diff options
author | Richard Jones <rjones@trick.home.annexia.org> | 2009-07-13 18:00:07 +0100 |
---|---|---|
committer | Richard Jones <rjones@trick.home.annexia.org> | 2009-07-13 18:00:07 +0100 |
commit | 7d41d75c1d4e6dbe61f6cd353bc104663340483f (patch) | |
tree | 2b853abebb6d4fa6a5cf818f2c97b18cfd143c64 | |
parent | f9ecb943be086087feeeaeb49bd8865fd5e54545 (diff) | |
download | libguestfs-7d41d75c1d4e6dbe61f6cd353bc104663340483f.tar.gz libguestfs-7d41d75c1d4e6dbe61f6cd353bc104663340483f.tar.xz libguestfs-7d41d75c1d4e6dbe61f6cd353bc104663340483f.zip |
Implement new 'zfile' command, to show file type inside compressed files.
-rw-r--r-- | daemon/file.c | 60 | ||||
-rw-r--r-- | src/MAX_PROC_NR | 2 | ||||
-rwxr-xr-x | src/generator.ml | 51 |
3 files changed, 92 insertions, 21 deletions
diff --git a/daemon/file.c b/daemon/file.c index 3ef7441d..98c356df 100644 --- a/daemon/file.c +++ b/daemon/file.c @@ -376,3 +376,63 @@ do_file (char *path) return out; /* caller frees */ } + +/* zcat | file */ +char * +do_zfile (char *method, char *path) +{ + int len; + char *cmd; + FILE *fp; + char line[256]; + + NEED_ROOT (NULL); + ABS_PATH (path, NULL); + + len = 2 * strlen (path) + 64; + cmd = malloc (len); + if (!cmd) { + reply_with_perror ("malloc"); + return NULL; + } + + if (strcmp (method, "gzip") == 0 || strcmp (method, "compress") == 0) + strcpy (cmd, "zcat"); + else if (strcmp (method, "bzip2") == 0) + strcpy (cmd, "bzcat"); + else { + free (cmd); + reply_with_error ("zfile: unknown method"); + return NULL; + } + + strcat (cmd, " /sysroot"); + shell_quote (cmd + strlen (cmd), len - strlen (cmd), path); + strcat (cmd, " | file -bsL -"); + + fp = popen (cmd, "r"); + if (fp == NULL) { + reply_with_perror ("%s", cmd); + free (cmd); + return NULL; + } + + free (cmd); + + if (fgets (line, sizeof line, fp) == NULL) { + reply_with_perror ("zfile: fgets"); + fclose (fp); + return NULL; + } + + if (fclose (fp) == -1) { + reply_with_perror ("zfile: fclose"); + return NULL; + } + + len = strlen (line); + if (len > 0 && line[len-1] == '\n') + line[len-1] = '\0'; + + return strdup (line); +} diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index 897bdc82..dee261df 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -139 +140 diff --git a/src/generator.ml b/src/generator.ml index 8c864f0d..e3293d1d 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -1718,8 +1718,8 @@ This uses the L<blockdev(8)> command."); ("upload", (RErr, [FileIn "filename"; String "remotefilename"]), 66, [], [InitBasicFS, Always, TestOutput ( (* Pick a file from cwd which isn't likely to change. *) - [["upload"; "../COPYING.LIB"; "/COPYING.LIB"]; - ["checksum"; "md5"; "/COPYING.LIB"]], "e3eda01d9815f8d24aae2dbd89b68b06")], + [["upload"; "../COPYING.LIB"; "/COPYING.LIB"]; + ["checksum"; "md5"; "/COPYING.LIB"]], "e3eda01d9815f8d24aae2dbd89b68b06")], "upload a file from the local machine", "\ Upload local file C<filename> to C<remotefilename> on the @@ -1732,10 +1732,10 @@ See also C<guestfs_download>."); ("download", (RErr, [String "remotefilename"; FileOut "filename"]), 67, [], [InitBasicFS, Always, TestOutput ( (* Pick a file from cwd which isn't likely to change. *) - [["upload"; "../COPYING.LIB"; "/COPYING.LIB"]; - ["download"; "/COPYING.LIB"; "testdownload.tmp"]; - ["upload"; "testdownload.tmp"; "/upload"]; - ["checksum"; "md5"; "/upload"]], "e3eda01d9815f8d24aae2dbd89b68b06")], + [["upload"; "../COPYING.LIB"; "/COPYING.LIB"]; + ["download"; "/COPYING.LIB"; "testdownload.tmp"]; + ["upload"; "testdownload.tmp"; "/upload"]; + ["checksum"; "md5"; "/upload"]], "e3eda01d9815f8d24aae2dbd89b68b06")], "download a file to the local machine", "\ Download file C<remotefilename> and save it as C<filename> @@ -2357,19 +2357,19 @@ are activated or deactivated."); ("lvresize", (RErr, [String "device"; Int "mbytes"]), 105, [], [InitNone, Always, TestOutput ( - [["sfdiskM"; "/dev/sda"; ","]; - ["pvcreate"; "/dev/sda1"]; - ["vgcreate"; "VG"; "/dev/sda1"]; - ["lvcreate"; "LV"; "VG"; "10"]; - ["mkfs"; "ext2"; "/dev/VG/LV"]; - ["mount"; "/dev/VG/LV"; "/"]; - ["write_file"; "/new"; "test content"; "0"]; - ["umount"; "/"]; - ["lvresize"; "/dev/VG/LV"; "20"]; - ["e2fsck_f"; "/dev/VG/LV"]; - ["resize2fs"; "/dev/VG/LV"]; - ["mount"; "/dev/VG/LV"; "/"]; - ["cat"; "/new"]], "test content")], + [["sfdiskM"; "/dev/sda"; ","]; + ["pvcreate"; "/dev/sda1"]; + ["vgcreate"; "VG"; "/dev/sda1"]; + ["lvcreate"; "LV"; "VG"; "10"]; + ["mkfs"; "ext2"; "/dev/VG/LV"]; + ["mount"; "/dev/VG/LV"; "/"]; + ["write_file"; "/new"; "test content"; "0"]; + ["umount"; "/"]; + ["lvresize"; "/dev/VG/LV"; "20"]; + ["e2fsck_f"; "/dev/VG/LV"]; + ["resize2fs"; "/dev/VG/LV"]; + ["mount"; "/dev/VG/LV"; "/"]; + ["cat"; "/new"]], "test content")], "resize an LVM logical volume", "\ This resizes (expands or shrinks) an existing LVM logical @@ -2441,7 +2441,7 @@ This command is only needed because of C<guestfs_resize2fs> ("sleep", (RErr, [Int "secs"]), 109, [], [InitNone, Always, TestRun ( - [["sleep"; "1"]])], + [["sleep"; "1"]])], "sleep for some seconds", "\ Sleep for C<secs> seconds."); @@ -2857,6 +2857,17 @@ were rarely if ever used anyway. See also C<guestfs_sfdisk> and the L<sfdisk(8)> manpage."); + ("zfile", (RString "description", [String "method"; String "path"]), 140, [], + [], + "determine file type inside a compressed file", + "\ +This command runs C<file> after first decompressing C<path> +using C<method>. + +C<method> must be one of C<gzip>, C<compress> or C<bzip2>. + +See also: C<guestfs_file>"); + ] let all_functions = non_daemon_functions @ daemon_functions |