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);
186 /* We document that umask defaults to 022 (it should be this anyway). */
189 /* This is the default for Windows anyway. It's not even clear if
190 * Windows ever uses this -- the MSDN documentation for the function
191 * contains obvious errors.
196 /* Get the vmchannel string.
199 * --channel/-c option on the command line
200 * guestfs_vmchannel=... from the kernel command line
201 * guestfs=... from the kernel command line
204 * At the moment we expect this to contain "tcp:ip:port" but in
205 * future it might contain a device name, eg. "/dev/vcon4" for
206 * virtio-console vmchannel.
208 if (vmchannel == NULL && cmdline) {
212 p = strstr (cmdline, "guestfs_vmchannel=");
214 len = strcspn (p + 18, " \t\n");
215 vmchannel = strndup (p + 18, len);
222 /* Old libraries passed guestfs=host:port. Rewrite it as tcp:host:port. */
223 if (vmchannel == NULL) {
224 /* We will rewrite it part of the "guestfs=" string with
225 * "tcp:" hence p + 4 below. */
226 p = strstr (cmdline, "guestfs=");
228 len = strcspn (p + 4, " \t\n");
229 vmchannel = strndup (p + 4, len);
234 memcpy (vmchannel, "tcp:", 4);
239 /* Default vmchannel. */
240 if (vmchannel == NULL) {
241 vmchannel = strdup ("tcp:" GUESTFWD_ADDR ":" GUESTFWD_PORT);
249 printf ("vmchannel: %s\n", vmchannel);
251 /* Connect to vmchannel. */
254 if (STREQLEN (vmchannel, "tcp:", 4)) {
255 /* Resolve the hostname. */
256 struct addrinfo *res, *rr;
257 struct addrinfo hints;
262 port = strchr (host, ':');
267 fprintf (stderr, "vmchannel: expecting \"tcp:<ip>:<port>\": %s\n",
272 memset (&hints, 0, sizeof hints);
273 hints.ai_socktype = SOCK_STREAM;
274 hints.ai_flags = AI_ADDRCONFIG;
275 r = getaddrinfo (host, port, &hints, &res);
277 fprintf (stderr, "%s:%s: %s\n",
278 host, port, gai_strerror (r));
282 /* Connect to the given TCP socket. */
283 for (rr = res; rr != NULL; rr = rr->ai_next) {
284 sock = socket (rr->ai_family, rr->ai_socktype, rr->ai_protocol);
286 if (connect (sock, rr->ai_addr, rr->ai_addrlen) == 0)
297 "unknown vmchannel connection type: %s\n"
298 "expecting \"tcp:<ip>:<port>\"\n",
306 "Failed to connect to any vmchannel implementation.\n"
309 "This is a fatal error and the appliance will now exit.\n"
311 "Usually this error is caused by either QEMU or the appliance\n"
312 "kernel not supporting the vmchannel method that the\n"
313 "libguestfs library chose to use. Please run\n"
314 "'libguestfs-test-tool' and provide the complete, unedited\n"
315 "output to the libguestfs developers, either in a bug report\n"
316 "or on the libguestfs redhat com mailing list.\n"
322 /* Send the magic length message which indicates that
323 * userspace is up inside the guest.
327 uint32_t len = GUESTFS_LAUNCH_FLAG;
328 xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
329 xdr_u_int (&xdr, &len);
331 if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
336 /* Fork into the background. */
339 if (daemon (0, 1) == -1) {
344 fprintf (stderr, "On Windows the daemon does not support forking into the background.\nYou *must* run the daemon with the -f option.\n");
349 /* Enter the main loop, reading and performing actions. */
355 /* Read /proc/cmdline. */
359 int fd = open ("/proc/cmdline", O_RDONLY);
361 perror ("/proc/cmdline");
371 n = read (fd, buf, sizeof buf);
380 char *newr = realloc (r, len + n + 1); /* + 1 is for terminating NUL */
388 memcpy (&r[len], buf, n);
395 if (close (fd) == -1) {
404 /* Turn "/path" into "/sysroot/path".
406 * Caller must check for NULL and call reply_with_perror ("malloc")
407 * if it is. Caller must also free the string.
409 * See also the custom %R printf formatter which does shell quoting too.
412 sysroot_path (const char *path)
415 int len = strlen (path) + sysroot_len + 1;
421 snprintf (r, len, "%s%s", sysroot, path);
426 xwrite (int sock, const void *v_buf, size_t len)
429 const char *buf = v_buf;
432 r = write (sock, buf, len);
445 xread (int sock, void *v_buf, size_t len)
451 r = read (sock, buf, len);
457 fprintf (stderr, "read: unexpected end of file on fd %d\n", sock);
468 add_string (char ***argv, int *size, int *alloc, const char *str)
473 if (*size >= *alloc) {
475 new_argv = realloc (*argv, *alloc * sizeof (char *));
476 if (new_argv == NULL) {
477 reply_with_perror ("realloc");
478 free_strings (*argv);
485 new_str = strdup (str);
486 if (new_str == NULL) {
487 reply_with_perror ("strdup");
488 free_strings (*argv);
493 (*argv)[*size] = new_str;
500 count_strings (char *const *argv)
504 for (argc = 0; argv[argc] != NULL; ++argc)
510 compare (const void *vp1, const void *vp2)
512 char * const *p1 = (char * const *) vp1;
513 char * const *p2 = (char * const *) vp2;
514 return strcmp (*p1, *p2);
518 sort_strings (char **argv, int len)
520 qsort (argv, len, sizeof (char *), compare);
524 free_strings (char **argv)
528 for (argc = 0; argv[argc] != NULL; ++argc)
534 free_stringslen (char **argv, int len)
538 for (i = 0; i < len; ++i)
543 /* Easy ways to run external commands. For full documentation, see
544 * 'commandrvf' below.
547 commandf (char **stdoutput, char **stderror, int flags, const char *name, ...)
554 /* Collect the command line arguments into an array. */
556 argv = malloc (sizeof (char *) * i);
561 argv[0] = (char *) name;
564 va_start (args, name);
566 while ((s = va_arg (args, char *)) != NULL) {
567 const char **p = realloc (argv, sizeof (char *) * (++i));
581 r = commandvf (stdoutput, stderror, flags, (const char * const*) argv);
583 /* NB: Mustn't free the strings which are on the stack. */
589 /* Same as 'command', but we allow the status code from the
590 * subcommand to be non-zero, and return that status code.
591 * We still return -1 if there was some other error.
594 commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...)
601 /* Collect the command line arguments into an array. */
603 argv = malloc (sizeof (char *) * i);
608 argv[0] = (char *) name;
611 va_start (args, name);
613 while ((s = va_arg (args, char *)) != NULL) {
614 const char **p = realloc (argv, sizeof (char *) * (++i));
628 r = commandrvf (stdoutput, stderror, flags, argv);
630 /* NB: Mustn't free the strings which are on the stack. */
636 /* Same as 'command', but passing an argv. */
638 commandvf (char **stdoutput, char **stderror, int flags,
639 char const *const *argv)
643 r = commandrvf (stdoutput, stderror, flags, (void *) argv);
650 /* This is a more sane version of 'system(3)' for running external
651 * commands. It uses fork/execvp, so we don't need to worry about
652 * quoting of parameters, and it allows us to capture any error
653 * messages in a buffer.
655 * If stdoutput is not NULL, then *stdoutput will return the stdout
658 * If stderror is not NULL, then *stderror will return the stderr
659 * of the command. If there is a final \n character, it is removed
660 * so you can use the error string directly in a call to
665 * COMMAND_FLAG_FOLD_STDOUT_ON_STDERR: For broken external commands
666 * that send error messages to stdout (hello, parted) but that don't
667 * have any useful stdout information, use this flag to capture the
668 * error messages in the *stderror buffer. If using this flag,
669 * you should pass stdoutput as NULL because nothing could ever be
670 * captured in that buffer.
673 commandrvf (char **stdoutput, char **stderror, int flags,
674 char const* const *argv)
676 int so_size = 0, se_size = 0;
677 int so_fd[2], se_fd[2];
684 if (stdoutput) *stdoutput = NULL;
685 if (stderror) *stderror = NULL;
688 printf ("%s", argv[0]);
689 for (i = 1; argv[i] != NULL; ++i)
690 printf (" %s", argv[i]);
694 if (pipe (so_fd) == -1 || pipe (se_fd) == -1) {
709 if (pid == 0) { /* Child process. */
711 open ("/dev/null", O_RDONLY); /* Set stdin to /dev/null (ignore failure) */
714 if (!(flags & COMMAND_FLAG_FOLD_STDOUT_ON_STDERR))
722 execvp (argv[0], (void *) argv);
727 /* Parent process. */
732 FD_SET (so_fd[0], &rset);
733 FD_SET (se_fd[0], &rset);
738 r = select (MAX (so_fd[0], se_fd[0]) + 1, &rset2, NULL, NULL, NULL);
742 if (stdoutput) free (*stdoutput);
743 if (stderror) free (*stderror);
746 waitpid (pid, NULL, 0);
750 if (FD_ISSET (so_fd[0], &rset2)) { /* something on stdout */
751 r = read (so_fd[0], buf, sizeof buf);
756 if (r == 0) { FD_CLR (so_fd[0], &rset); quit++; }
758 if (r > 0 && stdoutput) {
760 p = realloc (*stdoutput, so_size);
766 memcpy (*stdoutput + so_size - r, buf, r);
770 if (FD_ISSET (se_fd[0], &rset2)) { /* something on stderr */
771 r = read (se_fd[0], buf, sizeof buf);
776 if (r == 0) { FD_CLR (se_fd[0], &rset); quit++; }
780 ignore_value (write (2, buf, r));
784 p = realloc (*stderror, se_size);
790 memcpy (*stderror + se_size - r, buf, r);
799 /* Make sure the output buffers are \0-terminated. Also remove any
800 * trailing \n characters from the error buffer (not from stdout).
803 void *q = realloc (*stdoutput, so_size+1);
810 (*stdoutput)[so_size] = '\0';
813 void *q = realloc (*stderror, se_size+1);
820 (*stderror)[se_size] = '\0';
822 while (se_size >= 0 && (*stderror)[se_size] == '\n')
823 (*stderror)[se_size--] = '\0';
827 /* Get the exit status of the command. */
828 if (waitpid (pid, &r, 0) != pid) {
834 return WEXITSTATUS (r);
839 /* Split an output string into a NULL-terminated list of lines.
840 * Typically this is used where we have run an external command
841 * which has printed out a list of things, and we want to return
844 * The corner cases here are quite tricky. Note in particular:
848 * "a\nb" -> ["a"; "b"]
849 * "a\nb\n" -> ["a"; "b"]
850 * "a\nb\n\n" -> ["a"; "b"; ""]
852 * The original string is written over and destroyed by this
853 * function (which is usually OK because it's the 'out' string
854 * from command()). You can free the original string, because
855 * add_string() strdups the strings.
858 split_lines (char *str)
861 int size = 0, alloc = 0;
869 /* Empty last line? */
873 pend = strchr (p, '\n');
879 if (add_string (&lines, &size, &alloc, p) == -1) {
887 if (add_string (&lines, &size, &alloc, NULL) == -1)
893 /* printf helper function so we can use %Q ("quoted") and %R to print
894 * shell-quoted strings. See HACKING file for more details.
897 print_shell_quote (FILE *stream,
898 const struct printf_info *info ATTRIBUTE_UNUSED,
899 const void *const *args)
901 #define SAFE(c) (c_isalnum((c)) || \
902 (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
904 const char *str = *((const char **) (args[0]));
906 for (i = len = 0; str[i]; ++i) {
911 putc (str[i], stream);
919 print_sysroot_shell_quote (FILE *stream,
920 const struct printf_info *info,
921 const void *const *args)
923 fputs (sysroot, stream);
924 return sysroot_len + print_shell_quote (stream, info, args);
927 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
929 print_arginfo (const struct printf_info *info ATTRIBUTE_UNUSED,
930 size_t n, int *argtypes, int *size)
933 argtypes[0] = PA_STRING;
934 size[0] = sizeof (const char *);
939 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
941 print_arginfo (const struct printf_info *info, size_t n, int *argtypes)
944 argtypes[0] = PA_STRING;
948 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
952 /* Perform device name translation. Don't call this directly -
953 * use the RESOLVE_DEVICE macro.
955 * See guestfs(3) for the algorithm.
957 * We have to open the device and test for ENXIO, because
958 * the device nodes themselves will exist in the appliance.
961 device_name_translation (char *device, const char *func)
965 fd = open (device, O_RDONLY);
971 if (errno != ENXIO && errno != ENOENT) {
973 reply_with_perror ("%s: %s", func, device);
977 /* If the name begins with "/dev/sd" then try the alternatives. */
978 if (STRNEQLEN (device, "/dev/sd", 7))
981 device[5] = 'h'; /* /dev/hd (old IDE driver) */
982 fd = open (device, O_RDONLY);
988 device[5] = 'v'; /* /dev/vd (for virtio devices) */
989 fd = open (device, O_RDONLY);
995 device[5] = 's'; /* Restore original device name. */
999 /* LVM and other commands aren't synchronous, especially when udev is
1000 * involved. eg. You can create or remove some device, but the /dev
1001 * device node won't appear until some time later. This means that
1002 * you get an error if you run one command followed by another.
1003 * Use 'udevadm settle' after certain commands, but don't be too
1004 * fussed if it fails.
1009 static int which_prog = 0;
1011 if (which_prog == 0) {
1012 if (access ("/sbin/udevsettle", X_OK) == 0)
1014 else if (access ("/sbin/udevadm", X_OK) == 0)
1020 switch (which_prog) {
1022 command (NULL, NULL, "/sbin/udevadm", "settle", NULL);
1025 command (NULL, NULL, "/sbin/udevsettle", NULL);