X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshutdownd%2Fshutdownd.c;h=0f008a6100b475b121641e395e7bb3174d47db90;hb=fedfcdee6f55c3f183752b7fac4879bf41eed60b;hp=ee2a328b4eb311807402ca859e65fffba59ee552;hpb=574d5f2dfc25226afc718aa5ba1a145fe5cad221;p=elogind.git diff --git a/src/shutdownd/shutdownd.c b/src/shutdownd/shutdownd.c index ee2a328b4..0f008a610 100644 --- a/src/shutdownd/shutdownd.c +++ b/src/shutdownd/shutdownd.c @@ -30,8 +30,8 @@ #include #include -#include -#include +#include "systemd/sd-daemon.h" +#include "systemd/sd-shutdown.h" #include "log.h" #include "macro.h" @@ -46,30 +46,29 @@ union shutdown_buffer { }; static int read_packet(int fd, union shutdown_buffer *_b) { - struct msghdr msghdr; - struct iovec iovec; struct ucred *ucred; + ssize_t n; + + union shutdown_buffer b; /* We maintain our own copy here, in + * order not to corrupt the last message */ + struct iovec iovec = { + .iov_base = &b, + .iov_len = sizeof(b) - 1, + }; union { struct cmsghdr cmsghdr; uint8_t buf[CMSG_SPACE(sizeof(struct ucred))]; - } control; - ssize_t n; - union shutdown_buffer b; /* We maintain our own copy here, in order not to corrupt the last message */ + } control = {}; + struct msghdr msghdr = { + .msg_iov = &iovec, + .msg_iovlen = 1, + .msg_control = &control, + .msg_controllen = sizeof(control), + }; assert(fd >= 0); assert(_b); - zero(iovec); - iovec.iov_base = &b; - iovec.iov_len = sizeof(b) - 1; - - zero(control); - zero(msghdr); - msghdr.msg_iov = &iovec; - msghdr.msg_iovlen = 1; - msghdr.msg_control = &control; - msghdr.msg_controllen = sizeof(control); - n = recvmsg(fd, &msghdr, MSG_DONTWAIT); if (n <= 0) { if (n == 0) { @@ -121,7 +120,7 @@ static int read_packet(int fd, union shutdown_buffer *_b) { static void warn_wall(usec_t n, struct sd_shutdown_command *c) { char date[FORMAT_TIMESTAMP_MAX]; const char *prefix; - char *l = NULL; + _cleanup_free_ char *l = NULL; assert(c); assert(c->warn_wall); @@ -143,15 +142,13 @@ static void warn_wall(usec_t n, struct sd_shutdown_command *c) { assert_not_reached("Unknown mode!"); if (asprintf(&l, "%s%s%s%s!", c->wall_message, c->wall_message[0] ? "\n" : "", - prefix, format_timestamp(date, sizeof(date), c->usec)) < 0) + prefix, format_timestamp(date, sizeof(date), c->usec)) >= 0) + utmp_wall(l, NULL, NULL); + else log_error("Failed to allocate wall message"); - else { - utmp_wall(l, NULL); - free(l); - } } -static usec_t when_wall(usec_t n, usec_t elapse) { +_const_ static usec_t when_wall(usec_t n, usec_t elapse) { static const struct { usec_t delay; @@ -200,8 +197,8 @@ static const char *mode_to_string(enum sd_shutdown_mode m) { static int update_schedule_file(struct sd_shutdown_command *c) { int r; - FILE *f; - char *temp_path, *t; + _cleanup_fclose_ FILE *f = NULL; + _cleanup_free_ char *t = NULL, *temp_path = NULL; assert(c); @@ -218,17 +215,16 @@ static int update_schedule_file(struct sd_shutdown_command *c) { r = fopen_temporary("/run/systemd/shutdown/scheduled", &f, &temp_path); if (r < 0) { log_error("Failed to save information about scheduled shutdowns: %s", strerror(-r)); - free(t); return r; } fchmod(fileno(f), 0644); fprintf(f, - "USEC=%llu\n" + "USEC="USEC_FMT"\n" "WARN_WALL=%i\n" "MODE=%s\n", - (unsigned long long) c->usec, + c->usec, c->warn_wall, mode_to_string(c->mode)); @@ -238,8 +234,6 @@ static int update_schedule_file(struct sd_shutdown_command *c) { if (!isempty(t)) fprintf(f, "WALL_MESSAGE=%s\n", t); - free(t); - fflush(f); if (ferror(f) || rename(temp_path, "/run/systemd/shutdown/scheduled") < 0) { @@ -250,9 +244,6 @@ static int update_schedule_file(struct sd_shutdown_command *c) { unlink("/run/systemd/shutdown/scheduled"); } - fclose(f); - free(temp_path); - return r; } @@ -270,8 +261,8 @@ int main(int argc, char *argv[]) { }; int r = EXIT_FAILURE, n_fds; - union shutdown_buffer b; - struct pollfd pollfd[_FD_MAX]; + union shutdown_buffer b = {}; + struct pollfd pollfd[_FD_MAX] = {}; bool exec_shutdown = false, unlink_nologin = false; unsigned i; @@ -302,9 +293,6 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - zero(b); - zero(pollfd); - pollfd[FD_SOCKET].fd = SD_LISTEN_FDS_START; pollfd[FD_SOCKET].events = POLLIN; @@ -317,7 +305,7 @@ int main(int argc, char *argv[]) { } } - log_debug("systemd-shutdownd running as pid %lu", (unsigned long) getpid()); + log_debug("systemd-shutdownd running as pid "PID_FMT, getpid()); sd_notify(false, "READY=1\n" @@ -402,13 +390,12 @@ int main(int argc, char *argv[]) { } if (pollfd[FD_WALL_TIMER].revents) { - struct itimerspec its; + struct itimerspec its = {}; warn_wall(n, &b.command); flush_fd(pollfd[FD_WALL_TIMER].fd); /* Restart timer */ - zero(its); timespec_store(&its.it_value, when_wall(n, b.command.usec)); if (timerfd_settime(pollfd[FD_WALL_TIMER].fd, TFD_TIMER_ABSTIME, &its, NULL) < 0) { log_error("timerfd_settime(): %m"); @@ -438,13 +425,12 @@ int main(int argc, char *argv[]) { r = EXIT_SUCCESS; - log_debug("systemd-shutdownd stopped as pid %lu", (unsigned long) getpid()); + log_debug("systemd-shutdownd stopped as pid "PID_FMT, getpid()); finish: for (i = 0; i < _FD_MAX; i++) - if (pollfd[i].fd >= 0) - close_nointr_nofail(pollfd[i].fd); + safe_close(pollfd[i].fd); if (unlink_nologin) unlink("/run/nologin"); @@ -470,6 +456,7 @@ finish: } sd_notify(false, + "STOPPING=\n" "STATUS=Exiting..."); return r;