4 * Copyright IBM Corp. 2011
10 * This work is licensed under the terms of the GNU GPL, version 2 or later.
11 * See the COPYING file in the top-level directory.
20 #include "qemu_socket.h"
21 #include "json-streamer.h"
22 #include "json-parser.h"
25 #include "qga/guest-agent-core.h"
29 #include "error_int.h"
31 #define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0"
32 #define QGA_PIDFILE_DEFAULT "/var/run/qemu-ga.pid"
33 #define QGA_BAUDRATE_DEFAULT B38400 /* for isa-serial channels */
34 #define QGA_TIMEOUT_DEFAULT 30*1000 /* ms */
37 JSONMessageParser parser;
39 GIOChannel *conn_channel;
40 GIOChannel *listen_channel;
43 bool virtio; /* fastpath to check for virtio to deal with poll() quirks */
44 GACommandState *command_state;
45 GLogLevelFlags log_level;
50 static struct GAState *ga_state;
52 static void quit_handler(int sig)
54 g_debug("recieved signal num %d, quitting", sig);
56 if (g_main_loop_is_running(ga_state->main_loop)) {
57 g_main_loop_quit(ga_state->main_loop);
61 static void register_signal_handlers(void)
63 struct sigaction sigact;
66 memset(&sigact, 0, sizeof(struct sigaction));
67 sigact.sa_handler = quit_handler;
69 ret = sigaction(SIGINT, &sigact, NULL);
71 g_error("error configuring signal handler: %s", strerror(errno));
74 ret = sigaction(SIGTERM, &sigact, NULL);
76 g_error("error configuring signal handler: %s", strerror(errno));
80 static void usage(const char *cmd)
83 "Usage: %s -c <channel_opts>\n"
84 "QEMU Guest Agent %s\n"
86 " -m, --method transport method: one of unix-listen, virtio-serial, or\n"
87 " isa-serial (virtio-serial is the default)\n"
88 " -p, --path device/socket path (%s is the default for virtio-serial)\n"
89 " -l, --logfile set logfile path, logs to stderr by default\n"
90 " -f, --pidfile specify pidfile (default is %s)\n"
91 " -v, --verbose log extra debugging information\n"
92 " -V, --version print version information and exit\n"
93 " -d, --daemonize become a daemon\n"
94 " -h, --help display this help and exit\n"
97 , cmd, QGA_VERSION, QGA_VIRTIO_PATH_DEFAULT, QGA_PIDFILE_DEFAULT);
100 static void conn_channel_close(GAState *s);
102 static const char *ga_log_level_str(GLogLevelFlags level)
104 switch (level & G_LOG_LEVEL_MASK) {
105 case G_LOG_LEVEL_ERROR:
107 case G_LOG_LEVEL_CRITICAL:
109 case G_LOG_LEVEL_WARNING:
111 case G_LOG_LEVEL_MESSAGE:
113 case G_LOG_LEVEL_INFO:
115 case G_LOG_LEVEL_DEBUG:
122 bool ga_logging_enabled(GAState *s)
124 return s->logging_enabled;
127 void ga_disable_logging(GAState *s)
129 s->logging_enabled = false;
132 void ga_enable_logging(GAState *s)
134 s->logging_enabled = true;
137 static void ga_log(const gchar *domain, GLogLevelFlags level,
138 const gchar *msg, gpointer opaque)
142 const char *level_str = ga_log_level_str(level);
144 if (!ga_logging_enabled(s)) {
148 level &= G_LOG_LEVEL_MASK;
149 if (g_strcmp0(domain, "syslog") == 0) {
150 syslog(LOG_INFO, "%s: %s", level_str, msg);
151 } else if (level & s->log_level) {
152 g_get_current_time(&time);
154 "%lu.%lu: %s: %s\n", time.tv_sec, time.tv_usec, level_str, msg);
159 static void become_daemon(const char *pidfile)
173 pidfd = open(pidfile, O_CREAT|O_WRONLY|O_EXCL, S_IRUSR|S_IWUSR);
175 g_critical("Cannot create pid file, %s", strerror(errno));
179 if (asprintf(&pidstr, "%d", getpid()) == -1) {
180 g_critical("Cannot allocate memory");
183 if (write(pidfd, pidstr, strlen(pidstr)) != strlen(pidstr)) {
185 g_critical("Failed to write pid file");
194 if ((chdir("/")) < 0) {
199 close(STDOUT_FILENO);
200 close(STDERR_FILENO);
206 g_critical("failed to daemonize");
210 static int conn_channel_send_buf(GIOChannel *channel, const char *buf,
218 status = g_io_channel_write_chars(channel, buf, count, &written, &err);
219 g_debug("sending data, count: %d", (int)count);
221 g_warning("error sending newline: %s", err->message);
224 if (status == G_IO_STATUS_ERROR || status == G_IO_STATUS_EOF) {
228 if (status == G_IO_STATUS_NORMAL) {
236 static int conn_channel_send_payload(GIOChannel *channel, QObject *payload)
240 QString *payload_qstr;
243 g_assert(payload && channel);
245 payload_qstr = qobject_to_json(payload);
250 qstring_append_chr(payload_qstr, '\n');
251 buf = qstring_get_str(payload_qstr);
252 ret = conn_channel_send_buf(channel, buf, strlen(buf));
257 g_io_channel_flush(channel, &err);
259 g_warning("error flushing payload: %s", err->message);
265 QDECREF(payload_qstr);
272 static void process_command(GAState *s, QDict *req)
278 g_debug("processing command");
279 rsp = qmp_dispatch(QOBJECT(req));
281 ret = conn_channel_send_payload(s->conn_channel, rsp);
283 g_warning("error sending payload: %s", strerror(ret));
287 g_warning("error getting response");
291 /* handle requests/control events coming in over the channel */
292 static void process_event(JSONMessageParser *parser, QList *tokens)
294 GAState *s = container_of(parser, GAState, parser);
300 g_assert(s && parser);
302 g_debug("process_event: called");
303 obj = json_parser_parse_err(tokens, NULL, &err);
304 if (err || !obj || qobject_type(obj) != QTYPE_QDICT) {
308 g_warning("failed to parse event: unknown error");
309 error_set(&err, QERR_JSON_PARSING);
311 g_warning("failed to parse event: %s", error_get_pretty(err));
313 qdict_put_obj(qdict, "error", error_get_qobject(err));
316 qdict = qobject_to_qdict(obj);
321 /* handle host->guest commands */
322 if (qdict_haskey(qdict, "execute")) {
323 process_command(s, qdict);
325 if (!qdict_haskey(qdict, "error")) {
328 g_warning("unrecognized payload format");
329 error_set(&err, QERR_UNSUPPORTED);
330 qdict_put_obj(qdict, "error", error_get_qobject(err));
333 ret = conn_channel_send_payload(s->conn_channel, QOBJECT(qdict));
335 g_warning("error sending payload: %s", strerror(ret));
342 static gboolean conn_channel_read(GIOChannel *channel, GIOCondition condition,
349 memset(buf, 0, 1024);
350 GIOStatus status = g_io_channel_read_chars(channel, buf, 1024,
353 g_warning("error reading channel: %s", err->message);
354 conn_channel_close(s);
359 case G_IO_STATUS_ERROR:
360 g_warning("problem");
362 case G_IO_STATUS_NORMAL:
363 g_debug("read data, count: %d, data: %s", (int)count, buf);
364 json_message_parser_feed(&s->parser, (char *)buf, (int)count);
365 case G_IO_STATUS_AGAIN:
366 /* virtio causes us to spin here when no process is attached to
367 * host-side chardev. sleep a bit to mitigate this
373 case G_IO_STATUS_EOF:
374 g_debug("received EOF");
375 conn_channel_close(s);
381 g_warning("unknown channel read status, closing");
382 conn_channel_close(s);
388 static int conn_channel_add(GAState *s, int fd)
390 GIOChannel *conn_channel;
393 g_assert(s && !s->conn_channel);
394 conn_channel = g_io_channel_unix_new(fd);
395 g_assert(conn_channel);
396 g_io_channel_set_encoding(conn_channel, NULL, &err);
398 g_warning("error setting channel encoding to binary");
402 g_io_add_watch(conn_channel, G_IO_IN | G_IO_HUP,
403 conn_channel_read, s);
404 s->conn_channel = conn_channel;
408 static gboolean listen_channel_accept(GIOChannel *channel,
409 GIOCondition condition, gpointer data)
412 g_assert(channel != NULL);
414 bool accepted = false;
415 struct sockaddr_un addr;
416 socklen_t addrlen = sizeof(addr);
418 conn_fd = qemu_accept(g_io_channel_unix_get_fd(s->listen_channel),
419 (struct sockaddr *)&addr, &addrlen);
421 g_warning("error converting fd to gsocket: %s", strerror(errno));
424 fcntl(conn_fd, F_SETFL, O_NONBLOCK);
425 ret = conn_channel_add(s, conn_fd);
427 g_warning("error setting up connection");
433 /* only accept 1 connection at a time */
437 /* start polling for readable events on listen fd, new==true
438 * indicates we should use the existing s->listen_channel
440 static int listen_channel_add(GAState *s, int listen_fd, bool new)
443 s->listen_channel = g_io_channel_unix_new(listen_fd);
445 g_io_add_watch(s->listen_channel, G_IO_IN,
446 listen_channel_accept, s);
450 /* cleanup state for closed connection/session, start accepting new
451 * connections if we're in listening mode
453 static void conn_channel_close(GAState *s)
455 if (strcmp(s->method, "unix-listen") == 0) {
456 g_io_channel_shutdown(s->conn_channel, true, NULL);
457 listen_channel_add(s, 0, false);
458 } else if (strcmp(s->method, "virtio-serial") == 0) {
459 /* we spin on EOF for virtio-serial, so back off a bit. also,
460 * dont close the connection in this case, it'll resume normal
461 * operation when another process connects to host chardev
466 g_io_channel_unref(s->conn_channel);
467 s->conn_channel = NULL;
472 static void init_guest_agent(GAState *s)
477 if (s->method == NULL) {
478 /* try virtio-serial as our default */
479 s->method = "virtio-serial";
482 if (s->path == NULL) {
483 if (strcmp(s->method, "virtio-serial") != 0) {
484 g_critical("must specify a path for this channel");
487 /* try the default path for the virtio-serial port */
488 s->path = QGA_VIRTIO_PATH_DEFAULT;
491 if (strcmp(s->method, "virtio-serial") == 0) {
493 fd = qemu_open(s->path, O_RDWR | O_NONBLOCK | O_ASYNC);
495 g_critical("error opening channel: %s", strerror(errno));
498 ret = conn_channel_add(s, fd);
500 g_critical("error adding channel to main loop");
503 } else if (strcmp(s->method, "isa-serial") == 0) {
504 fd = qemu_open(s->path, O_RDWR | O_NOCTTY);
506 g_critical("error opening channel: %s", strerror(errno));
510 /* set up serial port for non-canonical, dumb byte streaming */
511 tio.c_iflag &= ~(IGNBRK | BRKINT | IGNPAR | PARMRK | INPCK | ISTRIP |
512 INLCR | IGNCR | ICRNL | IXON | IXOFF | IXANY |
516 tio.c_cflag |= QGA_BAUDRATE_DEFAULT;
517 /* 1 available byte min or reads will block (we'll set non-blocking
518 * elsewhere, else we have to deal with read()=0 instead)
522 /* flush everything waiting for read/xmit, it's garbage at this point */
523 tcflush(fd, TCIFLUSH);
524 tcsetattr(fd, TCSANOW, &tio);
525 ret = conn_channel_add(s, fd);
527 g_error("error adding channel to main loop");
529 } else if (strcmp(s->method, "unix-listen") == 0) {
530 fd = unix_listen(s->path, NULL, strlen(s->path));
532 g_critical("error opening path: %s", strerror(errno));
535 ret = listen_channel_add(s, fd, true);
537 g_critical("error binding/listening to specified socket");
541 g_critical("unsupported channel method/type: %s", s->method);
545 json_message_parser_init(&s->parser, process_event);
546 s->main_loop = g_main_loop_new(NULL, false);
549 int main(int argc, char **argv)
551 const char *sopt = "hVvdm:p:l:f:";
552 const char *method = NULL, *path = NULL, *pidfile = QGA_PIDFILE_DEFAULT;
553 const struct option lopt[] = {
554 { "help", 0, NULL, 'h' },
555 { "version", 0, NULL, 'V' },
556 { "logfile", 0, NULL, 'l' },
557 { "pidfile", 0, NULL, 'f' },
558 { "verbose", 0, NULL, 'v' },
559 { "method", 0, NULL, 'm' },
560 { "path", 0, NULL, 'p' },
561 { "daemonize", 0, NULL, 'd' },
564 int opt_ind = 0, ch, daemonize = 0;
565 GLogLevelFlags log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL;
566 FILE *log_file = stderr;
569 while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
578 log_file = fopen(optarg, "a");
580 g_critical("unable to open specified log file: %s",
589 /* enable all log levels */
590 log_level = G_LOG_LEVEL_MASK;
593 printf("QEMU Guest Agent %s\n", QGA_VERSION);
602 g_print("Unknown option, try '%s --help' for more information.\n",
609 g_debug("starting daemon");
610 become_daemon(pidfile);
613 s = g_malloc0(sizeof(GAState));
614 s->conn_channel = NULL;
617 s->log_file = log_file;
618 s->log_level = log_level;
619 g_log_set_default_handler(ga_log, s);
620 g_log_set_fatal_mask(NULL, G_LOG_LEVEL_ERROR);
621 s->logging_enabled = true;
622 s->command_state = ga_command_state_new();
623 ga_command_state_init(s, s->command_state);
624 ga_command_state_init_all(s->command_state);
627 module_call_init(MODULE_INIT_QAPI);
628 init_guest_agent(ga_state);
629 register_signal_handlers();
631 g_main_loop_run(ga_state->main_loop);
633 ga_command_state_cleanup_all(ga_state->command_state);