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>
42 #include <arpa/inet.h>
43 #include <netinet/in.h>
51 #include "ignore-value.h"
56 static char *read_cmdline (void);
58 /* Also in guestfs.c */
59 #define GUESTFWD_ADDR "10.0.2.4"
60 #define GUESTFWD_PORT "6666"
62 /* This is only a hint. If not defined, ignore it. */
64 # define AI_ADDRCONFIG 0
68 # define MAX(a,b) ((a)>(b)?(a):(b))
73 static int print_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
74 static int print_sysroot_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
75 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
76 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes, int *size);
78 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
79 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes);
81 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
87 daemon (int nochdir, int noclose)
90 "On Windows the daemon does not support forking into the "
91 "background.\nYou *must* run the daemon with the -f option.\n");
102 /* http://msdn2.microsoft.com/en-us/library/ms742213.aspx */
103 r = gl_sockets_startup (SOCKETS_2_2);
104 return r == 0 ? 0 : -1;
114 /* Location to mount root device. */
115 const char *sysroot = "/sysroot"; /* No trailing slash. */
118 /* Not used explicitly, but required by the gnulib 'error' module. */
119 const char *program_name = "guestfsd";
125 "guestfsd [-f|--foreground] [-c|--channel vmchannel] [-v|--verbose]\n");
129 main (int argc, char *argv[])
131 static const char *options = "fc:v?";
132 static const struct option long_options[] = {
133 { "channel", required_argument, 0, 'c' },
134 { "foreground", 0, 0, 'f' },
135 { "help", 0, 0, '?' },
136 { "verbose", 0, 0, 'v' },
142 char *vmchannel = NULL;
144 if (winsock_init () == -1)
145 error (EXIT_FAILURE, 0, "winsock initialization failed");
147 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
148 /* http://udrepper.livejournal.com/20948.html */
149 register_printf_specifier ('Q', print_shell_quote, print_arginfo);
150 register_printf_specifier ('R', print_sysroot_shell_quote, print_arginfo);
152 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
153 register_printf_function ('Q', print_shell_quote, print_arginfo);
154 register_printf_function ('R', print_sysroot_shell_quote, print_arginfo);
156 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
161 c = getopt_long (argc, argv, options, long_options, NULL);
182 fprintf (stderr, "guestfsd: unexpected command line option 0x%x\n", c);
192 cmdline = read_cmdline ();
194 /* Set the verbose flag. */
196 (cmdline && strstr (cmdline, "guestfs_verbose=1") != NULL);
198 printf ("verbose daemon enabled\n");
202 printf ("linux commmand line: %s\n", cmdline);
204 printf ("could not read linux command line\n");
208 /* Make sure SIGPIPE doesn't kill us. */
210 memset (&sa, 0, sizeof sa);
211 sa.sa_handler = SIG_IGN;
213 if (sigaction (SIGPIPE, &sa, NULL) == -1)
214 perror ("sigaction SIGPIPE"); /* but try to continue anyway ... */
218 # define setenv(n,v,f) _putenv(n "=" v)
220 /* Set up a basic environment. After we are called by /init the
221 * environment is essentially empty.
222 * https://bugzilla.redhat.com/show_bug.cgi?id=502074#c5
224 setenv ("PATH", "/usr/bin:/bin", 1);
225 setenv ("SHELL", "/bin/sh", 1);
226 setenv ("LC_ALL", "C", 1);
229 /* We document that umask defaults to 022 (it should be this anyway). */
232 /* This is the default for Windows anyway. It's not even clear if
233 * Windows ever uses this -- the MSDN documentation for the function
234 * contains obvious errors.
239 /* Get the vmchannel string.
242 * --channel/-c option on the command line
243 * guestfs_vmchannel=... from the kernel command line
244 * guestfs=... from the kernel command line
247 * At the moment we expect this to contain "tcp:ip:port" but in
248 * future it might contain a device name, eg. "/dev/vcon4" for
249 * virtio-console vmchannel.
251 if (vmchannel == NULL && cmdline) {
255 p = strstr (cmdline, "guestfs_vmchannel=");
257 len = strcspn (p + 18, " \t\n");
258 vmchannel = strndup (p + 18, len);
265 /* Old libraries passed guestfs=host:port. Rewrite it as tcp:host:port. */
266 if (vmchannel == NULL) {
267 /* We will rewrite it part of the "guestfs=" string with
268 * "tcp:" hence p + 4 below. */
269 p = strstr (cmdline, "guestfs=");
271 len = strcspn (p + 4, " \t\n");
272 vmchannel = strndup (p + 4, len);
277 memcpy (vmchannel, "tcp:", 4);
282 /* Default vmchannel. */
283 if (vmchannel == NULL) {
284 vmchannel = strdup ("tcp:" GUESTFWD_ADDR ":" GUESTFWD_PORT);
292 printf ("vmchannel: %s\n", vmchannel);
294 /* Connect to vmchannel. */
297 if (STREQLEN (vmchannel, "tcp:", 4)) {
298 /* Resolve the hostname. */
299 struct addrinfo *res, *rr;
300 struct addrinfo hints;
305 port = strchr (host, ':');
310 fprintf (stderr, "vmchannel: expecting \"tcp:<ip>:<port>\": %s\n",
315 memset (&hints, 0, sizeof hints);
316 hints.ai_socktype = SOCK_STREAM;
317 hints.ai_flags = AI_ADDRCONFIG;
318 r = getaddrinfo (host, port, &hints, &res);
320 fprintf (stderr, "%s:%s: %s\n",
321 host, port, gai_strerror (r));
325 /* Connect to the given TCP socket. */
326 for (rr = res; rr != NULL; rr = rr->ai_next) {
327 sock = socket (rr->ai_family, rr->ai_socktype, rr->ai_protocol);
329 if (connect (sock, rr->ai_addr, rr->ai_addrlen) == 0)
340 "unknown vmchannel connection type: %s\n"
341 "expecting \"tcp:<ip>:<port>\"\n",
349 "Failed to connect to any vmchannel implementation.\n"
352 "This is a fatal error and the appliance will now exit.\n"
354 "Usually this error is caused by either QEMU or the appliance\n"
355 "kernel not supporting the vmchannel method that the\n"
356 "libguestfs library chose to use. Please run\n"
357 "'libguestfs-test-tool' and provide the complete, unedited\n"
358 "output to the libguestfs developers, either in a bug report\n"
359 "or on the libguestfs redhat com mailing list.\n"
365 /* Send the magic length message which indicates that
366 * userspace is up inside the guest.
370 uint32_t len = GUESTFS_LAUNCH_FLAG;
371 xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
372 xdr_u_int (&xdr, &len);
374 if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
379 /* Fork into the background. */
381 if (daemon (0, 1) == -1) {
387 /* Enter the main loop, reading and performing actions. */
393 /* Read /proc/cmdline. */
397 int fd = open ("/proc/cmdline", O_RDONLY);
399 perror ("/proc/cmdline");
409 n = read (fd, buf, sizeof buf);
418 char *newr = realloc (r, len + n + 1); /* + 1 is for terminating NUL */
426 memcpy (&r[len], buf, n);
433 if (close (fd) == -1) {
442 /* Turn "/path" into "/sysroot/path".
444 * Caller must check for NULL and call reply_with_perror ("malloc")
445 * if it is. Caller must also free the string.
447 * See also the custom %R printf formatter which does shell quoting too.
450 sysroot_path (const char *path)
453 int len = strlen (path) + sysroot_len + 1;
459 snprintf (r, len, "%s%s", sysroot, path);
464 xwrite (int sock, const void *v_buf, size_t len)
467 const char *buf = v_buf;
470 r = write (sock, buf, len);
483 xread (int sock, void *v_buf, size_t len)
489 r = read (sock, buf, len);
495 fprintf (stderr, "read: unexpected end of file on fd %d\n", sock);
506 add_string (char ***argv, int *size, int *alloc, const char *str)
511 if (*size >= *alloc) {
513 new_argv = realloc (*argv, *alloc * sizeof (char *));
514 if (new_argv == NULL) {
515 reply_with_perror ("realloc");
516 free_strings (*argv);
523 new_str = strdup (str);
524 if (new_str == NULL) {
525 reply_with_perror ("strdup");
526 free_strings (*argv);
531 (*argv)[*size] = new_str;
538 count_strings (char *const *argv)
542 for (argc = 0; argv[argc] != NULL; ++argc)
548 compare (const void *vp1, const void *vp2)
550 char * const *p1 = (char * const *) vp1;
551 char * const *p2 = (char * const *) vp2;
552 return strcmp (*p1, *p2);
556 sort_strings (char **argv, int len)
558 qsort (argv, len, sizeof (char *), compare);
562 free_strings (char **argv)
566 for (argc = 0; argv[argc] != NULL; ++argc)
572 free_stringslen (char **argv, int len)
576 for (i = 0; i < len; ++i)
581 /* Easy ways to run external commands. For full documentation, see
582 * 'commandrvf' below.
585 commandf (char **stdoutput, char **stderror, int flags, const char *name, ...)
592 /* Collect the command line arguments into an array. */
594 argv = malloc (sizeof (char *) * i);
599 argv[0] = (char *) name;
602 va_start (args, name);
604 while ((s = va_arg (args, char *)) != NULL) {
605 const char **p = realloc (argv, sizeof (char *) * (++i));
619 r = commandvf (stdoutput, stderror, flags, (const char * const*) argv);
621 /* NB: Mustn't free the strings which are on the stack. */
627 /* Same as 'command', but we allow the status code from the
628 * subcommand to be non-zero, and return that status code.
629 * We still return -1 if there was some other error.
632 commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...)
639 /* Collect the command line arguments into an array. */
641 argv = malloc (sizeof (char *) * i);
646 argv[0] = (char *) name;
649 va_start (args, name);
651 while ((s = va_arg (args, char *)) != NULL) {
652 const char **p = realloc (argv, sizeof (char *) * (++i));
666 r = commandrvf (stdoutput, stderror, flags, argv);
668 /* NB: Mustn't free the strings which are on the stack. */
674 /* Same as 'command', but passing an argv. */
676 commandvf (char **stdoutput, char **stderror, int flags,
677 char const *const *argv)
681 r = commandrvf (stdoutput, stderror, flags, (void *) argv);
688 /* This is a more sane version of 'system(3)' for running external
689 * commands. It uses fork/execvp, so we don't need to worry about
690 * quoting of parameters, and it allows us to capture any error
691 * messages in a buffer.
693 * If stdoutput is not NULL, then *stdoutput will return the stdout
696 * If stderror is not NULL, then *stderror will return the stderr
697 * of the command. If there is a final \n character, it is removed
698 * so you can use the error string directly in a call to
703 * COMMAND_FLAG_FOLD_STDOUT_ON_STDERR: For broken external commands
704 * that send error messages to stdout (hello, parted) but that don't
705 * have any useful stdout information, use this flag to capture the
706 * error messages in the *stderror buffer. If using this flag,
707 * you should pass stdoutput as NULL because nothing could ever be
708 * captured in that buffer.
711 commandrvf (char **stdoutput, char **stderror, int flags,
712 char const* const *argv)
714 int so_size = 0, se_size = 0;
715 int so_fd[2], se_fd[2];
722 if (stdoutput) *stdoutput = NULL;
723 if (stderror) *stderror = NULL;
726 printf ("%s", argv[0]);
727 for (i = 1; argv[i] != NULL; ++i)
728 printf (" %s", argv[i]);
732 if (pipe (so_fd) == -1 || pipe (se_fd) == -1) {
747 if (pid == 0) { /* Child process. */
749 open ("/dev/null", O_RDONLY); /* Set stdin to /dev/null (ignore failure) */
752 if (!(flags & COMMAND_FLAG_FOLD_STDOUT_ON_STDERR))
760 execvp (argv[0], (void *) argv);
765 /* Parent process. */
770 FD_SET (so_fd[0], &rset);
771 FD_SET (se_fd[0], &rset);
776 r = select (MAX (so_fd[0], se_fd[0]) + 1, &rset2, NULL, NULL, NULL);
780 if (stdoutput) free (*stdoutput);
781 if (stderror) free (*stderror);
784 waitpid (pid, NULL, 0);
788 if (FD_ISSET (so_fd[0], &rset2)) { /* something on stdout */
789 r = read (so_fd[0], buf, sizeof buf);
794 if (r == 0) { FD_CLR (so_fd[0], &rset); quit++; }
796 if (r > 0 && stdoutput) {
798 p = realloc (*stdoutput, so_size);
804 memcpy (*stdoutput + so_size - r, buf, r);
808 if (FD_ISSET (se_fd[0], &rset2)) { /* something on stderr */
809 r = read (se_fd[0], buf, sizeof buf);
814 if (r == 0) { FD_CLR (se_fd[0], &rset); quit++; }
818 ignore_value (write (2, buf, r));
822 p = realloc (*stderror, se_size);
828 memcpy (*stderror + se_size - r, buf, r);
837 /* Make sure the output buffers are \0-terminated. Also remove any
838 * trailing \n characters from the error buffer (not from stdout).
841 void *q = realloc (*stdoutput, so_size+1);
848 (*stdoutput)[so_size] = '\0';
851 void *q = realloc (*stderror, se_size+1);
858 (*stderror)[se_size] = '\0';
860 while (se_size >= 0 && (*stderror)[se_size] == '\n')
861 (*stderror)[se_size--] = '\0';
865 /* Get the exit status of the command. */
866 if (waitpid (pid, &r, 0) != pid) {
872 return WEXITSTATUS (r);
877 /* Split an output string into a NULL-terminated list of lines.
878 * Typically this is used where we have run an external command
879 * which has printed out a list of things, and we want to return
882 * The corner cases here are quite tricky. Note in particular:
886 * "a\nb" -> ["a"; "b"]
887 * "a\nb\n" -> ["a"; "b"]
888 * "a\nb\n\n" -> ["a"; "b"; ""]
890 * The original string is written over and destroyed by this
891 * function (which is usually OK because it's the 'out' string
892 * from command()). You can free the original string, because
893 * add_string() strdups the strings.
896 split_lines (char *str)
899 int size = 0, alloc = 0;
907 /* Empty last line? */
911 pend = strchr (p, '\n');
917 if (add_string (&lines, &size, &alloc, p) == -1) {
925 if (add_string (&lines, &size, &alloc, NULL) == -1)
931 /* Skip leading and trailing whitespace, updating the original string
937 size_t len = strlen (str);
939 while (len > 0 && c_isspace (str[len-1])) {
945 while (*p && c_isspace (*p)) {
950 memmove (str, p, len+1);
953 /* printf helper function so we can use %Q ("quoted") and %R to print
954 * shell-quoted strings. See HACKING file for more details.
957 print_shell_quote (FILE *stream,
958 const struct printf_info *info ATTRIBUTE_UNUSED,
959 const void *const *args)
961 #define SAFE(c) (c_isalnum((c)) || \
962 (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
964 const char *str = *((const char **) (args[0]));
966 for (i = len = 0; str[i]; ++i) {
971 putc (str[i], stream);
979 print_sysroot_shell_quote (FILE *stream,
980 const struct printf_info *info,
981 const void *const *args)
983 fputs (sysroot, stream);
984 return sysroot_len + print_shell_quote (stream, info, args);
987 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
989 print_arginfo (const struct printf_info *info ATTRIBUTE_UNUSED,
990 size_t n, int *argtypes, int *size)
993 argtypes[0] = PA_STRING;
994 size[0] = sizeof (const char *);
999 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
1001 print_arginfo (const struct printf_info *info, size_t n, int *argtypes)
1004 argtypes[0] = PA_STRING;
1008 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
1012 /* Perform device name translation. Don't call this directly -
1013 * use the RESOLVE_DEVICE macro.
1015 * See guestfs(3) for the algorithm.
1017 * We have to open the device and test for ENXIO, because
1018 * the device nodes themselves will exist in the appliance.
1021 device_name_translation (char *device, const char *func)
1025 fd = open (device, O_RDONLY);
1031 if (errno != ENXIO && errno != ENOENT) {
1033 reply_with_perror ("%s: %s", func, device);
1037 /* If the name begins with "/dev/sd" then try the alternatives. */
1038 if (STRNEQLEN (device, "/dev/sd", 7))
1041 device[5] = 'h'; /* /dev/hd (old IDE driver) */
1042 fd = open (device, O_RDONLY);
1048 device[5] = 'v'; /* /dev/vd (for virtio devices) */
1049 fd = open (device, O_RDONLY);
1055 device[5] = 's'; /* Restore original device name. */
1059 /* LVM and other commands aren't synchronous, especially when udev is
1060 * involved. eg. You can create or remove some device, but the /dev
1061 * device node won't appear until some time later. This means that
1062 * you get an error if you run one command followed by another.
1064 * Use 'udevadm settle' after certain commands, but don't be too
1065 * fussed if it fails.
1067 * 'udevsettle' was the old name for this command (RHEL 5). This was
1068 * deprecated in favour of 'udevadm settle'. The old 'udevsettle'
1069 * command was left as a symlink. Then in Fedora 13 the old symlink
1070 * remained but it stopped working (RHBZ#548121), so we have to be
1071 * careful not to assume that we can use 'udevsettle' if it exists.
1076 (void) command (NULL, NULL, "/sbin/udevadm", "settle", NULL);
1077 (void) command (NULL, NULL, "/sbin/udevsettle", NULL);