mirror of
https://github.com/skeeto/endlessh.git
synced 2025-08-18 17:28:10 +02:00
Restart listening socket if port config changes
This commit is contained in:
60
endlessh.c
60
endlessh.c
@@ -216,12 +216,10 @@ pollvec_free(struct pollvec *v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
check(int r)
|
die(void)
|
||||||
{
|
{
|
||||||
if (r == -1) {
|
fprintf(stderr, "endlessh: fatal: %s\n", strerror(errno));
|
||||||
fprintf(stderr, "endlessh: fatal: %s\n", strerror(errno));
|
exit(EXIT_FAILURE);
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -415,6 +413,29 @@ usage(FILE *f)
|
|||||||
"(repeatable)\n");
|
"(repeatable)\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
server_create(int port)
|
||||||
|
{
|
||||||
|
int r, s, dummy;
|
||||||
|
|
||||||
|
s = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
if (s == -1) die();
|
||||||
|
|
||||||
|
dummy = 1;
|
||||||
|
r = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &dummy, sizeof(dummy));
|
||||||
|
if (r == -1) die();
|
||||||
|
|
||||||
|
struct sockaddr_in addr = {AF_INET, htons(port), {htonl(INADDR_ANY)}};
|
||||||
|
r = bind(s, (void *)&addr, sizeof(addr));
|
||||||
|
if (r == -1) die();
|
||||||
|
|
||||||
|
r = listen(s, INT_MAX);
|
||||||
|
logmsg(LOG_DEBUG, "listen(port=%d) = %d", port, r);
|
||||||
|
if (r == -1) die();
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@@ -460,12 +481,16 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
{
|
{
|
||||||
struct sigaction sa = {.sa_handler = sigterm_handler};
|
struct sigaction sa = {.sa_handler = sigterm_handler};
|
||||||
check(sigaction(SIGTERM, &sa, 0));
|
int r = sigaction(SIGTERM, &sa, 0);
|
||||||
|
if (r == -1)
|
||||||
|
die();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
struct sigaction sa = {.sa_handler = sighup_handler};
|
struct sigaction sa = {.sa_handler = sighup_handler};
|
||||||
check(sigaction(SIGHUP, &sa, 0));
|
int r = sigaction(SIGHUP, &sa, 0);
|
||||||
|
if (r == -1)
|
||||||
|
die();
|
||||||
}
|
}
|
||||||
|
|
||||||
int nclients = 0;
|
int nclients = 0;
|
||||||
@@ -476,28 +501,19 @@ main(int argc, char **argv)
|
|||||||
struct pollvec pollvec[1];
|
struct pollvec pollvec[1];
|
||||||
pollvec_init(pollvec);
|
pollvec_init(pollvec);
|
||||||
|
|
||||||
int server = socket(AF_INET, SOCK_STREAM, 0);
|
int server = server_create(config.port);
|
||||||
check(server);
|
|
||||||
|
|
||||||
int dummy = 1;
|
|
||||||
check(setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &dummy, sizeof(dummy)));
|
|
||||||
|
|
||||||
struct sockaddr_in addr = {
|
|
||||||
AF_INET,
|
|
||||||
htons(config.port),
|
|
||||||
{htonl(INADDR_ANY)}
|
|
||||||
};
|
|
||||||
check(bind(server, (void *)&addr, sizeof(addr)));
|
|
||||||
check(listen(server, INT_MAX));
|
|
||||||
|
|
||||||
logmsg(LOG_DEBUG, "listen(port=%d)", config.port);
|
|
||||||
|
|
||||||
srand(time(0));
|
srand(time(0));
|
||||||
while (running) {
|
while (running) {
|
||||||
if (reload) {
|
if (reload) {
|
||||||
/* Configuration reload requested (SIGHUP) */
|
/* Configuration reload requested (SIGHUP) */
|
||||||
|
int oldport = config.port;
|
||||||
config_load(&config, config_file, 0);
|
config_load(&config, config_file, 0);
|
||||||
config_log(&config);
|
config_log(&config);
|
||||||
|
if (oldport != config.port) {
|
||||||
|
close(server);
|
||||||
|
server = server_create(config.port);
|
||||||
|
}
|
||||||
reload = 0;
|
reload = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user