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) */
27 #include <rpc/types.h>
30 #include <sys/param.h>
31 #include <sys/types.h>
36 #include <sys/select.h>
44 #include "ignore-value.h"
48 static char *read_cmdline (void);
50 /* Also in guestfs.c */
51 #define GUESTFWD_ADDR "10.0.2.4"
52 #define GUESTFWD_PORT "6666"
54 /* This is only a hint. If not defined, ignore it. */
56 #define AI_ADDRCONFIG 0
61 static int print_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
62 static int print_sysroot_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
63 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
64 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes, int *size);
66 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
67 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes);
69 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
73 /* Location to mount root device. */
74 const char *sysroot = "/sysroot"; /* No trailing slash. */
81 "guestfsd [-f|--foreground] [-c|--channel vmchannel] [-v|--verbose]\n");
85 main (int argc, char *argv[])
87 static const char *options = "fc:v?";
88 static const struct option long_options[] = {
89 { "channel", required_argument, 0, 'c' },
90 { "foreground", 0, 0, 'f' },
91 { "help", 0, 0, '?' },
92 { "verbose", 0, 0, 'v' },
98 char *vmchannel = NULL;
100 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
101 /* http://udrepper.livejournal.com/20948.html */
102 register_printf_specifier ('Q', print_shell_quote, print_arginfo);
103 register_printf_specifier ('R', print_sysroot_shell_quote, print_arginfo);
105 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
106 register_printf_function ('Q', print_shell_quote, print_arginfo);
107 register_printf_function ('R', print_sysroot_shell_quote, print_arginfo);
109 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
114 c = getopt_long (argc, argv, options, long_options, NULL);
135 fprintf (stderr, "guestfsd: unexpected command line option 0x%x\n", c);
145 cmdline = read_cmdline ();
147 /* Set the verbose flag. */
149 (cmdline && strstr (cmdline, "guestfs_verbose=1") != NULL);
151 printf ("verbose daemon enabled\n");
155 printf ("linux commmand line: %s\n", cmdline);
157 printf ("could not read linux command line\n");
160 /* Make sure SIGPIPE doesn't kill us. */
162 memset (&sa, 0, sizeof sa);
163 sa.sa_handler = SIG_IGN;
165 if (sigaction (SIGPIPE, &sa, NULL) == -1)
166 perror ("sigaction SIGPIPE"); /* but try to continue anyway ... */
168 /* Set up a basic environment. After we are called by /init the
169 * environment is essentially empty.
170 * https://bugzilla.redhat.com/show_bug.cgi?id=502074#c5
172 setenv ("PATH", "/usr/bin:/bin", 1);
173 setenv ("SHELL", "/bin/sh", 1);
174 setenv ("LC_ALL", "C", 1);
176 /* We document that umask defaults to 022 (it should be this anyway). */
179 /* Get the vmchannel string.
182 * --channel/-c option on the command line
183 * guestfs_vmchannel=... from the kernel command line
184 * guestfs=... from the kernel command line
187 * At the moment we expect this to contain "tcp:ip:port" but in
188 * future it might contain a device name, eg. "/dev/vcon4" for
189 * virtio-console vmchannel.
191 if (vmchannel == NULL && cmdline) {
195 p = strstr (cmdline, "guestfs_vmchannel=");
197 len = strcspn (p + 18, " \t\n");
198 vmchannel = strndup (p + 18, len);
205 /* Old libraries passed guestfs=host:port. Rewrite it as tcp:host:port. */
206 if (vmchannel == NULL) {
207 /* We will rewrite it part of the "guestfs=" string with
208 * "tcp:" hence p + 4 below. */
209 p = strstr (cmdline, "guestfs=");
211 len = strcspn (p + 4, " \t\n");
212 vmchannel = strndup (p + 4, len);
217 memcpy (vmchannel, "tcp:", 4);
222 /* Default vmchannel. */
223 if (vmchannel == NULL) {
224 vmchannel = strdup ("tcp:" GUESTFWD_ADDR ":" GUESTFWD_PORT);
232 printf ("vmchannel: %s\n", vmchannel);
234 /* Connect to vmchannel. */
237 if (STREQLEN (vmchannel, "tcp:", 4)) {
238 /* Resolve the hostname. */
239 struct addrinfo *res, *rr;
240 struct addrinfo hints;
245 port = strchr (host, ':');
250 fprintf (stderr, "vmchannel: expecting \"tcp:<ip>:<port>\": %s\n",
255 memset (&hints, 0, sizeof hints);
256 hints.ai_socktype = SOCK_STREAM;
257 hints.ai_flags = AI_ADDRCONFIG;
258 r = getaddrinfo (host, port, &hints, &res);
260 fprintf (stderr, "%s:%s: %s\n",
261 host, port, gai_strerror (r));
265 /* Connect to the given TCP socket. */
266 for (rr = res; rr != NULL; rr = rr->ai_next) {
267 sock = socket (rr->ai_family, rr->ai_socktype, rr->ai_protocol);
269 if (connect (sock, rr->ai_addr, rr->ai_addrlen) == 0)
280 "unknown vmchannel connection type: %s\n"
281 "expecting \"tcp:<ip>:<port>\"\n",
289 "Failed to connect to any vmchannel implementation.\n"
292 "This is a fatal error and the appliance will now exit.\n"
294 "Usually this error is caused by either QEMU or the appliance\n"
295 "kernel not supporting the vmchannel method that the\n"
296 "libguestfs library chose to use. Please run\n"
297 "'libguestfs-test-tool' and provide the complete, unedited\n"
298 "output to the libguestfs developers, either in a bug report\n"
299 "or on the libguestfs redhat com mailing list.\n"
305 /* Send the magic length message which indicates that
306 * userspace is up inside the guest.
310 uint32_t len = GUESTFS_LAUNCH_FLAG;
311 xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
312 xdr_uint32_t (&xdr, &len);
314 if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
319 /* Fork into the background. */
321 if (daemon (0, 1) == -1) {
327 /* Enter the main loop, reading and performing actions. */
333 /* Read /proc/cmdline. */
337 int fd = open ("/proc/cmdline", O_RDONLY);
339 perror ("/proc/cmdline");
349 n = read (fd, buf, sizeof buf);
358 char *newr = realloc (r, len + n + 1); /* + 1 is for terminating NUL */
366 memcpy (&r[len], buf, n);
373 if (close (fd) == -1) {
382 /* Turn "/path" into "/sysroot/path".
384 * Caller must check for NULL and call reply_with_perror ("malloc")
385 * if it is. Caller must also free the string.
387 * See also the custom %R printf formatter which does shell quoting too.
390 sysroot_path (const char *path)
393 int len = strlen (path) + sysroot_len + 1;
399 snprintf (r, len, "%s%s", sysroot, path);
404 xwrite (int sock, const void *v_buf, size_t len)
407 const char *buf = v_buf;
410 r = write (sock, buf, len);
423 xread (int sock, void *v_buf, size_t len)
429 r = read (sock, buf, len);
435 fprintf (stderr, "read: unexpected end of file on fd %d\n", sock);
446 add_string (char ***argv, int *size, int *alloc, const char *str)
451 if (*size >= *alloc) {
453 new_argv = realloc (*argv, *alloc * sizeof (char *));
454 if (new_argv == NULL) {
455 reply_with_perror ("realloc");
456 free_strings (*argv);
463 new_str = strdup (str);
464 if (new_str == NULL) {
465 reply_with_perror ("strdup");
466 free_strings (*argv);
471 (*argv)[*size] = new_str;
478 count_strings (char *const *argv)
482 for (argc = 0; argv[argc] != NULL; ++argc)
488 compare (const void *vp1, const void *vp2)
490 char * const *p1 = (char * const *) vp1;
491 char * const *p2 = (char * const *) vp2;
492 return strcmp (*p1, *p2);
496 sort_strings (char **argv, int len)
498 qsort (argv, len, sizeof (char *), compare);
502 free_strings (char **argv)
506 for (argc = 0; argv[argc] != NULL; ++argc)
512 free_stringslen (char **argv, int len)
516 for (i = 0; i < len; ++i)
521 /* Easy ways to run external commands. For full documentation, see
522 * 'commandrvf' below.
525 commandf (char **stdoutput, char **stderror, int flags, const char *name, ...)
532 /* Collect the command line arguments into an array. */
534 argv = malloc (sizeof (char *) * i);
539 argv[0] = (char *) name;
542 va_start (args, name);
544 while ((s = va_arg (args, char *)) != NULL) {
545 const char **p = realloc (argv, sizeof (char *) * (++i));
559 r = commandvf (stdoutput, stderror, flags, (const char * const*) argv);
561 /* NB: Mustn't free the strings which are on the stack. */
567 /* Same as 'command', but we allow the status code from the
568 * subcommand to be non-zero, and return that status code.
569 * We still return -1 if there was some other error.
572 commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...)
579 /* Collect the command line arguments into an array. */
581 argv = malloc (sizeof (char *) * i);
586 argv[0] = (char *) name;
589 va_start (args, name);
591 while ((s = va_arg (args, char *)) != NULL) {
592 const char **p = realloc (argv, sizeof (char *) * (++i));
606 r = commandrvf (stdoutput, stderror, flags, argv);
608 /* NB: Mustn't free the strings which are on the stack. */
614 /* Same as 'command', but passing an argv. */
616 commandvf (char **stdoutput, char **stderror, int flags,
617 char const *const *argv)
621 r = commandrvf (stdoutput, stderror, flags, (void *) argv);
628 /* This is a more sane version of 'system(3)' for running external
629 * commands. It uses fork/execvp, so we don't need to worry about
630 * quoting of parameters, and it allows us to capture any error
631 * messages in a buffer.
633 * If stdoutput is not NULL, then *stdoutput will return the stdout
636 * If stderror is not NULL, then *stderror will return the stderr
637 * of the command. If there is a final \n character, it is removed
638 * so you can use the error string directly in a call to
643 * COMMAND_FLAG_FOLD_STDOUT_ON_STDERR: For broken external commands
644 * that send error messages to stdout (hello, parted) but that don't
645 * have any useful stdout information, use this flag to capture the
646 * error messages in the *stderror buffer. If using this flag,
647 * you should pass stdoutput as NULL because nothing could ever be
648 * captured in that buffer.
651 commandrvf (char **stdoutput, char **stderror, int flags,
652 char const* const *argv)
654 int so_size = 0, se_size = 0;
655 int so_fd[2], se_fd[2];
662 if (stdoutput) *stdoutput = NULL;
663 if (stderror) *stderror = NULL;
666 printf ("%s", argv[0]);
667 for (i = 1; argv[i] != NULL; ++i)
668 printf (" %s", argv[i]);
672 if (pipe (so_fd) == -1 || pipe (se_fd) == -1) {
687 if (pid == 0) { /* Child process. */
689 open ("/dev/null", O_RDONLY); /* Set stdin to /dev/null (ignore failure) */
692 if (!(flags & COMMAND_FLAG_FOLD_STDOUT_ON_STDERR))
700 execvp (argv[0], (void *) argv);
705 /* Parent process. */
710 FD_SET (so_fd[0], &rset);
711 FD_SET (se_fd[0], &rset);
716 r = select (MAX (so_fd[0], se_fd[0]) + 1, &rset2, NULL, NULL, NULL);
720 if (stdoutput) free (*stdoutput);
721 if (stderror) free (*stderror);
724 waitpid (pid, NULL, 0);
728 if (FD_ISSET (so_fd[0], &rset2)) { /* something on stdout */
729 r = read (so_fd[0], buf, sizeof buf);
734 if (r == 0) { FD_CLR (so_fd[0], &rset); quit++; }
736 if (r > 0 && stdoutput) {
738 p = realloc (*stdoutput, so_size);
744 memcpy (*stdoutput + so_size - r, buf, r);
748 if (FD_ISSET (se_fd[0], &rset2)) { /* something on stderr */
749 r = read (se_fd[0], buf, sizeof buf);
754 if (r == 0) { FD_CLR (se_fd[0], &rset); quit++; }
758 ignore_value (write (2, buf, r));
762 p = realloc (*stderror, se_size);
768 memcpy (*stderror + se_size - r, buf, r);
777 /* Make sure the output buffers are \0-terminated. Also remove any
778 * trailing \n characters from the error buffer (not from stdout).
781 void *q = realloc (*stdoutput, so_size+1);
788 (*stdoutput)[so_size] = '\0';
791 void *q = realloc (*stderror, se_size+1);
798 (*stderror)[se_size] = '\0';
800 while (se_size >= 0 && (*stderror)[se_size] == '\n')
801 (*stderror)[se_size--] = '\0';
805 /* Get the exit status of the command. */
806 if (waitpid (pid, &r, 0) != pid) {
812 return WEXITSTATUS (r);
817 /* Split an output string into a NULL-terminated list of lines.
818 * Typically this is used where we have run an external command
819 * which has printed out a list of things, and we want to return
822 * The corner cases here are quite tricky. Note in particular:
826 * "a\nb" -> ["a"; "b"]
827 * "a\nb\n" -> ["a"; "b"]
828 * "a\nb\n\n" -> ["a"; "b"; ""]
830 * The original string is written over and destroyed by this
831 * function (which is usually OK because it's the 'out' string
832 * from command()). You can free the original string, because
833 * add_string() strdups the strings.
836 split_lines (char *str)
839 int size = 0, alloc = 0;
847 /* Empty last line? */
851 pend = strchr (p, '\n');
857 if (add_string (&lines, &size, &alloc, p) == -1) {
865 if (add_string (&lines, &size, &alloc, NULL) == -1)
871 /* printf helper function so we can use %Q ("quoted") and %R to print
872 * shell-quoted strings. See HACKING file for more details.
875 print_shell_quote (FILE *stream,
876 const struct printf_info *info ATTRIBUTE_UNUSED,
877 const void *const *args)
879 #define SAFE(c) (c_isalnum((c)) || \
880 (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
882 const char *str = *((const char **) (args[0]));
884 for (i = len = 0; str[i]; ++i) {
889 putc (str[i], stream);
897 print_sysroot_shell_quote (FILE *stream,
898 const struct printf_info *info,
899 const void *const *args)
901 fputs (sysroot, stream);
902 return sysroot_len + print_shell_quote (stream, info, args);
905 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
907 print_arginfo (const struct printf_info *info ATTRIBUTE_UNUSED,
908 size_t n, int *argtypes, int *size)
911 argtypes[0] = PA_STRING;
912 size[0] = sizeof (const char *);
917 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
919 print_arginfo (const struct printf_info *info, size_t n, int *argtypes)
922 argtypes[0] = PA_STRING;
926 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
930 /* Perform device name translation. Don't call this directly -
931 * use the RESOLVE_DEVICE macro.
933 * See guestfs(3) for the algorithm.
935 * We have to open the device and test for ENXIO, because
936 * the device nodes themselves will exist in the appliance.
939 device_name_translation (char *device, const char *func)
943 fd = open (device, O_RDONLY);
949 if (errno != ENXIO && errno != ENOENT) {
951 reply_with_perror ("%s: %s", func, device);
955 /* If the name begins with "/dev/sd" then try the alternatives. */
956 if (STRNEQLEN (device, "/dev/sd", 7))
959 device[5] = 'h'; /* /dev/hd (old IDE driver) */
960 fd = open (device, O_RDONLY);
966 device[5] = 'v'; /* /dev/vd (for virtio devices) */
967 fd = open (device, O_RDONLY);
973 device[5] = 's'; /* Restore original device name. */
977 /* LVM and other commands aren't synchronous, especially when udev is
978 * involved. eg. You can create or remove some device, but the /dev
979 * device node won't appear until some time later. This means that
980 * you get an error if you run one command followed by another.
981 * Use 'udevadm settle' after certain commands, but don't be too
982 * fussed if it fails.
987 static int which_prog = 0;
989 if (which_prog == 0) {
990 if (access ("/sbin/udevsettle", X_OK) == 0)
992 else if (access ("/sbin/udevadm", X_OK) == 0)
998 switch (which_prog) {
1000 command (NULL, NULL, "/sbin/udevadm", "settle", NULL);
1003 command (NULL, NULL, "/sbin/udevsettle", NULL);