/* SPDX-License-Identifier: LGPL-2.1-or-later */

#include "bus-error.h"
#include "bus-locator.h"
#include "systemctl-daemon-reload.h"
#include "systemctl-util.h"
#include "systemctl.h"

int daemon_reload(enum action action, bool graceful) {
        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
        const char *method;
        sd_bus *bus;
        int r;

        r = acquire_bus(BUS_MANAGER, &bus);
        if (r < 0)
                return r;

        polkit_agent_open_maybe();

        switch (action) {

        case ACTION_RELOAD:
                method = "Reload";
                break;

        case ACTION_REEXEC:
                method = "Reexecute";
                break;

        default:
                return -EINVAL;
        }

        r = bus_message_new_method_call(bus, &m, bus_systemd_mgr, method);
        if (r < 0)
                return bus_log_create_error(r);

        /* Reloading the daemon may take long, hence set a longer timeout here */
        r = sd_bus_call(bus, m, DAEMON_RELOAD_TIMEOUT_SEC, &error, NULL);

        /* On reexecution, we expect a disconnect, not a reply */
        if (IN_SET(r, -ETIMEDOUT, -ECONNRESET) && action == ACTION_REEXEC)
                return 1;
        if (r < 0) {
                if (graceful) { /* If graceful mode is selected, debug log, but don't fail */
                        log_debug_errno(r, "Failed to reload daemon via the bus, ignoring: %s", bus_error_message(&error, r));
                        return 0;
                }

                return log_error_errno(r, "Failed to reload daemon: %s", bus_error_message(&error, r));
        }

        return 1;
}

int verb_daemon_reload(int argc, char *argv[], void *userdata) {
        enum action a;
        int r;

        assert(argc >= 1);

        if (streq(argv[0], "daemon-reexec"))
                a = ACTION_REEXEC;
        else if (streq(argv[0], "daemon-reload"))
                a = ACTION_RELOAD;
        else
                assert_not_reached();

        r = daemon_reload(a, /* graceful= */ false);
        if (r < 0)
                return r;

        return 0;
}
