1 /* libguestfs - the guestfsd daemon
2 * Copyright (C) 2009 Red Hat Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #define _BSD_SOURCE /* for daemon(3) */
31 #include <rpc/types.h>
34 #include <sys/param.h>
35 #include <sys/types.h>
40 #include <sys/select.h>
48 #include "ignore-value.h"
52 static char *read_cmdline (void);
54 /* Also in guestfs.c */
55 #define GUESTFWD_ADDR "10.0.2.4"
56 #define GUESTFWD_PORT "6666"
58 /* This is only a hint. If not defined, ignore it. */
60 #define AI_ADDRCONFIG 0
65 static int print_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
66 static int print_sysroot_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
67 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
68 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes, int *size);
70 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
71 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes);
73 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
77 /* Location to mount root device. */
78 const char *sysroot = "/sysroot"; /* No trailing slash. */
85 "guestfsd [-f|--foreground] [-c|--channel vmchannel] [-v|--verbose]\n");
89 main (int argc, char *argv[])
91 static const char *options = "fc:v?";
92 static const struct option long_options[] = {
93 { "channel", required_argument, 0, 'c' },
94 { "foreground", 0, 0, 'f' },
95 { "help", 0, 0, '?' },
96 { "verbose", 0, 0, 'v' },
102 char *vmchannel = NULL;
104 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
105 /* http://udrepper.livejournal.com/20948.html */
106 register_printf_specifier ('Q', print_shell_quote, print_arginfo);
107 register_printf_specifier ('R', print_sysroot_shell_quote, print_arginfo);
109 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
110 register_printf_function ('Q', print_shell_quote, print_arginfo);
111 register_printf_function ('R', print_sysroot_shell_quote, print_arginfo);
113 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
118 c = getopt_long (argc, argv, options, long_options, NULL);
139 fprintf (stderr, "guestfsd: unexpected command line option 0x%x\n", c);
149 cmdline = read_cmdline ();
151 /* Set the verbose flag. */
153 (cmdline && strstr (cmdline, "guestfs_verbose=1") != NULL);
155 printf ("verbose daemon enabled\n");
159 printf ("linux commmand line: %s\n", cmdline);
161 printf ("could not read linux command line\n");
165 /* Make sure SIGPIPE doesn't kill us. */
167 memset (&sa, 0, sizeof sa);
168 sa.sa_handler = SIG_IGN;
170 if (sigaction (SIGPIPE, &sa, NULL) == -1)
171 perror ("sigaction SIGPIPE"); /* but try to continue anyway ... */
175 #define setenv(n,v,f) _putenv(n "=" v)
177 /* Set up a basic environment. After we are called by /init the
178 * environment is essentially empty.
179 * https://bugzilla.redhat.com/show_bug.cgi?id=502074#c5
181 setenv ("PATH", "/usr/bin:/bin", 1);
182 setenv ("SHELL", "/bin/sh", 1);
183 setenv ("LC_ALL", "C", 1);
185 /* We document that umask defaults to 022 (it should be this anyway). */
188 /* Get the vmchannel string.
191 * --channel/-c option on the command line
192 * guestfs_vmchannel=... from the kernel command line
193 * guestfs=... from the kernel command line
196 * At the moment we expect this to contain "tcp:ip:port" but in
197 * future it might contain a device name, eg. "/dev/vcon4" for
198 * virtio-console vmchannel.
200 if (vmchannel == NULL && cmdline) {
204 p = strstr (cmdline, "guestfs_vmchannel=");
206 len = strcspn (p + 18, " \t\n");
207 vmchannel = strndup (p + 18, len);
214 /* Old libraries passed guestfs=host:port. Rewrite it as tcp:host:port. */
215 if (vmchannel == NULL) {
216 /* We will rewrite it part of the "guestfs=" string with
217 * "tcp:" hence p + 4 below. */
218 p = strstr (cmdline, "guestfs=");
220 len = strcspn (p + 4, " \t\n");
221 vmchannel = strndup (p + 4, len);
226 memcpy (vmchannel, "tcp:", 4);
231 /* Default vmchannel. */
232 if (vmchannel == NULL) {
233 vmchannel = strdup ("tcp:" GUESTFWD_ADDR ":" GUESTFWD_PORT);
241 printf ("vmchannel: %s\n", vmchannel);
243 /* Connect to vmchannel. */
246 if (STREQLEN (vmchannel, "tcp:", 4)) {
247 /* Resolve the hostname. */
248 struct addrinfo *res, *rr;
249 struct addrinfo hints;
254 port = strchr (host, ':');
259 fprintf (stderr, "vmchannel: expecting \"tcp:<ip>:<port>\": %s\n",
264 memset (&hints, 0, sizeof hints);
265 hints.ai_socktype = SOCK_STREAM;
266 hints.ai_flags = AI_ADDRCONFIG;
267 r = getaddrinfo (host, port, &hints, &res);
269 fprintf (stderr, "%s:%s: %s\n",
270 host, port, gai_strerror (r));
274 /* Connect to the given TCP socket. */
275 for (rr = res; rr != NULL; rr = rr->ai_next) {
276 sock = socket (rr->ai_family, rr->ai_socktype, rr->ai_protocol);
278 if (connect (sock, rr->ai_addr, rr->ai_addrlen) == 0)
289 "unknown vmchannel connection type: %s\n"
290 "expecting \"tcp:<ip>:<port>\"\n",
298 "Failed to connect to any vmchannel implementation.\n"
301 "This is a fatal error and the appliance will now exit.\n"
303 "Usually this error is caused by either QEMU or the appliance\n"
304 "kernel not supporting the vmchannel method that the\n"
305 "libguestfs library chose to use. Please run\n"
306 "'libguestfs-test-tool' and provide the complete, unedited\n"
307 "output to the libguestfs developers, either in a bug report\n"
308 "or on the libguestfs redhat com mailing list.\n"
314 /* Send the magic length message which indicates that
315 * userspace is up inside the guest.
319 uint32_t len = GUESTFS_LAUNCH_FLAG;
320 xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
321 xdr_u_int (&xdr, &len);
323 if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
328 /* Fork into the background. */
330 if (daemon (0, 1) == -1) {
336 /* Enter the main loop, reading and performing actions. */
342 /* Read /proc/cmdline. */
346 int fd = open ("/proc/cmdline", O_RDONLY);
348 perror ("/proc/cmdline");
358 n = read (fd, buf, sizeof buf);
367 char *newr = realloc (r, len + n + 1); /* + 1 is for terminating NUL */
375 memcpy (&r[len], buf, n);
382 if (close (fd) == -1) {
391 /* Turn "/path" into "/sysroot/path".
393 * Caller must check for NULL and call reply_with_perror ("malloc")
394 * if it is. Caller must also free the string.
396 * See also the custom %R printf formatter which does shell quoting too.
399 sysroot_path (const char *path)
402 int len = strlen (path) + sysroot_len + 1;
408 snprintf (r, len, "%s%s", sysroot, path);
413 xwrite (int sock, const void *v_buf, size_t len)
416 const char *buf = v_buf;
419 r = write (sock, buf, len);
432 xread (int sock, void *v_buf, size_t len)
438 r = read (sock, buf, len);
444 fprintf (stderr, "read: unexpected end of file on fd %d\n", sock);
455 add_string (char ***argv, int *size, int *alloc, const char *str)
460 if (*size >= *alloc) {
462 new_argv = realloc (*argv, *alloc * sizeof (char *));
463 if (new_argv == NULL) {
464 reply_with_perror ("realloc");
465 free_strings (*argv);
472 new_str = strdup (str);
473 if (new_str == NULL) {
474 reply_with_perror ("strdup");
475 free_strings (*argv);
480 (*argv)[*size] = new_str;
487 count_strings (char *const *argv)
491 for (argc = 0; argv[argc] != NULL; ++argc)
497 compare (const void *vp1, const void *vp2)
499 char * const *p1 = (char * const *) vp1;
500 char * const *p2 = (char * const *) vp2;
501 return strcmp (*p1, *p2);
505 sort_strings (char **argv, int len)
507 qsort (argv, len, sizeof (char *), compare);
511 free_strings (char **argv)
515 for (argc = 0; argv[argc] != NULL; ++argc)
521 free_stringslen (char **argv, int len)
525 for (i = 0; i < len; ++i)
530 /* Easy ways to run external commands. For full documentation, see
531 * 'commandrvf' below.
534 commandf (char **stdoutput, char **stderror, int flags, const char *name, ...)
541 /* Collect the command line arguments into an array. */
543 argv = malloc (sizeof (char *) * i);
548 argv[0] = (char *) name;
551 va_start (args, name);
553 while ((s = va_arg (args, char *)) != NULL) {
554 const char **p = realloc (argv, sizeof (char *) * (++i));
568 r = commandvf (stdoutput, stderror, flags, (const char * const*) argv);
570 /* NB: Mustn't free the strings which are on the stack. */
576 /* Same as 'command', but we allow the status code from the
577 * subcommand to be non-zero, and return that status code.
578 * We still return -1 if there was some other error.
581 commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...)
588 /* Collect the command line arguments into an array. */
590 argv = malloc (sizeof (char *) * i);
595 argv[0] = (char *) name;
598 va_start (args, name);
600 while ((s = va_arg (args, char *)) != NULL) {
601 const char **p = realloc (argv, sizeof (char *) * (++i));
615 r = commandrvf (stdoutput, stderror, flags, argv);
617 /* NB: Mustn't free the strings which are on the stack. */
623 /* Same as 'command', but passing an argv. */
625 commandvf (char **stdoutput, char **stderror, int flags,
626 char const *const *argv)
630 r = commandrvf (stdoutput, stderror, flags, (void *) argv);
637 /* This is a more sane version of 'system(3)' for running external
638 * commands. It uses fork/execvp, so we don't need to worry about
639 * quoting of parameters, and it allows us to capture any error
640 * messages in a buffer.
642 * If stdoutput is not NULL, then *stdoutput will return the stdout
645 * If stderror is not NULL, then *stderror will return the stderr
646 * of the command. If there is a final \n character, it is removed
647 * so you can use the error string directly in a call to
652 * COMMAND_FLAG_FOLD_STDOUT_ON_STDERR: For broken external commands
653 * that send error messages to stdout (hello, parted) but that don't
654 * have any useful stdout information, use this flag to capture the
655 * error messages in the *stderror buffer. If using this flag,
656 * you should pass stdoutput as NULL because nothing could ever be
657 * captured in that buffer.
660 commandrvf (char **stdoutput, char **stderror, int flags,
661 char const* const *argv)
663 int so_size = 0, se_size = 0;
664 int so_fd[2], se_fd[2];
671 if (stdoutput) *stdoutput = NULL;
672 if (stderror) *stderror = NULL;
675 printf ("%s", argv[0]);
676 for (i = 1; argv[i] != NULL; ++i)
677 printf (" %s", argv[i]);
681 if (pipe (so_fd) == -1 || pipe (se_fd) == -1) {
696 if (pid == 0) { /* Child process. */
698 open ("/dev/null", O_RDONLY); /* Set stdin to /dev/null (ignore failure) */
701 if (!(flags & COMMAND_FLAG_FOLD_STDOUT_ON_STDERR))
709 execvp (argv[0], (void *) argv);
714 /* Parent process. */
719 FD_SET (so_fd[0], &rset);
720 FD_SET (se_fd[0], &rset);
725 r = select (MAX (so_fd[0], se_fd[0]) + 1, &rset2, NULL, NULL, NULL);
729 if (stdoutput) free (*stdoutput);
730 if (stderror) free (*stderror);
733 waitpid (pid, NULL, 0);
737 if (FD_ISSET (so_fd[0], &rset2)) { /* something on stdout */
738 r = read (so_fd[0], buf, sizeof buf);
743 if (r == 0) { FD_CLR (so_fd[0], &rset); quit++; }
745 if (r > 0 && stdoutput) {
747 p = realloc (*stdoutput, so_size);
753 memcpy (*stdoutput + so_size - r, buf, r);
757 if (FD_ISSET (se_fd[0], &rset2)) { /* something on stderr */
758 r = read (se_fd[0], buf, sizeof buf);
763 if (r == 0) { FD_CLR (se_fd[0], &rset); quit++; }
767 ignore_value (write (2, buf, r));
771 p = realloc (*stderror, se_size);
777 memcpy (*stderror + se_size - r, buf, r);
786 /* Make sure the output buffers are \0-terminated. Also remove any
787 * trailing \n characters from the error buffer (not from stdout).
790 void *q = realloc (*stdoutput, so_size+1);
797 (*stdoutput)[so_size] = '\0';
800 void *q = realloc (*stderror, se_size+1);
807 (*stderror)[se_size] = '\0';
809 while (se_size >= 0 && (*stderror)[se_size] == '\n')
810 (*stderror)[se_size--] = '\0';
814 /* Get the exit status of the command. */
815 if (waitpid (pid, &r, 0) != pid) {
821 return WEXITSTATUS (r);
826 /* Split an output string into a NULL-terminated list of lines.
827 * Typically this is used where we have run an external command
828 * which has printed out a list of things, and we want to return
831 * The corner cases here are quite tricky. Note in particular:
835 * "a\nb" -> ["a"; "b"]
836 * "a\nb\n" -> ["a"; "b"]
837 * "a\nb\n\n" -> ["a"; "b"; ""]
839 * The original string is written over and destroyed by this
840 * function (which is usually OK because it's the 'out' string
841 * from command()). You can free the original string, because
842 * add_string() strdups the strings.
845 split_lines (char *str)
848 int size = 0, alloc = 0;
856 /* Empty last line? */
860 pend = strchr (p, '\n');
866 if (add_string (&lines, &size, &alloc, p) == -1) {
874 if (add_string (&lines, &size, &alloc, NULL) == -1)
880 /* printf helper function so we can use %Q ("quoted") and %R to print
881 * shell-quoted strings. See HACKING file for more details.
884 print_shell_quote (FILE *stream,
885 const struct printf_info *info ATTRIBUTE_UNUSED,
886 const void *const *args)
888 #define SAFE(c) (c_isalnum((c)) || \
889 (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
891 const char *str = *((const char **) (args[0]));
893 for (i = len = 0; str[i]; ++i) {
898 putc (str[i], stream);
906 print_sysroot_shell_quote (FILE *stream,
907 const struct printf_info *info,
908 const void *const *args)
910 fputs (sysroot, stream);
911 return sysroot_len + print_shell_quote (stream, info, args);
914 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
916 print_arginfo (const struct printf_info *info ATTRIBUTE_UNUSED,
917 size_t n, int *argtypes, int *size)
920 argtypes[0] = PA_STRING;
921 size[0] = sizeof (const char *);
926 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
928 print_arginfo (const struct printf_info *info, size_t n, int *argtypes)
931 argtypes[0] = PA_STRING;
935 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
939 /* Perform device name translation. Don't call this directly -
940 * use the RESOLVE_DEVICE macro.
942 * See guestfs(3) for the algorithm.
944 * We have to open the device and test for ENXIO, because
945 * the device nodes themselves will exist in the appliance.
948 device_name_translation (char *device, const char *func)
952 fd = open (device, O_RDONLY);
958 if (errno != ENXIO && errno != ENOENT) {
960 reply_with_perror ("%s: %s", func, device);
964 /* If the name begins with "/dev/sd" then try the alternatives. */
965 if (STRNEQLEN (device, "/dev/sd", 7))
968 device[5] = 'h'; /* /dev/hd (old IDE driver) */
969 fd = open (device, O_RDONLY);
975 device[5] = 'v'; /* /dev/vd (for virtio devices) */
976 fd = open (device, O_RDONLY);
982 device[5] = 's'; /* Restore original device name. */
986 /* LVM and other commands aren't synchronous, especially when udev is
987 * involved. eg. You can create or remove some device, but the /dev
988 * device node won't appear until some time later. This means that
989 * you get an error if you run one command followed by another.
990 * Use 'udevadm settle' after certain commands, but don't be too
991 * fussed if it fails.
996 static int which_prog = 0;
998 if (which_prog == 0) {
999 if (access ("/sbin/udevsettle", X_OK) == 0)
1001 else if (access ("/sbin/udevadm", X_OK) == 0)
1007 switch (which_prog) {
1009 command (NULL, NULL, "/sbin/udevadm", "settle", NULL);
1012 command (NULL, NULL, "/sbin/udevsettle", NULL);