From 2b022e27d1939b46097e523c0973ffbf48d284b1 Mon Sep 17 00:00:00 2001 From: "Mr. Goblin" Date: Sat, 19 Sep 2026 15:06:12 +0300 Subject: man page, dist.sh, README is now plain text, Makefile is now posix --- src/btasktd.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 8 deletions(-) (limited to 'src/btasktd.c') diff --git a/src/btasktd.c b/src/btasktd.c index 34e1fae..9878a3d 100644 --- a/src/btasktd.c +++ b/src/btasktd.c @@ -64,16 +64,24 @@ fprint_help(FILE *f) fputs(BTASKTD_HELP_STR, f); } +static void +set_nonblock(int fd) +{ + int fflags = fcntl(fd, F_GETFL); + fcntl(fd, F_SETFL, fflags|O_NONBLOCK); +} + int main(int argc, char **argv) { - int server_fd, opt = 1, res, fflags, port, passed_flags = 1; + int server_fd, opt = 1, res, port, passed_flags = 1, users_cnt; + int *users = NULL; struct sockaddr_in addr = {0}; - struct int_flag_val port_res; + struct int_flag_val int_res; struct bool_flag_val show_ver, show_help; show_ver = extract_bool_flag('V', argc, argv); - if (show_ver.code == fvr_ok && show_ver.data) { + if (fvr_ok == show_ver.code && show_ver.data) { printf("btasktd version %s\n", BTASKTD_VERSION_STR); return 0; } @@ -84,8 +92,8 @@ main(int argc, char **argv) return 0; } - port_res = extract_int_flag('p', argc, argv); - switch (port_res.code) { + int_res = extract_int_flag('p', argc, argv); + switch (int_res.code) { case fvr_not_found: # ifdef BTASKTD_DEFAULT_PORT port = BTASKTD_DEFAULT_PORT; @@ -94,11 +102,35 @@ main(int argc, char **argv) passed_flags = 0; # endif break; + case fvr_ok: + port = int_res.data; + if (port > 0) + break; + /* fallthrough */ case fvr_invalid: fputs("Invalid port!\n", stderr); return 1; + break; + } + + int_res = extract_int_flag('u', argc, argv); + switch (int_res.code) { + case fvr_not_found: +# ifdef BTASKTD_DEFAULT_USERS_CNT + users_cnt = BTASKTD_DEFAULT_USERS_CNT; +# else + fputs("No users count specified!\n", stderr); + passed_flags = 0; +# endif + break; case fvr_ok: - port = port_res.data; + users = int_res.data; + if (users > 0) + break; + /* fallthrough */ + case fvr_invalid: + fputs("Invalid users count!\n", stderr); + return 1; break; } @@ -107,8 +139,15 @@ main(int argc, char **argv) return 1; } + users = (int*)malloc(users_cnt * sizeof(int)); + if (NULL == users) { + fputs("No memory!\n", stderr); + return 1; + } + server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { + free(users); perror("socket"); return 1; } @@ -118,12 +157,14 @@ main(int argc, char **argv) res = bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)); if (0 != res) { close(server_fd); + free(users); perror("bind"); return 1; } res = listen(server_fd, BTASKTD_QUEUE_LEN); if (0 != res) { close(server_fd); + free(users); perror("listen"); return 1; } @@ -131,17 +172,18 @@ main(int argc, char **argv) &opt, sizeof(opt)); if (0 != res) { close(server_fd); + free(users); perror("setsockopt"); return 1; } - fflags = fcntl(server_fd, F_GETFL); - fcntl(server_fd, F_SETFL, fflags|O_NONBLOCK); + set_nonblock(server_fd); printf("btaskt server btasktd started on port %d\n", port); /* main loop here */ printf("btaskt server btasktd stopped\n"); close(server_fd); + free(users); return 0; } -- cgit v1.3