server: Stack-allocate the server

This commit is contained in:
Kenny Levinsen 2020-08-03 01:26:31 +02:00
parent d68c5feaee
commit c35b2d2d88
4 changed files with 33 additions and 33 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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;
} }

View file

@ -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) {