From b6db5f69f96501aaa21e7aa9c4b6ba40548956f9 Mon Sep 17 00:00:00 2001 From: "Mr. Goblin" Date: Fri, 2 Oct 2026 22:47:33 +0300 Subject: logger library and flag to run as daemon --- btasktd.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 79 insertions(+), 17 deletions(-) (limited to 'btasktd.c') diff --git a/btasktd.c b/btasktd.c index b8b9fd9..388d655 100644 --- a/btasktd.c +++ b/btasktd.c @@ -40,13 +40,14 @@ #include #include #include +#include #include "cliflags.h" #include "codes.h" #define BTASKTD_HELP_STR \ "Copyright (c) 2026, Mr. Goblin\n" \ "btasktd - task tracking TCP-server\n" \ - "Usage: btasktd [-Vh] [-p port] [-u users]\n" \ + "Usage: btasktd [-Vhb] [-p port] [-u users]\n" \ "For more info read the program's man page\n" #define BTASKTD_VERSION_STR \ @@ -132,7 +133,7 @@ send_to_client(int fd, const char *s) int len = strlen(s); int code = send(fd, s, len, 0); if (-1 == code) - perror("send"); + logger_perror("send"); } static void @@ -162,16 +163,21 @@ handle_accept(struct btasktd *this) socklen_t addrlen = sizeof(user_addr); int fd = accept(this->fd, (struct sockaddr*)&user_addr, &addrlen); if (-1 == fd) { - perror("accept"); + logger_perror("accept"); return; } set_nonblock(fd); idx = find_free_user(this->users, this->users_cnt); if (-1 == idx) { + logger_log(log_lvl_warning, + "rejected user connection because " + "working at users limit\n"); send_response_code(fd, CODE_503_SERVICE_UNAVAILABLE); close(fd); return; } + logger_log(log_lvl_info, + "new connection successfully accepted\n"); this->users[idx].fd = fd; this->users[idx].bi = 0; } @@ -217,7 +223,7 @@ handle_user(struct btasktd *this, int id) reset_user(pu); return; } else if (-1 == valread) { - perror("recv"); + logger_perror("recv"); close(pu->fd); reset_user(pu); return; @@ -239,22 +245,54 @@ bye_all_clients(struct btasktd *this) } } -static volatile int last_sig = 0; +static volatile sig_atomic_t last_sig = 0; static void handle_sigint(int sig) { signal(sig, handle_sigint); - fprintf(stderr, "Caught signal %d, shutting down...\n", sig); + logger_log(log_lvl_info, + "Caught signal %d, shutting down...\n", sig); last_sig = SIGINT; } +static void +make_me_daemon(void) +{ + int fd = open("/dev/null", O_RDWR), pid; + if (fd < 0) { + logger_perror("open"); + exit(1); + } + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + chdir("/"); + if (fd > 2) + close(fd); + pid = fork(); + if (pid < 0) { + logger_perror("fork"); + exit(1); + } else if (pid > 0) { + exit(0); + } + setsid(); + pid = fork(); + if (pid < 0) { + logger_perror("fork"); + exit(1); + } else if (pid > 0) { + exit(0); + } +} + int main(int argc, char **argv) { struct btasktd server; int server_fd, opt = 1, res, port, passed_flags = 1, users_cnt; - int max_fd; + int is_daemon = 0, max_fd; struct user *users = NULL; int i; struct sockaddr_in addr = {0}; @@ -262,6 +300,7 @@ main(int argc, char **argv) struct bool_flag_val bool_res; fd_set readfds; + bool_res = extract_bool_flag('V', argc, argv); if (fvr_ok == bool_res.code && bool_res.data) { printf("btasktd version %s\n", BTASKTD_VERSION_STR); @@ -274,6 +313,13 @@ main(int argc, char **argv) return 0; } + bool_res = extract_bool_flag('b', argc, argv); + if (fvr_ok == bool_res.code && bool_res.data) { + is_daemon = 1; + } + + logger_init("btasktd", is_daemon); + int_res = extract_int_flag('p', argc, argv); switch (int_res.code) { case fvr_not_found: @@ -301,7 +347,8 @@ main(int argc, char **argv) # ifdef BTASKTD_DEFAULT_USERS_CNT users_cnt = BTASKTD_DEFAULT_USERS_CNT; # else - fprintf(stderr, "No users count specified!\n"); + fprintf(stderr, + "No users count specified!\n"); passed_flags = 0; # endif break; @@ -313,18 +360,23 @@ main(int argc, char **argv) case fvr_invalid: fprintf(stderr, "Invalid users count!\n"); return 1; - break; } + logger_init("btasktd", is_daemon); + if (!passed_flags) { + logger_log(log_lvl_err, + "FATAL: didn't passed flags check\n"); fprintf(stderr, "-\n"); fprint_help(stderr); + logger_close(); return 1; } users = (struct user*)calloc(users_cnt, sizeof(struct user)); if (NULL == users) { - fprintf(stderr, "No memory!\n"); + logger_log(log_lvl_err, "No memory!\n"); + logger_close(); return 1; } for (i = 0; i < users_cnt; i++) { @@ -333,8 +385,9 @@ main(int argc, char **argv) server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { + logger_perror("socket"); free(users); - perror("socket"); + logger_close(); return 1; } addr.sin_family = AF_INET; @@ -345,21 +398,24 @@ main(int argc, char **argv) if (0 != res) { close(server_fd); free(users); - perror("setsockopt"); + logger_perror("setsockopt"); + logger_close(); return 1; } res = bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)); if (0 != res) { close(server_fd); free(users); - perror("bind"); + logger_perror("bind"); + logger_close(); return 1; } res = listen(server_fd, BTASKTD_QUEUE_LEN); if (0 != res) { close(server_fd); free(users); - perror("listen"); + logger_perror("listen"); + logger_close(); return 1; } @@ -368,7 +424,12 @@ main(int argc, char **argv) server.fd = server_fd; server.users_cnt = users_cnt; server.users = users; - printf("btaskt server btasktd started on port %d\n", port); + + if (is_daemon) + make_me_daemon(); + logger_log(log_lvl_info, + "btaskt server btasktd started on port %d. pid - %d\n", + port, getpid()); signal(SIGINT, handle_sigint); @@ -393,7 +454,7 @@ main(int argc, char **argv) break; } } else { - perror("select"); + logger_perror("select"); } continue; } else if (0 == res) { @@ -410,7 +471,8 @@ main(int argc, char **argv) } } - printf("btaskt server btasktd stopped\n"); + logger_log(log_lvl_info, "btaskt server btasktd stopped\n"); + logger_close(); close(server_fd); free(users); return 0; -- cgit v1.3