Statistics
| Branch: | Revision:

root / qemu-ga.c @ 4bdb1a30

History | View | Annotate | Download (24.7 kB)

1
/*
2
 * QEMU Guest Agent
3
 *
4
 * Copyright IBM Corp. 2011
5
 *
6
 * Authors:
7
 *  Adam Litke        <aglitke@linux.vnet.ibm.com>
8
 *  Michael Roth      <mdroth@linux.vnet.ibm.com>
9
 *
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.
12
 */
13
#include <stdlib.h>
14
#include <stdio.h>
15
#include <stdbool.h>
16
#include <glib.h>
17
#include <getopt.h>
18
#ifndef _WIN32
19
#include <syslog.h>
20
#include <sys/wait.h>
21
#include <sys/stat.h>
22
#endif
23
#include "json-streamer.h"
24
#include "json-parser.h"
25
#include "qint.h"
26
#include "qjson.h"
27
#include "qga/guest-agent-core.h"
28
#include "module.h"
29
#include "signal.h"
30
#include "qerror.h"
31
#include "qapi/qmp-core.h"
32
#include "qga/channel.h"
33
#ifdef _WIN32
34
#include "qga/service-win32.h"
35
#include <windows.h>
36
#endif
37

    
38
#ifndef _WIN32
39
#define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0"
40
#else
41
#define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0"
42
#endif
43
#define QGA_PIDFILE_DEFAULT "/var/run/qemu-ga.pid"
44
#define QGA_STATEDIR_DEFAULT "/tmp"
45
#define QGA_SENTINEL_BYTE 0xFF
46

    
47
struct GAState {
48
    JSONMessageParser parser;
49
    GMainLoop *main_loop;
50
    GAChannel *channel;
51
    bool virtio; /* fastpath to check for virtio to deal with poll() quirks */
52
    GACommandState *command_state;
53
    GLogLevelFlags log_level;
54
    FILE *log_file;
55
    bool logging_enabled;
56
#ifdef _WIN32
57
    GAService service;
58
#endif
59
    bool delimit_response;
60
    bool frozen;
61
    GList *blacklist;
62
    const char *state_filepath_isfrozen;
63
    struct {
64
        const char *log_filepath;
65
        const char *pid_filepath;
66
    } deferred_options;
67
};
68

    
69
struct GAState *ga_state;
70

    
71
/* commands that are safe to issue while filesystems are frozen */
72
static const char *ga_freeze_whitelist[] = {
73
    "guest-ping",
74
    "guest-info",
75
    "guest-sync",
76
    "guest-fsfreeze-status",
77
    "guest-fsfreeze-thaw",
78
    NULL
79
};
80

    
81
#ifdef _WIN32
82
DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data,
83
                                  LPVOID ctx);
