From 9847e0c07d5907887e26ec60192fa12aa46277ee Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Wed, 29 Jul 2009 18:10:48 +0100 Subject: [PATCH] Implement '*grep*' family of commands. --- .gitignore | 1 + TODO | 1 - daemon/Makefile.am | 1 + daemon/grep.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++ images/Makefile.am | 15 ++++-- images/test-grep.txt | 7 +++ po/POTFILES.in | 1 + src/MAX_PROC_NR | 2 +- src/generator.ml | 98 ++++++++++++++++++++++++++++++++++++ 9 files changed, 260 insertions(+), 6 deletions(-) create mode 100644 daemon/grep.c create mode 100644 images/test-grep.txt diff --git a/.gitignore b/.gitignore index f2064a3..ecc39a5 100644 --- a/.gitignore +++ b/.gitignore @@ -84,6 +84,7 @@ images/initrd images/initrd-x86_64.img images/initrd-x86_64.img.gz images/test.sqsh +images/test-grep.txt.gz initramfs initramfs.timestamp inspector/virt-inspector.1 diff --git a/TODO b/TODO index dbfc3c8..da9f5b4 100644 --- a/TODO +++ b/TODO @@ -144,7 +144,6 @@ Ideas for extra commands General glibc / core programs: chgrp - grep (do it locally using pipe?) dd (?) ln / ln -s readlink diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 7b8a87e..ecbc3c4 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -39,6 +39,7 @@ guestfsd_SOURCES = \ find.c \ fsck.c \ glob.c \ + grep.c \ grub.c \ guestfsd.c \ headtail.c \ diff --git a/daemon/grep.c b/daemon/grep.c new file mode 100644 index 0000000..c51dc0b --- /dev/null +++ b/daemon/grep.c @@ -0,0 +1,140 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2009 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include +#include +#include +#include + +#include "../src/guestfs_protocol.h" +#include "daemon.h" +#include "actions.h" + +static char ** +grep (const char *prog, const char *flag, char *regex, char *path) +{ + char *buf; + char *out, *err; + int r; + char **lines; + + NEED_ROOT (NULL); + ABS_PATH (path, NULL); + + /* Make the path relative to /sysroot. */ + buf = sysroot_path (path); + if (!buf) { + reply_with_perror ("malloc"); + return NULL; + } + + /* Note that grep returns an error if no match. We want to + * suppress this error and return an empty list. + */ + r = commandr (&out, &err, prog, flag, regex, buf, NULL); + free (buf); + if (r == -1 || r > 1) { + reply_with_error ("%s %s %s: %s", prog, flag, regex, err); + free (out); + free (err); + return NULL; + } + + free (err); + + lines = split_lines (out); + free (out); + if (lines == NULL) return NULL; + + return lines; +} + +char ** +do_grep (char *regex, char *path) +{ + /* The "--" is not really needed, but it helps when we don't need a flag. */ + return grep ("grep", "--", regex, path); +} + +char ** +do_egrep (char *regex, char *path) +{ + return grep ("egrep", "--", regex, path); +} + +char ** +do_fgrep (char *regex, char *path) +{ + return grep ("fgrep", "--", regex, path); +} + +char ** +do_grepi (char *regex, char *path) +{ + return grep ("grep", "-i", regex, path); +} + +char ** +do_egrepi (char *regex, char *path) +{ + return grep ("egrep", "-i", regex, path); +} + +char ** +do_fgrepi (char *regex, char *path) +{ + return grep ("fgrep", "-i", regex, path); +} + +char ** +do_zgrep (char *regex, char *path) +{ + return grep ("zgrep", "--", regex, path); +} + +char ** +do_zegrep (char *regex, char *path) +{ + return grep ("zegrep", "--", regex, path); +} + +char ** +do_zfgrep (char *regex, char *path) +{ + return grep ("zfgrep", "--", regex, path); +} + +char ** +do_zgrepi (char *regex, char *path) +{ + return grep ("zgrep", "-i", regex, path); +} + +char ** +do_zegrepi (char *regex, char *path) +{ + return grep ("zegrep", "-i", regex, path); +} + +char ** +do_zfgrepi (char *regex, char *path) +{ + return grep ("zfgrep", "-i", regex, path); +} diff --git a/images/Makefile.am b/images/Makefile.am index d4aed55..b6b7f72 100644 --- a/images/Makefile.am +++ b/images/Makefile.am @@ -32,8 +32,8 @@ EXTRA_DIST = \ lib-sparc.so \ lib-win32.dll \ lib-win64.dll \ - lib-x86_64.so - + lib-x86_64.so \ + test-grep.txt noinst_DATA = test.sqsh @@ -58,7 +58,8 @@ squash_files_src = \ $(srcdir)/lib-sparc.so \ $(srcdir)/lib-win32.dll \ $(srcdir)/lib-win64.dll \ - $(srcdir)/lib-x86_64.so + $(srcdir)/lib-x86_64.so \ + $(srcdir)/test-grep.txt squash_files_build = \ $(builddir)/100kallzeroes \ @@ -68,7 +69,8 @@ squash_files_build = \ $(builddir)/10klines \ $(builddir)/initrd \ $(builddir)/initrd-x86_64.img \ - $(builddir)/initrd-x86_64.img.gz + $(builddir)/initrd-x86_64.img.gz \ + $(builddir)/test-grep.txt.gz squash_files = $(squash_files_src) $(squash_files_build) @@ -124,3 +126,8 @@ $(builddir)/initrd-x86_64.img.gz: initrd-x86_64.img rm -f $@ $@-t gzip --best -c $< > $@-t mv $@-t $@ + +$(builddir)/test-grep.txt.gz: test-grep.txt + rm -f $@ $@-t + gzip --best -c $< > $@-t + mv $@-t $@ diff --git a/images/test-grep.txt b/images/test-grep.txt new file mode 100644 index 0000000..1d24b9a --- /dev/null +++ b/images/test-grep.txt @@ -0,0 +1,7 @@ +abc +def +ghi +ghi + +abc123 +ABC diff --git a/po/POTFILES.in b/po/POTFILES.in index 1286fbd..1b2f03e 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -17,6 +17,7 @@ daemon/file.c daemon/find.c daemon/fsck.c daemon/glob.c +daemon/grep.c daemon/grub.c daemon/guestfsd.c daemon/headtail.c diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index fa8f08c..0234b51 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -150 +162 diff --git a/src/generator.ml b/src/generator.ml index b787850..c098ec8 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -3046,6 +3046,104 @@ handle files that contain embedded ASCII NUL characters. However unlike C, this function is limited in the total size of file that can be handled."); + ("grep", (RStringList "lines", [String "regex"; String "path"]), 151, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["grep"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"]); + InitSquashFS, Always, TestOutputList ( + [["grep"; "nomatch"; "/test-grep.txt"]], [])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("egrep", (RStringList "lines", [String "regex"; String "path"]), 152, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["egrep"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("fgrep", (RStringList "lines", [String "pattern"; String "path"]), 153, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["fgrep"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("grepi", (RStringList "lines", [String "regex"; String "path"]), 154, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["grepi"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"; "ABC"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("egrepi", (RStringList "lines", [String "regex"; String "path"]), 155, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["egrepi"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"; "ABC"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("fgrepi", (RStringList "lines", [String "pattern"; String "path"]), 156, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["fgrepi"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"; "ABC"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("zgrep", (RStringList "lines", [String "regex"; String "path"]), 157, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["zgrep"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("zegrep", (RStringList "lines", [String "regex"; String "path"]), 158, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["zegrep"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("zfgrep", (RStringList "lines", [String "pattern"; String "path"]), 159, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["zfgrep"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("zgrepi", (RStringList "lines", [String "regex"; String "path"]), 160, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["zgrepi"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"; "ABC"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("zegrepi", (RStringList "lines", [String "regex"; String "path"]), 161, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["zegrepi"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"; "ABC"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + + ("zfgrepi", (RStringList "lines", [String "pattern"; String "path"]), 162, [ProtocolLimitWarning], + [InitSquashFS, Always, TestOutputList ( + [["zfgrepi"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"; "ABC"])], + "return lines matching a pattern", + "\ +This calls the external C program and returns the +matching lines."); + ] let all_functions = non_daemon_functions @ daemon_functions -- 1.8.3.1