qemu/qga/main.c
<<
>>
Prefs
   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 "qemu/osdep.h"
  14#include <getopt.h>
  15#include <glib/gstdio.h>
  16#ifndef _WIN32
  17#include <syslog.h>
  18#include <sys/wait.h>
  19#endif
  20#include "qapi/qmp/json-streamer.h"
  21#include "qapi/qmp/json-parser.h"
  22#include "qapi/qmp/qint.h"
  23#include "qapi/qmp/qjson.h"
  24#include "qga/guest-agent-core.h"
  25#include "qemu/module.h"
  26#include "qapi/qmp/qerror.h"
  27#include "qapi/qmp/dispatch.h"
  28#include "qga/channel.h"
  29#include "qemu/bswap.h"
  30#include "qemu/help_option.h"
  31#ifdef _WIN32
  32#include "qga/service-win32.h"
  33#include "qga/vss-win32.h"
  34#endif
  35#ifdef __linux__
  36#include <linux/fs.h>
  37#ifdef FIFREEZE
  38#define CONFIG_FSFREEZE
  39#endif
  40#endif
  41
  42#ifndef _WIN32
  43#define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0"
  44#define QGA_STATE_RELATIVE_DIR  "run"
  45#define QGA_SERIAL_PATH_DEFAULT "/dev/ttyS0"
  46#else
  47#define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0"
  48#define QGA_STATE_RELATIVE_DIR  "qemu-ga"
  49#define QGA_SERIAL_PATH_DEFAULT "COM1"
  50#endif
  51#ifdef CONFIG_FSFREEZE
  52#define QGA_FSFREEZE_HOOK_DEFAULT CONFIG_QEMU_CONFDIR "/fsfreeze-hook"
  53#endif
  54#define QGA_SENTINEL_BYTE 0xFF
  55#define QGA_CONF_DEFAULT CONFIG_QEMU_CONFDIR G_DIR_SEPARATOR_S "qemu-ga.conf"
  56
  57static struct {
  58    const char *state_dir;
  59    const char *pidfile;
  60} dfl_pathnames;
  61
  62typedef struct GAPersistentState {
  63#define QGA_PSTATE_DEFAULT_FD_COUNTER 1000
  64    int64_t fd_counter;
  65} GAPersistentState;
  66
  67struct GAState {
  68    JSONMessageParser parser;
  69    GMainLoop *main_loop;
  70    GAChannel *channel;
  71    bool virtio; /* fastpath to check for virtio to deal with poll() quirks */
  72    GACommandState *command_state;
  73    GLogLevelFlags log_level;
  74    FILE *log_file;
  75    bool logging_enabled;
  76#ifdef _WIN32
  77    GAService service;
  78#endif
  79    bool delimit_response;
  80    bool frozen;
  81    GList *blacklist;
  82    char *state_filepath_isfrozen;
  83    struct {
  84        const char *log_filepath;
  85        const char *pid_filepath;
  86    } deferred_options;
  87#ifdef CONFIG_FSFREEZE
  88    const char *fsfreeze_hook;
  89#endif
  90    gchar *pstate_filepath;
  91    GAPersistentState pstate;
  92};
  93
  94struct GAState *ga_state;
  95
  96/* commands that are safe to issue while filesystems are frozen */
  97static const char *ga_freeze_whitelist[] = {
  98    "guest-ping",
  99    "guest-info",
 100    "guest-sync",
 101    "guest-sync-delimited",
 102    "guest-fsfreeze-status",
 103    "guest-fsfreeze-thaw",
 104    NULL
 105};
 106
 107#ifdef _WIN32
 108DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data,
 109                                  LPVOID ctx);
 110VOID WINAPI service_main(DWORD argc, TCHAR *argv[]);
 111#endif
 112
 113static void
 114init_dfl_pathnames(void)
 115{
 116    g_assert(dfl_pathnames.state_dir == NULL);
 117    g_assert(dfl_pathnames.pidfile == NULL);
 118    dfl_pathnames.state_dir = qemu_get_local_state_pathname(
 119      QGA_STATE_RELATIVE_DIR);
 120    dfl_pathnames.pidfile   = qemu_get_local_state_pathname(
 121      QGA_STATE_RELATIVE_DIR G_DIR_SEPARATOR_S "qemu-ga.pid");
 122}
 123
 124static void quit_handler(int sig)
 125{
 126    /* if we're frozen, don't exit unless we're absolutely forced to,
 127     * because it's basically impossible for graceful exit to complete
 128     * unless all log/pid files are on unfreezable filesystems. there's
 129     * also a very likely chance killing the agent before unfreezing
 130     * the filesystems is a mistake (or will be viewed as one later).
 131     */
 132    if (ga_is_frozen(ga_state)) {
 133        return;
 134    }
 135    g_debug("received signal num %d, quitting", sig);
 136
 137    if (g_main_loop_is_running(ga_state->main_loop)) {
 138        g_main_loop_quit(ga_state->main_loop);
 139    }
 140}
 141
 142#ifndef _WIN32
 143static gboolean register_signal_handlers(void)
 144{
 145    struct sigaction sigact;
 146    int ret;
 147
 148    memset(&sigact, 0, sizeof(struct sigaction));
 149    sigact.sa_handler = quit_handler;
 150
 151    ret = sigaction(SIGINT, &sigact, NULL);
 152    if (ret == -1) {
 153        g_error("error configuring signal handler: %s", strerror(errno));
 154    }
 155    ret = sigaction(SIGTERM, &sigact, NULL);
 156    if (ret == -1) {
 157        g_error("error configuring signal handler: %s", strerror(errno));
 158    }
 159
 160    sigact.sa_handler = SIG_IGN;
 161    if (sigaction(SIGPIPE, &sigact, NULL) != 0) {
 162        g_error("error configuring SIGPIPE signal handler: %s",
 163                strerror(errno));
 164    }
 165
 166    return true;
 167}
 168
 169/* TODO: use this in place of all post-fork() fclose(std*) callers */
 170void reopen_fd_to_null(int fd)
 171{
 172    int nullfd;
 173
 174    nullfd = open("/dev/null", O_RDWR);
 175    if (nullfd < 0) {
 176        return;
 177    }
 178
 179    dup2(nullfd, fd);
 180
 181    if (nullfd != fd) {
 182        close(nullfd);
 183    }
 184}
 185#endif
 186
 187static void usage(const char *cmd)
 188{
 189    printf(
 190"Usage: %s [-m <method> -p <path>] [<options>]\n"
 191"QEMU Guest Agent %s\n"
 192"\n"
 193"  -m, --method      transport method: one of unix-listen, virtio-serial,\n"
 194"                    isa-serial, or vsock-listen (virtio-serial is the default)\n"
 195"  -p, --path        device/socket path (the default for virtio-serial is:\n"
 196"                    %s,\n"
 197"                    the default for isa-serial is:\n"
 198"                    %s)\n"
 199"  -l, --logfile     set logfile path, logs to stderr by default\n"
 200"  -f, --pidfile     specify pidfile (default is %s)\n"
 201#ifdef CONFIG_FSFREEZE
 202"  -F, --fsfreeze-hook\n"
 203"                    enable fsfreeze hook. Accepts an optional argument that\n"
 204"                    specifies script to run on freeze/thaw. Script will be\n"
 205"                    called with 'freeze'/'thaw' arguments accordingly.\n"
 206"                    (default is %s)\n"
 207"                    If using -F with an argument, do not follow -F with a\n"
 208"                    space.\n"
 209"                    (for example: -F/var/run/fsfreezehook.sh)\n"
 210#endif
 211"  -t, --statedir    specify dir to store state information (absolute paths\n"
 212"                    only, default is %s)\n"
 213"  -v, --verbose     log extra debugging information\n"
 214"  -V, --version     print version information and exit\n"
 215"  -d, --daemonize   become a daemon\n"
 216#ifdef _WIN32
 217"  -s, --service     service commands: install, uninstall, vss-install, vss-uninstall\n"
 218#endif
 219"  -b, --blacklist   comma-separated list of RPCs to disable (no spaces, \"?\"\n"
 220"                    to list available RPCs)\n"
 221"  -D, --dump-conf   dump a qemu-ga config file based on current config\n"
 222"                    options / command-line parameters to stdout\n"
 223"  -h, --help        display this help and exit\n"
 224"\n"
 225"Report bugs to <mdroth@linux.vnet.ibm.com>\n"
 226    , cmd, QEMU_VERSION, QGA_VIRTIO_PATH_DEFAULT, QGA_SERIAL_PATH_DEFAULT,
 227    dfl_pathnames.pidfile,
 228#ifdef CONFIG_FSFREEZE
 229    QGA_FSFREEZE_HOOK_DEFAULT,
 230#endif
 231    dfl_pathnames.state_dir);
 232}
 233
 234static const char *ga_log_level_str(GLogLevelFlags level)
 235{
 236    switch (level & G_LOG_LEVEL_MASK) {
 237        case G_LOG_LEVEL_ERROR:
 238            return "error";
 239        case G_LOG_LEVEL_CRITICAL:
 240            return "critical";
 241        case G_LOG_LEVEL_WARNING:
 242            return "warning";
 243        case G_LOG_LEVEL_MESSAGE:
 244            return "message";
 245        case G_LOG_LEVEL_INFO:
 246            return "info";
 247        case G_LOG_LEVEL_DEBUG:
 248            return "debug";
 249        default:
 250            return "user";
 251    }
 252}
 253
 254bool ga_logging_enabled(GAState *s)
 255{
 256    return s->logging_enabled;
 257}
 258
 259void ga_disable_logging(GAState *s)
 260{
 261    s->logging_enabled = false;
 262}
 263
 264void ga_enable_logging(GAState *s)
 265{
 266    s->logging_enabled = true;
 267}
 268
 269static void ga_log(const gchar *domain, GLogLevelFlags level,
 270                   const gchar *msg, gpointer opaque)
 271{
 272    GAState *s = opaque;
 273    GTimeVal time;
 274    const char *level_str = ga_log_level_str(level);
 275
 276    if (!ga_logging_enabled(s)) {
 277        return;
 278    }
 279
 280    level &= G_LOG_LEVEL_MASK;
 281#ifndef _WIN32
 282    if (g_strcmp0(domain, "syslog") == 0) {
 283        syslog(LOG_INFO, "%s: %s", level_str, msg);
 284    } else if (level & s->log_level) {
 285#else
 286    if (level & s->log_level) {
 287#endif
 288        g_get_current_time(&time);
 289        fprintf(s->log_file,
 290                "%lu.%lu: %s: %s\n", time.tv_sec, time.tv_usec, level_str, msg);
 291        fflush(s->log_file);
 292    }
 293}
 294
 295void ga_set_response_delimited(GAState *s)
 296{
 297    s->delimit_response = true;
 298}
 299
 300static FILE *ga_open_logfile(const char *logfile)
 301{
 302    FILE *f;
 303
 304    f = fopen(logfile, "a");
 305    if (!f) {
 306        return NULL;
 307    }
 308
 309    qemu_set_cloexec(fileno(f));
 310    return f;
 311}
 312
 313#ifndef _WIN32
 314static bool ga_open_pidfile(const char *pidfile)
 315{
 316    int pidfd;
 317    char pidstr[32];
 318
 319    pidfd = qemu_open(pidfile, O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR);
 320    if (pidfd == -1 || lockf(pidfd, F_TLOCK, 0)) {
 321        g_critical("Cannot lock pid file, %s", strerror(errno));
 322        if (pidfd != -1) {
 323            close(pidfd);
 324        }
 325        return false;
 326    }
 327
 328    if (ftruncate(pidfd, 0)) {
 329        g_critical("Failed to truncate pid file");
 330        goto fail;
 331    }
 332    snprintf(pidstr, sizeof(pidstr), "%d\n", getpid());
 333    if (write(pidfd, pidstr, strlen(pidstr)) != strlen(pidstr)) {
 334        g_critical("Failed to write pid file");
 335        goto fail;
 336    }
 337
 338    /* keep pidfile open & locked forever */
 339    return true;
 340
 341fail:
 342    unlink(pidfile);
 343    close(pidfd);
 344    return false;
 345}
 346#else /* _WIN32 */
 347static bool ga_open_pidfile(const char *pidfile)
 348{
 349    return true;
 350}
 351#endif
 352
 353static gint ga_strcmp(gconstpointer str1, gconstpointer str2)
 354{
 355    return strcmp(str1, str2);
 356}
 357
 358/* disable commands that aren't safe for fsfreeze */
 359static void ga_disable_non_whitelisted(QmpCommand *cmd, void *opaque)
 360{
 361    bool whitelisted = false;
 362    int i = 0;
 363    const char *name = qmp_command_name(cmd);
 364
 365    while (ga_freeze_whitelist[i] != NULL) {
 366        if (strcmp(name, ga_freeze_whitelist[i]) == 0) {
 367            whitelisted = true;
 368        }
 369        i++;
 370    }
 371    if (!whitelisted) {
 372        g_debug("disabling command: %s", name);
 373        qmp_disable_command(name);
 374    }
 375}
 376
 377/* [re-]enable all commands, except those explicitly blacklisted by user */
 378static void ga_enable_non_blacklisted(QmpCommand *cmd, void *opaque)
 379{
 380    GList *blacklist = opaque;
 381    const char *name = qmp_command_name(cmd);
 382
 383    if (g_list_find_custom(blacklist, name, ga_strcmp) == NULL &&
 384        !qmp_command_is_enabled(cmd)) {
 385        g_debug("enabling command: %s", name);
 386        qmp_enable_command(name);
 387    }
 388}
 389
 390static bool ga_create_file(const char *path)
 391{
 392    int fd = open(path, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR);
 393    if (fd == -1) {
 394        g_warning("unable to open/create file %s: %s", path, strerror(errno));
 395        return false;
 396    }
 397    close(fd);
 398    return true;
 399}
 400
 401static bool ga_delete_file(const char *path)
 402{
 403    int ret = unlink(path);
 404    if (ret == -1) {
 405        g_warning("unable to delete file: %s: %s", path, strerror(errno));
 406        return false;
 407    }
 408
 409    return true;
 410}
 411
 412bool ga_is_frozen(GAState *s)
 413{
 414    return s->frozen;
 415}
 416
 417void ga_set_frozen(GAState *s)
 418{
 419    if (ga_is_frozen(s)) {
 420        return;
 421    }
 422    /* disable all non-whitelisted (for frozen state) commands */
 423    qmp_for_each_command(ga_disable_non_whitelisted, NULL);
 424    g_warning("disabling logging due to filesystem freeze");
 425    ga_disable_logging(s);
 426    s->frozen = true;
 427    if (!ga_create_file(s->state_filepath_isfrozen)) {
 428        g_warning("unable to create %s, fsfreeze may not function properly",
 429                  s->state_filepath_isfrozen);
 430    }
 431}
 432
 433void ga_unset_frozen(GAState *s)
 434{
 435    if (!ga_is_frozen(s)) {
 436        return;
 437    }
 438
 439    /* if we delayed creation/opening of pid/log files due to being
 440     * in a frozen state at start up, do it now
 441     */
 442    if (s->deferred_options.log_filepath) {
 443        s->log_file = ga_open_logfile(s->deferred_options.log_filepath);
 444        if (!s->log_file) {
 445            s->log_file = stderr;
 446        }
 447        s->deferred_options.log_filepath = NULL;
 448    }
 449    ga_enable_logging(s);
 450    g_warning("logging re-enabled due to filesystem unfreeze");
 451    if (s->deferred_options.pid_filepath) {
 452        if (!ga_open_pidfile(s->deferred_options.pid_filepath)) {
 453            g_warning("failed to create/open pid file");
 454        }
 455        s->deferred_options.pid_filepath = NULL;
 456    }
 457
 458    /* enable all disabled, non-blacklisted commands */
 459    qmp_for_each_command(ga_enable_non_blacklisted, s->blacklist);
 460    s->frozen = false;
 461    if (!ga_delete_file(s->state_filepath_isfrozen)) {
 462        g_warning("unable to delete %s, fsfreeze may not function properly",
 463                  s->state_filepath_isfrozen);
 464    }
 465}
 466
 467#ifdef CONFIG_FSFREEZE
 468const char *ga_fsfreeze_hook(GAState *s)
 469{
 470    return s->fsfreeze_hook;
 471}
 472#endif
 473
 474static void become_daemon(const char *pidfile)
 475{
 476#ifndef _WIN32
 477    pid_t pid, sid;
 478
 479    pid = fork();
 480    if (pid < 0) {
 481        exit(EXIT_FAILURE);
 482    }
 483    if (pid > 0) {
 484        exit(EXIT_SUCCESS);
 485    }
 486
 487    if (pidfile) {
 488        if (!ga_open_pidfile(pidfile)) {
 489            g_critical("failed to create pidfile");
 490            exit(EXIT_FAILURE);
 491        }
 492    }
 493
 494    umask(S_IRWXG | S_IRWXO);
 495    sid = setsid();
 496    if (sid < 0) {
 497        goto fail;
 498    }
 499    if ((chdir("/")) < 0) {
 500        goto fail;
 501    }
 502
 503    reopen_fd_to_null(STDIN_FILENO);
 504    reopen_fd_to_null(STDOUT_FILENO);
 505    reopen_fd_to_null(STDERR_FILENO);
 506    return;
 507
 508fail:
 509    if (pidfile) {
 510        unlink(pidfile);
 511    }
 512    g_critical("failed to daemonize");
 513    exit(EXIT_FAILURE);
 514#endif
 515}
 516
 517static int send_response(GAState *s, QObject *payload)
 518{
 519    const char *buf;
 520    QString *payload_qstr, *response_qstr;
 521    GIOStatus status;
 522
 523    g_assert(payload && s->channel);
 524
 525    payload_qstr = qobject_to_json(payload);
 526    if (!payload_qstr) {
 527        return -EINVAL;
 528    }
 529
 530    if (s->delimit_response) {
 531        s->delimit_response = false;
 532        response_qstr = qstring_new();
 533        qstring_append_chr(response_qstr, QGA_SENTINEL_BYTE);
 534        qstring_append(response_qstr, qstring_get_str(payload_qstr));
 535        QDECREF(payload_qstr);
 536    } else {
 537        response_qstr = payload_qstr;
 538    }
 539
 540    qstring_append_chr(response_qstr, '\n');
 541    buf = qstring_get_str(response_qstr);
 542    status = ga_channel_write_all(s->channel, buf, strlen(buf));
 543    QDECREF(response_qstr);
 544    if (status != G_IO_STATUS_NORMAL) {
 545        return -EIO;
 546    }
 547
 548    return 0;
 549}
 550
 551static void process_command(GAState *s, QDict *req)
 552{
 553    QObject *rsp = NULL;
 554    int ret;
 555
 556    g_assert(req);
 557    g_debug("processing command");
 558    rsp = qmp_dispatch(QOBJECT(req));
 559    if (rsp) {
 560        ret = send_response(s, rsp);
 561        if (ret) {
 562            g_warning("error sending response: %s", strerror(ret));
 563        }
 564        qobject_decref(rsp);
 565    }
 566}
 567
 568/* handle requests/control events coming in over the channel */
 569static void process_event(JSONMessageParser *parser, GQueue *tokens)
 570{
 571    GAState *s = container_of(parser, GAState, parser);
 572    QDict *qdict;
 573    Error *err = NULL;
 574    int ret;
 575
 576    g_assert(s && parser);
 577
 578    g_debug("process_event: called");
 579    qdict = qobject_to_qdict(json_parser_parse_err(tokens, NULL, &err));
 580    if (err || !qdict) {
 581        QDECREF(qdict);
 582        qdict = qdict_new();
 583        if (!err) {
 584            g_warning("failed to parse event: unknown error");
 585            error_setg(&err, QERR_JSON_PARSING);
 586        } else {
 587            g_warning("failed to parse event: %s", error_get_pretty(err));
 588        }
 589        qdict_put_obj(qdict, "error", qmp_build_error_object(err));
 590        error_free(err);
 591    }
 592
 593    /* handle host->guest commands */
 594    if (qdict_haskey(qdict, "execute")) {
 595        process_command(s, qdict);
 596    } else {
 597        if (!qdict_haskey(qdict, "error")) {
 598            QDECREF(qdict);
 599            qdict = qdict_new();
 600            g_warning("unrecognized payload format");
 601            error_setg(&err, QERR_UNSUPPORTED);
 602            qdict_put_obj(qdict, "error", qmp_build_error_object(err));
 603            error_free(err);
 604        }
 605        ret = send_response(s, QOBJECT(qdict));
 606        if (ret < 0) {
 607            g_warning("error sending error response: %s", strerror(-ret));
 608        }
 609    }
 610
 611    QDECREF(qdict);
 612}
 613
 614/* false return signals GAChannel to close the current client connection */
 615static gboolean channel_event_cb(GIOCondition condition, gpointer data)
 616{
 617    GAState *s = data;
 618    gchar buf[QGA_READ_COUNT_DEFAULT+1];
 619    gsize count;
 620    GIOStatus status = ga_channel_read(s->channel, buf, QGA_READ_COUNT_DEFAULT, &count);
 621    switch (status) {
 622    case G_IO_STATUS_ERROR:
 623        g_warning("error reading channel");
 624        return false;
 625    case G_IO_STATUS_NORMAL:
 626        buf[count] = 0;
 627        g_debug("read data, count: %d, data: %s", (int)count, buf);
 628        json_message_parser_feed(&s->parser, (char *)buf, (int)count);
 629        break;
 630    case G_IO_STATUS_EOF:
 631        g_debug("received EOF");
 632        if (!s->virtio) {
 633            return false;
 634        }
 635        /* fall through */
 636    case G_IO_STATUS_AGAIN:
 637        /* virtio causes us to spin here when no process is attached to
 638         * host-side chardev. sleep a bit to mitigate this
 639         */
 640        if (s->virtio) {
 641            usleep(100*1000);
 642        }
 643        return true;
 644    default:
 645        g_warning("unknown channel read status, closing");
 646        return false;
 647    }
 648    return true;
 649}
 650
 651static gboolean channel_init(GAState *s, const gchar *method, const gchar *path)
 652{
 653    GAChannelMethod channel_method;
 654
 655    if (strcmp(method, "virtio-serial") == 0) {
 656        s->virtio = true; /* virtio requires special handling in some cases */
 657        channel_method = GA_CHANNEL_VIRTIO_SERIAL;
 658    } else if (strcmp(method, "isa-serial") == 0) {
 659        channel_method = GA_CHANNEL_ISA_SERIAL;
 660    } else if (strcmp(method, "unix-listen") == 0) {
 661        channel_method = GA_CHANNEL_UNIX_LISTEN;
 662    } else if (strcmp(method, "vsock-listen") == 0) {
 663        channel_method = GA_CHANNEL_VSOCK_LISTEN;
 664    } else {
 665        g_critical("unsupported channel method/type: %s", method);
 666        return false;
 667    }
 668
 669    s->channel = ga_channel_new(channel_method, path, channel_event_cb, s);
 670    if (!s->channel) {
 671        g_critical("failed to create guest agent channel");
 672        return false;
 673    }
 674
 675    return true;
 676}
 677
 678#ifdef _WIN32
 679DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data,
 680                                  LPVOID ctx)
 681{
 682    DWORD ret = NO_ERROR;
 683    GAService *service = &ga_state->service;
 684
 685    switch (ctrl)
 686    {
 687        case SERVICE_CONTROL_STOP:
 688        case SERVICE_CONTROL_SHUTDOWN:
 689            quit_handler(SIGTERM);
 690            service->status.dwCurrentState = SERVICE_STOP_PENDING;
 691            SetServiceStatus(service->status_handle, &service->status);
 692            break;
 693
 694        default:
 695            ret = ERROR_CALL_NOT_IMPLEMENTED;
 696    }
 697    return ret;
 698}
 699
 700VOID WINAPI service_main(DWORD argc, TCHAR *argv[])
 701{
 702    GAService *service = &ga_state->service;
 703
 704    service->status_handle = RegisterServiceCtrlHandlerEx(QGA_SERVICE_NAME,
 705        service_ctrl_handler, NULL);
 706
 707    if (service->status_handle == 0) {
 708        g_critical("Failed to register extended requests function!\n");
 709        return;
 710    }
 711
 712    service->status.dwServiceType = SERVICE_WIN32;
 713    service->status.dwCurrentState = SERVICE_RUNNING;
 714    service->status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
 715    service->status.dwWin32ExitCode = NO_ERROR;
 716    service->status.dwServiceSpecificExitCode = NO_ERROR;
 717    service->status.dwCheckPoint = 0;
 718    service->status.dwWaitHint = 0;
 719    SetServiceStatus(service->status_handle, &service->status);
 720
 721    g_main_loop_run(ga_state->main_loop);
 722
 723    service->status.dwCurrentState = SERVICE_STOPPED;
 724    SetServiceStatus(service->status_handle, &service->status);
 725}
 726#endif
 727
 728static void set_persistent_state_defaults(GAPersistentState *pstate)
 729{
 730    g_assert(pstate);
 731    pstate->fd_counter = QGA_PSTATE_DEFAULT_FD_COUNTER;
 732}
 733
 734static void persistent_state_from_keyfile(GAPersistentState *pstate,
 735                                          GKeyFile *keyfile)
 736{
 737    g_assert(pstate);
 738    g_assert(keyfile);
 739    /* if any fields are missing, either because the file was tampered with
 740     * by agents of chaos, or because the field wasn't present at the time the
 741     * file was created, the best we can ever do is start over with the default
 742     * values. so load them now, and ignore any errors in accessing key-value
 743     * pairs
 744     */
 745    set_persistent_state_defaults(pstate);
 746
 747    if (g_key_file_has_key(keyfile, "global", "fd_counter", NULL)) {
 748        pstate->fd_counter =
 749            g_key_file_get_integer(keyfile, "global", "fd_counter", NULL);
 750    }
 751}
 752
 753static void persistent_state_to_keyfile(const GAPersistentState *pstate,
 754                                        GKeyFile *keyfile)
 755{
 756    g_assert(pstate);
 757    g_assert(keyfile);
 758
 759    g_key_file_set_integer(keyfile, "global", "fd_counter", pstate->fd_counter);
 760}
 761
 762static gboolean write_persistent_state(const GAPersistentState *pstate,
 763                                       const gchar *path)
 764{
 765    GKeyFile *keyfile = g_key_file_new();
 766    GError *gerr = NULL;
 767    gboolean ret = true;
 768    gchar *data = NULL;
 769    gsize data_len;
 770
 771    g_assert(pstate);
 772
 773    persistent_state_to_keyfile(pstate, keyfile);
 774    data = g_key_file_to_data(keyfile, &data_len, &gerr);
 775    if (gerr) {
 776        g_critical("failed to convert persistent state to string: %s",
 777                   gerr->message);
 778        ret = false;
 779        goto out;
 780    }
 781
 782    g_file_set_contents(path, data, data_len, &gerr);
 783    if (gerr) {
 784        g_critical("failed to write persistent state to %s: %s",
 785                    path, gerr->message);
 786        ret = false;
 787        goto out;
 788    }
 789
 790out:
 791    if (gerr) {
 792        g_error_free(gerr);
 793    }
 794    if (keyfile) {
 795        g_key_file_free(keyfile);
 796    }
 797    g_free(data);
 798    return ret;
 799}
 800
 801static gboolean read_persistent_state(GAPersistentState *pstate,
 802                                      const gchar *path, gboolean frozen)
 803{
 804    GKeyFile *keyfile = NULL;
 805    GError *gerr = NULL;
 806    struct stat st;
 807    gboolean ret = true;
 808
 809    g_assert(pstate);
 810
 811    if (stat(path, &st) == -1) {
 812        /* it's okay if state file doesn't exist, but any other error
 813         * indicates a permissions issue or some other misconfiguration
 814         * that we likely won't be able to recover from.
 815         */
 816        if (errno != ENOENT) {
 817            g_critical("unable to access state file at path %s: %s",
 818                       path, strerror(errno));
 819            ret = false;
 820            goto out;
 821        }
 822
 823        /* file doesn't exist. initialize state to default values and
 824         * attempt to save now. (we could wait till later when we have
 825         * modified state we need to commit, but if there's a problem,
 826         * such as a missing parent directory, we want to catch it now)
 827         *
 828         * there is a potential scenario where someone either managed to
 829         * update the agent from a version that didn't use a key store
 830         * while qemu-ga thought the filesystem was frozen, or
 831         * deleted the key store prior to issuing a fsfreeze, prior
 832         * to restarting the agent. in this case we go ahead and defer
 833         * initial creation till we actually have modified state to
 834         * write, otherwise fail to recover from freeze.
 835         */
 836        set_persistent_state_defaults(pstate);
 837        if (!frozen) {
 838            ret = write_persistent_state(pstate, path);
 839            if (!ret) {
 840                g_critical("unable to create state file at path %s", path);
 841                ret = false;
 842                goto out;
 843            }
 844        }
 845        ret = true;
 846        goto out;
 847    }
 848
 849    keyfile = g_key_file_new();
 850    g_key_file_load_from_file(keyfile, path, 0, &gerr);
 851    if (gerr) {
 852        g_critical("error loading persistent state from path: %s, %s",
 853                   path, gerr->message);
 854        ret = false;
 855        goto out;
 856    }
 857
 858    persistent_state_from_keyfile(pstate, keyfile);
 859
 860out:
 861    if (keyfile) {
 862        g_key_file_free(keyfile);
 863    }
 864    if (gerr) {
 865        g_error_free(gerr);
 866    }
 867
 868    return ret;
 869}
 870
 871int64_t ga_get_fd_handle(GAState *s, Error **errp)
 872{
 873    int64_t handle;
 874
 875    g_assert(s->pstate_filepath);
 876    /* we blacklist commands and avoid operations that potentially require
 877     * writing to disk when we're in a frozen state. this includes opening
 878     * new files, so we should never get here in that situation
 879     */
 880    g_assert(!ga_is_frozen(s));
 881
 882    handle = s->pstate.fd_counter++;
 883
 884    /* This should never happen on a reasonable timeframe, as guest-file-open
 885     * would have to be issued 2^63 times */
 886    if (s->pstate.fd_counter == INT64_MAX) {
 887        abort();
 888    }
 889
 890    if (!write_persistent_state(&s->pstate, s->pstate_filepath)) {
 891        error_setg(errp, "failed to commit persistent state to disk");
 892        return -1;
 893    }
 894
 895    return handle;
 896}
 897
 898static void ga_print_cmd(QmpCommand *cmd, void *opaque)
 899{
 900    printf("%s\n", qmp_command_name(cmd));
 901}
 902
 903static GList *split_list(const gchar *str, const gchar *delim)
 904{
 905    GList *list = NULL;
 906    int i;
 907    gchar **strv;
 908
 909    strv = g_strsplit(str, delim, -1);
 910    for (i = 0; strv[i]; i++) {
 911        list = g_list_prepend(list, strv[i]);
 912    }
 913    g_free(strv);
 914
 915    return list;
 916}
 917
 918typedef struct GAConfig {
 919    char *channel_path;
 920    char *method;
 921    char *log_filepath;
 922    char *pid_filepath;
 923#ifdef CONFIG_FSFREEZE
 924    char *fsfreeze_hook;
 925#endif
 926    char *state_dir;
 927#ifdef _WIN32
 928    const char *service;
 929#endif
 930    gchar *bliststr; /* blacklist may point to this string */
 931    GList *blacklist;
 932    int daemonize;
 933    GLogLevelFlags log_level;
 934    int dumpconf;
 935} GAConfig;
 936
 937static void config_load(GAConfig *config)
 938{
 939    GError *gerr = NULL;
 940    GKeyFile *keyfile;
 941    const char *conf = g_getenv("QGA_CONF") ?: QGA_CONF_DEFAULT;
 942
 943    /* read system config */
 944    keyfile = g_key_file_new();
 945    if (!g_key_file_load_from_file(keyfile, conf, 0, &gerr)) {
 946        goto end;
 947    }
 948    if (g_key_file_has_key(keyfile, "general", "daemon", NULL)) {
 949        config->daemonize =
 950            g_key_file_get_boolean(keyfile, "general", "daemon", &gerr);
 951    }
 952    if (g_key_file_has_key(keyfile, "general", "method", NULL)) {
 953        config->method =
 954            g_key_file_get_string(keyfile, "general", "method", &gerr);
 955    }
 956    if (g_key_file_has_key(keyfile, "general", "path", NULL)) {
 957        config->channel_path =
 958            g_key_file_get_string(keyfile, "general", "path", &gerr);
 959    }
 960    if (g_key_file_has_key(keyfile, "general", "logfile", NULL)) {
 961        config->log_filepath =
 962            g_key_file_get_string(keyfile, "general", "logfile", &gerr);
 963    }
 964    if (g_key_file_has_key(keyfile, "general", "pidfile", NULL)) {
 965        config->pid_filepath =
 966            g_key_file_get_string(keyfile, "general", "pidfile", &gerr);
 967    }
 968#ifdef CONFIG_FSFREEZE
 969    if (g_key_file_has_key(keyfile, "general", "fsfreeze-hook", NULL)) {
 970        config->fsfreeze_hook =
 971            g_key_file_get_string(keyfile,
 972                                  "general", "fsfreeze-hook", &gerr);
 973    }
 974#endif
 975    if (g_key_file_has_key(keyfile, "general", "statedir", NULL)) {
 976        config->state_dir =
 977            g_key_file_get_string(keyfile, "general", "statedir", &gerr);
 978    }
 979    if (g_key_file_has_key(keyfile, "general", "verbose", NULL) &&
 980        g_key_file_get_boolean(keyfile, "general", "verbose", &gerr)) {
 981        /* enable all log levels */
 982        config->log_level = G_LOG_LEVEL_MASK;
 983    }
 984    if (g_key_file_has_key(keyfile, "general", "blacklist", NULL)) {
 985        config->bliststr =
 986            g_key_file_get_string(keyfile, "general", "blacklist", &gerr);
 987        config->blacklist = g_list_concat(config->blacklist,
 988                                          split_list(config->bliststr, ","));
 989    }
 990
 991end:
 992    g_key_file_free(keyfile);
 993    if (gerr &&
 994        !(gerr->domain == G_FILE_ERROR && gerr->code == G_FILE_ERROR_NOENT)) {
 995        g_critical("error loading configuration from path: %s, %s",
 996                   QGA_CONF_DEFAULT, gerr->message);
 997        exit(EXIT_FAILURE);
 998    }
 999    g_clear_error(&gerr);
1000}
1001
1002static gchar *list_join(GList *list, const gchar separator)
1003{
1004    GString *str = g_string_new("");
1005
1006    while (list) {
1007        str = g_string_append(str, (gchar *)list->data);
1008        list = g_list_next(list);
1009        if (list) {
1010            str = g_string_append_c(str, separator);
1011        }
1012    }
1013
1014    return g_string_free(str, FALSE);
1015}
1016
1017static void config_dump(GAConfig *config)
1018{
1019    GError *error = NULL;
1020    GKeyFile *keyfile;
1021    gchar *tmp;
1022
1023    keyfile = g_key_file_new();
1024    g_assert(keyfile);
1025
1026    g_key_file_set_boolean(keyfile, "general", "daemon", config->daemonize);
1027    g_key_file_set_string(keyfile, "general", "method", config->method);
1028    g_key_file_set_string(keyfile, "general", "path", config->channel_path);
1029    if (config->log_filepath) {
1030        g_key_file_set_string(keyfile, "general", "logfile",
1031                              config->log_filepath);
1032    }
1033    g_key_file_set_string(keyfile, "general", "pidfile", config->pid_filepath);
1034#ifdef CONFIG_FSFREEZE
1035    if (config->fsfreeze_hook) {
1036        g_key_file_set_string(keyfile, "general", "fsfreeze-hook",
1037                              config->fsfreeze_hook);
1038    }
1039#endif
1040    g_key_file_set_string(keyfile, "general", "statedir", config->state_dir);
1041    g_key_file_set_boolean(keyfile, "general", "verbose",
1042                           config->log_level == G_LOG_LEVEL_MASK);
1043    tmp = list_join(config->blacklist, ',');
1044    g_key_file_set_string(keyfile, "general", "blacklist", tmp);
1045    g_free(tmp);
1046
1047    tmp = g_key_file_to_data(keyfile, NULL, &error);
1048    printf("%s", tmp);
1049
1050    g_free(tmp);
1051    g_key_file_free(keyfile);
1052}
1053
1054static void config_parse(GAConfig *config, int argc, char **argv)
1055{
1056    const char *sopt = "hVvdm:p:l:f:F::b:s:t:D";
1057    int opt_ind = 0, ch;
1058    const struct option lopt[] = {
1059        { "help", 0, NULL, 'h' },
1060        { "version", 0, NULL, 'V' },
1061        { "dump-conf", 0, NULL, 'D' },
1062        { "logfile", 1, NULL, 'l' },
1063        { "pidfile", 1, NULL, 'f' },
1064#ifdef CONFIG_FSFREEZE
1065        { "fsfreeze-hook", 2, NULL, 'F' },
1066#endif
1067        { "verbose", 0, NULL, 'v' },
1068        { "method", 1, NULL, 'm' },
1069        { "path", 1, NULL, 'p' },
1070        { "daemonize", 0, NULL, 'd' },
1071        { "blacklist", 1, NULL, 'b' },
1072#ifdef _WIN32
1073        { "service", 1, NULL, 's' },
1074#endif
1075        { "statedir", 1, NULL, 't' },
1076        { NULL, 0, NULL, 0 }
1077    };
1078
1079    while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
1080        switch (ch) {
1081        case 'm':
1082            g_free(config->method);
1083            config->method = g_strdup(optarg);
1084            break;
1085        case 'p':
1086            g_free(config->channel_path);
1087            config->channel_path = g_strdup(optarg);
1088            break;
1089        case 'l':
1090            g_free(config->log_filepath);
1091            config->log_filepath = g_strdup(optarg);
1092            break;
1093        case 'f':
1094            g_free(config->pid_filepath);
1095            config->pid_filepath = g_strdup(optarg);
1096            break;
1097#ifdef CONFIG_FSFREEZE
1098        case 'F':
1099            g_free(config->fsfreeze_hook);
1100            config->fsfreeze_hook = g_strdup(optarg ?: QGA_FSFREEZE_HOOK_DEFAULT);
1101            break;
1102#endif
1103        case 't':
1104            g_free(config->state_dir);
1105            config->state_dir = g_strdup(optarg);
1106            break;
1107        case 'v':
1108            /* enable all log levels */
1109            config->log_level = G_LOG_LEVEL_MASK;
1110            break;
1111        case 'V':
1112            printf("QEMU Guest Agent %s\n", QEMU_VERSION);
1113            exit(EXIT_SUCCESS);
1114        case 'd':
1115            config->daemonize = 1;
1116            break;
1117        case 'D':
1118            config->dumpconf = 1;
1119            break;
1120        case 'b': {
1121            if (is_help_option(optarg)) {
1122                qmp_for_each_command(ga_print_cmd, NULL);
1123                exit(EXIT_SUCCESS);
1124            }
1125            config->blacklist = g_list_concat(config->blacklist,
1126                                             split_list(optarg, ","));
1127            break;
1128        }
1129#ifdef _WIN32
1130        case 's':
1131            config->service = optarg;
1132            if (strcmp(config->service, "install") == 0) {
1133                if (ga_install_vss_provider()) {
1134                    exit(EXIT_FAILURE);
1135                }
1136                if (ga_install_service(config->channel_path,
1137                                       config->log_filepath, config->state_dir)) {
1138                    exit(EXIT_FAILURE);
1139                }
1140                exit(EXIT_SUCCESS);
1141            } else if (strcmp(config->service, "uninstall") == 0) {
1142                ga_uninstall_vss_provider();
1143                exit(ga_uninstall_service());
1144            } else if (strcmp(config->service, "vss-install") == 0) {
1145                if (ga_install_vss_provider()) {
1146                    exit(EXIT_FAILURE);
1147                }
1148                exit(EXIT_SUCCESS);
1149            } else if (strcmp(config->service, "vss-uninstall") == 0) {
1150                ga_uninstall_vss_provider();
1151                exit(EXIT_SUCCESS);
1152            } else {
1153                printf("Unknown service command.\n");
1154                exit(EXIT_FAILURE);
1155            }
1156            break;
1157#endif
1158        case 'h':
1159            usage(argv[0]);
1160            exit(EXIT_SUCCESS);
1161        case '?':
1162            g_print("Unknown option, try '%s --help' for more information.\n",
1163                    argv[0]);
1164            exit(EXIT_FAILURE);
1165        }
1166    }
1167}
1168
1169static void config_free(GAConfig *config)
1170{
1171    g_free(config->method);
1172    g_free(config->log_filepath);
1173    g_free(config->pid_filepath);
1174    g_free(config->state_dir);
1175    g_free(config->channel_path);
1176    g_free(config->bliststr);
1177#ifdef CONFIG_FSFREEZE
1178    g_free(config->fsfreeze_hook);
1179#endif
1180    g_list_free_full(config->blacklist, g_free);
1181    g_free(config);
1182}
1183
1184static bool check_is_frozen(GAState *s)
1185{
1186#ifndef _WIN32
1187    /* check if a previous instance of qemu-ga exited with filesystems' state
1188     * marked as frozen. this could be a stale value (a non-qemu-ga process
1189     * or reboot may have since unfrozen them), but better to require an
1190     * uneeded unfreeze than to risk hanging on start-up
1191     */
1192    struct stat st;
1193    if (stat(s->state_filepath_isfrozen, &st) == -1) {
1194        /* it's okay if the file doesn't exist, but if we can't access for
1195         * some other reason, such as permissions, there's a configuration
1196         * that needs to be addressed. so just bail now before we get into
1197         * more trouble later
1198         */
1199        if (errno != ENOENT) {
1200            g_critical("unable to access state file at path %s: %s",
1201                       s->state_filepath_isfrozen, strerror(errno));
1202            return EXIT_FAILURE;
1203        }
1204    } else {
1205        g_warning("previous instance appears to have exited with frozen"
1206                  " filesystems. deferring logging/pidfile creation and"
1207                  " disabling non-fsfreeze-safe commands until"
1208                  " guest-fsfreeze-thaw is issued, or filesystems are"
1209                  " manually unfrozen and the file %s is removed",
1210                  s->state_filepath_isfrozen);
1211        return true;
1212    }
1213#endif
1214    return false;
1215}
1216
1217static int run_agent(GAState *s, GAConfig *config)
1218{
1219    ga_state = s;
1220
1221    g_log_set_default_handler(ga_log, s);
1222    g_log_set_fatal_mask(NULL, G_LOG_LEVEL_ERROR);
1223    ga_enable_logging(s);
1224
1225#ifdef _WIN32
1226    /* On win32 the state directory is application specific (be it the default
1227     * or a user override). We got past the command line parsing; let's create
1228     * the directory (with any intermediate directories). If we run into an
1229     * error later on, we won't try to clean up the directory, it is considered
1230     * persistent.
1231     */
1232    if (g_mkdir_with_parents(config->state_dir, S_IRWXU) == -1) {
1233        g_critical("unable to create (an ancestor of) the state directory"
1234                   " '%s': %s", config->state_dir, strerror(errno));
1235        return EXIT_FAILURE;
1236    }
1237#endif
1238
1239    if (ga_is_frozen(s)) {
1240        if (config->daemonize) {
1241            /* delay opening/locking of pidfile till filesystems are unfrozen */
1242            s->deferred_options.pid_filepath = config->pid_filepath;
1243            become_daemon(NULL);
1244        }
1245        if (config->log_filepath) {
1246            /* delay opening the log file till filesystems are unfrozen */
1247            s->deferred_options.log_filepath = config->log_filepath;
1248        }
1249        ga_disable_logging(s);
1250        qmp_for_each_command(ga_disable_non_whitelisted, NULL);
1251    } else {
1252        if (config->daemonize) {
1253            become_daemon(config->pid_filepath);
1254        }
1255        if (config->log_filepath) {
1256            FILE *log_file = ga_open_logfile(config->log_filepath);
1257            if (!log_file) {
1258                g_critical("unable to open specified log file: %s",
1259                           strerror(errno));
1260                return EXIT_FAILURE;
1261            }
1262            s->log_file = log_file;
1263        }
1264    }
1265
1266    /* load persistent state from disk */
1267    if (!read_persistent_state(&s->pstate,
1268                               s->pstate_filepath,
1269                               ga_is_frozen(s))) {
1270        g_critical("failed to load persistent state");
1271        return EXIT_FAILURE;
1272    }
1273
1274    config->blacklist = ga_command_blacklist_init(config->blacklist);
1275    if (config->blacklist) {
1276        GList *l = config->blacklist;
1277        s->blacklist = config->blacklist;
1278        do {
1279            g_debug("disabling command: %s", (char *)l->data);
1280            qmp_disable_command(l->data);
1281            l = g_list_next(l);
1282        } while (l);
1283    }
1284    s->command_state = ga_command_state_new();
1285    ga_command_state_init(s, s->command_state);
1286    ga_command_state_init_all(s->command_state);
1287    json_message_parser_init(&s->parser, process_event);
1288    ga_state = s;
1289#ifndef _WIN32
1290    if (!register_signal_handlers()) {
1291        g_critical("failed to register signal handlers");
1292        return EXIT_FAILURE;
1293    }
1294#endif
1295
1296    s->main_loop = g_main_loop_new(NULL, false);
1297    if (!channel_init(ga_state, config->method, config->channel_path)) {
1298        g_critical("failed to initialize guest agent channel");
1299        return EXIT_FAILURE;
1300    }
1301#ifndef _WIN32
1302    g_main_loop_run(ga_state->main_loop);
1303#else
1304    if (config->daemonize) {
1305        SERVICE_TABLE_ENTRY service_table[] = {
1306            { (char *)QGA_SERVICE_NAME, service_main }, { NULL, NULL } };
1307        StartServiceCtrlDispatcher(service_table);
1308    } else {
1309        g_main_loop_run(ga_state->main_loop);
1310    }
1311#endif
1312
1313    return EXIT_SUCCESS;
1314}
1315
1316int main(int argc, char **argv)
1317{
1318    int ret = EXIT_SUCCESS;
1319    GAState *s = g_new0(GAState, 1);
1320    GAConfig *config = g_new0(GAConfig, 1);
1321
1322    config->log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL;
1323
1324    module_call_init(MODULE_INIT_QAPI);
1325
1326    init_dfl_pathnames();
1327    config_load(config);
1328    config_parse(config, argc, argv);
1329
1330    if (config->pid_filepath == NULL) {
1331        config->pid_filepath = g_strdup(dfl_pathnames.pidfile);
1332    }
1333
1334    if (config->state_dir == NULL) {
1335        config->state_dir = g_strdup(dfl_pathnames.state_dir);
1336    }
1337
1338    if (config->method == NULL) {
1339        config->method = g_strdup("virtio-serial");
1340    }
1341
1342    if (config->channel_path == NULL) {
1343        if (strcmp(config->method, "virtio-serial") == 0) {
1344            /* try the default path for the virtio-serial port */
1345            config->channel_path = g_strdup(QGA_VIRTIO_PATH_DEFAULT);
1346        } else if (strcmp(config->method, "isa-serial") == 0) {
1347            /* try the default path for the serial port - COM1 */
1348            config->channel_path = g_strdup(QGA_SERIAL_PATH_DEFAULT);
1349        } else {
1350            g_critical("must specify a path for this channel");
1351            ret = EXIT_FAILURE;
1352            goto end;
1353        }
1354    }
1355
1356    s->log_level = config->log_level;
1357    s->log_file = stderr;
1358#ifdef CONFIG_FSFREEZE
1359    s->fsfreeze_hook = config->fsfreeze_hook;
1360#endif
1361    s->pstate_filepath = g_strdup_printf("%s/qga.state", config->state_dir);
1362    s->state_filepath_isfrozen = g_strdup_printf("%s/qga.state.isfrozen",
1363                                                 config->state_dir);
1364    s->frozen = check_is_frozen(s);
1365
1366    if (config->dumpconf) {
1367        config_dump(config);
1368        goto end;
1369    }
1370
1371    ret = run_agent(s, config);
1372
1373end:
1374    if (s->command_state) {
1375        ga_command_state_cleanup_all(s->command_state);
1376        ga_command_state_free(s->command_state);
1377        json_message_parser_destroy(&s->parser);
1378    }
1379    if (s->channel) {
1380        ga_channel_free(s->channel);
1381    }
1382    g_free(s->pstate_filepath);
1383    g_free(s->state_filepath_isfrozen);
1384
1385    if (config->daemonize) {
1386        unlink(config->pid_filepath);
1387    }
1388
1389    config_free(config);
1390    if (s->main_loop) {
1391        g_main_loop_unref(s->main_loop);
1392    }
1393    g_free(s);
1394
1395    return ret;
1396}
1397