84
VOID WINAPI service_main(DWORD argc, TCHAR *argv[]);
85
#endif
86

    
87
static void quit_handler(int sig)
88
{
89
    /* if we're frozen, don't exit unless we're absolutely forced to,
90
     * because it's basically impossible for graceful exit to complete
91
     * unless all log/pid files are on unfreezable filesystems. there's
92
     * also a very likely chance killing the agent before unfreezing
93
     * the filesystems is a mistake (or will be viewed as one later).
94
     */
95
    if (ga_is_frozen(ga_state)) {
96
        return;
97
    }
98
    g_debug("received signal num %d, quitting", sig);
99

    
100
    if (g_main_loop_is_running(ga_state->main_loop)) {
101
        g_main_loop_quit(ga_state->main_loop);
102
    }
103
}
104

    
105
#ifndef _WIN32
106
static gboolean register_signal_handlers(void)
107
{
108
    struct sigaction sigact;
109
    int ret;
110

    
111
    memset(&sigact, 0, sizeof(struct sigaction));
112
    sigact.sa_handler = quit_handler;
113

    
114
    ret = sigaction(SIGINT, &sigact, NULL);
115
    if (ret == -1) {
116
        g_error("error configuring signal handler: %s", strerror(errno));
117
        return false;
118
    }
119
    ret = sigaction(SIGTERM, &sigact, NULL);
120
    if (ret == -1) {
121
        g_error("error configuring signal handler: %s", strerror(errno));
122
        return false;
123
    }
124

    
125
    return true;
126
}
127

    
128
/* TODO: use this in place of all post-fork() fclose(std*) callers */
129
void reopen_fd_to_null(int fd)
130
{
131
    int nullfd;
132

    
133
    nullfd = open("/dev/null", O_RDWR);
134
    if (nullfd < 0) {
135
        return;
136
    }
137

    
138
    dup2(nullfd, fd);
139

    
140
    if (nullfd != fd) {
141
        close(nullfd);
142
    }
143
}
144
#endif
145

    
146
static void usage(const char *cmd)
147
{
148
    printf(
149
"Usage: %s [-m <method> -p <path>] [<options>]\n"
150
"QEMU Guest Agent %s\n"
151
"\n"
152
"  -m, --method      transport method: one of unix-listen, virtio-serial, or\n"
153
"                    isa-serial (virtio-serial is the default)\n"
154
"  -p, --path        device/socket path (the default for virtio-serial is:\n"
155
"                    %s)\n"
156
"  -l, --logfile     set logfile path, logs to stderr by default\n"
157
"  -f, --pidfile     specify pidfile (default is %s)\n"
158
"  -t, --statedir    specify dir to store state information (absolute paths\n"
159
"                    only, default is %s)\n"
160
"  -v, --verbose     log extra debugging information\n"
161
"  -V, --version     print version information and exit\n"
162
"  -d, --daemonize   become a daemon\n"
163
#ifdef _WIN32
164
"  -s, --service     service commands: install, uninstall\n"
165
#endif
166
"  -b, --blacklist   comma-separated list of RPCs to disable (no spaces, \"?\"\n"
167
"                    to list available RPCs)\n"
168
"  -h, --help        display this help and exit\n"
169
"\n"
170
"Report bugs to <mdroth@linux.vnet.ibm.com>\n"
171
    , cmd, QEMU_VERSION, QGA_VIRTIO_PATH_DEFAULT, QGA_PIDFILE_DEFAULT,
172
    QGA_STATEDIR_DEFAULT);
173
}
174

    
175
static const char *ga_log_level_str(GLogLevelFlags level)
176
{
177
    switch (level & G_LOG_LEVEL_MASK) {
178
        case G_LOG_LEVEL_ERROR:
179
            return "error";
180
        case G_LOG_LEVEL_CRITICAL:
181
            return "critical";
182
        case G_LOG_LEVEL_WARNING:
183
            return "warning";
184
        case G_LOG_LEVEL_MESSAGE:
185
            return "message";
186
        case G_LOG_LEVEL_INFO:
187
            return "info";
188
        case G_LOG_LEVEL_DEBUG:
189
            return "debug";
190
        default:
191
            return "user";
192
    }
193
}
194

    
195
bool ga_logging_enabled(GAState *s)
196
{
197
    return s->logging_enabled;
198
}
199

    
200
void ga_disable_logging(GAState *s)
201
{
202
    s->logging_enabled = false;
203
}
204

    
205
void ga_enable_logging(GAState *s)
206
{
207
    s->logging_enabled = true;
208
}
209

    
210
static void ga_log(const gchar *domain, GLogLevelFlags level,
211
                   const gchar *msg, gpointer opaque)
