From 78029b529ad98769685d607230b70f71832d5906 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Sat, 18 Jul 2009 10:43:52 +0100 Subject: [PATCH] Make /sysroot path configurable. Currently /sysroot is hard-coded throughout the daemon code. This patch turns the path into a variable so that we can change it in future, for example to allow standalone mode to be implemented. This patch was tested by running all the C API tests successfully. --- daemon/augeas.c | 5 +---- daemon/checksum.c | 7 +++---- daemon/cmp.c | 10 ++-------- daemon/command.c | 27 +++++++++++++++++++-------- daemon/cpmv.c | 10 ++-------- daemon/daemon.h | 11 ++++++++--- daemon/dir.c | 7 ++----- daemon/du.c | 5 +---- daemon/file.c | 12 ++++++------ daemon/find.c | 12 ++++++++++-- daemon/grub.c | 4 ++-- daemon/guestfsd.c | 23 +++++++++++++++++++++++ daemon/headtail.c | 6 ++---- daemon/hexdump.c | 6 +----- daemon/initrd.c | 5 +++-- daemon/ls.c | 6 ++---- daemon/mount.c | 50 +++++++++++++++++++++++--------------------------- daemon/scrub.c | 10 ++-------- daemon/strings.c | 6 +----- daemon/tar.c | 20 ++++++++++++-------- daemon/wc.c | 6 ++---- 21 files changed, 127 insertions(+), 121 deletions(-) diff --git a/daemon/augeas.c b/daemon/augeas.c index f75a1d6..79d41a4 100644 --- a/daemon/augeas.c +++ b/daemon/augeas.c @@ -53,7 +53,6 @@ do_aug_init (char *root, int flags) { #ifdef HAVE_AUGEAS char *buf; - int len; NEED_ROOT (-1); ABS_PATH (root, -1); @@ -63,13 +62,11 @@ do_aug_init (char *root, int flags) aug = NULL; } - len = strlen (root) + 9; - buf = malloc (len); + buf = sysroot_path (root); if (!buf) { reply_with_perror ("malloc"); return -1; } - snprintf (buf, len, "/sysroot%s", root); aug = aug_init (buf, NULL, flags); free (buf); diff --git a/daemon/checksum.c b/daemon/checksum.c index bb30b05..bd71182 100644 --- a/daemon/checksum.c +++ b/daemon/checksum.c @@ -33,7 +33,8 @@ do_checksum (char *csumtype, char *path) const char *program; char *buf; char *out, *err; - int r, len; + int r; + int len; NEED_ROOT (NULL); ABS_PATH (path, NULL); @@ -58,13 +59,11 @@ do_checksum (char *csumtype, char *path) } /* Make the path relative to /sysroot. */ - len = strlen (path) + 9; - buf = malloc (len); + buf = sysroot_path (path); if (!buf) { reply_with_perror ("malloc"); return NULL; } - snprintf (buf, len, "/sysroot%s", path); r = command (&out, &err, program, buf, NULL); free (buf); diff --git a/daemon/cmp.c b/daemon/cmp.c index f650083..a2d92a3 100644 --- a/daemon/cmp.c +++ b/daemon/cmp.c @@ -31,7 +31,6 @@ int do_equal (char *file1, char *file2) { char *file1buf, *file2buf; - int file1len, file2len; char *err; int r; @@ -39,24 +38,19 @@ do_equal (char *file1, char *file2) ABS_PATH (file1, -1); ABS_PATH (file2, -1); - file1len = strlen (file1) + 32; - file1buf = malloc (file1len); + file1buf = sysroot_path (file1); if (file1buf == NULL) { reply_with_perror ("malloc"); return -1; } - file2len = strlen (file2) + 32; - file2buf = malloc (file2len); + file2buf = sysroot_path (file2); if (file2buf == NULL) { reply_with_perror ("malloc"); free (file1buf); return -1; } - snprintf (file1buf, file1len, "/sysroot%s", file1); - snprintf (file2buf, file2len, "/sysroot%s", file2); - r = commandr (NULL, &err, "cmp", "-s", file1buf, file2buf, NULL); free (file1buf); diff --git a/daemon/command.c b/daemon/command.c index 3f21807..0399255 100644 --- a/daemon/command.c +++ b/daemon/command.c @@ -31,6 +31,7 @@ do_command (char **argv) { char *out, *err; int r; + char *sysroot_proc, *sysroot_dev, *sysroot_dev_pts, *sysroot_sys; int proc_ok, dev_ok, dev_pts_ok, sys_ok; /* We need a root filesystem mounted to do this. */ @@ -53,23 +54,33 @@ do_command (char **argv) * We deliberately allow these commands to fail silently, BUT * if a mount fails, don't unmount the corresponding mount. */ - r = command (NULL, NULL, "mount", "--bind", "/dev", "/sysroot/dev", NULL); + sysroot_dev = sysroot_path ("/dev"); + sysroot_dev_pts = sysroot_path ("/dev/pts"); + sysroot_proc = sysroot_path ("/proc"); + sysroot_sys = sysroot_path ("/sys"); + + r = command (NULL, NULL, "mount", "--bind", "/dev", sysroot_dev, NULL); dev_ok = r != -1; - r = command (NULL, NULL, "mount", "--bind", "/dev/pts", "/sysroot/dev/pts", NULL); + r = command (NULL, NULL, "mount", "--bind", "/dev/pts", sysroot_dev_pts, NULL); dev_pts_ok = r != -1; - r = command (NULL, NULL, "mount", "--bind", "/proc", "/sysroot/proc", NULL); + r = command (NULL, NULL, "mount", "--bind", "/proc", sysroot_proc, NULL); proc_ok = r != -1; - r = command (NULL, NULL, "mount", "--bind", "/sys", "/sysroot/sys", NULL); + r = command (NULL, NULL, "mount", "--bind", "/sys", sysroot_sys, NULL); sys_ok = r != -1; CHROOT_IN; r = commandv (&out, &err, argv); CHROOT_OUT; - if (sys_ok) command (NULL, NULL, "umount", "/sysroot/sys", NULL); - if (proc_ok) command (NULL, NULL, "umount", "/sysroot/proc", NULL); - if (dev_pts_ok) command (NULL, NULL, "umount", "/sysroot/dev/pts", NULL); - if (dev_ok) command (NULL, NULL, "umount", "/sysroot/dev", NULL); + if (sys_ok) command (NULL, NULL, "umount", sysroot_sys, NULL); + if (proc_ok) command (NULL, NULL, "umount", sysroot_proc, NULL); + if (dev_pts_ok) command (NULL, NULL, "umount", sysroot_dev_pts, NULL); + if (dev_ok) command (NULL, NULL, "umount", sysroot_dev, NULL); + + free (sysroot_dev); + free (sysroot_dev_pts); + free (sysroot_proc); + free (sysroot_sys); if (r == -1) { reply_with_error ("%s", err); diff --git a/daemon/cpmv.c b/daemon/cpmv.c index 5448a97..289a2da 100644 --- a/daemon/cpmv.c +++ b/daemon/cpmv.c @@ -49,7 +49,6 @@ static int cpmv_cmd (const char *cmd, const char *flags, const char *src, const char *dest) { char *srcbuf, *destbuf; - int srclen, destlen; char *err; int r; @@ -57,24 +56,19 @@ cpmv_cmd (const char *cmd, const char *flags, const char *src, const char *dest) ABS_PATH (src, -1); ABS_PATH (dest, -1); - srclen = strlen (src) + 32; - srcbuf = malloc (srclen); + srcbuf = sysroot_path (src); if (srcbuf == NULL) { reply_with_perror ("malloc"); return -1; } - destlen = strlen (dest) + 32; - destbuf = malloc (destlen); + destbuf = sysroot_path (dest); if (destbuf == NULL) { reply_with_perror ("malloc"); free (srcbuf); return -1; } - snprintf (srcbuf, srclen, "/sysroot%s", src); - snprintf (destbuf, destlen, "/sysroot%s", dest); - if (flags) r = command (NULL, &err, cmd, flags, srcbuf, destbuf, NULL); else diff --git a/daemon/daemon.h b/daemon/daemon.h index 814d2b1..c2bbf3e 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -29,6 +29,13 @@ #include "../src/guestfs_protocol.h" /*-- in guestfsd.c --*/ +extern int verbose; + +extern const char *sysroot; +extern int sysroot_len; + +extern char *sysroot_path (const char *path); + extern int xwrite (int sock, const void *buf, size_t len); extern int xread (int sock, void *buf, size_t len); @@ -53,8 +60,6 @@ extern int device_name_translation (char *device, const char *func); extern void udev_settle (void); -extern int verbose; - /*-- in names.c (auto-generated) --*/ extern const char *function_names[]; @@ -172,7 +177,7 @@ extern void reply (xdrproc_t xdrp, char *ret); #define CHROOT_IN \ do { \ int __old_errno = errno; \ - if (chroot ("/sysroot") == -1) \ + if (chroot (sysroot) == -1) \ perror ("CHROOT_IN: sysroot"); \ errno = __old_errno; \ } while (0) diff --git a/daemon/dir.c b/daemon/dir.c index 6eb86bb..a8f066f 100644 --- a/daemon/dir.c +++ b/daemon/dir.c @@ -56,7 +56,7 @@ do_rmdir (char *path) int do_rm_rf (char *path) { - int r, len; + int r; char *buf, *err; NEED_ROOT (-1); @@ -67,15 +67,12 @@ do_rm_rf (char *path) return -1; } - len = strlen (path) + 9; - buf = malloc (len); + buf = sysroot_path (path); if (buf == NULL) { reply_with_perror ("malloc"); return -1; } - snprintf (buf, len, "/sysroot%s", path); - r = command (NULL, &err, "rm", "-rf", buf, NULL); free (buf); diff --git a/daemon/du.c b/daemon/du.c index 6f1adba..735132a 100644 --- a/daemon/du.c +++ b/daemon/du.c @@ -35,19 +35,16 @@ do_du (char *path) int64_t rv; char *out, *err; char *buf; - int len; NEED_ROOT (-1); ABS_PATH (path, -1); /* Make the path relative to /sysroot. */ - len = strlen (path) + 9; - buf = malloc (len); + buf = sysroot_path (path); if (!buf) { reply_with_perror ("malloc"); return -1; } - snprintf (buf, len, "/sysroot%s", path); r = command (&out, &err, "du", "-s", buf, NULL); free (buf); diff --git a/daemon/file.c b/daemon/file.c index 98c356d..851d9e7 100644 --- a/daemon/file.c +++ b/daemon/file.c @@ -328,8 +328,9 @@ char * do_file (char *path) { char *out, *err; - int r, len, freeit = 0; + int r, freeit = 0; char *buf; + int len; NEED_ROOT_OR_IS_DEVICE (path, NULL); ABS_PATH (path, NULL); @@ -337,13 +338,11 @@ do_file (char *path) if (strncmp (path, "/dev/", 5) == 0) buf = (char *) path; else { - len = strlen (path) + 9; - buf = malloc (len); + buf = sysroot_path (path); if (!buf) { reply_with_perror ("malloc"); return NULL; } - snprintf (buf, len, "/sysroot%s", path); freeit = 1; } @@ -389,7 +388,7 @@ do_zfile (char *method, char *path) NEED_ROOT (NULL); ABS_PATH (path, NULL); - len = 2 * strlen (path) + 64; + len = 2 * strlen (path) + sysroot_len + 64; cmd = malloc (len); if (!cmd) { reply_with_perror ("malloc"); @@ -406,7 +405,8 @@ do_zfile (char *method, char *path) return NULL; } - strcat (cmd, " /sysroot"); + strcat (cmd, " "); + strcat (cmd, sysroot); shell_quote (cmd + strlen (cmd), len - strlen (cmd), path); strcat (cmd, " | file -bsL -"); diff --git a/daemon/find.c b/daemon/find.c index 85994b6..d882953 100644 --- a/daemon/find.c +++ b/daemon/find.c @@ -56,21 +56,27 @@ do_find (char *dir) FILE *fp; char **res = NULL; int size = 0, alloc = 0; - char sysrootdir[PATH_MAX]; + char *sysrootdir; char str[PATH_MAX]; NEED_ROOT (NULL); ABS_PATH (dir, NULL); - snprintf (sysrootdir, sizeof sysrootdir, "/sysroot%s", dir); + sysrootdir = sysroot_path (dir); + if (!sysrootdir) { + reply_with_perror ("malloc"); + return NULL; + } r = stat (sysrootdir, &statbuf); if (r == -1) { reply_with_perror ("%s", dir); + free (sysrootdir); return NULL; } if (!S_ISDIR (statbuf.st_mode)) { reply_with_error ("%s: not a directory", dir); + free (sysrootdir); return NULL; } @@ -81,11 +87,13 @@ do_find (char *dir) cmd = malloc (len); if (!cmd) { reply_with_perror ("malloc"); + free (sysrootdir); return NULL; } strcpy (cmd, "find "); shell_quote (cmd+5, len-5, sysrootdir); + free (sysrootdir); strcat (cmd, " -print0"); if (verbose) diff --git a/daemon/grub.c b/daemon/grub.c index 29fe294..3b1768f 100644 --- a/daemon/grub.c +++ b/daemon/grub.c @@ -36,13 +36,13 @@ do_grub_install (char *root, char *device) ABS_PATH (root, -1); IS_DEVICE (device, -1); - len = strlen (root) + 64; + len = strlen (root) + sysroot_len + 64; buf = malloc (len); if (!buf) { reply_with_perror ("malloc"); return -1; } - snprintf (buf, len, "--root-directory=/sysroot%s", root); + snprintf (buf, len, "--root-directory=%s%s", sysroot, root); r = command (NULL, &err, "/sbin/grub-install", buf, device, NULL); free (buf); diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index 87065b9..5c250f0 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -47,6 +47,10 @@ static void usage (void); int verbose = 0; +/* Location to mount root device. */ +const char *sysroot = "/sysroot"; /* No trailing slash. */ +int sysroot_len = 8; + int main (int argc, char *argv[]) { @@ -221,6 +225,25 @@ main (int argc, char *argv[]) exit (0); } +/* Turn "/path" into "/sysroot/path". + * + * Caller must check for NULL and call reply_with_perror ("malloc") + * if it is. Caller must also free the string. + */ +char * +sysroot_path (const char *path) +{ + char *r; + int len = strlen (path) + sysroot_len + 1; + + r = malloc (len); + if (r == NULL) + return NULL; + + snprintf (r, len, "%s%s", sysroot, path); + return r; +} + int xwrite (int sock, const void *buf, size_t len) { diff --git a/daemon/headtail.c b/daemon/headtail.c index 6d24851..af2648c 100644 --- a/daemon/headtail.c +++ b/daemon/headtail.c @@ -32,20 +32,18 @@ headtail (const char *prog, const char *flag, const char *n, char *path) { char *buf; char *out, *err; - int r, len; + int r; char **lines; NEED_ROOT (NULL); ABS_PATH (path, NULL); /* Make the path relative to /sysroot. */ - len = strlen (path) + 9; - buf = malloc (len); + buf = sysroot_path (path); if (!buf) { reply_with_perror ("malloc"); return NULL; } - snprintf (buf, len, "/sysroot%s", path); r = command (&out, &err, prog, flag, n, buf, NULL); free (buf); diff --git a/daemon/hexdump.c b/daemon/hexdump.c index a582c57..e2d8300 100644 --- a/daemon/hexdump.c +++ b/daemon/hexdump.c @@ -28,7 +28,6 @@ char * do_hexdump (char *path) { - int len; char *buf; int r; char *out, *err; @@ -36,15 +35,12 @@ do_hexdump (char *path) NEED_ROOT (NULL); ABS_PATH (path, NULL); - len = strlen (path) + 9; - buf = malloc (len); + buf = sysroot_path (path); if (!buf) { reply_with_perror ("malloc"); return NULL; } - snprintf (buf, len, "/sysroot%s", path); - r = command (&out, &err, "hexdump", "-C", buf, NULL); free (buf); if (r == -1) { diff --git a/daemon/initrd.c b/daemon/initrd.c index 7b32a08..392b811 100644 --- a/daemon/initrd.c +++ b/daemon/initrd.c @@ -41,14 +41,15 @@ do_initrd_list (char *path) ABS_PATH (path, NULL); /* "zcat /sysroot/ | cpio --quiet -it", but path must be quoted. */ - len = 64 + 2 * strlen (path); + len = 64 + sysroot_len + 2 * strlen (path); cmd = malloc (len); if (!cmd) { reply_with_perror ("malloc"); return NULL; } - strcpy (cmd, "zcat /sysroot"); + strcpy (cmd, "zcat "); + strcat (cmd, sysroot); shell_quote (cmd+13, len-13, path); strcat (cmd, " | cpio --quiet -it"); diff --git a/daemon/ls.c b/daemon/ls.c index a440080..4d4714e 100644 --- a/daemon/ls.c +++ b/daemon/ls.c @@ -77,7 +77,7 @@ do_ls (char *path) char * do_ll (char *path) { - int r, len; + int r; char *out, *err; char *spath; @@ -90,13 +90,11 @@ do_ll (char *path) * interactive sessions. For the same reason, you can also "escape" * the sysroot (eg. 'll /..'). */ - len = strlen (path) + 9; - spath = malloc (len); + spath = sysroot_path (path); if (!spath) { reply_with_perror ("malloc"); return NULL; } - snprintf (spath, len, "/sysroot%s", path); r = command (&out, &err, "ls", "-la", spath, NULL); free (spath); diff --git a/daemon/mount.c b/daemon/mount.c index 20811f1..e7265fe 100644 --- a/daemon/mount.c +++ b/daemon/mount.c @@ -44,7 +44,7 @@ int do_mount_vfs (char *options, char *vfstype, char *device, char *mountpoint) { - int len, r, is_root; + int r, is_root; char *mp; char *error; @@ -57,16 +57,12 @@ do_mount_vfs (char *options, char *vfstype, return -1; } - len = strlen (mountpoint) + 9; - - mp = malloc (len); + mp = sysroot_path (mountpoint); if (!mp) { reply_with_perror ("malloc"); return -1; } - snprintf (mp, len, "/sysroot%s", mountpoint); - if (vfstype) r = command (NULL, &error, "mount", "-o", options, "-t", vfstype, device, mp, NULL); @@ -111,7 +107,7 @@ do_mount_options (char *options, char *device, int do_umount (char *pathordevice) { - int len, freeit = 0, r; + int freeit = 0, r; char *buf; char *err; @@ -119,14 +115,12 @@ do_umount (char *pathordevice) buf = pathordevice; IS_DEVICE (buf, -1); } else { - len = strlen (pathordevice) + 9; - freeit = 1; - buf = malloc (len); + buf = sysroot_path (pathordevice); if (buf == NULL) { reply_with_perror ("malloc"); return -1; } - snprintf (buf, len, "/sysroot%s", pathordevice); + freeit = 1; } r = command (NULL, &err, "umount", buf, NULL); @@ -153,6 +147,7 @@ mounts_or_mountpoints (int mp) int size = 0, alloc = 0; char *p, *pend, *p2; int len; + char matching[5 + sysroot_len]; r = command (&out, &err, "mount", NULL); if (r == -1) { @@ -164,6 +159,11 @@ mounts_or_mountpoints (int mp) free (err); + /* Lines have the format: + * /dev/foo on /mountpoint type ... + */ + snprintf (matching, 5 + sysroot_len, " on %s", sysroot); + p = out; while (p) { pend = strchr (p, '\n'); @@ -172,10 +172,7 @@ mounts_or_mountpoints (int mp) pend++; } - /* Lines have the format: - * /dev/foo on /mountpoint type ... - */ - p2 = strstr (p, " on /sysroot"); + p2 = strstr (p, matching); if (p2 != NULL) { *p2 = '\0'; if (add_string (&ret, &size, &alloc, p) == -1) { @@ -183,7 +180,7 @@ mounts_or_mountpoints (int mp) return NULL; } if (mp) { - p2 += 12; /* skip " on /sysroot" */ + p2 += 4 + sysroot_len; /* skip " on /sysroot" */ len = strcspn (p2, " "); if (len == 0) /* .. just /sysroot, so we turn it into "/" */ @@ -249,6 +246,7 @@ do_umount_all (void) char **mounts = NULL; int size = 0, alloc = 0; char *p, *p2, *p3, *pend; + char matching[5 + sysroot_len]; r = command (&out, &err, "mount", NULL); if (r == -1) { @@ -260,6 +258,11 @@ do_umount_all (void) free (err); + /* Lines have the format: + * /dev/foo on /mountpoint type ... + */ + snprintf (matching, 5 + sysroot_len, " on %s", sysroot); + p = out; while (p) { pend = strchr (p, '\n'); @@ -268,10 +271,7 @@ do_umount_all (void) pend++; } - /* Lines have the format: - * /dev/foo on /mountpoint type ... - */ - p2 = strstr (p, " on /sysroot"); + p2 = strstr (p, matching); if (p2 != NULL) { p2 += 4; p3 = p2 + strcspn (p2, " "); @@ -315,7 +315,7 @@ do_umount_all (void) int do_mount_loop (char *file, char *mountpoint) { - int len, r; + int r; char *buf, *mp; char *error; @@ -323,22 +323,18 @@ do_mount_loop (char *file, char *mountpoint) ABS_PATH (file, -1); /* We have to prefix /sysroot on both the filename and the mountpoint. */ - len = strlen (mountpoint) + 9; - mp = malloc (len); + mp = sysroot_path (mountpoint); if (!mp) { reply_with_perror ("malloc"); return -1; } - snprintf (mp, len, "/sysroot%s", mountpoint); - len = strlen (file) + 9; - buf = malloc (len); + buf = sysroot_path (file); if (!file) { reply_with_perror ("malloc"); free (mp); return -1; } - snprintf (buf, len, "/sysroot%s", file); r = command (NULL, &error, "mount", "-o", "loop", buf, mp, NULL); free (mp); diff --git a/daemon/scrub.c b/daemon/scrub.c index 2f14bcb..6e205a0 100644 --- a/daemon/scrub.c +++ b/daemon/scrub.c @@ -51,7 +51,6 @@ int do_scrub_file (char *file) { char *buf; - int len; char *err; int r; @@ -59,13 +58,11 @@ do_scrub_file (char *file) ABS_PATH (file, -1); /* Make the path relative to /sysroot. */ - len = strlen (file) + 9; - buf = malloc (len); + buf = sysroot_path (file); if (!buf) { reply_with_perror ("malloc"); return -1; } - snprintf (buf, len, "/sysroot%s", file); r = command (NULL, &err, "scrub", "-r", buf, NULL); free (buf); @@ -84,7 +81,6 @@ int do_scrub_freespace (char *dir) { char *buf; - int len; char *err; int r; @@ -92,13 +88,11 @@ do_scrub_freespace (char *dir) ABS_PATH (dir, -1); /* Make the path relative to /sysroot. */ - len = strlen (dir) + 9; - buf = malloc (len); + buf = sysroot_path (dir); if (!buf) { reply_with_perror ("malloc"); return -1; } - snprintf (buf, len, "/sysroot%s", dir); r = command (NULL, &err, "scrub", "-X", buf, NULL); free (buf); diff --git a/daemon/strings.c b/daemon/strings.c index 2c52532..c0e073f 100644 --- a/daemon/strings.c +++ b/daemon/strings.c @@ -28,7 +28,6 @@ char ** do_strings_e (char *encoding, char *path) { - int len; char *buf; int r; char *out, *err; @@ -37,15 +36,12 @@ do_strings_e (char *encoding, char *path) NEED_ROOT (NULL); ABS_PATH (path, NULL); - len = strlen (path) + 9; - buf = malloc (len); + buf = sysroot_path (path); if (!buf) { reply_with_perror ("malloc"); return NULL; } - snprintf (buf, len, "/sysroot%s", path); - r = command (&out, &err, "strings", "-e", encoding, buf, NULL); free (buf); if (r == -1) { diff --git a/daemon/tar.c b/daemon/tar.c index 9540827..3008574 100644 --- a/daemon/tar.c +++ b/daemon/tar.c @@ -49,7 +49,7 @@ do_tar_in (char *dir) } /* "tar -C /sysroot%s -xf -" but we have to quote the dir. */ - len = 2 * strlen (dir) + 32; + len = 2 * strlen (dir) + sysroot_len + 32; cmd = malloc (len); if (!cmd) { err = errno; @@ -58,7 +58,8 @@ do_tar_in (char *dir) reply_with_perror ("malloc"); return -1; } - strcpy (cmd, "tar -C /sysroot"); + strcpy (cmd, "tar -C "); + strcat (cmd, sysroot); shell_quote (cmd+15, len-15, dir); strcat (cmd, " -xf -"); @@ -112,13 +113,14 @@ do_tar_out (char *dir) ABS_PATH (dir, -1); /* "tar -C /sysroot%s -cf - ." but we have to quote the dir. */ - len = 2 * strlen (dir) + 32; + len = 2 * strlen (dir) + sysroot_len + 32; cmd = malloc (len); if (!cmd) { reply_with_perror ("malloc"); return -1; } - strcpy (cmd, "tar -C /sysroot"); + strcpy (cmd, "tar -C "); + strcat (cmd, sysroot); shell_quote (cmd+15, len-15, dir); strcat (cmd, " -cf - ."); @@ -175,7 +177,7 @@ do_tgz_in (char *dir) } /* "tar -C /sysroot%s -zxf -" but we have to quote the dir. */ - len = 2 * strlen (dir) + 32; + len = 2 * strlen (dir) + sysroot_len + 32; cmd = malloc (len); if (!cmd) { err = errno; @@ -184,7 +186,8 @@ do_tgz_in (char *dir) reply_with_perror ("malloc"); return -1; } - strcpy (cmd, "tar -C /sysroot"); + strcpy (cmd, "tar -C "); + strcat (cmd, sysroot); shell_quote (cmd+15, len-15, dir); strcat (cmd, " -zxf -"); @@ -238,13 +241,14 @@ do_tgz_out (char *dir) ABS_PATH (dir, -1); /* "tar -C /sysroot%s -zcf - ." but we have to quote the dir. */ - len = 2 * strlen (dir) + 32; + len = 2 * strlen (dir) + sysroot_len + 32; cmd = malloc (len); if (!cmd) { reply_with_perror ("malloc"); return -1; } - strcpy (cmd, "tar -C /sysroot"); + strcpy (cmd, "tar -C "); + strcat (cmd, sysroot); shell_quote (cmd+15, len-15, dir); strcat (cmd, " -zcf - ."); diff --git a/daemon/wc.c b/daemon/wc.c index 370ffdd..4878b57 100644 --- a/daemon/wc.c +++ b/daemon/wc.c @@ -32,19 +32,17 @@ wc (char *flag, char *path) { char *buf; char *out, *err; - int r, len; + int r; NEED_ROOT (-1); ABS_PATH (path, -1); /* Make the path relative to /sysroot. */ - len = strlen (path) + 9; - buf = malloc (len); + buf = sysroot_path (path); if (!buf) { reply_with_perror ("malloc"); return -1; } - snprintf (buf, len, "/sysroot%s", path); r = command (&out, &err, "wc", flag, buf, NULL); free (buf); -- 1.8.3.1