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, or\n"
 194"                    isa-serial (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 {
 663        g_critical("unsupported channel method/type: %s", method);
 664        return false;
 665    }
 666
 667    s->channel = ga_channel_new(channel_method, path, channel_event_cb, s);
 668    if (!s->channel) {
 669        g_critical("failed to create guest agent channel");
 670        return false;
 671    }
 672
 673    return true;
 674}
 675
 676#ifdef _WIN32
 677DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data,
 678                                  LPVOID ctx)
 679{
 680    DWORD ret = NO_ERROR;
 681    GAService *service = &ga_state->service;
 682
 683    switch (ctrl)
 684    {
 685        case SERVICE_CONTROL_STOP:
 686        case SERVICE_CONTROL_SHUTDOWN:
 687            quit_handler(SIGTERM);
 688            service->status.dwCurrentState = SERVICE_STOP_PENDING;
 689            SetServiceStatus(service->status_handle, &service->status);
 690            break;
 691
 692        default:
 693            ret = ERROR_CALL_NOT_IMPLEMENTED;
 694    }
 695    return ret;
 696}
 697
 698VOID WINAPI service_main(DWORD argc, TCHAR *argv[])
 699{
 700    GAService *service = &ga_state->service;
 701
 702    service->status_handle = RegisterServiceCtrlHandlerEx(QGA_SERVICE_NAME,
 703        service_ctrl_handler, NULL);
 704
 705    if (service->status_handle == 0) {
 706        g_critical("Failed to register extended requests function!\n");
 707        return;
 708    }
 709
 710    service->status.dwServiceType = SERVICE_WIN32;
 711    service->status.dwCurrentState = SERVICE_RUNNING;
 712    service->status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
 713    service->status.dwWin32ExitCode = NO_ERROR;
 714    service->status.dwServiceSpecificExitCode = NO_ERROR;
 715    service->status.dwCheckPoint = 0;
 716    service->status.dwWaitHint = 0;
 717    SetServiceStatus(service->status_handle, &service->status);
 718
 719    g_main_loop_run(ga_state->main_loop);
 720
 721    service->status.dwCurrentState = SERVICE_STOPPED;
 722    SetServiceStatus(service->status_handle, &service->status);
 723}
 724#endif
 725
 726static void set_persistent_state_defaults(GAPersistentState *pstate)
 727{
 728    g_assert(pstate);
 729    pstate->fd_counter = QGA_PSTATE_DEFAULT_FD_COUNTER;
 730}
 731
 732static void persistent_state_from_keyfile(GAPersistentState *pstate,
 733                                          GKeyFile *keyfile)
 734{
 735    g_assert(pstate);
 736    g_assert(keyfile);
 737    /* if any fields are missing, either because the file was tampered with
 738     * by agents of chaos, or because the field wasn't present at the time the
 739     * file was created, the best we can ever do is start over with the default
 740     * values. so load them now, and ignore any errors in accessing key-value
 741     * pairs
 742     */
 743    set_persistent_state_defaults(pstate);
 744
 745    if (g_key_file_has_key(keyfile, "global", "fd_counter", NULL)) {
 746        pstate->fd_counter =
 747            g_key_file_get_integer(keyfile, "global", "fd_counter", NULL);
 748    }
 749}
 750
 751static void persistent_state_to_keyfile(const GAPersistentState *pstate,
 752                                        GKeyFile *keyfile)
 753{
 754    g_assert(pstate);
 755    g_assert(keyfile);
 756
 757    g_key_file_set_integer(keyfile, "global", "fd_counter", pstate->fd_counter);
 758}
 759
 760static gboolean write_persistent_state(const GAPersistentState *pstate,
 761                                       const gchar *path)
 762{
 763    GKeyFile *keyfile = g_key_file_new();
 764    GError *gerr = NULL;
 765    gboolean ret = true;
 766    gchar *data = NULL;
 767    gsize data_len;
 768
 769    g_assert(pstate);
 770
 771    persistent_state_to_keyfile(pstate, keyfile);
 772    data = g_key_file_to_data(keyfile, &data_len, &gerr);
 773    if (gerr) {
 774        g_critical("failed to convert persistent state to string: %s",
 775                   gerr->message);
 776        ret = false;
 777        goto out;
 778    }
 779
 780    g_file_set_contents(path, data, data_len, &gerr);
 781    if (gerr) {
 782        g_critical("failed to write persistent state to %s: %s",
 783                    path, gerr->message);
 784        ret = false;
 785        goto out;
 786    }
 787
 788out:
 789    if (gerr) {
 790        g_error_free(gerr);
 791    }
 792    if (keyfile) {
 793        g_key_file_free(keyfile);
 794    }
 795    g_free(data);
 796    return ret;
 797}
 798
 799static gboolean read_persistent_state(GAPersistentState *pstate,
 800                                      const gchar *path, gboolean frozen)
 801{
 802    GKeyFile *keyfile = NULL;
 803    GError *gerr = NULL;
 804    struct stat st;
 805    gboolean ret = true;
 806
 807    g_assert(pstate);
 808
 809    if (stat(path, &st) == -1) {
 810        /* it's okay if state file doesn't exist, but any other error
 811         * indicates a permissions issue or some other misconfiguration
 812         * that we likely won't be able to recover from.
 813         */
 814        if (errno != ENOENT) {
 815            g_critical("unable to access state file at path %s: %s",
 816                       path, strerror(errno));
 817            ret = false;
 818            goto out;
 819        }
 820
 821        /* file doesn't exist. initialize state to default values and
 822         * attempt to save now. (we could wait till later when we have
 823         * modified state we need to commit, but if there's a problem,
 824         * such as a missing parent directory, we want to catch it now)
 825         *
 826         * there is a potential scenario where someone either managed to
 827         * update the agent from a version that didn't use a key store
 828         * while qemu-ga thought the filesystem was frozen, or
 829         * deleted the key store prior to issuing a fsfreeze, prior
 830         * to restarting the agent. in this case we go ahead and defer
 831         * initial creation till we actually have modified state to
 832         * write, otherwise fail to recover from freeze.
 833         */
 834        set_persistent_state_defaults(pstate);
 835        if (!frozen) {
 836            ret = write_persistent_state(pstate, path);
 837            if (!ret) {
 838                g_critical("unable to create state file at path %s", path);
 839                ret = false;
 840                goto out;
 841            }
 842        }
 843        ret = true;
 844        goto out;
 845    }
 846
 847    keyfile = g_key_file_new();
 848    g_key_file_load_from_file(keyfile, path, 0, &gerr);
 849    if (gerr) {
 850        g_critical("error loading persistent state from path: %s, %s",
 851                   path, gerr->message);
 852        ret = false;
 853        goto out;
 854    }
 855
 856    persistent_state_from_keyfile(pstate, keyfile);
 857
 858out:
 859    if (keyfile) {
 860        g_key_file_free(keyfile);
 861    }
 862    if (gerr) {
 863        g_error_free(gerr);
 864    }
 865
 866    return ret;
 867}
 868
 869int64_t ga_get_fd_handle(GAState *s, Error **errp)
 870{
 871    int64_t handle;
 872
 873    g_assert(s->pstate_filepath);
 874    /* we blacklist commands and avoid operations that potentially require
 875     * writing to disk when we're in a frozen state. this includes opening
 876     * new files, so we should never get here in that situation
 877     */
 878    g_assert(!ga_is_frozen(s));
 879
 880    handle = s->pstate.fd_counter++;
 881
 882    /* This should never happen on a reasonable timeframe, as guest-file-open
 883     * would have to be issued 2^63 times */
 884    if (s->pstate.fd_counter == INT64_MAX) {
 885        abort();
 886    }
 887
 888    if (!write_persistent_state(&s->pstate, s->pstate_filepath)) {
 889        error_setg(errp, "failed to commit persistent state to disk");
 890        return -1;
 891    }
 892
 893    return handle;
 894}
 895
 896static void ga_print_cmd(QmpCommand *cmd, void *opaque)
 897{
 898    printf("%s\n", qmp_command_name(cmd));
 899}
 900
 901static GList *split_list(const gchar *str, const gchar *delim)
 902{
 903    GList *list = NULL;
 904    int i;
 905    gchar **strv;
 906
 907    strv = g_strsplit(str, delim, -1);
 908    for (i = 0; strv[i]; i++) {
 909        list = g_list_prepend(list, strv[i]);
 910    }
 911    g_free(strv);
 912
 913    return list;
 914}
 915
 916typedef struct GAConfig {
 917    char *channel_path;
 918    char *method;
 919    char *log_filepath;
 920    char *pid_filepath;
 921#ifdef CONFIG_FSFREEZE
 922    char *fsfreeze_hook;
 923#endif
 924    char *state_dir;
 925#ifdef _WIN32
 926    const char *service;
 927#endif
 928    gchar *bliststr; /* blacklist may point to this string */
 929    GList *blacklist;
 930    int daemonize;
 931    GLogLevelFlags log_level;
 932    int dumpconf;
 933} GAConfig;
 934
 935static void config_load(GAConfig *config)
 936{
 937    GError *gerr = NULL;
 938    GKeyFile *keyfile;
 939    const char *conf = g_getenv("QGA_CONF") ?: QGA_CONF_DEFAULT;
 940
 941    /* read system config */
 942    keyfile = g_key_file_new();
 943    if (!g_key_file_load_from_file(keyfile, conf, 0, &gerr)) {
 944        goto end;
 945    }
 946    if (g_key_file_has_key(keyfile, "general", "daemon", NULL)) {
 947        config->daemonize =
 948            g_key_file_get_boolean(keyfile, "general", "daemon", &gerr);
 949    }
 950    if (g_key_file_has_key(keyfile, "general", "method", NULL)) {
 951        config->method =
 952            g_key_file_get_string(keyfile, "general", "method", &gerr);
 953    }
 954    if (g_key_file_has_key(keyfile, "general", "path", NULL)) {
 955        config->channel_path =
 956            g_key_file_get_string(keyfile, "general", "path", &gerr);
 957    }
 958    if (g_key_file_has_key(keyfile, "general", "logfile", NULL)) {
 959        config->log_filepath =
 960            g_key_file_get_string(keyfile, "general", "logfile", &gerr);
 961    }
 962    if (g_key_file_has_key(keyfile, "general", "pidfile", NULL)) {
 963        config->pid_filepath =
 964            g_key_file_get_string(keyfile, "general", "pidfile", &gerr);
 965    }
 966#ifdef CONFIG_FSFREEZE
 967    if (g_key_file_has_key(keyfile, "general", "fsfreeze-hook", NULL)) {
 968        config->fsfreeze_hook =
 969            g_key_file_get_string(keyfile,
 970                                  "general", "fsfreeze-hook", &gerr);
 971    }
 972#endif
 973    if (g_key_file_has_key(keyfile, "general", "statedir", NULL)) {
 974        config->state_dir =
 975            g_key_file_get_string(keyfile, "general", "statedir", &gerr);
 976    }
 977    if (g_key_file_has_key(keyfile, "general", "verbose", NULL) &&
 978        g_key_file_get_boolean(keyfile, "general", "verbose", &gerr)) {
 979        /* enable all log levels */
 980        config->log_level = G_LOG_LEVEL_MASK;
 981    }
 982    if (g_key_file_has_key(keyfile, "general", "blacklist", NULL)) {
 983        config->bliststr =
 984            g_key_file_get_string(keyfile, "general", "blacklist", &gerr);
 985        config->blacklist = g_list_concat(config->blacklist,
 986                                          split_list(config->bliststr, ","));
 987    }
 988
 989end:
 990    g_key_file_free(keyfile);
 991    if (gerr &&
 992        !(gerr->domain == G_FILE_ERROR && gerr->code == G_FILE_ERROR_NOENT)) {
 993        g_critical("error loading configuration from path: %s, %s",
 994                   QGA_CONF_DEFAULT, gerr->message);
 995        exit(EXIT_FAILURE);
 996    }
 997    g_clear_error(&gerr);
 998}
 999