212
{
213
    GAState *s = opaque;
214
    GTimeVal time;
215
    const char *level_str = ga_log_level_str(level);
216

    
217
    if (!ga_logging_enabled(s)) {
218
        return;
219
    }
220

    
221
    level &= G_LOG_LEVEL_MASK;
222
#ifndef _WIN32
223
    if (domain && strcmp(domain, "syslog") == 0) {
224
        syslog(LOG_INFO, "%s: %s", level_str, msg);
225
    } else if (level & s->log_level) {
226
#else
227
    if (level & s->log_level) {
228
#endif
229
        g_get_current_time(&time);
230
        fprintf(s->log_file,
231
                "%lu.%lu: %s: %s\n", time.tv_sec, time.tv_usec, level_str, msg);
232
        fflush(s->log_file);
233
    }
234
}
235

    
236
void ga_set_response_delimited(GAState *s)
237
{
238
    s->delimit_response = true;
239
}
240

    
241
#ifndef _WIN32
242
static bool ga_open_pidfile(const char *pidfile)
243
{
244
    int pidfd;
245
    char pidstr[32];
246

    
247
    pidfd = open(pidfile, O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR);
248
    if (pidfd == -1 || lockf(pidfd, F_TLOCK, 0)) {
249
        g_critical("Cannot lock pid file, %s", strerror(errno));
250
        if (pidfd != -1) {
251
            close(pidfd);
252
        }
253
        return false;
254
    }
255

    
256
    if (ftruncate(pidfd, 0) || lseek(pidfd, 0, SEEK_SET)) {
257
        g_critical("Failed to truncate pid file");
258
        goto fail;
259
    }
260
    sprintf(pidstr, "%d", getpid());
261
    if (write(pidfd, pidstr, strlen(pidstr)) != strlen(pidstr)) {
262
        g_critical("Failed to write pid file");
263
        goto fail;
264
    }
265

    
266
    return true;
267

    
268
fail:
269
    unlink(pidfile);
270
    return false;
271
}
272
#else /* _WIN32 */
273
static bool ga_open_pidfile(const char *pidfile)
274
{
275
    return true;
276
}
277
#endif
278

    
279
static gint ga_strcmp(gconstpointer str1, gconstpointer str2)
280
{
281
    return strcmp(str1, str2);
282
}
283

    
284
/* disable commands that aren't safe for fsfreeze */
285
static void ga_disable_non_whitelisted(void)
286
{
287
    char **list_head, **list;
288
    bool whitelisted;
289
    int i;
290

    
291
    list_head = list = qmp_get_command_list();
292
    while (*list != NULL) {
293
        whitelisted = false;
294
        i = 0;
295
        while (ga_freeze_whitelist[i] != NULL) {
296
            if (strcmp(*list, ga_freeze_whitelist[i]) == 0) {
297
                whitelisted = true;
298
            }
299
            i++;
300
        }
301
        if (!whitelisted) {
302
            g_debug("disabling command: %s", *list);
303
            qmp_disable_command(*list);
304
        }
305
        g_free(*list);
306
        list++;
307
    }
308
    g_free(list_head);
309
}
310

    
311
/* [re-]enable all commands, except those explicitly blacklisted by user */
312
static void ga_enable_non_blacklisted(GList *blacklist)
313
{
314
    char **list_head, **list;
315

    
316
    list_head = list = qmp_get_command_list();
317
    while (*list != NULL) {
318
        if (g_list_find_custom(blacklist, *list, ga_strcmp) == NULL &&
319
            !qmp_command_is_enabled(*list)) {
320
            g_debug("enabling command: %s", *list);
321
            qmp_enable_command(*list);
322
        }
323
        g_free(*list);
324
        list++;
325
    }
326
    g_free(list_head);
327
}
328

    
329
static bool ga_create_file(const char *path)
330
{
331
    int fd = open(path, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR);
332
    if (fd == -1) {
333
        g_warning("unable to open/create file %s: %s", path, strerror(errno));
334
        return false;
335
    }
336
    close(fd);
337
    return true;
338
}
339

    
340
static bool ga_delete_file(const char *path)
341
{
342
    int ret = unlink(path);
343
    if (ret == -1) {
344
        g_warning("unable to delete file: %s: %s", path, strerror(errno));
345
        return false;
346
    }
347

    
348
    return true;
349
}
350

    
351
bool ga_is_frozen(GAState *s)
352
{
353
    return s->frozen;
354
}
355

    
356
void ga_set_frozen(GAState *s)
357
{
358
    if (ga_is_frozen(s)) {
359
        return;
360
    }
361
    /* disable all non-whitelisted (for frozen state) commands */
362
    ga_disable_non_whitelisted();
363
    g_warning("disabling logging due to filesystem freeze");
364
    ga_disable_logging(s);
365
    s->frozen = true;
366
    if (!ga_create_file(s->state_filepath_isfrozen)) {
367
        g_warning("unable to create %s, fsfreeze may not function properly",
368
                  s->state_filepath_isfrozen);
369
    }
370
}
371

    
372
void ga_unset_frozen(GAState *s)
373
{
374
    if (!ga_is_frozen(s)) {
375
        return;
376
    }
377

    
378
    /* if we delayed creation/opening of pid/log files due to being
379
     * in a frozen state at start up, do it now
380
     */
381
    if (s->deferred_options.log_filepath) {
382
        s->log_file = fopen(s->deferred_options.log_filepath, "a");
383
        if (!s->log_file) {
384
            s->log_file = stderr;
385
        }
386
        s->deferred_options.log_filepath = NULL;
387
    }
388
    ga_enable_logging(s);
389
    g_warning("logging re-enabled due to filesystem unfreeze");
390
    if (s->deferred_options.pid_filepath) {
391
        if (!ga_open_pidfile(s->deferred_options.pid_filepath)) {
392
            g_warning("failed to create/open pid file");
393
        }
394
        s->deferred_options.pid_filepath = NULL;
395
    }
396

    
397
    /* enable all disabled, non-blacklisted commands */
398
    ga_enable_non_blacklisted(s->blacklist);
399
    s->frozen = false;
400
    if (!ga_delete_file(s->state_filepath_isfrozen)) {
401
        g_warning("unable to delete %s, fsfreeze may not function properly",
402
                  s->state_filepath_isfrozen);
403
    }
404
}
405

    
406
static void become_daemon(const char *pidfile)
407
{
408
#ifndef _WIN32
409
    pid_t pid, sid;
410

    
411
    pid = fork();
412
    if (pid < 0) {
413
        exit(EXIT_FAILURE);
414
    }
415
    if (pid > 0) {
416
        exit(EXIT_SUCCESS);
417
    }
418

    
419
    if (pidfile) {
420
        if (!ga_open_pidfile(pidfile)) {
421
            g_critical("failed to create pidfile");
422
            exit(EXIT_FAILURE);
423
        }
424
    }
425

    
426
    umask(0);
427
    sid = setsid();
428
    if (sid < 0) {
429
        goto fail;
430
    }
431
    if ((chdir("/")) < 0) {
432
        goto fail;
433
    }
434

    
435
    reopen_fd_to_null(STDIN_FILENO);
436
    reopen_fd_to_null(STDOUT_FILENO);
437
    reopen_fd_to_null(STDERR_FILENO);
438
    return;
439

    
440
fail:
441
    if (pidfile) {
442
        unlink(pidfile);
443
    }
444
    g_critical("failed to daemonize");
445
    exit(EXIT_FAILURE);
446
#endif
447
}
448

    
449
static int send_response(GAState *s, QObject *payload)
450
{
451
    const char *buf;
452
    QString *payload_qstr, *response_qstr;
453
    GIOStatus status;
454

    
455
    g_assert(payload && s->channel);
456

    
457
    payload_qstr = qobject_to_json(payload);
458
    if (!payload_qstr) {
459
        return -EINVAL;
460
    }
461

    
462
    if (s->delimit_response) {
463
        s->delimit_response = false;
464
        response_qstr = qstring_new();
465
        qstring_append_chr(response_qstr, QGA_SENTINEL_BYTE);
466
        qstring_append(response_qstr, qstring_get_str(payload_qstr));
467
        QDECREF(payload_qstr);
468
    } else {
469
        response_qstr = payload_qstr;
470
    }
471

    
472
    qstring_append_chr(response_qstr, '\n');
473
    buf = qstring_get_str(response_qstr);
474
    status = ga_channel_write_all(s->channel, buf, strlen(buf));
475
    QDECREF(response_qstr);
476
    if (status != G_IO_STATUS_NORMAL) {
477
        return -EIO;
478
    }
479

    
480
    return 0;
481
}
482

    
483
static void process_command(GAState *s, QDict *req)
484
{
485
    QObject *rsp = NULL;
486
    int ret;
487

    
488
    g_assert(req);
489
    g_debug("processing command");
490
    rsp = qmp_dispatch(QOBJECT(req));
491
    if (rsp) {
492
        ret = send_response(s, rsp);
493
        if (ret) {
494
            g_warning("error sending response: %s", strerror(ret));
495
        }
496
        qobject_decref(rsp);
497
    }
498
}
499

    
500
/* handle requests/control events coming in over the channel */
501
static void process_event(JSONMessageParser *parser, QList *tokens)
502
{
503
    GAState *s = container_of(parser, GAState, parser);
504
    QObject *obj;
505
    QDict *qdict;
506
    Error *err = NULL;
507
    int ret;
508

    
509
    g_assert(s && parser);
510

    
511
    g_debug("process_event: called");
512
    obj = json_parser_parse_err(tokens, NULL, &err);
513
    if (err || !obj || qobject_type(obj) != QTYPE_QDICT) {
514
        qobject_decref(obj);
515
        qdict = qdict_new();
516
        if (!err) {
517
            g_warning("failed to parse event: unknown error");
518
            error_set(&err, QERR_JSON_PARSING);
519
        } else {
520
            g_warning("failed to parse event: %s", error_get_pretty(err));
521
        }
522
        qdict_put_obj(qdict, "error", qmp_build_error_object(err));
523
        error_free(err);
524
    } else {
525
        qdict = qobject_to_qdict(obj);
526
    }
527

    
528
    g_assert(qdict);
529

    
530
    /* handle host->guest commands */
531
    if (qdict_haskey(qdict, "execute")) {
532
        process_command(s, qdict);
533
    } else {
534
        if (!qdict_haskey(qdict, "error")) {
535
            QDECREF(qdict);
536
            qdict = qdict_new();
537
            g_warning("unrecognized payload format");
538
            error_set(&err, QERR_UNSUPPORTED);
539
            qdict_put_obj(qdict, "error", qmp_build_error_object(err));
540
            error_free(err);
541
        }
542
        ret = send_response(s, QOBJECT(qdict));
543
        if (ret) {
544
            g_warning("error sending error response: %s", strerror(ret));
545
        }
546
    }
547

    
548
    QDECREF(qdict);
549
}
550

    
551
/* false return signals GAChannel to close the current client connection */
552
static gboolean channel_event_cb(GIOCondition condition, gpointer data)
553
{
554
    GAState *s = data;
555
    gchar buf[QGA_READ_COUNT_DEFAULT+1];
556
    gsize count;
557
    GError *err = NULL;
558
    GIOStatus status = ga_channel_read(s->channel, buf, QGA_READ_COUNT_DEFAULT, &count);
559
    if (err != NULL) {
560
        g_warning("error reading channel: %s", err->message);
561
        g_error_free(err);
562
        return false;
563
    }
564
    switch (status) {
565
    case G_IO_STATUS_ERROR:
566
        g_warning("error reading channel");
567
        return false;
568
    case G_IO_STATUS_NORMAL:
569
        buf[count] = 0;
570
        g_debug("read data, count: %d, data: %s", (int)count, buf);
571
        json_message_parser_feed(&s->parser, (char *)buf, (int)count);
572
        break;
573
    case G_IO_STATUS_EOF:
574
        g_debug("received EOF");
575
        if (!s->virtio) {
576
            return false;
577
        }
578
    case G_IO_STATUS_AGAIN:
579
        /* virtio causes us to spin here when no process is attached to
580
         * host-side chardev. sleep a bit to mitigate this
581
         */
582
        if (s->virtio) {
583
            usleep(100*1000);
584
        }
585
        return true;
586
    default:
587
        g_warning("unknown channel read status, closing");
588
        return false;
589
    }
590
    return true;
591
}
592

    
593
static gboolean channel_init(GAState *s, const gchar *method, const gchar *path)
594
{
595
    GAChannelMethod channel_method;
596

    
597
    if (method == NULL) {
598
        method = "virtio-serial";
599
    }
600

    
601
    if (path == NULL) {
602
        if (strcmp(method, "virtio-serial") != 0) {
603
            g_critical("must specify a path for this channel");
604
            return false;
605
        }
606
        /* try the default path for the virtio-serial port */
607
        path = QGA_VIRTIO_PATH_DEFAULT;
608
    }
609

    
610
    if (strcmp(method, "virtio-serial") == 0) {
611
        s->virtio = true; /* virtio requires special handling in some cases */
612
        channel_method = GA_CHANNEL_VIRTIO_SERIAL;
613
    } else if (strcmp(method, "isa-serial") == 0) {
614
        channel_method = GA_CHANNEL_ISA_SERIAL;
615
    } else if (strcmp(method, "unix-listen") == 0) {
616
        channel_method = GA_CHANNEL_UNIX_LISTEN;
617
    } else {
618
        g_critical("unsupported channel method/type: %s", method);
619
        return false;
620
    }
621

    
622
    s->channel = ga_channel_new(channel_method, path, channel_event_cb, s);
623
    if (!s->channel) {
624
        g_critical("failed to create guest agent channel");
625
        return false;
626
    }
627

    
628
    return true;
629
}
630

    
631
#ifdef _WIN32
632
DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data,
633
                                  LPVOID ctx)
