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>
31 #include <sys/param.h>
32 #include <sys/select.h>
33 #include <sys/types.h>
41 #include "ignore-value.h"
45 static char *read_cmdline (void);
47 /* Also in guestfs.c */
48 #define GUESTFWD_ADDR "10.0.2.4"
49 #define GUESTFWD_PORT "6666"
53 static int print_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
54 static int print_sysroot_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
55 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
56 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes, int *size);
58 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
59 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes);
61 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
65 /* Location to mount root device. */
66 const char *sysroot = "/sysroot"; /* No trailing slash. */
73 "guestfsd [-f|--foreground] [-c|--channel vmchannel] [-v|--verbose]\n");
77 main (int argc, char *argv[])
79 static const char *options = "fc:v?";
80 static const struct option long_options[] = {
81 { "channel", required_argument, 0, 'c' },
82 { "foreground", 0, 0, 'f' },
83 { "help", 0, 0, '?' },
84 { "verbose", 0, 0, 'v' },
90 char *vmchannel = NULL;
92 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
93 /* http://udrepper.livejournal.com/20948.html */
94 register_printf_specifier ('Q', print_shell_quote, print_arginfo);
95 register_printf_specifier ('R', print_sysroot_shell_quote, print_arginfo);
97 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
98 register_printf_function ('Q', print_shell_quote, print_arginfo);
99 register_printf_function ('R', print_sysroot_shell_quote, print_arginfo);
101 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
106 c = getopt_long (argc, argv, options, long_options, NULL);
127 fprintf (stderr, "guestfsd: unexpected command line option 0x%x\n", c);
137 cmdline = read_cmdline ();
139 /* Set the verbose flag. */
141 (cmdline && strstr (cmdline, "guestfs_verbose=1") != NULL);
143 printf ("verbose daemon enabled\n");
147 printf ("linux commmand line: %s\n", cmdline);
149 printf ("could not read linux command line\n");
152 /* Make sure SIGPIPE doesn't kill us. */
154 memset (&sa, 0, sizeof sa);
155 sa.sa_handler = SIG_IGN;
157 if (sigaction (SIGPIPE, &sa, NULL) == -1)
158 perror ("sigaction SIGPIPE"); /* but try to continue anyway ... */
160 /* Set up a basic environment. After we are called by /init the
161 * environment is essentially empty.
162 * https://bugzilla.redhat.com/show_bug.cgi?id=502074#c5
164 setenv ("PATH", "/usr/bin:/bin", 1);
165 setenv ("SHELL", "/bin/sh", 1);
166 setenv ("LC_ALL", "C", 1);
168 /* We document that umask defaults to 022 (it should be this anyway). */
171 /* Get the vmchannel string.
174 * --channel/-c option on the command line
175 * guestfs_vmchannel=... from the kernel command line
176 * guestfs=... from the kernel command line
179 * At the moment we expect this to contain "tcp:ip:port" but in
180 * future it might contain a device name, eg. "/dev/vcon4" for
181 * virtio-console vmchannel.
183 if (vmchannel == NULL && cmdline) {
187 p = strstr (cmdline, "guestfs_vmchannel=");
189 len = strcspn (p + 18, " \t\n");
190 vmchannel = strndup (p + 18, len);
197 /* Old libraries passed guestfs=host:port. Rewrite it as tcp:host:port. */
198 if (vmchannel == NULL) {
199 /* We will rewrite it part of the "guestfs=" string with
200 * "tcp:" hence p + 4 below. */
201 p = strstr (cmdline, "guestfs=");
203 len = strcspn (p + 4, " \t\n");
204 vmchannel = strndup (p + 4, len);
209 memcpy (vmchannel, "tcp:", 4);
214 /* Default vmchannel. */
215 if (vmchannel == NULL) {
216 vmchannel = strdup ("tcp:" GUESTFWD_ADDR ":" GUESTFWD_PORT);
224 printf ("vmchannel: %s\n", vmchannel);
226 /* Connect to vmchannel. */
229 if (strncmp (vmchannel, "tcp:", 4) == 0) {
230 /* Resolve the hostname. */
231 struct addrinfo *res, *rr;
232 struct addrinfo hints;
237 port = strchr (host, ':');
242 fprintf (stderr, "vmchannel: expecting \"tcp:<ip>:<port>\": %s\n",
247 memset (&hints, 0, sizeof hints);
248 hints.ai_socktype = SOCK_STREAM;
249 hints.ai_flags = AI_ADDRCONFIG;
250 r = getaddrinfo (host, port, &hints, &res);
252 fprintf (stderr, "%s:%s: %s\n",
253 host, port, gai_strerror (r));
257 /* Connect to the given TCP socket. */
258 for (rr = res; rr != NULL; rr = rr->ai_next) {
259 sock = socket (rr->ai_family, rr->ai_socktype, rr->ai_protocol);
261 if (connect (sock, rr->ai_addr, rr->ai_addrlen) == 0)
272 "unknown vmchannel connection type: %s\n"
273 "expecting \"tcp:<ip>:<port>\"\n",
281 "Failed to connect to any vmchannel implementation.\n"
284 "This is a fatal error and the appliance will now exit.\n"
286 "Usually this error is caused by either QEMU or the appliance\n"
287 "kernel not supporting the vmchannel method that the\n"
288 "libguestfs library chose to use. Please run\n"
289 "'libguestfs-test-tool' and provide the complete, unedited\n"
290 "output to the libguestfs developers, either in a bug report\n"
291 "or on the libguestfs redhat com mailing list.\n"
297 /* Send the magic length message which indicates that
298 * userspace is up inside the guest.
302 uint32_t len = GUESTFS_LAUNCH_FLAG;
303 xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
304 xdr_uint32_t (&xdr, &len);
306 if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
311 /* Fork into the background. */
313 if (daemon (0, 1) == -1) {
319 /* Enter the main loop, reading and performing actions. */
325 /* Read /proc/cmdline. */
329 int fd = open ("/proc/cmdline", O_RDONLY);
331 perror ("/proc/cmdline");
341 n = read (fd, buf, sizeof buf);
350 char *newr = realloc (r, len + n + 1); /* + 1 is for terminating NUL */
358 memcpy (&r[len], buf, n);
365 if (close (fd) == -1) {
374 /* Turn "/path" into "/sysroot/path".
376 * Caller must check for NULL and call reply_with_perror ("malloc")
377 * if it is. Caller must also free the string.
379 * See also the custom %R printf formatter which does shell quoting too.
382 sysroot_path (const char *path)
385 int len = strlen (path) + sysroot_len + 1;
391 snprintf (r, len, "%s%s", sysroot, path);
396 xwrite (int sock, const void *v_buf, size_t len)
399 const char *buf = v_buf;
402 r = write (sock, buf, len);
415 xread (int sock, void *v_buf, size_t len)
421 r = read (sock, buf, len);
427 fprintf (stderr, "read: unexpected end of file on fd %d\n", sock);
438 add_string (char ***argv, int *size, int *alloc, const char *str)
443 if (*size >= *alloc) {
445 new_argv = realloc (*argv, *alloc * sizeof (char *));
446 if (new_argv == NULL) {
447 reply_with_perror ("realloc");
448 free_strings (*argv);
455 new_str = strdup (str);
456 if (new_str == NULL) {
457 reply_with_perror ("strdup");
458 free_strings (*argv);
463 (*argv)[*size] = new_str;
470 count_strings (char *const *argv)
474 for (argc = 0; argv[argc] != NULL; ++argc)
480 compare (const void *vp1, const void *vp2)
482 char * const *p1 = (char * const *) vp1;
483 char * const *p2 = (char * const *) vp2;
484 return strcmp (*p1, *p2);
488 sort_strings (char **argv, int len)
490 qsort (argv, len, sizeof (char *), compare);
494 free_strings (char **argv)
498 for (argc = 0; argv[argc] != NULL; ++argc)
504 free_stringslen (char **argv, int len)
508 for (i = 0; i < len; ++i)
513 /* Easy ways to run external commands. For full documentation, see
514 * 'commandrvf' below.
517 commandf (char **stdoutput, char **stderror, int flags, const char *name, ...)
524 /* Collect the command line arguments into an array. */
526 argv = malloc (sizeof (char *) * i);
531 argv[0] = (char *) name;
534 va_start (args, name);
536 while ((s = va_arg (args, char *)) != NULL) {
537 const char **p = realloc (argv, sizeof (char *) * (++i));
551 r = commandvf (stdoutput, stderror, flags, (char **) argv);
553 /* NB: Mustn't free the strings which are on the stack. */
559 /* Same as 'command', but we allow the status code from the
560 * subcommand to be non-zero, and return that status code.
561 * We still return -1 if there was some other error.
564 commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...)
571 /* Collect the command line arguments into an array. */
573 argv = malloc (sizeof (char *) * i);
578 argv[0] = (char *) name;
581 va_start (args, name);
583 while ((s = va_arg (args, char *)) != NULL) {
584 const char **p = realloc (argv, sizeof (char *) * (++i));
598 r = commandrvf (stdoutput, stderror, flags, argv);
600 /* NB: Mustn't free the strings which are on the stack. */
606 /* Same as 'command', but passing an argv. */
608 commandvf (char **stdoutput, char **stderror, int flags, char *const *argv)
612 r = commandrvf (stdoutput, stderror, flags, (void *) argv);
619 /* This is a more sane version of 'system(3)' for running external
620 * commands. It uses fork/execvp, so we don't need to worry about
621 * quoting of parameters, and it allows us to capture any error
622 * messages in a buffer.
624 * If stdoutput is not NULL, then *stdoutput will return the stdout
627 * If stderror is not NULL, then *stderror will return the stderr
628 * of the command. If there is a final \n character, it is removed
629 * so you can use the error string directly in a call to
634 * COMMAND_FLAG_FOLD_STDOUT_ON_STDERR: For broken external commands
635 * that send error messages to stdout (hello, parted) but that don't
636 * have any useful stdout information, use this flag to capture the
637 * error messages in the *stderror buffer. If using this flag,
638 * you should pass stdoutput as NULL because nothing could ever be
639 * captured in that buffer.
642 commandrvf (char **stdoutput, char **stderror, int flags,
643 char const* const *argv)
645 int so_size = 0, se_size = 0;
646 int so_fd[2], se_fd[2];
653 if (stdoutput) *stdoutput = NULL;
654 if (stderror) *stderror = NULL;
657 printf ("%s", argv[0]);
658 for (i = 1; argv[i] != NULL; ++i)
659 printf (" %s", argv[i]);
663 if (pipe (so_fd) == -1 || pipe (se_fd) == -1) {
678 if (pid == 0) { /* Child process. */
680 open ("/dev/null", O_RDONLY); /* Set stdin to /dev/null (ignore failure) */
683 if (!(flags & COMMAND_FLAG_FOLD_STDOUT_ON_STDERR))
691 execvp (argv[0], (void *) argv);
696 /* Parent process. */
701 FD_SET (so_fd[0], &rset);
702 FD_SET (se_fd[0], &rset);
707 r = select (MAX (so_fd[0], se_fd[0]) + 1, &rset2, NULL, NULL, NULL);
711 if (stdoutput) free (*stdoutput);
712 if (stderror) free (*stderror);
715 waitpid (pid, NULL, 0);
719 if (FD_ISSET (so_fd[0], &rset2)) { /* something on stdout */
720 r = read (so_fd[0], buf, sizeof buf);
725 if (r == 0) { FD_CLR (so_fd[0], &rset); quit++; }
727 if (r > 0 && stdoutput) {
729 p = realloc (*stdoutput, so_size);
735 memcpy (*stdoutput + so_size - r, buf, r);
739 if (FD_ISSET (se_fd[0], &rset2)) { /* something on stderr */
740 r = read (se_fd[0], buf, sizeof buf);
745 if (r == 0) { FD_CLR (se_fd[0], &rset); quit++; }
749 ignore_value (write (2, buf, r));
753 p = realloc (*stderror, se_size);
759 memcpy (*stderror + se_size - r, buf, r);
768 /* Make sure the output buffers are \0-terminated. Also remove any
769 * trailing \n characters from the error buffer (not from stdout).
772 void *q = realloc (*stdoutput, so_size+1);
779 (*stdoutput)[so_size] = '\0';
782 void *q = realloc (*stderror, se_size+1);
789 (*stderror)[se_size] = '\0';
791 while (se_size >= 0 && (*stderror)[se_size] == '\n')
792 (*stderror)[se_size--] = '\0';
796 /* Get the exit status of the command. */
797 if (waitpid (pid, &r, 0) != pid) {
803 return WEXITSTATUS (r);
808 /* Split an output string into a NULL-terminated list of lines.
809 * Typically this is used where we have run an external command
810 * which has printed out a list of things, and we want to return
813 * The corner cases here are quite tricky. Note in particular:
817 * "a\nb" -> ["a"; "b"]
818 * "a\nb\n" -> ["a"; "b"]
819 * "a\nb\n\n" -> ["a"; "b"; ""]
821 * The original string is written over and destroyed by this
822 * function (which is usually OK because it's the 'out' string
823 * from command()). You can free the original string, because
824 * add_string() strdups the strings.
827 split_lines (char *str)
830 int size = 0, alloc = 0;
833 if (strcmp (str, "") == 0)
838 /* Empty last line? */
842 pend = strchr (p, '\n');
848 if (add_string (&lines, &size, &alloc, p) == -1) {
856 if (add_string (&lines, &size, &alloc, NULL) == -1)
862 /* printf helper function so we can use %Q ("quoted") and %R to print
863 * shell-quoted strings. See HACKING file for more details.
866 print_shell_quote (FILE *stream,
867 const struct printf_info *info ATTRIBUTE_UNUSED,
868 const void *const *args)
870 #define SAFE(c) (c_isalnum((c)) || \
871 (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
873 const char *str = *((const char **) (args[0]));
875 for (i = len = 0; str[i]; ++i) {
880 putc (str[i], stream);
888 print_sysroot_shell_quote (FILE *stream,
889 const struct printf_info *info,
890 const void *const *args)
892 fputs (sysroot, stream);
893 return sysroot_len + print_shell_quote (stream, info, args);
896 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
898 print_arginfo (const struct printf_info *info ATTRIBUTE_UNUSED,
899 size_t n, int *argtypes, int *size)
902 argtypes[0] = PA_STRING;
903 size[0] = sizeof (const char *);
908 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
910 print_arginfo (const struct printf_info *info, size_t n, int *argtypes)
913 argtypes[0] = PA_STRING;
917 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
921 /* Perform device name translation. Don't call this directly -
922 * use the RESOLVE_DEVICE macro.
924 * See guestfs(3) for the algorithm.
926 * We have to open the device and test for ENXIO, because
927 * the device nodes themselves will exist in the appliance.
930 device_name_translation (char *device, const char *func)
934 fd = open (device, O_RDONLY);
940 if (errno != ENXIO && errno != ENOENT) {
942 reply_with_perror ("%s: %s", func, device);
946 /* If the name begins with "/dev/sd" then try the alternatives. */
947 if (strncmp (device, "/dev/sd", 7) != 0)
950 device[5] = 'h'; /* /dev/hd (old IDE driver) */
951 fd = open (device, O_RDONLY);
957 device[5] = 'v'; /* /dev/vd (for virtio devices) */
958 fd = open (device, O_RDONLY);
964 device[5] = 's'; /* Restore original device name. */
968 /* LVM and other commands aren't synchronous, especially when udev is
969 * involved. eg. You can create or remove some device, but the /dev
970 * device node won't appear until some time later. This means that
971 * you get an error if you run one command followed by another.
972 * Use 'udevadm settle' after certain commands, but don't be too
973 * fussed if it fails.
978 command (NULL, NULL, "/sbin/udevadm", "settle", NULL);