X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Finitrd.c;fp=daemon%2Finitrd.c;h=513ed8daa0ba0e0a3299cf9f6cf2d68ec6c46e53;hp=0000000000000000000000000000000000000000;hb=4dff42aa13dd726fb6b02843d0f4db4b4b330fe3;hpb=e492608f2f3809a824cb70ee03ff305964b69dd7 diff --git a/daemon/initrd.c b/daemon/initrd.c new file mode 100644 index 0000000..513ed8d --- /dev/null +++ b/daemon/initrd.c @@ -0,0 +1,88 @@ +/* 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" + +char ** +do_initrd_list (char *path) +{ + FILE *fp; + int len; + char *cmd; + char filename[PATH_MAX]; + char **filenames = NULL; + int size = 0, alloc = 0; + + NEED_ROOT (NULL); + ABS_PATH (path, NULL); + + /* "zcat /sysroot/ | cpio --quiet -it", but path must be quoted. */ + len = 64 + 2 * strlen (path); + cmd = malloc (len); + if (!cmd) { + reply_with_perror ("malloc"); + return NULL; + } + + strcpy (cmd, "zcat /sysroot"); + shell_quote (cmd+13, len-13, path); + strcat (cmd, " | cpio --quiet -it"); + + fprintf (stderr, "%s\n", cmd); + + fp = popen (cmd, "r"); + if (fp == NULL) { + reply_with_perror ("popen: %s", cmd); + free (cmd); + return NULL; + } + free (cmd); + + while (fgets (filename, sizeof filename, fp) != NULL) { + len = strlen (filename); + if (len > 0 && filename[len-1] == '\n') + filename[len-1] = '\0'; + + if (add_string (&filenames, &size, &alloc, filename) == -1) { + pclose (fp); + return NULL; + } + } + + if (add_string (&filenames, &size, &alloc, NULL) == -1) { + pclose (fp); + return NULL; + } + + if (pclose (fp) == -1) { + reply_with_perror ("pclose"); + free_strings (filenames); + return NULL; + } + + return filenames; +}