aboutsummaryrefslogtreecommitdiff
path: root/btasktd.c
diff options
context:
space:
mode:
Diffstat (limited to 'btasktd.c')
-rw-r--r--btasktd.c96
1 files changed, 79 insertions, 17 deletions
diff --git a/btasktd.c b/btasktd.c
index b8b9fd9..388d655 100644
--- a/btasktd.c
+++ b/btasktd.c
@@ -40,13 +40,14 @@
#include <unistd.h>
#include <errno.h>
#include <signal.h>
+#include <logger/logger.h>
#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;