From 7d41d75c1d4e6dbe61f6cd353bc104663340483f Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Mon, 13 Jul 2009 18:00:07 +0100 Subject: [PATCH] Implement new 'zfile' command, to show file type inside compressed files. --- daemon/file.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/MAX_PROC_NR | 2 +- src/generator.ml | 51 ++++++++++++++++++++++++++++------------------- 3 files changed, 92 insertions(+), 21 deletions(-) diff --git a/daemon/file.c b/daemon/file.c index 3ef7441..98c356d 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 897bdc8..dee261d 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 8c864f0..e3293d1 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -1718,8 +1718,8 @@ This uses the L 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 to C on the @@ -1732,10 +1732,10 @@ See also C."); ("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 and save it as C @@ -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 ("sleep", (RErr, [Int "secs"]), 109, [], [InitNone, Always, TestRun ( - [["sleep"; "1"]])], + [["sleep"; "1"]])], "sleep for some seconds", "\ Sleep for C seconds."); @@ -2857,6 +2857,17 @@ were rarely if ever used anyway. See also C and the L manpage."); + ("zfile", (RString "description", [String "method"; String "path"]), 140, [], + [], + "determine file type inside a compressed file", + "\ +This command runs C after first decompressing C +using C. + +C must be one of C, C or C. + +See also: C"); + ] let all_functions = non_daemon_functions @ daemon_functions -- 1.8.3.1