634
{
635
    DWORD ret = NO_ERROR;
636
    GAService *service = &ga_state->service;
637

    
638
    switch (ctrl)
639
    {
640
        case SERVICE_CONTROL_STOP:
641
        case SERVICE_CONTROL_SHUTDOWN:
642
            quit_handler(SIGTERM);
643
            service->status.dwCurrentState = SERVICE_STOP_PENDING;
644
            SetServiceStatus(service->status_handle, &service->status);
645
            break;
646

    
647
        default:
648
            ret = ERROR_CALL_NOT_IMPLEMENTED;
649
    }
650
    return ret;
651
}
652

    
653
VOID WINAPI service_main(DWORD argc, TCHAR *argv[])
654
{
655
    GAService *service = &ga_state->service;
656

    
657
    service->status_handle = RegisterServiceCtrlHandlerEx(QGA_SERVICE_NAME,
658
        service_ctrl_handler, NULL);
659

    
660
    if (service->status_handle == 0) {
661
        g_critical("Failed to register extended requests function!\n");
662
        return;
663
    }
664

    
665
    service->status.dwServiceType = SERVICE_WIN32;
666
    service->status.dwCurrentState = SERVICE_RUNNING;
667
    service->status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
668
    service->status.dwWin32ExitCode = NO_ERROR;
669
    service->status.dwServiceSpecificExitCode = NO_ERROR;
670
    service->status.dwCheckPoint = 0;
671
    service->status.dwWaitHint = 0;
672
    SetServiceStatus(service->status_handle, &service->status);
673

    
674
    g_main_loop_run(ga_state->main_loop);
675

    
676
    service->status.dwCurrentState = SERVICE_STOPPED;
677
    SetServiceStatus(service->status_handle, &service->status);
678
}
679
#endif
680

    
681
int main(int argc, char **argv)
682
{
683
    const char *sopt = "hVvdm:p:l:f:b:s:t:";
684
    const char *method = NULL, *path = NULL;
685
    const char *log_filepath = NULL;
686
    const char *pid_filepath = QGA_PIDFILE_DEFAULT;
687
    const char *state_dir = QGA_STATEDIR_DEFAULT;
688
#ifdef _WIN32
689
    const char *service = NULL;
690
#endif
691
    const struct option lopt[] = {
692
        { "help", 0, NULL, 'h' },
693
        { "version", 0, NULL, 'V' },
694
        { "logfile", 1, NULL, 'l' },
695
        { "pidfile", 1, NULL, 'f' },
696
        { "verbose", 0, NULL, 'v' },
697
        { "method", 1, NULL, 'm' },
698
        { "path", 1, NULL, 'p' },
699
        { "daemonize", 0, NULL, 'd' },
700
        { "blacklist", 1, NULL, 'b' },
701
#ifdef _WIN32
702
        { "service", 1, NULL, 's' },
703
#endif
704
        { "statedir", 1, NULL, 't' },
705
        { NULL, 0, NULL, 0 }
706
    };
707
    int opt_ind = 0, ch, daemonize = 0, i, j, len;
708
    GLogLevelFlags log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL;
709
    GList *blacklist = NULL;
710
    GAState *s;
711

    
712
    module_call_init(MODULE_INIT_QAPI);
713

    
714
    while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
715
        switch (ch) {
716
        case 'm':
717
            method = optarg;
718
            break;
719
        case 'p':
720
            path = optarg;
721
            break;
722
        case 'l':
723
            log_filepath = optarg;
724
            break;
725
        case 'f':
726
            pid_filepath = optarg;
727
            break;
728
        case 't':
729
             state_dir = optarg;
730
             break;
731
        case 'v':
732
            /* enable all log levels */
733
            log_level = G_LOG_LEVEL_MASK;
734
            break;
735
        case 'V':
736
            printf("QEMU Guest Agent %s\n", QEMU_VERSION);
737
            return 0;
738
        case 'd':
739
            daemonize = 1;
740
            break;
741
        case 'b': {
742
            char **list_head, **list;
743
            if (is_help_option(optarg)) {
744
                list_head = list = qmp_get_command_list();
745
                while (*list != NULL) {
746
                    printf("%s\n", *list);
747
                    g_free(*list);
748
                    list++;
749
                }
750
                g_free(list_head);
751
                return 0;
752
            }
753
            for (j = 0, i = 0, len = strlen(optarg); i < len; i++) {
754
                if (optarg[i] == ',') {
755
                    optarg[i] = 0;
756
                    blacklist = g_list_append(blacklist, &optarg[j]);
757
                    j = i + 1;
758
                }
759
            }
760
            if (j < i) {
761
                blacklist = g_list_append(blacklist, &optarg[j]);
762
            }
763
            break;
764
        }
765
#ifdef _WIN32
766
        case 's':
767
            service = optarg;
768
            if (strcmp(service, "install") == 0) {
769
                return ga_install_service(path, log_filepath);
770
            } else if (strcmp(service, "uninstall") == 0) {
771
                return ga_uninstall_service();
772
            } else {
773
                printf("Unknown service command.\n");
774
                return EXIT_FAILURE;
775
            }
776
            break;
777
#endif
778
        case 'h':
779
            usage(argv[0]);
780
            return 0;
781
        case '?':
782
            g_print("Unknown option, try '%s --help' for more information.\n",
783
                    argv[0]);
784
            return EXIT_FAILURE;
785
        }
786
    }
