summaryrefslogtreecommitdiffstats
path: root/daemon/grep.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/grep.c')
-rw-r--r--daemon/grep.c71
1 files changed, 54 insertions, 17 deletions
diff --git a/daemon/grep.c b/daemon/grep.c
index 285c48ec..d0fd42bc 100644
--- a/daemon/grep.c
+++ b/daemon/grep.c
@@ -28,13 +28,40 @@
#include "daemon.h"
#include "actions.h"
+#define MAX_ARGS 64
+
static char **
-grep (const char *prog, const char *flag, const char *regex, const char *path)
+grep (const char *regex, const char *path,
+ int extended, int fixed, int insensitive, int compressed)
{
+ const char *argv[MAX_ARGS];
+ size_t i = 0;
char *out, *err;
int fd, flags, r;
char **lines;
+ if (extended && fixed) {
+ reply_with_error ("can't use 'extended' and 'fixed' flags at the same time");
+ return NULL;
+ }
+
+ if (!compressed)
+ ADD_ARG (argv, i, "grep");
+ else
+ ADD_ARG (argv, i, "zgrep");
+
+ if (extended)
+ ADD_ARG (argv, i, "-E");
+
+ if (fixed)
+ ADD_ARG (argv, i, "-F");
+
+ if (insensitive)
+ ADD_ARG (argv, i, "-i");
+
+ ADD_ARG (argv, i, regex);
+ ADD_ARG (argv, i, NULL);
+
CHROOT_IN;
fd = open (path, O_RDONLY|O_CLOEXEC);
CHROOT_OUT;
@@ -48,9 +75,9 @@ grep (const char *prog, const char *flag, const char *regex, const char *path)
* suppress this error and return an empty list.
*/
flags = COMMAND_FLAG_CHROOT_COPY_FILE_TO_STDIN | fd;
- r = commandrf (&out, &err, flags, prog, flag, regex, NULL);
+ r = commandrvf (&out, &err, flags, argv);
if (r == -1 || r > 1) {
- reply_with_error ("%s %s %s: %s", prog, flag, regex, err);
+ reply_with_error ("%s: %s", regex, err);
free (out);
free (err);
return NULL;
@@ -65,75 +92,85 @@ grep (const char *prog, const char *flag, const char *regex, const char *path)
return lines;
}
+/* Takes optional arguments, consult optargs_bitmask. */
char **
-do_grep (const char *regex, const char *path)
+do_grep (const char *regex, const char *path,
+ int extended, int fixed, int insensitive, int compressed)
{
- /* The "--" is not really needed, but it helps when we don't need a flag. */
- return grep ("grep", "--", regex, path);
+ if (!(optargs_bitmask & GUESTFS_GREP_EXTENDED_BITMASK))
+ extended = 0;
+ if (!(optargs_bitmask & GUESTFS_GREP_FIXED_BITMASK))
+ fixed = 0;
+ if (!(optargs_bitmask & GUESTFS_GREP_INSENSITIVE_BITMASK))
+ insensitive = 0;
+ if (!(optargs_bitmask & GUESTFS_GREP_COMPRESSED_BITMASK))
+ compressed = 0;
+
+ return grep (regex, path, extended, fixed, insensitive, compressed);
}
char **
do_egrep (const char *regex, const char *path)
{
- return grep ("egrep", "--", regex, path);
+ return grep (regex, path, 1, 0, 0, 0);
}
char **
do_fgrep (const char *regex, const char *path)
{
- return grep ("fgrep", "--", regex, path);
+ return grep (regex, path, 0, 1, 0, 0);
}
char **
do_grepi (const char *regex, const char *path)
{
- return grep ("grep", "-i", regex, path);
+ return grep (regex, path, 0, 0, 1, 0);
}
char **
do_egrepi (const char *regex, const char *path)
{
- return grep ("egrep", "-i", regex, path);
+ return grep (regex, path, 1, 0, 1, 0);
}
char **
do_fgrepi (const char *regex, const char *path)
{
- return grep ("fgrep", "-i", regex, path);
+ return grep (regex, path, 0, 1, 1, 0);
}
char **
do_zgrep (const char *regex, const char *path)
{
- return grep ("zgrep", "--", regex, path);
+ return grep (regex, path, 0, 0, 0, 1);
}
char **
do_zegrep (const char *regex, const char *path)
{
- return grep ("zegrep", "--", regex, path);
+ return grep (regex, path, 1, 0, 0, 1);
}
char **
do_zfgrep (const char *regex, const char *path)
{
- return grep ("zfgrep", "--", regex, path);
+ return grep (regex, path, 0, 1, 0, 1);
}
char **
do_zgrepi (const char *regex, const char *path)
{
- return grep ("zgrep", "-i", regex, path);
+ return grep (regex, path, 0, 0, 1, 1);
}
char **
do_zegrepi (const char *regex, const char *path)
{
- return grep ("zegrep", "-i", regex, path);
+ return grep (regex, path, 1, 0, 1, 1);
}
char **
do_zfgrepi (const char *regex, const char *path)
{
- return grep ("zfgrep", "-i", regex, path);
+ return grep (regex, path, 0, 1, 1, 1);
}