1000static gchar *list_join(GList *list, const gchar separator)
1001{
1002    GString *str = g_string_new("");
1003
1004    while (list) {
1005        str = g_string_append(str, (gchar *)list->data);
1006        list = g_list_next(list);
1007        if (list) {
1008            str = g_string_append_c(str, separator);
1009        }
1010    }
1011
1012    return g_string_free(str, FALSE);
1013}
1014
1015static void config_dump(GAConfig *config)
1016{
1017    GError *error = NULL;
1018    GKeyFile *keyfile;
1019    gchar *tmp;
1020
1021    keyfile = g_key_file_new();
1022    g_assert(keyfile);
1023
1024    g_key_file_set_boolean(keyfile, "general", "daemon", config->daemonize);
1025    g_key_file_set_string(keyfile, "general", "method", config->method);
1026    g_key_file_set_string(keyfile, "general", "path", config->channel_path);
1027    if (config->log_filepath) {
1028        g_key_file_set_string(keyfile, "general", "logfile",
1029                              config->log_filepath);
1030    }
1031    g_key_file_set_string(keyfile, "general", "pidfile", config->pid_filepath);
1032#ifdef CONFIG_FSFREEZE
1033    if (config->fsfreeze_hook) {
1034        g_key_file_set_string(keyfile, "general", "fsfreeze-hook",
1035                              config->fsfreeze_hook);
1036    }
1037#endif
1038    g_key_file_set_string(keyfile, "general", "statedir", config->state_dir);
1039    g_key_file_set_boolean(keyfile, "general", "verbose",
1040                           config->log_level == G_LOG_LEVEL_MASK);
1041    tmp = list_join(config->blacklist, ',');
1042    g_key_file_set_string(keyfile, "general", "blacklist", tmp);
1043    g_free(tmp);
1044
1045    tmp = g_key_file_to_data(keyfile, NULL, &error);
1046    printf("%s", tmp);
1047
1048    g_free(tmp);
1049    g_key_file_free(keyfile);
1050}
1051
1052static void config_parse(GAConfig *config, int argc, char **argv)
1053{
1054    const char *sopt = "hVvdm:p:l:f:F::b:s:t:D";
1055    int opt_ind = 0, ch;
1056    const struct option lopt[] = {
1057        { "help", 0, NULL, 'h' },
1058        { "version", 0, NULL, 'V' },
1059        { "dump-conf", 0, NULL, 'D' },
1060        { "logfile", 1, NULL, 'l' },
1061        { "pidfile", 1, NULL, 'f' },
1062#ifdef CONFIG_FSFREEZE
1063        { "fsfreeze-hook", 2, NULL, 'F' },
1064#endif
1065        { "verbose", 0, NULL, 'v' },
1066        { "method", 1, NULL, 'm' },
1067        { "path", 1, NULL, 'p' },
1068        { "daemonize", 0, NULL, 'd' },
1069        { "blacklist", 1, NULL, 'b' },
1070#ifdef _WIN32
1071        { "service", 1, NULL, 's' },
1072#endif
1073        { "statedir", 1, NULL, 't' },
1074        { NULL, 0, NULL, 0 }
1075    };
1076
1077    while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
1078        switch (ch) {
1079        case 'm':
1080            g_free(config->method);
1081            config->method = g_strdup(optarg);
1082            break;
1083        case 'p':
1084            g_free(config->channel_path);
1085            config->channel_path = g_strdup(optarg);
1086            break;
1087        case 'l':
1088            g_free(config->log_filepath);
1089            config->log_filepath = g_strdup(optarg);
1090            break;
1091        case 'f':
1092            g_free(config->pid_filepath);
1093            config->pid_filepath = g_strdup(optarg);
1094            break;
1095#ifdef CONFIG_FSFREEZE
1096        case 'F':
1097            g_free(config->fsfreeze_hook);
1098            config->fsfreeze_hook = g_strdup(optarg ?: QGA_FSFREEZE_HOOK_DEFAULT);
1099            break;
1100#endif
1101        case 't':
1102            g_free(config->state_dir);
1103            config->state_dir = g_strdup(optarg);
1104            break;
1105        case 'v':
1106            /* enable all log levels */
1107            config->log_level = G_LOG_LEVEL_MASK;
1108            break;
1109        case 'V':
1110            printf("QEMU Guest Agent %s\n", QEMU_VERSION);
1111            exit(EXIT_SUCCESS);
1112        case 'd':
1113            config->daemonize = 1;
1114            break;
1115        case 'D':
1116            config->dumpconf = 1;
1117            break;
1118        case 'b': {
1119            if (is_help_option(optarg)) {
1120                qmp_for_each_command(ga_print_cmd, NULL);
1121                exit(EXIT_SUCCESS);
1122            }
1123            config->blacklist = g_list_concat(config->blacklist,
1124                                             split_list(optarg, ","));
1125            break;
1126        }
1127#ifdef _WIN32
1128        case 's':
1129            config->service = optarg;
1130            if (strcmp(config->service, "install") == 0) {
1131                if (ga_install_vss_provider()) {
1132                    exit(EXIT_FAILURE);
1133                }
1134                if (ga_install_service(config->channel_path,
1135                                       config->log_filepath, config->state_dir)) {
1136                    exit(EXIT_FAILURE);
1137                }
1138                exit(EXIT_SUCCESS);
1139            } else if (strcmp(config->service, "uninstall") == 0) {
1140                ga_uninstall_vss_provider();
1141                exit(ga_uninstall_service());
1142            } else if (strcmp(config->service, "vss-install") == 0) {
1143                if (ga_install_vss_provider()) {
1144                    exit(EXIT_FAILURE);
1145                }
1146                exit(EXIT_SUCCESS);
1147            } else if (strcmp(config->service, "vss-uninstall") == 0) {
1148                ga_uninstall_vss_provider();
1149                exit(EXIT_SUCCESS);
1150            } else {
1151                printf("Unknown service command.\n");
1152                exit(EXIT_FAILURE);
1153            }
1154            break;
1155#endif
1156        case 'h':
1157            usage(argv[0]);
1158            exit(EXIT_SUCCESS);
1159        case '?':
1160            g_print("Unknown option, try '%s --help' for more information.\n",
1161                    argv[0]);
1162            exit(EXIT_FAILURE);
1163        }
1164    }
1165}
1166
1167static void config_free(GAConfig *config)
1168{
1169    g_free(config->method);
1170    g_free(config->log_filepath);
1171    g_free(config->pid_filepath);
1172    g_free(config->state_dir);
1173    g_free(config->channel_path);
1174    g_free(config->bliststr);
1175#ifdef CONFIG_FSFREEZE
1176    g_free(config->fsfreeze_hook);
1177#endif
1178    g_free(config);
1179}
1180
1181static bool check_is_frozen(GAState *s)
1182{
1183#ifndef _WIN32
1184    /* check if a previous instance of qemu-ga exited with filesystems' state
1185     * marked as frozen. this could be a stale value (a non-qemu-ga process
1186     * or reboot may have since unfrozen them), but better to require an
1187     * uneeded unfreeze than to risk hanging on start-up
1188     */
1189    struct stat st;
1190    if (stat(s->state_filepath_isfrozen, &st) == -1) {
1191        /* it's okay if the file doesn't exist, but if we can't access for
1192         * some other reason, such as permissions, there's a configuration
1193         * that needs to be addressed. so just bail now before we get into
1194         * more trouble later
1195         */
1196        if (errno != ENOENT) {
1197            g_critical("unable to access state file at path %s: %s",
1198                       s->state_filepath_isfrozen, strerror(errno));
1199            return EXIT_FAILURE;
1200        }
1201    } else {
1202        g_warning("previous instance appears to have exited with frozen"
1203                  " filesystems. deferring logging/pidfile creation and"
1204                  " disabling non-fsfreeze-safe commands until"
1205                  " guest-fsfreeze-thaw is issued, or filesystems are"
1206                  " manually unfrozen and the file %s is removed",
1207                  s->state_filepath_isfrozen);
1208        return true;
1209    }
1210#endif
1211    return false;
1212}
1213
1214static int run_agent(GAState *s, GAConfig *config)
1215{
1216    ga_state = s;
1217
1218    g_log_set_default_handler(ga_log, s);
1219    g_log_set_fatal_mask(NULL, G_LOG_LEVEL_ERROR);
1220    ga_enable_logging(s);
1221
1222#ifdef _WIN32
1223    /* On win32 the state directory is application specific (be it the default
1224     * or a user override). We got past the command line parsing; let's create
1225     * the directory (with any intermediate directories). If we run into an
1226     * error later on, we won't try to clean up the directory, it is considered
1227     * persistent.
1228     */
1229    if (g_mkdir_with_parents(config->state_dir, S_IRWXU) == -1) {
1230        g_critical("unable to create (an ancestor of) the state directory"
1231                   " '%s': %s", config->state_dir, strerror(errno));
1232        return EXIT_FAILURE;
1233    }
1234#endif
1235
1236    if (ga_is_frozen(s)) {
1237        if (config->daemonize) {
1238            /* delay opening/locking of pidfile till filesystems are unfrozen */
1239            s->deferred_options.pid_filepath = config->pid_filepath;
1240            become_daemon(NULL);
1241        }
1242        if (config->log_filepath) {
1243            /* delay opening the log file till filesystems are unfrozen */
1244            s->deferred_options.log_filepath = config->log_filepath;
1245        }
1246        ga_disable_logging(s);
1247        qmp_for_each_command(ga_disable_non_whitelisted, NULL);
1248    } else {
1249        if (config->daemonize) {
1250            become_daemon(config->pid_filepath);
1251        }
1252        if (config->log_filepath) {
1253            FILE *log_file = ga_open_logfile(config->log_filepath);
1254            if (!log_file) {
1255                g_critical("unable to open specified log file: %s",
1256                           strerror(errno));
1257                return EXIT_FAILURE;
1258            }
1259            s->log_file = log_file;
1260        }
1261    }
1262
1263    /* load persistent state from disk */
1264    if (!read_persistent_state(&s->pstate,
1265                               s->pstate_filepath,
1266                               ga_is_frozen(s))) {
1267        g_critical("failed to load persistent state");
1268        return EXIT_FAILURE;
1269    }
1270
1271    config->blacklist = ga_command_blacklist_init(config->blacklist);
1272    if (config->blacklist) {
1273        GList *l = config->blacklist;
1274        s->blacklist = config->blacklist;
1275        do {
1276            g_debug("disabling command: %s", (char *)l->data);
1277            qmp_disable_command(l->data);
1278            l = g_list_next(l);
1279        } while (l);
1280    }
1281    s->command_state = ga_command_state_new();
1282    ga_command_state_init(s, s->command_state);
1283    ga_command_state_init_all(s->command_state);
1284    json_message_parser_init(&s->parser, process_event);
1285    ga_state = s;
1286#ifndef _WIN32
1287    if (!register_signal_handlers()) {
1288        g_critical("failed to register signal handlers");
1289        return EXIT_FAILURE;
1290    }
1291#endif
1292
1293    s->main_loop = g_main_loop_new(NULL, false);
1294    if (!channel_init(ga_state, config->method, config->channel_path)) {
1295        g_critical("failed to initialize guest agent channel");
1296        return EXIT_FAILURE;
1297    }
1298#ifndef _WIN32
1299    g_main_loop_run(ga_state->main_loop);
1300#else
1301    if (config->daemonize) {
1302        SERVICE_TABLE_ENTRY service_table[] = {
1303            { (char *)QGA_SERVICE_NAME, service_main }, { NULL, NULL } };
1304        StartServiceCtrlDispatcher(service_table);
1305    } else {
1306        g_main_loop_run(ga_state->main_loop);
1307    }
1308#endif
1309
1310    return EXIT_SUCCESS;
1311}
1312
1313static void free_blacklist_entry(gpointer entry, gpointer unused)
1314{
1315    g_free(entry);
1316}
1317
1318int main(int argc, char **argv)
1319{
1320    int ret = EXIT_SUCCESS;
1321    GAState *s = g_new0(GAState, 1);
1322    GAConfig *config = g_new0(GAConfig, 1);
1323
1324    config->log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL;
1325
1326    module_call_init(MODULE_INIT_QAPI);
1327
1328    init_dfl_pathnames();
1329    config_load(config);
1330    config_parse(config, argc, argv);
1331
1332    if (config->pid_filepath == NULL) {
1333        config->pid_filepath = g_strdup(dfl_pathnames.pidfile);
1334    }
1335
1336    if (config->state_dir == NULL) {
1337        config->state_dir = g_strdup(dfl_pathnames.state_dir);
1338    }
1339
1340    if (config->method == NULL) {
1341        config->method = g_strdup("virtio-serial");
1342    }
1343
1344    if (config->channel_path == NULL) {
1345        if (strcmp(config->method, "virtio-serial") == 0) {
1346            /* try the default path for the virtio-serial port */
1347            config->channel_path = g_strdup(QGA_VIRTIO_PATH_DEFAULT);
1348        } else if (strcmp(config->method, "isa-serial") == 0) {
1349            /* try the default path for the serial port - COM1 */
1350            config->channel_path = g_strdup(QGA_SERIAL_PATH_DEFAULT);
1351        } else {
1352            g_critical("must specify a path for this channel");
1353            ret = EXIT_FAILURE;
1354            goto end;
1355        }
1356    }
1357
1358    s->log_level = config->log_level;
1359    s->log_file = stderr;
1360#ifdef CONFIG_FSFREEZE
1361    s->fsfreeze_hook = config->fsfreeze_hook;
1362#endif
1363    s->pstate_filepath = g_strdup_printf("%s/qga.state", config->state_dir);
1364    s->state_filepath_isfrozen = g_strdup_printf("%s/qga.state.isfrozen",
1365                                                 config->state_dir);
1366    s->frozen = check_is_frozen(s);
1367
1368    if (config->dumpconf) {
1369        config_dump(config);
1370        goto end;
1371    }
1372
1373    ret = run_agent(s, config);
1374
1375end:
1376    if (s->command_state) {
1377        ga_command_state_cleanup_all(s->command_state);
1378    }
1379    if (s->channel) {
1380        ga_channel_free(s->channel);
1381    }
1382    g_list_foreach(config->blacklist, free_blacklist_entry, NULL);
1383    g_free(s->pstate_filepath);
1384    g_free(s->state_filepath_isfrozen);
1385
1386    if (config->daemonize) {
1387        unlink(config->pid_filepath);
1388    }
1389
1390    config_free(config);
1391
1392    return ret;
1393}
1394