server: Stack-allocate the server
This commit is contained in:
parent
d68c5feaee
commit
c35b2d2d88
4 changed files with 33 additions and 33 deletions
|
@ -4,8 +4,8 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
#include "poller.h"
|
||||||
|
|
||||||
struct poller;
|
|
||||||
struct client;
|
struct client;
|
||||||
|
|
||||||
struct server {
|
struct server {
|
||||||
|
@ -15,8 +15,8 @@ struct server {
|
||||||
struct list seats;
|
struct list seats;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct server *server_create(void);
|
int server_init(struct server *server);
|
||||||
void server_destroy(struct server *server);
|
void server_finish(struct server *server);
|
||||||
|
|
||||||
struct seat *server_get_seat(struct server *server, const char *seat_name);
|
struct seat *server_get_seat(struct server *server, const char *seat_name);
|
||||||
|
|
||||||
|
|
|
@ -530,23 +530,28 @@ static struct libseat *builtin_open_seat(struct libseat_seat_listener *listener,
|
||||||
return NULL;
|
return NULL;
|
||||||
} else if (pid == 0) {
|
} else if (pid == 0) {
|
||||||
int fd = fds[0];
|
int fd = fds[0];
|
||||||
struct server *server = server_create();
|
int res = 0;
|
||||||
if (server == NULL) {
|
struct server server = {0};
|
||||||
close(fd);
|
if (server_init(&server) == -1) {
|
||||||
exit(1);
|
res = 1;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
if (server_add_client(server, fd) == -1) {
|
if (server_add_client(&server, fd) == -1) {
|
||||||
exit(1);
|
res = 1;
|
||||||
|
goto server_error;
|
||||||
}
|
}
|
||||||
set_deathsig(SIGTERM);
|
set_deathsig(SIGTERM);
|
||||||
while (server->running) {
|
while (server.running) {
|
||||||
if (poller_poll(server->poller) == -1) {
|
if (poller_poll(&server.poller) == -1) {
|
||||||
exit(1);
|
res = 1;
|
||||||
|
goto server_error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
server_destroy(server);
|
server_error:
|
||||||
|
server_finish(&server);
|
||||||
|
error:
|
||||||
close(fd);
|
close(fd);
|
||||||
exit(0);
|
exit(res);
|
||||||
} else {
|
} else {
|
||||||
int fd = fds[1];
|
int fd = fds[1];
|
||||||
return _open_seat(listener, data, fd);
|
return _open_seat(listener, data, fd);
|
||||||
|
|
|
@ -29,8 +29,8 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
libseat_log_init(level);
|
libseat_log_init(level);
|
||||||
|
|
||||||
struct server *server = server_create();
|
struct server server = {0};
|
||||||
if (server == NULL) {
|
if (server_init(&server) == -1) {
|
||||||
log_errorf("server_create failed: %s", strerror(errno));
|
log_errorf("server_create failed: %s", strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -39,22 +39,22 @@ int main(int argc, char *argv[]) {
|
||||||
path = "/run/seatd.sock";
|
path = "/run/seatd.sock";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server_listen(server, path) == -1) {
|
if (server_listen(&server, path) == -1) {
|
||||||
log_errorf("server_listen failed: %s", strerror(errno));
|
log_errorf("server_listen failed: %s", strerror(errno));
|
||||||
server_destroy(server);
|
server_finish(&server);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("seatd started");
|
log_info("seatd started");
|
||||||
|
|
||||||
while (server->running) {
|
while (server.running) {
|
||||||
if (poller_poll(&server->poller) == -1) {
|
if (poller_poll(&server.poller) == -1) {
|
||||||
log_errorf("poller failed: %s", strerror(errno));
|
log_errorf("poller failed: %s", strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
server_destroy(server);
|
server_finish(&server);
|
||||||
unlink(path);
|
unlink(path);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,11 +26,7 @@ static int server_handle_vt_acq(int signal, void *data);
|
||||||
static int server_handle_vt_rel(int signal, void *data);
|
static int server_handle_vt_rel(int signal, void *data);
|
||||||
static int server_handle_kill(int signal, void *data);
|
static int server_handle_kill(int signal, void *data);
|
||||||
|
|
||||||
struct server *server_create(void) {
|
int server_init(struct server *server) {
|
||||||
struct server *server = calloc(1, sizeof(struct server));
|
|
||||||
if (server == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
poller_init(&server->poller);
|
poller_init(&server->poller);
|
||||||
|
|
||||||
list_init(&server->seats);
|
list_init(&server->seats);
|
||||||
|
@ -39,8 +35,8 @@ struct server *server_create(void) {
|
||||||
poller_add_signal(&server->poller, SIGUSR2, server_handle_vt_acq, server) == NULL ||
|
poller_add_signal(&server->poller, SIGUSR2, server_handle_vt_acq, server) == NULL ||
|
||||||
poller_add_signal(&server->poller, SIGINT, server_handle_kill, server) == NULL ||
|
poller_add_signal(&server->poller, SIGINT, server_handle_kill, server) == NULL ||
|
||||||
poller_add_signal(&server->poller, SIGTERM, server_handle_kill, server) == NULL) {
|
poller_add_signal(&server->poller, SIGTERM, server_handle_kill, server) == NULL) {
|
||||||
server_destroy(server);
|
server_finish(server);
|
||||||
return NULL;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *vtenv = getenv("SEATD_VTBOUND");
|
char *vtenv = getenv("SEATD_VTBOUND");
|
||||||
|
@ -48,16 +44,16 @@ struct server *server_create(void) {
|
||||||
// TODO: create more seats:
|
// TODO: create more seats:
|
||||||
struct seat *seat = seat_create("seat0", vtenv == NULL || strcmp(vtenv, "1") == 0);
|
struct seat *seat = seat_create("seat0", vtenv == NULL || strcmp(vtenv, "1") == 0);
|
||||||
if (seat == NULL) {
|
if (seat == NULL) {
|
||||||
server_destroy(server);
|
server_finish(server);
|
||||||
return NULL;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
list_add(&server->seats, seat);
|
list_add(&server->seats, seat);
|
||||||
server->running = true;
|
server->running = true;
|
||||||
return server;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void server_destroy(struct server *server) {
|
void server_finish(struct server *server) {
|
||||||
assert(server);
|
assert(server);
|
||||||
for (size_t idx = 0; idx < server->seats.length; idx++) {
|
for (size_t idx = 0; idx < server->seats.length; idx++) {
|
||||||
struct seat *seat = server->seats.items[idx];
|
struct seat *seat = server->seats.items[idx];
|
||||||
|
@ -65,7 +61,6 @@ void server_destroy(struct server *server) {
|
||||||
}
|
}
|
||||||
list_free(&server->seats);
|
list_free(&server->seats);
|
||||||
poller_finish(&server->poller);
|
poller_finish(&server->poller);
|
||||||
free(server);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct seat *server_get_seat(struct server *server, const char *seat_name) {
|
struct seat *server_get_seat(struct server *server, const char *seat_name) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue