X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fstrings.c;h=f08401b2835b92fbac740cac303fe55f97938930;hp=5e9c3a8968cc5ad8a001f84cee77d3d531f303aa;hb=74958b0ad44df6ed703cd3009983d04ade3a8e93;hpb=fa7c8bb79b45aecdf65ed93635a42f3fdf301134 diff --git a/daemon/strings.c b/daemon/strings.c index 5e9c3a8..f08401b 100644 --- a/daemon/strings.c +++ b/daemon/strings.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * 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 @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include "daemon.h" #include "actions.h" @@ -28,30 +30,29 @@ char ** do_strings_e (const char *encoding, const char *path) { - int len; - char *buf; - int r; + int fd, flags, r; char *out, *err; - char **lines = NULL; - int size = 0, alloc = 0; - char *p, *pend; + char **lines; - NEED_ROOT (NULL); - ABS_PATH (path, NULL); - - len = strlen (path) + 9; - buf = malloc (len); - if (!buf) { - reply_with_perror ("malloc"); + if (strlen (encoding) != 1 || + strchr ("sSblBL", encoding[0]) == NULL) { + reply_with_error ("%s: invalid encoding", encoding); return NULL; } - snprintf (buf, len, "/sysroot%s", path); + CHROOT_IN; + fd = open (path, O_RDONLY); + CHROOT_OUT; + + if (fd == -1) { + reply_with_perror ("%s", path); + return NULL; + } - r = command (&out, &err, "strings", "-e", encoding, buf, NULL); - free (buf); + flags = COMMAND_FLAG_CHROOT_COPY_FILE_TO_STDIN | fd; + r = commandf (&out, &err, flags, "strings", "-e", encoding, NULL); if (r == -1) { - reply_with_error ("strings: %s: %s", path, err); + reply_with_error ("%s: %s", path, err); free (err); free (out); return NULL; @@ -60,25 +61,10 @@ do_strings_e (const char *encoding, const char *path) free (err); /* Now convert the output to a list of lines. */ - p = out; - while (p && *p) { - pend = strchr (p, '\n'); - if (pend) { - *pend = '\0'; - pend++; - } - - if (add_string (&lines, &size, &alloc, p) == -1) { - free (out); - return NULL; - } - - p = pend; - } - + lines = split_lines (out); free (out); - if (add_string (&lines, &size, &alloc, NULL) == -1) + if (lines == NULL) return NULL; return lines; /* Caller frees. */