787

    
788
    s = g_malloc0(sizeof(GAState));
789
    s->log_level = log_level;
790
    s->log_file = stderr;
791
    g_log_set_default_handler(ga_log, s);
792
    g_log_set_fatal_mask(NULL, G_LOG_LEVEL_ERROR);
793
    ga_enable_logging(s);
794
    s->state_filepath_isfrozen = g_strdup_printf("%s/qga.state.isfrozen",
795
                                                 state_dir);
796
    s->frozen = false;
797
#ifndef _WIN32
798
    /* check if a previous instance of qemu-ga exited with filesystems' state
799
     * marked as frozen. this could be a stale value (a non-qemu-ga process
800
     * or reboot may have since unfrozen them), but better to require an
801
     * uneeded unfreeze than to risk hanging on start-up
802
     */
803
    struct stat st;
804
    if (stat(s->state_filepath_isfrozen, &st) == -1) {
805
        /* it's okay if the file doesn't exist, but if we can't access for
806
         * some other reason, such as permissions, there's a configuration
807
         * that needs to be addressed. so just bail now before we get into
808
         * more trouble later
809
         */
810
        if (errno != ENOENT) {
811
            g_critical("unable to access state file at path %s: %s",
812
                       s->state_filepath_isfrozen, strerror(errno));
813
            return EXIT_FAILURE;
814
        }
815
    } else {
816
        g_warning("previous instance appears to have exited with frozen"
817
                  " filesystems. deferring logging/pidfile creation and"
818
                  " disabling non-fsfreeze-safe commands until"
819
                  " guest-fsfreeze-thaw is issued, or filesystems are"
820
                  " manually unfrozen and the file %s is removed",
821
                  s->state_filepath_isfrozen);
822
        s->frozen = true;
823
    }
