X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fmount.c;h=1820f8a8e4b79ea2a9b1a1987a77bb55adad5464;hb=9af96c41f64567e6fbe0dd25f6ffa90385e9c49a;hp=4955fcf307704557f3110ea87af6dad28349ea72;hpb=887290e949d54c6ac4c9b787231e588f84f2367c;p=libguestfs.git diff --git a/daemon/mount.c b/daemon/mount.c index 4955fcf..1820f8a 100644 --- a/daemon/mount.c +++ b/daemon/mount.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 @@ -71,6 +71,7 @@ do_mount_vfs (char *options, char *vfstype, else r = command (NULL, &error, "mount", "-o", options, device, mp, NULL); + free (mp); if (r == -1) { reply_with_error ("mount: %s on %s: %s", device, mountpoint, error); free (error); @@ -277,3 +278,47 @@ do_umount_all (void) return 0; } + +/* Mount using the loopback device. You can't use the generic + * do_mount call for this because the first parameter isn't a + * device. + */ +int +do_mount_loop (char *file, char *mountpoint) +{ + int len, r; + char *buf, *mp; + char *error; + + NEED_ROOT (-1); + ABS_PATH (file, -1); + + /* We have to prefix /sysroot on both the filename and the mountpoint. */ + len = strlen (mountpoint) + 9; + mp = malloc (len); + if (!mp) { + reply_with_perror ("malloc"); + return -1; + } + snprintf (mp, len, "/sysroot%s", mountpoint); + + len = strlen (file) + 9; + buf = malloc (len); + 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); + free (buf); + if (r == -1) { + reply_with_error ("mount: %s on %s: %s", file, mountpoint, error); + free (error); + return -1; + } + + return 0; +}