1 /* libguestfs - the guestfsd daemon
2 * Copyright (C) 2009-2010 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>
52 #include "ignore-value.h"
57 static char *read_cmdline (void);
59 /* This is the default address we connect to for very old libraries
60 * which didn't specify the address and port number explicitly on the
61 * kernel command line. It's now recommended to always specify the
62 * address and port number on the command line, so this will not be
65 #define OLD_GUESTFWD_ADDR "10.0.2.4"
66 #define OLD_GUESTFWD_PORT "6666"
68 /* This is only a hint. If not defined, ignore it. */
70 # define AI_ADDRCONFIG 0
74 # define MAX(a,b) ((a)>(b)?(a):(b))
77 /* If root device is an ext2 filesystem, this is the major and minor.
78 * This is so we can ignore this device from the point of view of the
79 * user, eg. in guestfs_list_devices and many other places.
81 static dev_t root_device = 0;
85 static int print_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
86 static int print_sysroot_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
87 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
88 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes, int *size);
90 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
91 static int print_arginfo (const struct printf_info *info, size_t n, int *argtypes);
93 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
99 daemon (int nochdir, int noclose)
102 "On Windows the daemon does not support forking into the "
103 "background.\nYou *must* run the daemon with the -f option.\n");
114 /* http://msdn2.microsoft.com/en-us/library/ms742213.aspx */
115 r = gl_sockets_startup (SOCKETS_2_2);
116 return r == 0 ? 0 : -1;
126 /* Location to mount root device. */
127 const char *sysroot = "/sysroot"; /* No trailing slash. */
130 /* Not used explicitly, but required by the gnulib 'error' module. */
131 const char *program_name = "guestfsd";
137 "guestfsd [-f|--foreground] [-c|--channel vmchannel] [-v|--verbose]\n");
141 main (int argc, char *argv[])
143 static const char *options = "fc:v?";
144 static const struct option long_options[] = {
145 { "channel", required_argument, 0, 'c' },
146 { "foreground", 0, 0, 'f' },
147 { "help", 0, 0, '?' },
148 { "verbose", 0, 0, 'v' },
154 char *vmchannel = NULL;
156 if (winsock_init () == -1)
157 error (EXIT_FAILURE, 0, "winsock initialization failed");
159 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
160 /* http://udrepper.livejournal.com/20948.html */
161 register_printf_specifier ('Q', print_shell_quote, print_arginfo);
162 register_printf_specifier ('R', print_sysroot_shell_quote, print_arginfo);
164 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
165 register_printf_function ('Q', print_shell_quote, print_arginfo);
166 register_printf_function ('R', print_sysroot_shell_quote, print_arginfo);
168 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
173 if (stat ("/", &statbuf) == 0)
174 root_device = statbuf.st_dev;
177 c = getopt_long (argc, argv, options, long_options, NULL);
198 fprintf (stderr, "guestfsd: unexpected command line option 0x%x\n", c);
208 cmdline = read_cmdline ();
210 /* Set the verbose flag. */
212 (cmdline && strstr (cmdline, "guestfs_verbose=1") != NULL);
214 printf ("verbose daemon enabled\n");
218 printf ("linux commmand line: %s\n", cmdline);
220 printf ("could not read linux command line\n");
224 /* Make sure SIGPIPE doesn't kill us. */
226 memset (&sa, 0, sizeof sa);
227 sa.sa_handler = SIG_IGN;
229 if (sigaction (SIGPIPE, &sa, NULL) == -1)
230 perror ("sigaction SIGPIPE"); /* but try to continue anyway ... */
234 # define setenv(n,v,f) _putenv(n "=" v)
236 /* Set up a basic environment. After we are called by /init the
237 * environment is essentially empty.
238 * https://bugzilla.redhat.com/show_bug.cgi?id=502074#c5
240 * NOTE: if you change $PATH, you must also change 'prog_exists'
243 setenv ("PATH", "/sbin:/usr/sbin:/bin:/usr/bin", 1);
244 setenv ("SHELL", "/bin/sh", 1);
245 setenv ("LC_ALL", "C", 1);
246 setenv ("TERM", "dumb", 1);
249 /* We document that umask defaults to 022 (it should be this anyway). */
252 /* This is the default for Windows anyway. It's not even clear if
253 * Windows ever uses this -- the MSDN documentation for the function
254 * contains obvious errors.
259 /* Get the vmchannel string.
262 * --channel/-c option on the command line
263 * guestfs_vmchannel=... from the kernel command line
264 * guestfs=... from the kernel command line
267 * At the moment we expect this to contain "tcp:ip:port" but in
268 * future it might contain a device name, eg. "/dev/vcon4" for
269 * virtio-console vmchannel.
271 if (vmchannel == NULL && cmdline) {
275 p = strstr (cmdline, "guestfs_vmchannel=");
277 len = strcspn (p + 18, " \t\n");
278 vmchannel = strndup (p + 18, len);
285 /* Old libraries passed guestfs=host:port. Rewrite it as tcp:host:port. */
286 if (vmchannel == NULL) {
287 /* We will rewrite it part of the "guestfs=" string with
288 * "tcp:" hence p + 4 below. */
289 p = strstr (cmdline, "guestfs=");
291 len = strcspn (p + 4, " \t\n");
292 vmchannel = strndup (p + 4, len);
297 memcpy (vmchannel, "tcp:", 4);
302 /* Default vmchannel. */
303 if (vmchannel == NULL) {
304 vmchannel = strdup ("tcp:" OLD_GUESTFWD_ADDR ":" OLD_GUESTFWD_PORT);
312 printf ("vmchannel: %s\n", vmchannel);
314 /* Connect to vmchannel. */
317 if (STREQLEN (vmchannel, "tcp:", 4)) {
318 /* Resolve the hostname. */
319 struct addrinfo *res, *rr;
320 struct addrinfo hints;
325 port = strchr (host, ':');
330 fprintf (stderr, "vmchannel: expecting \"tcp:<ip>:<port>\": %s\n",
335 memset (&hints, 0, sizeof hints);
336 hints.ai_socktype = SOCK_STREAM;
337 hints.ai_flags = AI_ADDRCONFIG;
338 r = getaddrinfo (host, port, &hints, &res);
340 fprintf (stderr, "%s:%s: %s\n",
341 host, port, gai_strerror (r));
345 /* Connect to the given TCP socket. */
346 for (rr = res; rr != NULL; rr = rr->ai_next) {
347 sock = socket (rr->ai_family, rr->ai_socktype, rr->ai_protocol);
349 if (connect (sock, rr->ai_addr, rr->ai_addrlen) == 0)
360 "unknown vmchannel connection type: %s\n"
361 "expecting \"tcp:<ip>:<port>\"\n",
369 "Failed to connect to any vmchannel implementation.\n"
372 "This is a fatal error and the appliance will now exit.\n"
374 "Usually this error is caused by either QEMU or the appliance\n"
375 "kernel not supporting the vmchannel method that the\n"
376 "libguestfs library chose to use. Please run\n"
377 "'libguestfs-test-tool' and provide the complete, unedited\n"
378 "output to the libguestfs developers, either in a bug report\n"
379 "or on the libguestfs redhat com mailing list.\n"
385 /* Send the magic length message which indicates that
386 * userspace is up inside the guest.
390 uint32_t len = GUESTFS_LAUNCH_FLAG;
391 xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
392 xdr_u_int (&xdr, &len);
394 if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
399 /* Fork into the background. */
401 if (daemon (0, 1) == -1) {
407 /* Enter the main loop, reading and performing actions. */
413 /* Read /proc/cmdline. */
417 int fd = open ("/proc/cmdline", O_RDONLY);
419 perror ("/proc/cmdline");
429 n = read (fd, buf, sizeof buf);
438 char *newr = realloc (r, len + n + 1); /* + 1 is for terminating NUL */
446 memcpy (&r[len], buf, n);
453 if (close (fd) == -1) {
462 /* Return true iff device is the root device (and therefore should be
463 * ignored from the point of view of user calls).
466 is_root_device (const char *device)
469 if (stat (device, &statbuf) == -1) {
473 if (statbuf.st_rdev == root_device)
478 /* Turn "/path" into "/sysroot/path".
480 * Caller must check for NULL and call reply_with_perror ("malloc")
481 * if it is. Caller must also free the string.
483 * See also the custom %R printf formatter which does shell quoting too.
486 sysroot_path (const char *path)
489 int len = strlen (path) + sysroot_len + 1;
495 snprintf (r, len, "%s%s", sysroot, path);
500 xwrite (int sock, const void *v_buf, size_t len)
503 const char *buf = v_buf;
506 r = write (sock, buf, len);
519 xread (int sock, void *v_buf, size_t len)
525 r = read (sock, buf, len);
531 fprintf (stderr, "read: unexpected end of file on fd %d\n", sock);
542 add_string (char ***argv, int *size, int *alloc, const char *str)
547 if (*size >= *alloc) {
549 new_argv = realloc (*argv, *alloc * sizeof (char *));
550 if (new_argv == NULL) {
551 reply_with_perror ("realloc");
552 free_strings (*argv);
559 new_str = strdup (str);
560 if (new_str == NULL) {
561 reply_with_perror ("strdup");
562 free_strings (*argv);
567 (*argv)[*size] = new_str;
574 count_strings (char *const *argv)
578 for (argc = 0; argv[argc] != NULL; ++argc)
583 /* http://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2 */
585 is_power_of_2 (unsigned long v)
587 return v && ((v & (v - 1)) == 0);
591 compare (const void *vp1, const void *vp2)
593 char * const *p1 = (char * const *) vp1;
594 char * const *p2 = (char * const *) vp2;
595 return strcmp (*p1, *p2);
599 sort_strings (char **argv, int len)
601 qsort (argv, len, sizeof (char *), compare);
605 free_strings (char **argv)
609 for (argc = 0; argv[argc] != NULL; ++argc)
615 free_stringslen (char **argv, int len)
619 for (i = 0; i < len; ++i)
624 /* Easy ways to run external commands. For full documentation, see
625 * 'commandrvf' below.
628 commandf (char **stdoutput, char **stderror, int flags, const char *name, ...)
635 /* Collect the command line arguments into an array. */
637 argv = malloc (sizeof (char *) * i);
642 argv[0] = (char *) name;
645 va_start (args, name);
647 while ((s = va_arg (args, char *)) != NULL) {
648 const char **p = realloc (argv, sizeof (char *) * (++i));
662 r = commandvf (stdoutput, stderror, flags, (const char * const*) argv);
664 /* NB: Mustn't free the strings which are on the stack. */
670 /* Same as 'command', but we allow the status code from the
671 * subcommand to be non-zero, and return that status code.
672 * We still return -1 if there was some other error.
675 commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...)
682 /* Collect the command line arguments into an array. */
684 argv = malloc (sizeof (char *) * i);
689 argv[0] = (char *) name;
692 va_start (args, name);
694 while ((s = va_arg (args, char *)) != NULL) {
695 const char **p = realloc (argv, sizeof (char *) * (++i));
709 r = commandrvf (stdoutput, stderror, flags, argv);
711 /* NB: Mustn't free the strings which are on the stack. */
717 /* Same as 'command', but passing an argv. */
719 commandvf (char **stdoutput, char **stderror, int flags,
720 char const *const *argv)
724 r = commandrvf (stdoutput, stderror, flags, (void *) argv);
731 /* This is a more sane version of 'system(3)' for running external
732 * commands. It uses fork/execvp, so we don't need to worry about
733 * quoting of parameters, and it allows us to capture any error
734 * messages in a buffer.
736 * If stdoutput is not NULL, then *stdoutput will return the stdout
739 * If stderror is not NULL, then *stderror will return the stderr
740 * of the command. If there is a final \n character, it is removed
741 * so you can use the error string directly in a call to
746 * COMMAND_FLAG_FOLD_STDOUT_ON_STDERR: For broken external commands
747 * that send error messages to stdout (hello, parted) but that don't
748 * have any useful stdout information, use this flag to capture the
749 * error messages in the *stderror buffer. If using this flag,
750 * you should pass stdoutput as NULL because nothing could ever be
751 * captured in that buffer.
753 * COMMAND_FLAG_CHROOT_COPY_FILE_TO_STDIN: For running external
754 * commands on chrooted files correctly (see RHBZ#579608) specifying
755 * this flag causes another process to be forked which chroots into
756 * sysroot and just copies the input file to stdin of the specified
757 * command. The file descriptor is ORed with the flags, and that file
758 * descriptor is always closed by this function. See hexdump.c for an
762 commandrvf (char **stdoutput, char **stderror, int flags,
763 char const* const *argv)
765 int so_size = 0, se_size = 0;
766 int so_fd[2], se_fd[2];
767 int flag_copy_stdin = flags & COMMAND_FLAG_CHROOT_COPY_FILE_TO_STDIN;
768 int stdin_fd[2] = { -1, -1 };
769 pid_t pid, stdin_pid = -1;
775 if (stdoutput) *stdoutput = NULL;
776 if (stderror) *stderror = NULL;
779 printf ("%s", argv[0]);
780 for (i = 1; argv[i] != NULL; ++i)
781 printf (" %s", argv[i]);
785 /* Note: abort is used in a few places along the error paths early
786 * in this function. This is because (a) cleaning up correctly is
787 * very complex at these places and (b) abort is used when a
788 * resource problems is indicated which would be due to much more
789 * serious issues - eg. memory or file descriptor leaks. We
790 * wouldn't expect fork(2) or pipe(2) to fail in normal
794 if (pipe (so_fd) == -1 || pipe (se_fd) == -1) {
795 error (0, errno, "pipe");
799 if (flag_copy_stdin) {
800 if (pipe (stdin_fd) == -1) {
801 error (0, errno, "pipe");
808 error (0, errno, "fork");
812 if (pid == 0) { /* Child process running the command. */
814 if (flag_copy_stdin) {
815 dup2 (stdin_fd[0], 0);
819 /* Set stdin to /dev/null (ignore failure) */
820 open ("/dev/null", O_RDONLY);
824 if (!(flags & COMMAND_FLAG_FOLD_STDOUT_ON_STDERR))
832 execvp (argv[0], (void *) argv);
834 _exit (EXIT_FAILURE);
837 if (flag_copy_stdin) {
838 int fd = flags & COMMAND_FLAG_FD_MASK;
841 if (stdin_pid == -1) {
842 error (0, errno, "fork");
846 if (stdin_pid == 0) { /* Child process copying stdin. */
853 dup2 (stdin_fd[1], 1);
857 if (chroot (sysroot) == -1) {
859 _exit (EXIT_FAILURE);
864 while ((n = read (fd, buffer, sizeof buffer)) > 0) {
865 if (xwrite (1, buffer, n) == -1)
866 /* EPIPE error indicates the command process has exited
867 * early. If the command process fails that will be caught
868 * by the daemon, and if not, then it's not an error.
870 _exit (errno == EPIPE ? EXIT_SUCCESS : EXIT_FAILURE);
875 _exit (EXIT_FAILURE);
878 if (close (fd) == -1) {
880 _exit (EXIT_FAILURE);
883 _exit (EXIT_SUCCESS);
891 /* Parent process. */
896 FD_SET (so_fd[0], &rset);
897 FD_SET (se_fd[0], &rset);
902 r = select (MAX (so_fd[0], se_fd[0]) + 1, &rset2, NULL, NULL, NULL);
906 if (stdoutput) free (*stdoutput);
907 if (stderror) free (*stderror);
910 waitpid (pid, NULL, 0);
911 if (stdin_pid >= 0) waitpid (stdin_pid, NULL, 0);
915 if (FD_ISSET (so_fd[0], &rset2)) { /* something on stdout */
916 r = read (so_fd[0], buf, sizeof buf);
921 if (r == 0) { FD_CLR (so_fd[0], &rset); quit++; }
923 if (r > 0 && stdoutput) {
925 p = realloc (*stdoutput, so_size);
931 memcpy (*stdoutput + so_size - r, buf, r);
935 if (FD_ISSET (se_fd[0], &rset2)) { /* something on stderr */
936 r = read (se_fd[0], buf, sizeof buf);
941 if (r == 0) { FD_CLR (se_fd[0], &rset); quit++; }
945 ignore_value (write (2, buf, r));
949 p = realloc (*stderror, se_size);
955 memcpy (*stderror + se_size - r, buf, r);
964 /* Make sure the output buffers are \0-terminated. Also remove any
965 * trailing \n characters from the error buffer (not from stdout).
968 void *q = realloc (*stdoutput, so_size+1);
975 (*stdoutput)[so_size] = '\0';
978 void *q = realloc (*stderror, se_size+1);
985 (*stderror)[se_size] = '\0';
987 while (se_size >= 0 && (*stderror)[se_size] == '\n')
988 (*stderror)[se_size--] = '\0';
992 if (flag_copy_stdin) {
993 /* Check copy process didn't fail. */
994 if (waitpid (stdin_pid, &r, 0) != stdin_pid) {
997 waitpid (pid, NULL, 0);
1001 if (!WIFEXITED (r) || WEXITSTATUS (r) != 0) {
1002 fprintf (stderr, "failed copying from input file, see earlier messages\n");
1004 waitpid (pid, NULL, 0);
1009 /* Get the exit status of the command. */
1010 if (waitpid (pid, &r, 0) != pid) {
1015 if (WIFEXITED (r)) {
1016 return WEXITSTATUS (r);
1021 /* Split an output string into a NULL-terminated list of lines.
1022 * Typically this is used where we have run an external command
1023 * which has printed out a list of things, and we want to return
1026 * The corner cases here are quite tricky. Note in particular:
1030 * "a\nb" -> ["a"; "b"]
1031 * "a\nb\n" -> ["a"; "b"]
1032 * "a\nb\n\n" -> ["a"; "b"; ""]
1034 * The original string is written over and destroyed by this
1035 * function (which is usually OK because it's the 'out' string
1036 * from command()). You can free the original string, because
1037 * add_string() strdups the strings.
1040 split_lines (char *str)
1042 char **lines = NULL;
1043 int size = 0, alloc = 0;
1046 if (STREQ (str, ""))
1051 /* Empty last line? */
1055 pend = strchr (p, '\n');
1061 if (add_string (&lines, &size, &alloc, p) == -1) {
1069 if (add_string (&lines, &size, &alloc, NULL) == -1)
1075 /* Skip leading and trailing whitespace, updating the original string
1081 size_t len = strlen (str);
1083 while (len > 0 && c_isspace (str[len-1])) {
1088 const char *p = str;
1089 while (*p && c_isspace (*p)) {
1094 memmove (str, p, len+1);
1097 /* printf helper function so we can use %Q ("quoted") and %R to print
1098 * shell-quoted strings. See HACKING file for more details.
1101 print_shell_quote (FILE *stream,
1102 const struct printf_info *info ATTRIBUTE_UNUSED,
1103 const void *const *args)
1105 #define SAFE(c) (c_isalnum((c)) || \
1106 (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
1108 const char *str = *((const char **) (args[0]));
1110 for (i = len = 0; str[i]; ++i) {
1111 if (!SAFE(str[i])) {
1112 putc ('\\', stream);
1115 putc (str[i], stream);
1123 print_sysroot_shell_quote (FILE *stream,
1124 const struct printf_info *info,
1125 const void *const *args)
1127 fputs (sysroot, stream);
1128 return sysroot_len + print_shell_quote (stream, info, args);
1131 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
1133 print_arginfo (const struct printf_info *info ATTRIBUTE_UNUSED,
1134 size_t n, int *argtypes, int *size)
1137 argtypes[0] = PA_STRING;
1138 size[0] = sizeof (const char *);
1143 #ifdef HAVE_REGISTER_PRINTF_FUNCTION
1145 print_arginfo (const struct printf_info *info, size_t n, int *argtypes)
1148 argtypes[0] = PA_STRING;
1152 #error "HAVE_REGISTER_PRINTF_{SPECIFIER|FUNCTION} not defined"
1156 /* Perform device name translation. Don't call this directly -
1157 * use the RESOLVE_DEVICE macro.
1159 * See guestfs(3) for the algorithm.
1161 * We have to open the device and test for ENXIO, because
1162 * the device nodes themselves will exist in the appliance.
1165 device_name_translation (char *device)
1169 fd = open (device, O_RDONLY);
1176 if (errno != ENXIO && errno != ENOENT)
1179 /* If the name begins with "/dev/sd" then try the alternatives. */
1180 if (STRNEQLEN (device, "/dev/sd", 7))
1183 device[5] = 'h'; /* /dev/hd (old IDE driver) */
1184 fd = open (device, O_RDONLY);
1188 device[5] = 'v'; /* /dev/vd (for virtio devices) */
1189 fd = open (device, O_RDONLY);
1193 device[5] = 's'; /* Restore original device name. */
1197 /* Check program exists and is executable on $PATH. Actually, we
1198 * just assume PATH contains the default entries (see main() above).
1201 prog_exists (const char *prog)
1203 static const char * const dirs[] =
1204 { "/sbin", "/usr/sbin", "/bin", "/usr/bin" };
1208 for (i = 0; i < sizeof dirs / sizeof dirs[0]; ++i) {
1209 snprintf (buf, sizeof buf, "%s/%s", dirs[i], prog);
1210 if (access (buf, X_OK) == 0)
1216 /* LVM and other commands aren't synchronous, especially when udev is
1217 * involved. eg. You can create or remove some device, but the /dev
1218 * device node won't appear until some time later. This means that
1219 * you get an error if you run one command followed by another.
1221 * Use 'udevadm settle' after certain commands, but don't be too
1222 * fussed if it fails.
1224 * 'udevsettle' was the old name for this command (RHEL 5). This was
1225 * deprecated in favour of 'udevadm settle'. The old 'udevsettle'
1226 * command was left as a symlink. Then in Fedora 13 the old symlink
1227 * remained but it stopped working (RHBZ#548121), so we have to be
1228 * careful not to assume that we can use 'udevsettle' if it exists.
1233 (void) command (NULL, NULL, "udevadm", "settle", NULL);
1234 (void) command (NULL, NULL, "udevsettle", NULL);