Makes a series of non-trivial calls.
[libguestfs.git] / src / guestfs.c
1 /* libguestfs
2  * Copyright (C) 2009 Red Hat Inc. 
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library 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 GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18
19 #include <config.h>
20
21 #define _BSD_SOURCE /* for mkdtemp, usleep */
22 #define _GNU_SOURCE /* for vasprintf, GNU strerror_r */
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <stdarg.h>
27 #include <unistd.h>
28 #include <ctype.h>
29 #include <string.h>
30 #include <fcntl.h>
31 #include <time.h>
32 #include <sys/select.h>
33 #include <rpc/types.h>
34 #include <rpc/xdr.h>
35
36 #ifdef HAVE_ERRNO_H
37 #include <errno.h>
38 #endif
39
40 #ifdef HAVE_SYS_TYPES_H
41 #include <sys/types.h>
42 #endif
43
44 #ifdef HAVE_SYS_WAIT_H
45 #include <sys/wait.h>
46 #endif
47
48 #ifdef HAVE_SYS_SOCKET_H
49 #include <sys/socket.h>
50 #endif
51
52 #ifdef HAVE_SYS_UN_H
53 #include <sys/un.h>
54 #endif
55
56 #include "guestfs.h"
57 #include "guestfs_protocol.h"
58
59 static void error (guestfs_h *g, const char *fs, ...);
60 static void perrorf (guestfs_h *g, const char *fs, ...);
61 static void *safe_malloc (guestfs_h *g, int nbytes);
62 static void *safe_realloc (guestfs_h *g, void *ptr, int nbytes);
63 static char *safe_strdup (guestfs_h *g, const char *str);
64
65 static void default_error_cb (guestfs_h *g, void *data, const char *msg);
66 static void stdout_event (void *data, int watch, int fd, int events);
67 static void sock_read_event (void *data, int watch, int fd, int events);
68 static void sock_write_event (void *data, int watch, int fd, int events);
69
70 static int select_add_handle (guestfs_h *g, int fd, int events, guestfs_handle_event_cb cb, void *data);
71 static int select_remove_handle (guestfs_h *g, int watch);
72 static int select_add_timeout (guestfs_h *g, int interval, guestfs_handle_timeout_cb cb, void *data);
73 static int select_remove_timeout (guestfs_h *g, int timer);
74 static void select_main_loop_run (guestfs_h *g);
75 static void select_main_loop_quit (guestfs_h *g);
76
77 #define UNIX_PATH_MAX 108
78
79 /* Also in guestfsd.c */
80 #define VMCHANNEL_PORT 6666
81 #define VMCHANNEL_ADDR "10.0.2.4"
82
83 /* Current main loop. */
84 static guestfs_main_loop main_loop = {
85   .add_handle = select_add_handle,
86   .remove_handle = select_remove_handle,
87   .add_timeout = select_add_timeout,
88   .remove_timeout = select_remove_timeout,
89   .main_loop_run = select_main_loop_run,
90   .main_loop_quit = select_main_loop_quit,
91 };
92
93 /* GuestFS handle and connection. */
94 enum state { CONFIG, LAUNCHING, READY, BUSY, NO_HANDLE };
95
96 struct guestfs_h
97 {
98   /* State: see the state machine diagram in the man page guestfs(3). */
99   enum state state;
100
101   int fd[2];                    /* Stdin/stdout of qemu. */
102   int sock;                     /* Daemon communications socket. */
103   int pid;                      /* Qemu PID. */
104   time_t start_t;               /* The time when we started qemu. */
105
106   int stdout_watch;             /* Watches qemu stdout for log messages. */
107   int sock_watch;               /* Watches daemon comm socket. */
108
109   char *tmpdir;                 /* Temporary directory containing socket. */
110
111   char **cmdline;               /* Qemu command line. */
112   int cmdline_size;
113
114   int verbose;
115
116   /* Callbacks. */
117   guestfs_abort_cb           abort_cb;
118   guestfs_error_handler_cb   error_cb;
119   void *                     error_cb_data;
120   guestfs_reply_cb           reply_cb;
121   void *                     reply_cb_data;
122   guestfs_log_message_cb     log_message_cb;
123   void *                     log_message_cb_data;
124   guestfs_subprocess_quit_cb subprocess_quit_cb;
125   void *                     subprocess_quit_cb_data;
126   guestfs_launch_done_cb     launch_done_cb;
127   void *                     launch_done_cb_data;
128
129   /* These callbacks are called before reply_cb and launch_done_cb,
130    * and are used to implement the high-level API without needing to
131    * interfere with callbacks that the user might have set.
132    */
133   guestfs_reply_cb           reply_cb_internal;
134   void *                     reply_cb_internal_data;
135   guestfs_launch_done_cb     launch_done_cb_internal;
136   void *                     launch_done_cb_internal_data;
137
138   /* Messages sent and received from the daemon. */
139   char *msg_in;
140   int msg_in_size, msg_in_allocated;
141   char *msg_out;
142   int msg_out_size, msg_out_pos;
143
144   int msg_next_serial;
145 };
146
147 guestfs_h *
148 guestfs_create (void)
149 {
150   guestfs_h *g;
151   const char *str;
152
153   g = malloc (sizeof (*g));
154   if (!g) return NULL;
155
156   memset (g, 0, sizeof (*g));
157
158   g->state = CONFIG;
159
160   g->fd[0] = -1;
161   g->fd[1] = -1;
162   g->sock = -1;
163   g->stdout_watch = -1;
164   g->sock_watch = -1;
165
166   g->abort_cb = abort;
167   g->error_cb = default_error_cb;
168   g->error_cb_data = NULL;
169
170   str = getenv ("LIBGUESTFS_DEBUG");
171   g->verbose = str != NULL && strcmp (str, "1") == 0;
172
173   /* Start with large serial numbers so they are easy to spot
174    * inside the protocol.
175    */
176   g->msg_next_serial = 0x00123400;
177
178   return g;
179 }
180
181 void
182 guestfs_close (guestfs_h *g)
183 {
184   int i;
185   char filename[256];
186
187   if (g->state == NO_HANDLE) {
188     /* Not safe to call 'error' here, so ... */
189     fprintf (stderr, "guestfs_close: called twice on the same handle\n");
190     return;
191   }
192
193   /* Remove any handlers that might be called back before we kill the
194    * subprocess.
195    */
196   g->log_message_cb = NULL;
197
198   if (g->state != CONFIG)
199     guestfs_kill_subprocess (g);
200
201   if (g->tmpdir) {
202     snprintf (filename, sizeof filename, "%s/sock", g->tmpdir);
203     unlink (filename);
204
205     rmdir (g->tmpdir);
206
207     free (g->tmpdir);
208   }
209
210   if (g->cmdline) {
211     for (i = 0; i < g->cmdline_size; ++i)
212       free (g->cmdline[i]);
213     free (g->cmdline);
214   }
215
216   /* Mark the handle as dead before freeing it. */
217   g->state = NO_HANDLE;
218
219   free (g);
220 }
221
222 static void
223 default_error_cb (guestfs_h *g, void *data, const char *msg)
224 {
225   fprintf (stderr, "libguestfs: error: %s\n", msg);
226 }
227
228 static void
229 error (guestfs_h *g, const char *fs, ...)
230 {
231   va_list args;
232   char *msg;
233
234   if (!g->error_cb) return;
235
236   va_start (args, fs);
237   vasprintf (&msg, fs, args);
238   va_end (args);
239
240   g->error_cb (g, g->error_cb_data, msg);
241
242   free (msg);
243 }
244
245 static void
246 perrorf (guestfs_h *g, const char *fs, ...)
247 {
248   va_list args;
249   char *msg;
250   int err = errno;
251
252   if (!g->error_cb) return;
253
254   va_start (args, fs);
255   vasprintf (&msg, fs, args);
256   va_end (args);
257
258 #ifndef _GNU_SOURCE
259   char buf[256];
260   strerror_r (err, buf, sizeof buf);
261 #else
262   char _buf[256];
263   char *buf;
264   buf = strerror_r (err, _buf, sizeof _buf);
265 #endif
266
267   msg = safe_realloc (g, msg, strlen (msg) + 2 + strlen (buf) + 1);
268   strcat (msg, ": ");
269   strcat (msg, buf);
270
271   g->error_cb (g, g->error_cb_data, msg);
272
273   free (msg);
274 }
275
276 static void *
277 safe_malloc (guestfs_h *g, int nbytes)
278 {
279   void *ptr = malloc (nbytes);
280   if (!ptr) g->abort_cb ();
281   return ptr;
282 }
283
284 static void *
285 safe_realloc (guestfs_h *g, void *ptr, int nbytes)
286 {
287   void *p = realloc (ptr, nbytes);
288   if (!p) g->abort_cb ();
289   return p;
290 }
291
292 static char *
293 safe_strdup (guestfs_h *g, const char *str)
294 {
295   char *s = strdup (str);
296   if (!s) g->abort_cb ();
297   return s;
298 }
299
300 void
301 guestfs_set_out_of_memory_handler (guestfs_h *g, guestfs_abort_cb cb)
302 {
303   g->abort_cb = cb;
304 }
305
306 guestfs_abort_cb
307 guestfs_get_out_of_memory_handler (guestfs_h *g)
308 {
309   return g->abort_cb;
310 }
311
312 void
313 guestfs_set_error_handler (guestfs_h *g, guestfs_error_handler_cb cb, void *data)
314 {
315   g->error_cb = cb;
316   g->error_cb_data = data;
317 }
318
319 guestfs_error_handler_cb
320 guestfs_get_error_handler (guestfs_h *g, void **data_rtn)
321 {
322   if (data_rtn) *data_rtn = g->error_cb_data;
323   return g->error_cb;
324 }
325
326 void
327 guestfs_set_verbose (guestfs_h *g, int v)
328 {
329   g->verbose = v;
330 }
331
332 int
333 guestfs_get_verbose (guestfs_h *g)
334 {
335   return g->verbose;
336 }
337
338 /* Add a string to the current command line. */
339 static void
340 incr_cmdline_size (guestfs_h *g)
341 {
342   if (g->cmdline == NULL) {
343     /* g->cmdline[0] is reserved for argv[0], set in guestfs_launch. */
344     g->cmdline_size = 1;
345     g->cmdline = safe_malloc (g, sizeof (char *));
346     g->cmdline[0] = NULL;
347   }
348
349   g->cmdline_size++;
350   g->cmdline = safe_realloc (g, g->cmdline, sizeof (char *) * g->cmdline_size);
351 }
352
353 static int
354 add_cmdline (guestfs_h *g, const char *str)
355 {
356   if (g->state != CONFIG) {
357     error (g, "command line cannot be altered after qemu subprocess launched");
358     return -1;
359   }
360
361   incr_cmdline_size (g);
362   g->cmdline[g->cmdline_size-1] = safe_strdup (g, str);
363   return 0;
364 }
365
366 int
367 guestfs_config (guestfs_h *g,
368                 const char *qemu_param, const char *qemu_value)
369 {
370   if (qemu_param[0] != '-') {
371     error (g, "guestfs_config: parameter must begin with '-' character");
372     return -1;
373   }
374
375   /* A bit fascist, but the user will probably break the extra
376    * parameters that we add if they try to set any of these.
377    */
378   if (strcmp (qemu_param, "-kernel") == 0 ||
379       strcmp (qemu_param, "-initrd") == 0 ||
380       strcmp (qemu_param, "-nographic") == 0 ||
381       strcmp (qemu_param, "-serial") == 0 ||
382       strcmp (qemu_param, "-vnc") == 0 ||
383       strcmp (qemu_param, "-full-screen") == 0 ||
384       strcmp (qemu_param, "-std-vga") == 0 ||
385       strcmp (qemu_param, "-vnc") == 0) {
386     error (g, "guestfs_config: parameter '%s' isn't allowed", qemu_param);
387     return -1;
388   }
389
390   if (add_cmdline (g, qemu_param) != 0) return -1;
391
392   if (qemu_value != NULL) {
393     if (add_cmdline (g, qemu_value) != 0) return -1;
394   }
395
396   return 0;
397 }
398
399 int
400 guestfs_add_drive (guestfs_h *g, const char *filename)
401 {
402   int len = strlen (filename) + 64;
403   char buf[len];
404
405   if (strchr (filename, ',') != NULL) {
406     error (g, "filename cannot contain ',' (comma) character");
407     return -1;
408   }
409
410   snprintf (buf, len, "file=%s", filename);
411
412   return guestfs_config (g, "-drive", buf);
413 }
414
415 int
416 guestfs_add_cdrom (guestfs_h *g, const char *filename)
417 {
418   if (strchr (filename, ',') != NULL) {
419     error (g, "filename cannot contain ',' (comma) character");
420     return -1;
421   }
422
423   return guestfs_config (g, "-cdrom", filename);
424 }
425
426 int
427 guestfs_launch (guestfs_h *g)
428 {
429   static const char *dir_template = "/tmp/libguestfsXXXXXX";
430   int r, i;
431   int wfd[2], rfd[2];
432   int tries;
433   /*const char *qemu = QEMU;*/  /* XXX */
434   const char *qemu = "/usr/bin/qemu-system-x86_64";
435   const char *kernel = "vmlinuz.fedora-10.x86_64";
436   const char *initrd = "initramfs.fedora-10.x86_64.img";
437   char unixsock[256];
438   struct sockaddr_un addr;
439
440   /* XXX Choose which qemu to run. */
441   /* XXX Choose initrd, etc. */
442
443   /* Configured? */
444   if (!g->cmdline) {
445     error (g, "you must call guestfs_add_drive before guestfs_launch");
446     return -1;
447   }
448
449   if (g->state != CONFIG) {
450     error (g, "qemu has already been launched");
451     return -1;
452   }
453
454   /* Make the temporary directory containing the socket. */
455   if (!g->tmpdir) {
456     g->tmpdir = safe_strdup (g, dir_template);
457     if (mkdtemp (g->tmpdir) == NULL) {
458       perrorf (g, "%s: cannot create temporary directory", dir_template);
459       return -1;
460     }
461   }
462
463   snprintf (unixsock, sizeof unixsock, "%s/sock", g->tmpdir);
464   unlink (unixsock);
465
466   if (pipe (wfd) == -1 || pipe (rfd) == -1) {
467     perrorf (g, "pipe");
468     return -1;
469   }
470
471   r = fork ();
472   if (r == -1) {
473     perrorf (g, "fork");
474     close (wfd[0]);
475     close (wfd[1]);
476     close (rfd[0]);
477     close (rfd[1]);
478     return -1;
479   }
480
481   if (r == 0) {                 /* Child (qemu). */
482     char vmchannel[256];
483     char append[256];
484
485     /* Set up the full command line.  Do this in the subprocess so we
486      * don't need to worry about cleaning up.
487      */
488     g->cmdline[0] = (char *) qemu;
489
490     /* Construct the -net channel parameter for qemu. */
491     snprintf (vmchannel, sizeof vmchannel,
492               "channel,%d:unix:%s,server,nowait",
493               VMCHANNEL_PORT, unixsock);
494
495     /* Linux kernel command line. */
496     snprintf (append, sizeof append,
497               "console=ttyS0 guestfs=%s:%d", VMCHANNEL_ADDR, VMCHANNEL_PORT);
498
499     add_cmdline (g, "-m");
500     add_cmdline (g, "384");     /* XXX Choose best size. */
501     add_cmdline (g, "-kernel");
502     add_cmdline (g, (char *) kernel);
503     add_cmdline (g, "-initrd");
504     add_cmdline (g, (char *) initrd);
505     add_cmdline (g, "-append");
506     add_cmdline (g, append);
507     add_cmdline (g, "-nographic");
508     add_cmdline (g, "-serial");
509     add_cmdline (g, "stdio");
510     add_cmdline (g, "-net");
511     add_cmdline (g, vmchannel);
512     add_cmdline (g, "-net");
513     add_cmdline (g, "user,vlan=0");
514     add_cmdline (g, "-net");
515     add_cmdline (g, "nic,vlan=0");
516     incr_cmdline_size (g);
517     g->cmdline[g->cmdline_size-1] = NULL;
518
519     if (g->verbose) {
520       fprintf (stderr, "%s", qemu);
521       for (i = 0; g->cmdline[i]; ++i)
522         fprintf (stderr, " %s", g->cmdline[i]);
523       fprintf (stderr, "\n");
524     }
525
526     /* Set up stdin, stdout. */
527     close (0);
528     close (1);
529     close (wfd[1]);
530     close (rfd[0]);
531     dup (wfd[0]);
532     dup (rfd[1]);
533
534 #if 0
535     /* Set up a new process group, so we can signal this process
536      * and all subprocesses (eg. if qemu is really a shell script).
537      */
538     setpgid (0, 0);
539 #endif
540
541     execv (qemu, g->cmdline);   /* Run qemu. */
542     perror (qemu);
543     _exit (1);
544   }
545
546   /* Parent (library). */
547   g->pid = r;
548
549   /* Start the clock ... */
550   time (&g->start_t);
551
552   /* Close the other ends of the pipe. */
553   close (wfd[0]);
554   close (rfd[1]);
555
556   if (fcntl (wfd[1], F_SETFL, O_NONBLOCK) == -1 ||
557       fcntl (rfd[0], F_SETFL, O_NONBLOCK) == -1) {
558     perrorf (g, "fcntl");
559     goto cleanup1;
560   }
561
562   g->fd[0] = wfd[1];            /* stdin of child */
563   g->fd[1] = rfd[0];            /* stdout of child */
564
565   /* Open the Unix socket.  The vmchannel implementation that got
566    * merged with qemu sucks in a number of ways.  Both ends do
567    * connect(2), which means that no one knows what, if anything, is
568    * connected to the other end, or if it becomes disconnected.  Even
569    * worse, we have to wait some indeterminate time for qemu to create
570    * the socket and connect to it (which happens very early in qemu's
571    * start-up), so any code that uses vmchannel is inherently racy.
572    * Hence this silly loop.
573    */
574   g->sock = socket (AF_UNIX, SOCK_STREAM, 0);
575   if (g->sock == -1) {
576     perrorf (g, "socket");
577     goto cleanup1;
578   }
579
580   if (fcntl (g->sock, F_SETFL, O_NONBLOCK) == -1) {
581     perrorf (g, "fcntl");
582     goto cleanup2;
583   }
584
585   addr.sun_family = AF_UNIX;
586   strncpy (addr.sun_path, unixsock, UNIX_PATH_MAX);
587   addr.sun_path[UNIX_PATH_MAX-1] = '\0';
588
589   tries = 100;
590   while (tries > 0) {
591     /* Always sleep at least once to give qemu a small chance to start up. */
592     usleep (10000);
593
594     r = connect (g->sock, (struct sockaddr *) &addr, sizeof addr);
595     if ((r == -1 && errno == EINPROGRESS) || r == 0)
596       goto connected;
597
598     if (errno != ENOENT)
599       perrorf (g, "connect");
600     tries--;
601   }
602
603   error (g, "failed to connect to vmchannel socket");
604   goto cleanup2;
605
606  connected:
607   /* Watch the file descriptors. */
608   free (g->msg_in);
609   g->msg_in = NULL;
610   g->msg_in_size = g->msg_in_allocated = 0;
611
612   free (g->msg_out);
613   g->msg_out = NULL;
614   g->msg_out_size = 0;
615   g->msg_out_pos = 0;
616
617   g->stdout_watch =
618     main_loop.add_handle (g, g->fd[1],
619                           GUESTFS_HANDLE_READABLE,
620                           stdout_event, g);
621   if (g->stdout_watch == -1) {
622     error (g, "could not watch qemu stdout");
623     goto cleanup3;
624   }
625
626   g->sock_watch =
627     main_loop.add_handle (g, g->sock,
628                           GUESTFS_HANDLE_READABLE,
629                           sock_read_event, g);
630   if (g->sock_watch == -1) {
631     error (g, "could not watch daemon communications socket");
632     goto cleanup3;
633   }
634
635   g->state = LAUNCHING;
636   return 0;
637
638  cleanup3:
639   if (g->stdout_watch >= 0)
640     main_loop.remove_handle (g, g->stdout_watch);
641   if (g->sock_watch >= 0)
642     main_loop.remove_handle (g, g->sock_watch);
643
644  cleanup2:
645   close (g->sock);
646
647  cleanup1:
648   close (wfd[1]);
649   close (rfd[0]);
650   kill (g->pid, 9);
651   waitpid (g->pid, NULL, 0);
652   g->fd[0] = -1;
653   g->fd[1] = -1;
654   g->sock = -1;
655   g->pid = 0;
656   g->start_t = 0;
657   g->stdout_watch = -1;
658   g->sock_watch = -1;
659   return -1;
660 }
661
662 static void
663 finish_wait_ready (guestfs_h *g, void *vp)
664 {
665   *((int *)vp) = 1;
666   main_loop.main_loop_quit (g);
667 }
668
669 int
670 guestfs_wait_ready (guestfs_h *g)
671 {
672   int r = 0;
673
674   if (g->state == READY) return 0;
675
676   if (g->state == BUSY) {
677     error (g, "qemu has finished launching already");
678     return -1;
679   }
680
681   if (g->state != LAUNCHING) {
682     error (g, "qemu has not been launched yet");
683     return -1;
684   }
685
686   g->launch_done_cb_internal = finish_wait_ready;
687   g->launch_done_cb_internal_data = &r;
688   main_loop.main_loop_run (g);
689   g->launch_done_cb_internal = NULL;
690   g->launch_done_cb_internal_data = NULL;
691
692   if (r != 1) {
693     error (g, "guestfs_wait_ready failed, see earlier error messages");
694     return -1;
695   }
696
697   /* This is possible in some really strange situations, such as
698    * guestfsd starts up OK but then qemu immediately exits.  Check for
699    * it because the caller is probably expecting to be able to send
700    * commands after this function returns.
701    */
702   if (g->state != READY) {
703     error (g, "qemu launched and contacted daemon, but state != READY");
704     return -1;
705   }
706
707   return 0;
708 }
709
710 int
711 guestfs_kill_subprocess (guestfs_h *g)
712 {
713   if (g->state == CONFIG) {
714     error (g, "no subprocess to kill");
715     return -1;
716   }
717
718   if (g->verbose)
719     fprintf (stderr, "sending SIGTERM to process group %d\n", g->pid);
720
721   kill (g->pid, SIGTERM);
722
723   return 0;
724 }
725
726 /* This function is called whenever qemu prints something on stdout.
727  * Qemu's stdout is also connected to the guest's serial console, so
728  * we see kernel messages here too.
729  */
730 static void
731 stdout_event (void *data, int watch, int fd, int events)
732 {
733   guestfs_h *g = (guestfs_h *) data;
734   char buf[4096];
735   int n;
736
737 #if 0
738   if (g->verbose)
739     fprintf (stderr,
740              "stdout_event: %p g->state = %d, fd = %d, events = 0x%x\n",
741              g, g->state, fd, events);
742 #endif
743
744   if (g->fd[1] != fd) {
745     error (g, "stdout_event: internal error: %d != %d", g->fd[1], fd);
746     return;
747   }
748
749   n = read (fd, buf, sizeof buf);
750   if (n == 0) {
751     /* Hopefully this indicates the qemu child process has died. */
752     if (g->verbose)
753       fprintf (stderr, "stdout_event: %p: child process died\n", g);
754     /*kill (g->pid, SIGTERM);*/
755     waitpid (g->pid, NULL, 0);
756     if (g->stdout_watch >= 0)
757       main_loop.remove_handle (g, g->stdout_watch);
758     if (g->sock_watch >= 0)
759       main_loop.remove_handle (g, g->sock_watch);
760     close (g->fd[0]);
761     close (g->fd[1]);
762     close (g->sock);
763     g->fd[0] = -1;
764     g->fd[1] = -1;
765     g->sock = -1;
766     g->pid = 0;
767     g->start_t = 0;
768     g->stdout_watch = -1;
769     g->sock_watch = -1;
770     g->state = CONFIG;
771     if (g->subprocess_quit_cb)
772       g->subprocess_quit_cb (g, g->subprocess_quit_cb_data);
773     return;
774   }
775
776   if (n == -1) {
777     if (errno != EAGAIN)
778       perrorf (g, "read");
779     return;
780   }
781
782   /* In verbose mode, copy all log messages to stderr. */
783   if (g->verbose)
784     write (2, buf, n);
785
786   /* It's an actual log message, send it upwards if anyone is listening. */
787   if (g->log_message_cb)
788     g->log_message_cb (g, g->log_message_cb_data, buf, n);
789 }
790
791 /* The function is called whenever we can read something on the
792  * guestfsd (daemon inside the guest) communication socket.
793  */
794 static void
795 sock_read_event (void *data, int watch, int fd, int events)
796 {
797   guestfs_h *g = (guestfs_h *) data;
798   XDR xdr;
799   unsigned len;
800   int n;
801
802   if (g->verbose)
803     fprintf (stderr,
804              "sock_read_event: %p g->state = %d, fd = %d, events = 0x%x\n",
805              g, g->state, fd, events);
806
807   if (g->sock != fd) {
808     error (g, "sock_read_event: internal error: %d != %d", g->sock, fd);
809     return;
810   }
811
812   if (g->msg_in_size <= g->msg_in_allocated) {
813     g->msg_in_allocated += 4096;
814     g->msg_in = safe_realloc (g, g->msg_in, g->msg_in_allocated);
815   }
816   n = read (g->sock, g->msg_in + g->msg_in_size,
817             g->msg_in_allocated - g->msg_in_size);
818   if (n == 0)
819     /* Disconnected?  Ignore it because stdout_watch will get called
820      * and will do the cleanup.
821      */
822     return;
823
824   if (n == -1) {
825     if (errno != EAGAIN)
826       perrorf (g, "read");
827     return;
828   }
829
830   g->msg_in_size += n;
831
832   /* Have we got enough of a message to be able to process it yet? */
833   if (g->msg_in_size < 4) return;
834
835   xdrmem_create (&xdr, g->msg_in, g->msg_in_size, XDR_DECODE);
836   if (!xdr_uint32_t (&xdr, &len)) {
837     error (g, "can't decode length word");
838     goto cleanup;
839   }
840
841   /* Length is normally the length of the message, but when guestfsd
842    * starts up it sends a "magic" value (longer than any possible
843    * message).  Check for this.
844    */
845   if (len == 0xf5f55ff5) {
846     if (g->state != LAUNCHING)
847       error (g, "received magic signature from guestfsd, but in state %d",
848              g->state);
849     else if (g->msg_in_size != 4)
850       error (g, "received magic signature from guestfsd, but msg size is %d",
851              g->msg_in_size);
852     else {
853       g->state = READY;
854       if (g->launch_done_cb_internal)
855         g->launch_done_cb_internal (g, g->launch_done_cb_internal_data);
856       if (g->launch_done_cb)
857         g->launch_done_cb (g, g->launch_done_cb_data);
858     }
859
860     goto cleanup;
861   }
862
863   /* If this happens, it's pretty bad and we've probably lost synchronization.*/
864   if (len > GUESTFS_MESSAGE_MAX) {
865     error (g, "message length (%u) > maximum possible size (%d)",
866            len, GUESTFS_MESSAGE_MAX);
867     goto cleanup;
868   }
869
870   if (g->msg_in_size-4 < len) return; /* Need more of this message. */
871
872   /* This should not happen, and if it does it probably means we've
873    * lost all hope of synchronization.
874    */
875   if (g->msg_in_size-4 > len) {
876     error (g, "len = %d, but msg_in_size-4 = %d", len, g->msg_in_size-4);
877     goto cleanup;
878   }
879
880   /* Not in the expected state. */
881   if (g->state != BUSY)
882     error (g, "state %d != BUSY", g->state);
883
884   /* Push the message up to the higher layer.  Note that unlike
885    * launch_done_cb / launch_done_cb_internal, we only call at
886    * most one of the callback functions here.
887    */
888   g->state = READY;
889   if (g->reply_cb_internal)
890     g->reply_cb_internal (g, g->reply_cb_internal_data, &xdr);
891   else if (g->reply_cb)
892     g->reply_cb (g, g->reply_cb, &xdr);
893
894  cleanup:
895   /* Free the message buffer if it's grown excessively large. */
896   if (g->msg_in_allocated > 65536) {
897     free (g->msg_in);
898     g->msg_in = NULL;
899     g->msg_in_size = g->msg_in_allocated = 0;
900   } else
901     g->msg_in_size = 0;
902
903   xdr_destroy (&xdr);
904 }
905
906 /* The function is called whenever we can write something on the
907  * guestfsd (daemon inside the guest) communication socket.
908  */
909 static void
910 sock_write_event (void *data, int watch, int fd, int events)
911 {
912   guestfs_h *g = (guestfs_h *) data;
913   int n;
914
915   if (g->verbose)
916     fprintf (stderr,
917              "sock_write_event: %p g->state = %d, fd = %d, events = 0x%x\n",
918              g, g->state, fd, events);
919
920   if (g->sock != fd) {
921     error (g, "sock_write_event: internal error: %d != %d", g->sock, fd);
922     return;
923   }
924
925   if (g->state != BUSY) {
926     error (g, "sock_write_event: state %d != BUSY", g->state);
927     return;
928   }
929
930   if (g->verbose)
931     fprintf (stderr, "sock_write_event: writing %d bytes ...\n",
932              g->msg_out_size - g->msg_out_pos);
933
934   n = write (g->sock, g->msg_out + g->msg_out_pos,
935              g->msg_out_size - g->msg_out_pos);
936   if (n == -1) {
937     if (errno != EAGAIN)
938       perrorf (g, "write");
939     return;
940   }
941
942   if (g->verbose)
943     fprintf (stderr, "sock_write_event: wrote %d bytes\n", n);
944
945   g->msg_out_pos += n;
946
947   /* More to write? */
948   if (g->msg_out_pos < g->msg_out_size)
949     return;
950
951   if (g->verbose)
952     fprintf (stderr, "sock_write_event: done writing, switching back to reading events\n");
953
954   free (g->msg_out);
955   g->msg_out_pos = g->msg_out_size = 0;
956
957   if (main_loop.remove_handle (g, g->sock_watch) == -1) {
958     error (g, "remove_handle failed in sock_write_event");
959     return;
960   }
961   g->sock_watch =
962     main_loop.add_handle (g, g->sock,
963                           GUESTFS_HANDLE_READABLE,
964                           sock_read_event, g);
965   if (g->sock_watch == -1) {
966     error (g, "add_handle failed in sock_write_event");
967     return;
968   }
969 }
970
971 /* Dispatch a call to the remote daemon.  This function just queues
972  * the call in msg_out, to be sent when we next enter the main loop.
973  * Returns -1 for error, or the message serial number.
974  */
975 static int
976 dispatch (guestfs_h *g, int proc_nr, xdrproc_t xdrp, char *args)
977 {
978   char buffer[GUESTFS_MESSAGE_MAX];
979   struct guestfs_message_header hdr;
980   XDR xdr;
981   unsigned len;
982   int serial = g->msg_next_serial++;
983
984   if (g->state != READY) {
985     error (g, "dispatch: state %d != READY", g->state);
986     return -1;
987   }
988
989   /* Serialize the header. */
990   hdr.prog = GUESTFS_PROGRAM;
991   hdr.vers = GUESTFS_PROTOCOL_VERSION;
992   hdr.proc = proc_nr;
993   hdr.direction = GUESTFS_DIRECTION_CALL;
994   hdr.serial = serial;
995   hdr.status = GUESTFS_STATUS_OK;
996
997   xdrmem_create (&xdr, buffer, sizeof buffer, XDR_ENCODE);
998   if (!xdr_guestfs_message_header (&xdr, &hdr)) {
999     error (g, "xdr_guestfs_message_header failed");
1000     return -1;
1001   }
1002
1003   /* Serialize the args.  If any, because some message types
1004    * have no parameters.
1005    */
1006   if (xdrp) {
1007     if (!(*xdrp) (&xdr, args)) {
1008       error (g, "dispatch failed to marshal args");
1009       return -1;
1010     }
1011   }
1012
1013   len = xdr_getpos (&xdr);
1014   xdr_destroy (&xdr);
1015
1016   /* Allocate the outgoing message buffer. */
1017   g->msg_out = safe_malloc (g, len + 4);
1018
1019   g->msg_out_size = len + 4;
1020   g->msg_out_pos = 0;
1021   g->state = BUSY;
1022
1023   xdrmem_create (&xdr, g->msg_out, 4, XDR_ENCODE);
1024   if (!xdr_uint32_t (&xdr, &len)) {
1025     error (g, "xdr_uint32_t failed in dispatch");
1026     goto cleanup1;
1027   }
1028
1029   memcpy (g->msg_out + 4, buffer, len);
1030
1031   /* Change the handle to sock_write_event. */
1032   if (main_loop.remove_handle (g, g->sock_watch) == -1) {
1033     error (g, "remove_handle failed in dispatch");
1034     goto cleanup1;
1035   }
1036   g->sock_watch =
1037     main_loop.add_handle (g, g->sock,
1038                           GUESTFS_HANDLE_WRITABLE,
1039                           sock_write_event, g);
1040   if (g->sock_watch == -1) {
1041     error (g, "add_handle failed in dispatch");
1042     goto cleanup1;
1043   }
1044
1045   return serial;
1046
1047  cleanup1:
1048   free (g->msg_out);
1049   g->msg_out = NULL;
1050   g->msg_out_size = 0;
1051   g->state = READY;
1052   return -1;
1053 }
1054
1055 /* The high-level actions are autogenerated by generator.ml.  Include
1056  * them here.
1057  */
1058 #include "guestfs-actions.c"
1059
1060 /* This is the default main loop implementation, using select(2). */
1061
1062 struct handle_cb_data {
1063   guestfs_handle_event_cb cb;
1064   void *data;
1065 };
1066
1067 static fd_set rset;
1068 static fd_set wset;
1069 static fd_set xset;
1070 static int select_init_done = 0;
1071 static int max_fd = -1;
1072 static int nr_fds = 0;
1073 static struct handle_cb_data *handle_cb_data = NULL;
1074
1075 static void
1076 select_init (void)
1077 {
1078   if (!select_init_done) {
1079     FD_ZERO (&rset);
1080     FD_ZERO (&wset);
1081     FD_ZERO (&xset);
1082
1083     select_init_done = 1;
1084   }
1085 }
1086
1087 static int
1088 select_add_handle (guestfs_h *g, int fd, int events,
1089                    guestfs_handle_event_cb cb, void *data)
1090 {
1091   select_init ();
1092
1093   if (fd < 0 || fd >= FD_SETSIZE) {
1094     error (g, "fd %d is out of range", fd);
1095     return -1;
1096   }
1097
1098   if ((events & ~(GUESTFS_HANDLE_READABLE |
1099                   GUESTFS_HANDLE_WRITABLE |
1100                   GUESTFS_HANDLE_HANGUP |
1101                   GUESTFS_HANDLE_ERROR)) != 0) {
1102     error (g, "set of events (0x%x) contains unknown events", events);
1103     return -1;
1104   }
1105
1106   if (events == 0) {
1107     error (g, "set of events is empty");
1108     return -1;
1109   }
1110
1111   if (FD_ISSET (fd, &rset) || FD_ISSET (fd, &wset) || FD_ISSET (fd, &xset)) {
1112     error (g, "fd %d is already registered", fd);
1113     return -1;
1114   }
1115
1116   if (cb == NULL) {
1117     error (g, "callback is NULL");
1118     return -1;
1119   }
1120
1121   if ((events & GUESTFS_HANDLE_READABLE))
1122     FD_SET (fd, &rset);
1123   if ((events & GUESTFS_HANDLE_WRITABLE))
1124     FD_SET (fd, &wset);
1125   if ((events & GUESTFS_HANDLE_HANGUP) || (events & GUESTFS_HANDLE_ERROR))
1126     FD_SET (fd, &xset);
1127
1128   if (fd > max_fd) {
1129     max_fd = fd;
1130     handle_cb_data = safe_realloc (g, handle_cb_data,
1131                                    sizeof (struct handle_cb_data) * (max_fd+1));
1132   }
1133   handle_cb_data[fd].cb = cb;
1134   handle_cb_data[fd].data = data;
1135
1136   nr_fds++;
1137
1138   /* Any integer >= 0 can be the handle, and this is as good as any ... */
1139   return fd;
1140 }
1141
1142 static int
1143 select_remove_handle (guestfs_h *g, int fd)
1144 {
1145   select_init ();
1146
1147   if (fd < 0 || fd >= FD_SETSIZE) {
1148     error (g, "fd %d is out of range", fd);
1149     return -1;
1150   }
1151
1152   if (!FD_ISSET (fd, &rset) && !FD_ISSET (fd, &wset) && !FD_ISSET (fd, &xset)) {
1153     error (g, "fd %d was not registered", fd);
1154     return -1;
1155   }
1156
1157   FD_CLR (fd, &rset);
1158   FD_CLR (fd, &wset);
1159   FD_CLR (fd, &xset);
1160
1161   if (fd == max_fd) {
1162     max_fd--;
1163     handle_cb_data = safe_realloc (g, handle_cb_data,
1164                                    sizeof (struct handle_cb_data) * (max_fd+1));
1165   }
1166
1167   nr_fds--;
1168
1169   return 0;
1170 }
1171
1172 static int
1173 select_add_timeout (guestfs_h *g, int interval,
1174                     guestfs_handle_timeout_cb cb, void *data)
1175 {
1176   select_init ();
1177
1178   abort ();                     /* XXX not implemented yet */
1179 }
1180
1181 static int
1182 select_remove_timeout (guestfs_h *g, int timer)
1183 {
1184   select_init ();
1185
1186   abort ();                     /* XXX not implemented yet */
1187 }
1188
1189 /* Note that main loops can be nested. */
1190 static int level = 0;
1191
1192 static void
1193 select_main_loop_run (guestfs_h *g)
1194 {
1195   int old_level, fd, r, events;
1196   fd_set rset2, wset2, xset2;
1197
1198   select_init ();
1199
1200   old_level = level++;
1201   while (level > old_level) {
1202     if (nr_fds == 0) {
1203       level = old_level;
1204       break;
1205     }
1206
1207     rset2 = rset;
1208     wset2 = wset;
1209     xset2 = xset;
1210     r = select (max_fd+1, &rset2, &wset2, &xset2, NULL);
1211     if (r == -1) {
1212       perrorf (g, "select");
1213       level = old_level;
1214       break;
1215     }
1216
1217     for (fd = 0; r > 0 && fd <= max_fd; ++fd) {
1218       events = 0;
1219       if (FD_ISSET (fd, &rset2))
1220         events |= GUESTFS_HANDLE_READABLE;
1221       if (FD_ISSET (fd, &wset2))
1222         events |= GUESTFS_HANDLE_WRITABLE;
1223       if (FD_ISSET (fd, &xset2))
1224         events |= GUESTFS_HANDLE_ERROR | GUESTFS_HANDLE_HANGUP;
1225       if (events) {
1226         r--;
1227         handle_cb_data[fd].cb (handle_cb_data[fd].data,
1228                                fd, fd, events);
1229       }
1230     }
1231   }
1232 }
1233
1234 static void
1235 select_main_loop_quit (guestfs_h *g)
1236 {
1237   select_init ();
1238
1239   if (level == 0) {
1240     error (g, "cannot quit, we are not in a main loop");
1241     return;
1242   }
1243
1244   level--;
1245 }