824
#endif
825

    
826
    if (ga_is_frozen(s)) {
827
        if (daemonize) {
828
            /* delay opening/locking of pidfile till filesystem are unfrozen */
829
            s->deferred_options.pid_filepath = pid_filepath;
830
            become_daemon(NULL);
831
        }
832
        if (log_filepath) {
833
            /* delay opening the log file till filesystems are unfrozen */
834
            s->deferred_options.log_filepath = log_filepath;
835
        }
836
        ga_disable_logging(s);
837
        ga_disable_non_whitelisted();
838
    } else {
839
        if (daemonize) {
840
            become_daemon(pid_filepath);
841
        }
842
        if (log_filepath) {
843
            FILE *log_file = fopen(log_filepath, "a");
844
            if (!log_file) {
845
                g_critical("unable to open specified log file: %s",
846
                           strerror(errno));
847
                goto out_bad;
848
            }
849
            s->log_file = log_file;
850
        }
851
    }
852

    
853
    if (blacklist) {
854
        s->blacklist = blacklist;
855
        do {
856
            g_debug("disabling command: %s", (char *)blacklist->data);
857
            qmp_disable_command(blacklist->data);
858
            blacklist = g_list_next(blacklist);
859
        } while (blacklist);
860
    }
861
    s->command_state = ga_command_state_new();
