#include <csignal>
#include <cstddef>
#include <cstdlib>
+
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/un.h>
static void sigquit_cb(struct ev_loop *loop, ev_signal *w, int revents);
static void sigterm_cb(struct ev_loop *loop, ev_signal *w, int revents);
void open_control_socket(struct ev_loop *loop) noexcept;
+void close_control_socket(struct ev_loop *loop) noexcept;
struct ev_io control_socket_io;
}
}
+ close_control_socket(ev_default_loop(EVFLAG_AUTO));
+
if (am_system_init) {
if (do_reboot) {
// Fork and execute /sbin/reboot
return;
}
- if (bind(sockfd, (struct sockaddr *) &name, sockaddr_size) == -1) {
+ if (bind(sockfd, (struct sockaddr *) name, sockaddr_size) == -1) {
log(LogLevel::ERROR, "Error binding control socket: ", strerror(errno));
close(sockfd);
free(name);
}
}
+void close_control_socket(struct ev_loop *loop) noexcept
+{
+ if (control_socket_open) {
+ int fd = control_socket_io.fd;
+ ev_io_stop(loop, &control_socket_io);
+ close(fd);
+
+ // Unlink the socket:
+ unlink(control_socket_path);
+ }
+}
+
/* handle SIGINT signal (generated by kernel when ctrl+alt+del pressed) */
static void sigint_reboot_cb(struct ev_loop *loop, ev_signal *w, int revents)
{