aboutsummaryrefslogtreecommitdiff
path: root/src/btasktd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/btasktd.c')
-rw-r--r--src/btasktd.c58
1 files changed, 50 insertions, 8 deletions
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;
}