862
    ga_command_state_init(s, s->command_state);
863
    ga_command_state_init_all(s->command_state);
864
    json_message_parser_init(&s->parser, process_event);
865
    ga_state = s;
866
#ifndef _WIN32
867
    if (!register_signal_handlers()) {
868
        g_critical("failed to register signal handlers");
869
        goto out_bad;
870
    }
871
#endif
872

    
873
    s->main_loop = g_main_loop_new(NULL, false);
874
    if (!channel_init(ga_state, method, path)) {
875
        g_critical("failed to initialize guest agent channel");
876
        goto out_bad;
877
    }
878
#ifndef _WIN32
879
    g_main_loop_run(ga_state->main_loop);
880
#else
881
    if (daemonize) {
882
        SERVICE_TABLE_ENTRY service_table[] = {
883
            { (char *)QGA_SERVICE_NAME, service_main }, { NULL, NULL } };
884
        StartServiceCtrlDispatcher(service_table);
885
    } else {
886
        g_main_loop_run(ga_state->main_loop);
887
    }
888
#endif
889

    
890
    ga_command_state_cleanup_all(ga_state->command_state);
891
    ga_channel_free(ga_state->channel);
892

    
893
    if (daemonize) {
894
        unlink(pid_filepath);
895
    }
896
    return 0;
897

    
898
out_bad:
899
    if (daemonize) {
900
        unlink(pid_filepath);
901
    }
902
    return EXIT_FAILURE;
903
}