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. */
122 "guestfsd [-f|--foreground] [-c|--channel vmchannel] [-v|--verbose]\n");
126 main (int argc, char *argv[])
128 static const char *options = "fc:v?";
129 static const struct option long_options[] = {
130 { "channel", required_argument, 0, 'c' },
131 { "foreground", 0, 0, 'f' },
132 { "help", 0, 0, '?' },
133 { "verbose", 0, 0, 'v' },
139 char *vmchannel = NULL;
141 if (winsock_init () == -1)
142 error (EXIT_FAILURE, 0, "winsock initialization failed");
144 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
145 /* http://udrepper.livejournal.com/20948.html */
146 register_printf_specifier ('Q', print_shell_quote, print_arginfo);
147 register_printf_specifier ('R', print_sysroot_shell_quote, print_arginfo);
149 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
150 register_printf_function ('Q', print_shell_quote, print_arginfo);
151 register_printf_function ('R', print_sysroot_shell_quote, print_arginfo);
153 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
158 c = getopt_long (argc, argv, options, long_options, NULL);
179 fprintf (stderr, "guestfsd: unexpected command line option 0x%x\n", c);
189 cmdline = read_cmdline ();
191 /* Set the verbose flag. */
193 (cmdline && strstr (cmdline, "guestfs_verbose=1") != NULL);
195 printf ("verbose daemon enabled\n");
199 printf ("linux commmand line: %s\n", cmdline);
201 printf ("could not read linux command line\n");
205 /* Make sure SIGPIPE doesn't kill us. */
207 memset (&sa, 0, sizeof sa);
208 sa.sa_handler = SIG_IGN;
210 if (sigaction (SIGPIPE, &sa, NULL) == -1)
211 perror ("sigaction SIGPIPE"); /* but try to continue anyway ... */
215 # define setenv(n,v,f) _putenv(n "=" v)
217 /* Set up a basic environment. After we are called by /init the
218 * environment is essentially empty.
219 * https://bugzilla.redhat.com/show_bug.cgi?id=502074#c5
221 setenv ("PATH", "/usr/bin:/bin", 1);
222 setenv ("SHELL", "/bin/sh", 1);
223 setenv ("LC_ALL", "C", 1);
226 /* We document that umask defaults to 022 (it should be this anyway). */
229 /* This is the default for Windows anyway. It's not even clear if
230 * Windows ever uses this -- the MSDN documentation for the function
231 * contains obvious errors.
236 /* Get the vmchannel string.
239 * --channel/-c option on the command line
240 * guestfs_vmchannel=... from the kernel command line
241 * guestfs=... from the kernel command line
244 * At the moment we expect this to contain "tcp:ip:port" but in
245 * future it might contain a device name, eg. "/dev/vcon4" for
246 * virtio-console vmchannel.
248 if (vmchannel == NULL && cmdline) {
252 p = strstr (cmdline, "guestfs_vmchannel=");
254 len = strcspn (p + 18, " \t\n");
255 vmchannel = strndup (p + 18, len);
262 /* Old libraries passed guestfs=host:port. Rewrite it as tcp:host:port. */
263 if (vmchannel == NULL) {
264 /* We will rewrite it part of the "guestfs=" string with
265 * "tcp:" hence p + 4 below. */
266 p = strstr (cmdline, "guestfs=");
268 len = strcspn (p + 4, " \t\n");
269 vmchannel = strndup (p + 4, len);
274 memcpy (vmchannel, "tcp:", 4);
279 /* Default vmchannel. */
280 if (vmchannel == NULL) {
281 vmchannel = strdup ("tcp:" GUESTFWD_ADDR ":" GUESTFWD_PORT);
289 printf ("vmchannel: %s\n", vmchannel);
291 /* Connect to vmchannel. */
294 if (STREQLEN (vmchannel, "tcp:", 4)) {
295 /* Resolve the hostname. */
296 struct addrinfo *res, *rr;
297 struct addrinfo hints;
302 port = strchr (host, ':');
307 fprintf (stderr, "vmchannel: expecting \"tcp:<ip>:<port>\": %s\n",
312 memset (&hints, 0, sizeof hints);
313 hints.ai_socktype = SOCK_STREAM;
314 hints.ai_flags = AI_ADDRCONFIG;
315 r = getaddrinfo (host, port, &hints, &res);
317 fprintf (stderr, "%s:%s: %s\n",
318 host, port, gai_strerror (r));
322 /* Connect to the given TCP socket. */
323 for (rr = res; rr != NULL; rr = rr->ai_next) {
324 sock = socket (rr->ai_family, rr->ai_socktype, rr->ai_protocol);
326 if (connect (sock, rr->ai_addr, rr->ai_addrlen) == 0)
337 "unknown vmchannel connection type: %s\n"
338 "expecting \"tcp:<ip>:<port>\"\n",
346 "Failed to connect to any vmchannel implementation.\n"
349 "This is a fatal error and the appliance will now exit.\n"
351 "Usually this error is caused by either QEMU or the appliance\n"
352 "kernel not supporting the vmchannel method that the\n"
353 "libguestfs library chose to use. Please run\n"
354 "'libguestfs-test-tool' and provide the complete, unedited\n"
355 "output to the libguestfs developers, either in a bug report\n"
356 "or on the libguestfs redhat com mailing list.\n"
362 /* Send the magic length message which indicates that
363 * userspace is up inside the guest.
367 uint32_t len = GUESTFS_LAUNCH_FLAG;
368 xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
369 xdr_u_int (&xdr, &len);
371 if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
376 /* Fork into the background. */
378 if (daemon (0, 1) == -1) {
384 /* Enter the main loop, reading and performing actions. */
390 /* Read /proc/cmdline. */
394 int fd = open ("/proc/cmdline", O_RDONLY);
396 perror ("/proc/cmdline");
406 n = read (fd, buf, sizeof buf);
415 char *newr = realloc (r, len + n + 1); /* + 1 is for terminating NUL */
423 memcpy (&r[len], buf, n);
430 if (close (fd) == -1) {
439 /* Turn "/path" into "/sysroot/path".
441 * Caller must check for NULL and call reply_with_perror ("malloc")
442 * if it is. Caller must also free the string.
444 * See also the custom %R printf formatter which does shell quoting too.
447 sysroot_path (const char *path)
450 int len = strlen (path) + sysroot_len + 1;
456 snprintf (r, len, "%s%s", sysroot, path);
461 xwrite (int sock, const void *v_buf, size_t len)
464 const char *buf = v_buf;
467 r = write (sock, buf, len);
480 xread (int sock, void *v_buf, size_t len)
486 r = read (sock, buf, len);
492 fprintf (stderr, "read: unexpected end of file on fd %d\n", sock);
503 add_string (char ***argv, int *size, int *alloc, const char *str)
508 if (*size >= *alloc) {
510 new_argv = realloc (*argv, *alloc * sizeof (char *));
511 if (new_argv == NULL) {
512 reply_with_perror ("realloc");
513 free_strings (*argv);
520 new_str = strdup (str);
521 if (new_str == NULL) {
522 reply_with_perror ("strdup");
523 free_strings (*argv);
528 (*argv)[*size] = new_str;
535 count_strings (char *const *argv)
539 for (argc = 0; argv[argc] != NULL; ++argc)
545 compare (const void *vp1, const void *vp2)
547 char * const *p1 = (char * const *) vp1;
548 char * const *p2 = (char * const *) vp2;
549 return strcmp (*p1, *p2);
553 sort_strings (char **argv, int len)
555 qsort (argv, len, sizeof (char *), compare);
559 free_strings (char **argv)
563 for (argc = 0; argv[argc] != NULL; ++argc)
569 free_stringslen (char **argv, int len)
573 for (i = 0; i < len; ++i)
578 /* Easy ways to run external commands. For full documentation, see
579 * 'commandrvf' below.
582 commandf (char **stdoutput, char **stderror, int flags, const char *name, ...)
589 /* Collect the command line arguments into an array. */
591 argv = malloc (sizeof (char *) * i);
596 argv[0] = (char *) name;
599 va_start (args, name);
601 while ((s = va_arg (args, char *)) != NULL) {
602 const char **p = realloc (argv, sizeof (char *) * (++i));
616 r = commandvf (stdoutput, stderror, flags, (const char * const*) argv);
618 /* NB: Mustn't free the strings which are on the stack. */
624 /* Same as 'command', but we allow the status code from the
625 * subcommand to be non-zero, and return that status code.
626 * We still return -1 if there was some other error.
629 commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...)
636 /* Collect the command line arguments into an array. */
638 argv = malloc (sizeof (char *) * i);
643 argv[0] = (char *) name;
646 va_start (args, name);
648 while ((s = va_arg (args, char *)) != NULL) {
649 const char **p = realloc (argv, sizeof (char *) * (++i));
663 r = commandrvf (stdoutput, stderror, flags, argv);
665 /* NB: Mustn't free the strings which are on the stack. */
671 /* Same as 'command', but passing an argv. */
673 commandvf (char **stdoutput, char **stderror, int flags,
674 char const *const *argv)
678 r = commandrvf (stdoutput, stderror, flags, (void *) argv);
685 /* This is a more sane version of 'system(3)' for running external
686 * commands. It uses fork/execvp, so we don't need to worry about
687 * quoting of parameters, and it allows us to capture any error
688 * messages in a buffer.
690 * If stdoutput is not NULL, then *stdoutput will return the stdout
693 * If stderror is not NULL, then *stderror will return the stderr
694 * of the command. If there is a final \n character, it is removed
695 * so you can use the error string directly in a call to
700 * COMMAND_FLAG_FOLD_STDOUT_ON_STDERR: For broken external commands
701 * that send error messages to stdout (hello, parted) but that don't
702 * have any useful stdout information, use this flag to capture the
703 * error messages in the *stderror buffer. If using this flag,
704 * you should pass stdoutput as NULL because nothing could ever be
705 * captured in that buffer.
708 commandrvf (char **stdoutput, char **stderror, int flags,
709 char const* const *argv)
711 int so_size = 0, se_size = 0;
712 int so_fd[2], se_fd[2];
719 if (stdoutput) *stdoutput = NULL;
720 if (stderror) *stderror = NULL;
723 printf ("%s", argv[0]);
724 for (i = 1; argv[i] != NULL; ++i)
725 printf (" %s", argv[i]);
729 if (pipe (so_fd) == -1 || pipe (se_fd) == -1) {
744 if (pid == 0) { /* Child process. */
746 open ("/dev/null", O_RDONLY); /* Set stdin to /dev/null (ignore failure) */
749 if (!(flags & COMMAND_FLAG_FOLD_STDOUT_ON_STDERR))
757 execvp (argv[0], (void *) argv);
762 /* Parent process. */
767 FD_SET (so_fd[0], &rset);
768 FD_SET (se_fd[0], &rset);
773 r = select (MAX (so_fd[0], se_fd[0]) + 1, &rset2, NULL, NULL, NULL);
777 if (stdoutput) free (*stdoutput);
778 if (stderror) free (*stderror);
781 waitpid (pid, NULL, 0);
785 if (FD_ISSET (so_fd[0], &rset2)) { /* something on stdout */
786 r = read (so_fd[0], buf, sizeof buf);
791 if (r == 0) { FD_CLR (so_fd[0], &rset); quit++; }
793 if (r > 0 && stdoutput) {
795 p = realloc (*stdoutput, so_size);
801 memcpy (*stdoutput + so_size - r, buf, r);
805 if (FD_ISSET (se_fd[0], &rset2)) { /* something on stderr */
806 r = read (se_fd[0], buf, sizeof buf);
811 if (r == 0) { FD_CLR (se_fd[0], &rset); quit++; }
815 ignore_value (write (2, buf, r));
819 p = realloc (*stderror, se_size);
825 memcpy (*stderror + se_size - r, buf, r);
834 /* Make sure the output buffers are \0-terminated. Also remove any
835 * trailing \n characters from the error buffer (not from stdout).
838 void *q = realloc (*stdoutput, so_size+1);
845 (*stdoutput)[so_size] = '\0';
848 void *q = realloc (*stderror, se_size+1);
855 (*stderror)[se_size] = '\0';
857 while (se_size >= 0 && (*stderror)[se_size] == '\n')
858 (*stderror)[se_size--] = '\0';
862 /* Get the exit status of the command. */
863 if (waitpid (pid, &r, 0) != pid) {
869 return WEXITSTATUS (r);
874 /* Split an output string into a NULL-terminated list of lines.
875 * Typically this is used where we have run an external command
876 * which has printed out a list of things, and we want to return
879 * The corner cases here are quite tricky. Note in particular:
883 * "a\nb" -> ["a"; "b"]
884 * "a\nb\n" -> ["a"; "b"]
885 * "a\nb\n\n" -> ["a"; "b"; ""]
887 * The original string is written over and destroyed by this
888 * function (which is usually OK because it's the 'out' string
889 * from command()). You can free the original string, because
890 * add_string() strdups the strings.
893 split_lines (char *str)
896 int size = 0, alloc = 0;
904 /* Empty last line? */
908 pend = strchr (p, '\n');
914 if (add_string (&lines, &size, &alloc, p) == -1) {
922 if (add_string (&lines, &size, &alloc, NULL) == -1)
928 /* printf helper function so we can use %Q ("quoted") and %R to print
929 * shell-quoted strings. See HACKING file for more details.
932 print_shell_quote (FILE *stream,
933 const struct printf_info *info ATTRIBUTE_UNUSED,
934 const void *const *args)
936 #define SAFE(c) (c_isalnum((c)) || \
937 (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
939 const char *str = *((const char **) (args[0]));
941 for (i = len = 0; str[i]; ++i) {
946 putc (str[i], stream);
954 print_sysroot_shell_quote (FILE *stream,
955 const struct printf_info *info,
956 const void *const *args)
958 fputs (sysroot, stream);
959 return sysroot_len + print_shell_quote (stream, info, args);
962 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
964 print_arginfo (const struct printf_info *info ATTRIBUTE_UNUSED,
965 size_t n, int *argtypes, int *size)
968 argtypes[0] = PA_STRING;
969 size[0] = sizeof (const char *);
974 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
976 print_arginfo (const struct printf_info *info, size_t n, int *argtypes)
979 argtypes[0] = PA_STRING;
983 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
987 /* Perform device name translation. Don't call this directly -
988 * use the RESOLVE_DEVICE macro.
990 * See guestfs(3) for the algorithm.
992 * We have to open the device and test for ENXIO, because
993 * the device nodes themselves will exist in the appliance.
996 device_name_translation (char *device, const char *func)
1000 fd = open (device, O_RDONLY);
1006 if (errno != ENXIO && errno != ENOENT) {
1008 reply_with_perror ("%s: %s", func, device);
1012 /* If the name begins with "/dev/sd" then try the alternatives. */
1013 if (STRNEQLEN (device, "/dev/sd", 7))
1016 device[5] = 'h'; /* /dev/hd (old IDE driver) */
1017 fd = open (device, O_RDONLY);
1023 device[5] = 'v'; /* /dev/vd (for virtio devices) */
1024 fd = open (device, O_RDONLY);
1030 device[5] = 's'; /* Restore original device name. */
1034 /* LVM and other commands aren't synchronous, especially when udev is
1035 * involved. eg. You can create or remove some device, but the /dev
1036 * device node won't appear until some time later. This means that
1037 * you get an error if you run one command followed by another.
1038 * Use 'udevadm settle' after certain commands, but don't be too
1039 * fussed if it fails.
1044 static int which_prog = 0;
1046 if (which_prog == 0) {
1047 if (access ("/sbin/udevsettle", X_OK) == 0)
1049 else if (access ("/sbin/udevadm", X_OK) == 0)
1055 switch (which_prog) {
1057 command (NULL, NULL, "/sbin/udevadm", "settle", NULL);
1060 command (NULL, NULL, "/sbin/udevsettle", NULL);