X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=src%2Fgenerator.ml;h=c9b3315656b16892f0bb8c2eb5548d031c2c88d6;hp=a50867189e2f24dc96a4c539b29cfb11c2abf9c0;hb=8ae7e1057f43e9b79260cdf191f39d657fdf0293;hpb=98515732084c6856c2e22364b2ae64113c2c37c6 diff --git a/src/generator.ml b/src/generator.ml index a508671..c9b3315 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -25,13 +25,11 @@ * daemon/.c to write the implementation. * * After editing this file, run it (./src/generator.ml) to regenerate all the - * output files. Note that if you are using a separate build directory you must - * run generator.ml from your top level build directory. You must also have run - * configure before generator.ml will run. + * output files. Note that if you are using a separate build directory you + * must run generator.ml from the _source_ directory. * * IMPORTANT: This script should NOT print any warnings. If it prints * warnings, you should treat them as errors. - * [Need to add -warn-error to ocaml command line] *) #load "unix.cma";; @@ -45,39 +43,62 @@ and ret = * indication, ie. 0 or -1. *) | RErr + (* "RInt" as a return value means an int which is -1 for error * or any value >= 0 on success. Only use this for smallish * positive ints (0 <= i < 2^30). *) | RInt of string + (* "RInt64" is the same as RInt, but is guaranteed to be able * to return a full 64 bit value, _except_ that -1 means error * (so -1 cannot be a valid, non-error return value). *) | RInt64 of string + (* "RBool" is a bool return value which can be true/false or * -1 for error. *) | RBool of string + (* "RConstString" is a string that refers to a constant value. + * The return value must NOT be NULL (since NULL indicates + * an error). + * * Try to avoid using this. In particular you cannot use this * for values returned from the daemon, because there is no * thread-safe way to return them in the C API. *) | RConstString of string - (* "RString" and "RStringList" are caller-frees. *) + + (* "RConstOptString" is an even more broken version of + * "RConstString". The returned string may be NULL and there + * is no way to return an error indication. Avoid using this! + *) + | RConstOptString of string + + (* "RString" is a returned string. It must NOT be NULL, since + * a NULL return indicates an error. The caller frees this. + *) | RString of string + + (* "RStringList" is a list of strings. No string in the list + * can be NULL. The caller frees the strings and the array. + *) | RStringList of string + (* "RStruct" is a function which returns a single named structure * or an error indication (in C, a struct, and in other languages * with varying representations, but usually very efficient). See - * after the function list below for the structures. + * after the function list below for the structures. *) | RStruct of string * string (* name of retval, name of struct *) + (* "RStructList" is a function which returns either a list/array * of structures (could be zero-length), or an error indication. *) | RStructList of string * string (* name of retval, name of struct *) + (* Key-value pairs of untyped strings. Turns into a hashtable or * dictionary in languages which support it. DON'T use this as a * general "bucket" for results. Prefer a stronger typed return @@ -86,16 +107,21 @@ and ret = * inefficient. Keys should be unique. NULLs are not permitted. *) | RHashtable of string -(* Not implemented: + (* "RBufferOut" is handled almost exactly like RString, but * it allows the string to contain arbitrary 8 bit data including * ASCII NUL. In the C API this causes an implicit extra parameter - * to be added of type . Other programming languages - * support strings with arbitrary 8 bit data. At the RPC layer - * we have to use the opaque<> type instead of string<>. + * to be added of type . The extra parameter + * returns the actual size of the return buffer in bytes. + * + * Other programming languages support strings with arbitrary 8 bit + * data. + * + * At the RPC layer we have to use the opaque<> type instead of + * string<>. Returned data is still limited to the max message + * size (ie. ~ 2 MB). *) | RBufferOut of string -*) and args = argt list (* Function parameters, guestfs handle is implicit. *) @@ -142,15 +168,7 @@ type flags = | FishAction of string (* call this function in guestfish *) | NotInFish (* do not export via guestfish *) | NotInDocs (* do not add this function to documentation *) - -let protocol_limit_warning = - "Because of the message protocol, there is a transfer limit -of somewhere between 2MB and 4MB. To transfer large files you should use -FTP." - -let danger_will_robinson = - "B." + | DeprecatedBy of string (* function is deprecated, use .. instead *) (* You can supply zero or as many tests as you want per API call. * @@ -188,45 +206,60 @@ type tests = (test_init * test_prereq * test) list and test = (* Run the command sequence and just expect nothing to fail. *) | TestRun of seq + (* Run the command sequence and expect the output of the final * command to be the string. *) | TestOutput of seq * string + (* Run the command sequence and expect the output of the final * command to be the list of strings. *) | TestOutputList of seq * string list + (* Run the command sequence and expect the output of the final * command to be the list of block devices (could be either * "/dev/sd.." or "/dev/hd.." form - we don't check the 5th * character of each string). *) | TestOutputListOfDevices of seq * string list + (* Run the command sequence and expect the output of the final * command to be the integer. *) | TestOutputInt of seq * int + (* Run the command sequence and expect the output of the final * command to be , eg. ">=", "1". *) | TestOutputIntOp of seq * string * int + (* Run the command sequence and expect the output of the final * command to be a true value (!= 0 or != NULL). *) | TestOutputTrue of seq + (* Run the command sequence and expect the output of the final * command to be a false value (== 0 or == NULL, but not an error). *) | TestOutputFalse of seq + (* Run the command sequence and expect the output of the final * command to be a list of the given length (but don't care about * content). *) | TestOutputLength of seq * int + + (* Run the command sequence and expect the output of the final + * command to be a buffer (RBufferOut), ie. string + size. + *) + | TestOutputBuffer of seq * string + (* Run the command sequence and expect the output of the final * command to be a structure. *) | TestOutputStruct of seq * test_field_compare list + (* Run the command sequence and expect the final command (only) * to fail. *) @@ -243,14 +276,17 @@ and test_field_compare = and test_prereq = (* Test always runs. *) | Always + (* Test is currently disabled - eg. it fails, or it tests some * unimplemented feature. *) | Disabled + (* 'string' is some C code (a function body) that should return * true or false. The test will run if the code returns true. *) | If of string + (* As for 'If' but the test runs _unless_ the code returns true. *) | Unless of string @@ -261,14 +297,17 @@ and test_init = * a bad idea. *) | InitNone + (* Block devices are empty and no filesystems are mounted. *) | InitEmpty + (* /dev/sda contains a single partition /dev/sda1, which is formatted * as ext2, empty [except for lost+found] and mounted on /. * /dev/sdb and /dev/sdc may have random content. * No LVM. *) | InitBasicFS + (* /dev/sda: * /dev/sda1 (is a PV): * /dev/VG/LV (size 8MB): @@ -277,6 +316,11 @@ and test_init = *) | InitBasicFSonLVM + (* /dev/sdd (the squashfs, see images/ directory in source) + * is mounted on / + *) + | InitSquashFS + (* Sequence of commands for testing. *) and seq = cmd list and cmd = string list @@ -307,6 +351,7 @@ let test_all_rets = [ "test0rint64", RInt64 "valout"; "test0rbool", RBool "valout"; "test0rconststring", RConstString "valout"; + "test0rconstoptstring", RConstOptString "valout"; "test0rstring", RString "valout"; "test0rstringlist", RStringList "valout"; "test0rstruct", RStruct ("valout", "lvm_pv"); @@ -330,9 +375,9 @@ You probably don't want to call this function."); List.map ( fun (name, ret) -> [(name, (ret, [String "val"]), -1, [NotInFish; NotInDocs], - [], - "internal test function - do not use", - "\ + [], + "internal test function - do not use", + "\ This is an internal test function which is used to test whether the automatically generated bindings can handle every possible return type correctly. @@ -341,9 +386,9 @@ It converts string C to the return type. You probably don't want to call this function."); (name ^ "err", (ret, []), -1, [NotInFish; NotInDocs], - [], - "internal test function - do not use", - "\ + [], + "internal test function - do not use", + "\ This is an internal test function which is used to test whether the automatically generated bindings can handle every possible return type correctly. @@ -501,7 +546,7 @@ Return the current search path. This is always non-NULL. If it wasn't set already, then this will return the default path."); - ("set_append", (RErr, [String "append"]), -1, [FishAlias "append"], + ("set_append", (RErr, [OptString "append"]), -1, [FishAlias "append"], [], "add options to kernel command line", "\ @@ -514,7 +559,7 @@ C environment variable. Setting C to C means I additional options are passed (libguestfs always adds a few of its own)."); - ("get_append", (RConstString "append", []), -1, [], + ("get_append", (RConstOptString "append", []), -1, [], (* This cannot be tested with the current framework. The * function can return NULL in normal operations, which the * test framework interprets as an error. @@ -764,22 +809,21 @@ update the timestamps on a file, or, if the file does not exist, to create a new zero-length file."); ("cat", (RString "content", [String "path"]), 4, [ProtocolLimitWarning], - [InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "new file contents"; "0"]; - ["cat"; "/new"]], "new file contents")], + [InitSquashFS, Always, TestOutput ( + [["cat"; "/known-2"]], "abcdef\n")], "list the contents of a file", "\ Return the contents of the file named C. Note that this function cannot correctly handle binary files (specifically, files containing C<\\0> character which is treated -as end of string). For those you need to use the C -function which has a more complex interface."); +as end of string). For those you need to use the C +or C functions which have a more complex interface."); ("ll", (RString "listing", [String "directory"]), 5, [], [], (* XXX Tricky to test because it depends on the exact format - * of the 'ls -l' command, which changes between F10 and F11. - *) + * of the 'ls -l' command, which changes between F10 and F11. + *) "list the files in a directory (long format)", "\ List the files in C (relative to the root directory, @@ -913,12 +957,10 @@ List all the logical volumes detected. This is the equivalent of the L command. The \"full\" version includes all fields."); ("read_lines", (RStringList "lines", [String "path"]), 15, [], - [InitBasicFS, Always, TestOutputList ( - [["write_file"; "/new"; "line1\r\nline2\nline3"; "0"]; - ["read_lines"; "/new"]], ["line1"; "line2"; "line3"]); - InitBasicFS, Always, TestOutputList ( - [["write_file"; "/new"; ""; "0"]; - ["read_lines"; "/new"]], [])], + [InitSquashFS, Always, TestOutputList ( + [["read_lines"; "/known-4"]], ["abc"; "def"; "ghi"]); + InitSquashFS, Always, TestOutputList ( + [["read_lines"; "/empty"]], [])], "read file as lines", "\ Return the contents of the file named C. @@ -1179,12 +1221,10 @@ names, you will need to locate and parse the password file yourself (Augeas support makes this relatively easy)."); ("exists", (RBool "existsflag", [String "path"]), 36, [], - [InitBasicFS, Always, TestOutputTrue ( - [["touch"; "/new"]; - ["exists"; "/new"]]); - InitBasicFS, Always, TestOutputTrue ( - [["mkdir"; "/new"]; - ["exists"; "/new"]])], + [InitSquashFS, Always, TestOutputTrue ( + [["exists"; "/empty"]]); + InitSquashFS, Always, TestOutputTrue ( + [["exists"; "/directory"]])], "test if file or directory exists", "\ This returns C if and only if there is a file, directory @@ -1193,12 +1233,10 @@ This returns C if and only if there is a file, directory See also C, C, C."); ("is_file", (RBool "fileflag", [String "path"]), 37, [], - [InitBasicFS, Always, TestOutputTrue ( - [["touch"; "/new"]; - ["is_file"; "/new"]]); - InitBasicFS, Always, TestOutputFalse ( - [["mkdir"; "/new"]; - ["is_file"; "/new"]])], + [InitSquashFS, Always, TestOutputTrue ( + [["is_file"; "/known-1"]]); + InitSquashFS, Always, TestOutputFalse ( + [["is_file"; "/directory"]])], "test if file exists", "\ This returns C if and only if there is a file @@ -1208,12 +1246,10 @@ other objects like directories. See also C."); ("is_dir", (RBool "dirflag", [String "path"]), 38, [], - [InitBasicFS, Always, TestOutputFalse ( - [["touch"; "/new"]; - ["is_dir"; "/new"]]); - InitBasicFS, Always, TestOutputTrue ( - [["mkdir"; "/new"]; - ["is_dir"; "/new"]])], + [InitSquashFS, Always, TestOutputFalse ( + [["is_dir"; "/known-3"]]); + InitSquashFS, Always, TestOutputTrue ( + [["is_dir"; "/directory"]])], "test if file exists", "\ This returns C if and only if there is a directory @@ -1284,8 +1320,8 @@ or LVM logical volume). The filesystem type is C, for example C."); ("sfdisk", (RErr, [String "device"; - Int "cyls"; Int "heads"; Int "sectors"; - StringList "lines"]), 43, [DangerWillRobinson], + Int "cyls"; Int "heads"; Int "sectors"; + StringList "lines"]), 43, [DangerWillRobinson], [], "create partitions on a block device", "\ @@ -1407,21 +1443,22 @@ This command removes all LVM logical volumes, volume groups and physical volumes."); ("file", (RString "description", [String "path"]), 49, [], - [InitBasicFS, Always, TestOutput ( - [["touch"; "/new"]; - ["file"; "/new"]], "empty"); - InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "some content\n"; "0"]; - ["file"; "/new"]], "ASCII text"); - InitBasicFS, Always, TestLastFail ( - [["file"; "/nofile"]])], + [InitSquashFS, Always, TestOutput ( + [["file"; "/empty"]], "empty"); + InitSquashFS, Always, TestOutput ( + [["file"; "/known-1"]], "ASCII text"); + InitSquashFS, Always, TestLastFail ( + [["file"; "/notexists"]])], "determine file type", "\ This call uses the standard L command to determine the type or contents of the file. This also works on devices, for example to find out whether a partition contains a filesystem. -The exact command which runs is C. Note in +This call will also transparently look inside various types +of compressed file. + +The exact command which runs is C. Note in particular that the filename is not prepended to the output (the C<-b> option)."); @@ -1559,9 +1596,8 @@ result into a list of lines. See also: C"); ("stat", (RStruct ("statbuf", "stat"), [String "path"]), 52, [], - [InitBasicFS, Always, TestOutputStruct ( - [["touch"; "/new"]; - ["stat"; "/new"]], [CompareWithInt ("size", 0)])], + [InitSquashFS, Always, TestOutputStruct ( + [["stat"; "/empty"]], [CompareWithInt ("size", 0)])], "get file information", "\ Returns file information for the given C. @@ -1569,9 +1605,8 @@ Returns file information for the given C. This is the same as the C system call."); ("lstat", (RStruct ("statbuf", "stat"), [String "path"]), 53, [], - [InitBasicFS, Always, TestOutputStruct ( - [["touch"; "/new"]; - ["lstat"; "/new"]], [CompareWithInt ("size", 0)])], + [InitSquashFS, Always, TestOutputStruct ( + [["lstat"; "/empty"]], [CompareWithInt ("size", 0)])], "get file information for a symbolic link", "\ Returns file information for the given C. @@ -1583,9 +1618,9 @@ refers to. This is the same as the C system call."); ("statvfs", (RStruct ("statbuf", "statvfs"), [String "path"]), 54, [], - [InitBasicFS, Always, TestOutputStruct ( - [["statvfs"; "/"]], [CompareWithInt ("namemax", 255); - CompareWithInt ("bsize", 1024)])], + [InitSquashFS, Always, TestOutputStruct ( + [["statvfs"; "/"]], [CompareWithInt ("namemax", 256); + CompareWithInt ("bsize", 131072)])], "get file system statistics", "\ Returns file system statistics for any mounted file system. @@ -1748,35 +1783,22 @@ C can also be a named pipe. See also C, C."); ("checksum", (RString "checksum", [String "csumtype"; String "path"]), 68, [], - [InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "test\n"; "0"]; - ["checksum"; "crc"; "/new"]], "935282863"); - InitBasicFS, Always, TestLastFail ( - [["checksum"; "crc"; "/new"]]); - InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "test\n"; "0"]; - ["checksum"; "md5"; "/new"]], "d8e8fca2dc0f896fd7cb4cb0031ba249"); - InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "test\n"; "0"]; - ["checksum"; "sha1"; "/new"]], "4e1243bd22c66e76c2ba9eddc1f91394e57f9f83"); - InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "test\n"; "0"]; - ["checksum"; "sha224"; "/new"]], "52f1bf093f4b7588726035c176c0cdb4376cfea53819f1395ac9e6ec"); - InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "test\n"; "0"]; - ["checksum"; "sha256"; "/new"]], "f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2"); - InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "test\n"; "0"]; - ["checksum"; "sha384"; "/new"]], "109bb6b5b6d5547c1ce03c7a8bd7d8f80c1cb0957f50c4f7fda04692079917e4f9cad52b878f3d8234e1a170b154b72d"); - InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "test\n"; "0"]; - ["checksum"; "sha512"; "/new"]], "0e3e75234abc68f4378a86b3f4b32a198ba301845b0cd6e50106e874345700cc6663a86c1ea125dc5e92be17c98f9a0f85ca9d5f595db2012f7cc3571945c123"); - InitBasicFS, Always, TestOutput ( - (* RHEL 5 thinks this is an HFS+ filesystem unless we give - * the type explicitly. - *) - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["checksum"; "md5"; "/known-3"]], "46d6ca27ee07cdc6fa99c2e138cc522c")], + [InitSquashFS, Always, TestOutput ( + [["checksum"; "crc"; "/known-3"]], "2891671662"); + InitSquashFS, Always, TestLastFail ( + [["checksum"; "crc"; "/notexists"]]); + InitSquashFS, Always, TestOutput ( + [["checksum"; "md5"; "/known-3"]], "46d6ca27ee07cdc6fa99c2e138cc522c"); + InitSquashFS, Always, TestOutput ( + [["checksum"; "sha1"; "/known-3"]], "b7ebccc3ee418311091c3eda0a45b83c0a770f15"); + InitSquashFS, Always, TestOutput ( + [["checksum"; "sha224"; "/known-3"]], "d2cd1774b28f3659c14116be0a6dc2bb5c4b350ce9cd5defac707741"); + InitSquashFS, Always, TestOutput ( + [["checksum"; "sha256"; "/known-3"]], "75bb71b90cd20cb13f86d2bea8dad63ac7194e7517c3b52b8d06ff52d3487d30"); + InitSquashFS, Always, TestOutput ( + [["checksum"; "sha384"; "/known-3"]], "5fa7883430f357b5d7b7271d3a1d2872b51d73cba72731de6863d3dea55f30646af2799bef44d5ea776a5ec7941ac640"); + InitSquashFS, Always, TestOutput ( + [["checksum"; "sha512"; "/known-3"]], "2794062c328c6b216dca90443b7f7134c5f40e56bd0ed7853123275a09982a6f992e6ca682f9d2fba34a4c5e870d8fe077694ff831e3032a004ee077e00603f6")], "compute MD5, SHAx or CRC checksum of file", "\ This call computes the MD5, SHAx or CRC checksum of the @@ -2214,21 +2236,18 @@ true if their content is exactly equal, or false otherwise. The external L program is used for the comparison."); ("strings", (RStringList "stringsout", [String "path"]), 94, [ProtocolLimitWarning], - [InitBasicFS, Always, TestOutputList ( - [["write_file"; "/new"; "hello\nworld\n"; "0"]; - ["strings"; "/new"]], ["hello"; "world"]); - InitBasicFS, Always, TestOutputList ( - [["touch"; "/new"]; - ["strings"; "/new"]], [])], + [InitSquashFS, Always, TestOutputList ( + [["strings"; "/known-5"]], ["abcdefghi"; "jklmnopqr"]); + InitSquashFS, Always, TestOutputList ( + [["strings"; "/empty"]], [])], "print the printable strings in a file", "\ This runs the L command on a file and returns the list of printable strings found."); ("strings_e", (RStringList "stringsout", [String "encoding"; String "path"]), 95, [ProtocolLimitWarning], - [InitBasicFS, Always, TestOutputList ( - [["write_file"; "/new"; "hello\nworld\n"; "0"]; - ["strings_e"; "b"; "/new"]], []); + [InitSquashFS, Always, TestOutputList ( + [["strings_e"; "b"; "/known-5"]], []); InitBasicFS, Disabled, TestOutputList ( [["write_file"; "/new"; "\000h\000e\000l\000l\000o\000\n\000w\000o\000r\000l\000d\000\n"; "24"]; ["strings_e"; "b"; "/new"]], ["hello"; "world"])], @@ -2245,15 +2264,13 @@ show strings inside Windows/x86 files. The returned strings are transcoded to UTF-8."); ("hexdump", (RString "dump", [String "path"]), 96, [ProtocolLimitWarning], - [InitBasicFS, Always, TestOutput ( - [["write_file"; "/new"; "hello\nworld\n"; "12"]; - ["hexdump"; "/new"]], "00000000 68 65 6c 6c 6f 0a 77 6f 72 6c 64 0a |hello.world.|\n0000000c\n"); + [InitSquashFS, Always, TestOutput ( + [["hexdump"; "/known-4"]], "00000000 61 62 63 0a 64 65 66 0a 67 68 69 |abc.def.ghi|\n0000000b\n"); (* Test for RHBZ#501888c2 regression which caused large hexdump * commands to segfault. *) - InitBasicFS, Always, TestRun ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["hexdump"; "/100krandom"]])], + InitSquashFS, Always, TestRun ( + [["hexdump"; "/100krandom"]])], "dump a file in hexadecimal", "\ This runs C on the given C. The result is @@ -2290,8 +2307,8 @@ This resizes (expands or shrinks) an existing LVM physical volume to match the new size of the underlying device."); ("sfdisk_N", (RErr, [String "device"; Int "partnum"; - Int "cyls"; Int "heads"; Int "sectors"; - String "line"]), 99, [DangerWillRobinson], + Int "cyls"; Int "heads"; Int "sectors"; + String "line"]), 99, [DangerWillRobinson], [], "modify a single partition on a block device", "\ @@ -2590,51 +2607,44 @@ directory and its contents after use. See also: L"); ("wc_l", (RInt "lines", [String "path"]), 118, [], - [InitBasicFS, Always, TestOutputInt ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["wc_l"; "/10klines"]], 10000)], + [InitSquashFS, Always, TestOutputInt ( + [["wc_l"; "/10klines"]], 10000)], "count lines in a file", "\ This command counts the lines in a file, using the C external command."); ("wc_w", (RInt "words", [String "path"]), 119, [], - [InitBasicFS, Always, TestOutputInt ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["wc_w"; "/10klines"]], 10000)], + [InitSquashFS, Always, TestOutputInt ( + [["wc_w"; "/10klines"]], 10000)], "count words in a file", "\ This command counts the words in a file, using the C external command."); ("wc_c", (RInt "chars", [String "path"]), 120, [], - [InitBasicFS, Always, TestOutputInt ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["wc_c"; "/100kallspaces"]], 102400)], + [InitSquashFS, Always, TestOutputInt ( + [["wc_c"; "/100kallspaces"]], 102400)], "count characters in a file", "\ This command counts the characters in a file, using the C external command."); ("head", (RStringList "lines", [String "path"]), 121, [ProtocolLimitWarning], - [InitBasicFS, Always, TestOutputList ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["head"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz";"3abcdefghijklmnopqrstuvwxyz";"4abcdefghijklmnopqrstuvwxyz";"5abcdefghijklmnopqrstuvwxyz";"6abcdefghijklmnopqrstuvwxyz";"7abcdefghijklmnopqrstuvwxyz";"8abcdefghijklmnopqrstuvwxyz";"9abcdefghijklmnopqrstuvwxyz"])], + [InitSquashFS, Always, TestOutputList ( + [["head"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz";"3abcdefghijklmnopqrstuvwxyz";"4abcdefghijklmnopqrstuvwxyz";"5abcdefghijklmnopqrstuvwxyz";"6abcdefghijklmnopqrstuvwxyz";"7abcdefghijklmnopqrstuvwxyz";"8abcdefghijklmnopqrstuvwxyz";"9abcdefghijklmnopqrstuvwxyz"])], "return first 10 lines of a file", "\ This command returns up to the first 10 lines of a file as a list of strings."); ("head_n", (RStringList "lines", [Int "nrlines"; String "path"]), 122, [ProtocolLimitWarning], - [InitBasicFS, Always, TestOutputList ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["head_n"; "3"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz"]); - InitBasicFS, Always, TestOutputList ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["head_n"; "-9997"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz"]); - InitBasicFS, Always, TestOutputList ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["head_n"; "0"; "/10klines"]], [])], + [InitSquashFS, Always, TestOutputList ( + [["head_n"; "3"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz"]); + InitSquashFS, Always, TestOutputList ( + [["head_n"; "-9997"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz"]); + InitSquashFS, Always, TestOutputList ( + [["head_n"; "0"; "/10klines"]], [])], "return first N lines of a file", "\ If the parameter C is a positive number, this returns the first @@ -2646,24 +2656,20 @@ from the file C, excluding the last C lines. If the parameter C is zero, this returns an empty list."); ("tail", (RStringList "lines", [String "path"]), 123, [ProtocolLimitWarning], - [InitBasicFS, Always, TestOutputList ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["tail"; "/10klines"]], ["9990abcdefghijklmnopqrstuvwxyz";"9991abcdefghijklmnopqrstuvwxyz";"9992abcdefghijklmnopqrstuvwxyz";"9993abcdefghijklmnopqrstuvwxyz";"9994abcdefghijklmnopqrstuvwxyz";"9995abcdefghijklmnopqrstuvwxyz";"9996abcdefghijklmnopqrstuvwxyz";"9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"])], + [InitSquashFS, Always, TestOutputList ( + [["tail"; "/10klines"]], ["9990abcdefghijklmnopqrstuvwxyz";"9991abcdefghijklmnopqrstuvwxyz";"9992abcdefghijklmnopqrstuvwxyz";"9993abcdefghijklmnopqrstuvwxyz";"9994abcdefghijklmnopqrstuvwxyz";"9995abcdefghijklmnopqrstuvwxyz";"9996abcdefghijklmnopqrstuvwxyz";"9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"])], "return last 10 lines of a file", "\ This command returns up to the last 10 lines of a file as a list of strings."); ("tail_n", (RStringList "lines", [Int "nrlines"; String "path"]), 124, [ProtocolLimitWarning], - [InitBasicFS, Always, TestOutputList ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["tail_n"; "3"; "/10klines"]], ["9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"]); - InitBasicFS, Always, TestOutputList ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["tail_n"; "-9998"; "/10klines"]], ["9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"]); - InitBasicFS, Always, TestOutputList ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["tail_n"; "0"; "/10klines"]], [])], + [InitSquashFS, Always, TestOutputList ( + [["tail_n"; "3"; "/10klines"]], ["9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"]); + InitSquashFS, Always, TestOutputList ( + [["tail_n"; "-9998"; "/10klines"]], ["9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"]); + InitSquashFS, Always, TestOutputList ( + [["tail_n"; "0"; "/10klines"]], [])], "return last N lines of a file", "\ If the parameter C is a positive number, this returns the last @@ -2676,8 +2682,8 @@ If the parameter C is zero, this returns an empty list."); ("df", (RString "output", []), 125, [], [], (* XXX Tricky to test because it depends on the exact format - * of the 'df' command and other imponderables. - *) + * of the 'df' command and other imponderables. + *) "report file system disk space usage", "\ This command runs the C command to report disk space used. @@ -2688,8 +2694,8 @@ Use C from programs."); ("df_h", (RString "output", []), 126, [], [], (* XXX Tricky to test because it depends on the exact format - * of the 'df' command and other imponderables. - *) + * of the 'df' command and other imponderables. + *) "report file system disk space usage (human readable)", "\ This command runs the C command to report disk space used @@ -2700,9 +2706,8 @@ is I intended that you try to parse the output string. Use C from programs."); ("du", (RInt64 "sizekb", [String "path"]), 127, [], - [InitBasicFS, Always, TestOutputInt ( - [["mkdir"; "/p"]; - ["du"; "/p"]], 1 (* ie. 1 block, so depends on ext3 blocksize *))], + [InitSquashFS, Always, TestOutputInt ( + [["du"; "/directory"]], 0 (* squashfs doesn't have blocks *))], "estimate file space usage", "\ This command runs the C command to estimate file space @@ -2716,9 +2721,8 @@ The result is the estimated size in I (ie. units of 1024 bytes)."); ("initrd_list", (RStringList "filenames", [String "path"]), 128, [], - [InitBasicFS, Always, TestOutputList ( - [["mount_vfs"; "ro"; "squashfs"; "/dev/sdd"; "/"]; - ["initrd_list"; "/initrd"]], ["empty";"known-1";"known-2";"known-3"])], + [InitSquashFS, Always, TestOutputList ( + [["initrd_list"; "/initrd"]], ["empty";"known-1";"known-2";"known-3";"known-4"; "known-5"])], "list files in an initrd", "\ This command lists out files contained in an initrd. @@ -2753,7 +2757,11 @@ Create a swap partition on C."); ["mkswap_L"; "hello"; "/dev/sda1"]])], "create a swap partition with a label", "\ -Create a swap partition on C with label C