aboutsummaryrefslogtreecommitdiff
path: root/src/btasktd.c
diff options
context:
space:
mode:
authorMr. Goblin <mrgoblin@mrgoblin.net>2026-09-13 23:32:10 +0300
committerMr. Goblin <mrgoblin@mrgoblin.net>2026-09-13 23:32:10 +0300
commit51a1bad32dec2f0ebff5f16345759934c233ef71 (patch)
treefeee32168e8962521f48003a871ee2b988bf26b8 /src/btasktd.c
parentf347a5e24fa073888476df92643d55fc61ceef12 (diff)
CLI flags
Diffstat (limited to 'src/btasktd.c')
-rw-r--r--src/btasktd.c108
1 files changed, 45 insertions, 63 deletions
diff --git a/src/btasktd.c b/src/btasktd.c
index 92f1ce4..34e1fae 100644
--- a/src/btasktd.c
+++ b/src/btasktd.c
@@ -39,83 +39,59 @@
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#include "cliflags.h"
-#ifndef BTASKTD_QUEUE_LEN
-# define QUEUE_LEN 16
-#endif
-
-enum flag_val_res {
- fvr_not_found = -1,
- fvr_min = fvr_not_found,
- fvr_ok = 0,
- fvr_invalid,
- fvr_max = fvr_invalid
-};
+#define BTASKTD_HELP_STR \
+ "btasktd - task tracking TCP-server\n" \
+ "flags:\n" \
+ " -p PORT\n" \
+ " sets the port server should listen to\n" \
+ " -h\n" \
+ " prints the help message (the server won't start!)\n" \
+ " -V\n" \
+ " prints version (the server won't start!)\n"
-struct str_flag_val {
- enum flag_val_res code;
- char *data;
-};
+#define BTASKTD_VERSION_STR \
+ "0.0.0"
-struct int_flag_val {
- enum flag_val_res code;
- int data;
-};
-
-/* -f the_str */
-static struct str_flag_val
-extract_str_flag(char flagletter, int argc, char **argv)
-{
- struct str_flag_val res = {0};
- char flagstr[3] = { '-', ' ', '\0' };
- int i;
- flagstr[1] = flagletter;
- for (i = 1; i < argc; i++)
- if (0 == strcmp(flagstr, argv[i]))
- break;
- if (i >= argc) {
- res.code = fvr_not_found;
- } else if (i == argc-1) {
- res.code = fvr_invalid;
- } else {
- res.code = fvr_ok;
- res.data = argv[i+1];
- }
- return res;
-}
+#ifndef BTASKTD_QUEUE_LEN
+# define BTASKTD_QUEUE_LEN 16
+#endif
-/* -f number */
-static struct int_flag_val
-extract_int_flag(char flagletter, int argc, char **argv)
+static void
+fprint_help(FILE *f)
{
- struct int_flag_val res;
- struct str_flag_val strres =
- extract_str_flag(flagletter, argc, argv);
- char *endptr;
- res.code = strres.code;
- if (res.code != fvr_ok) {
- return res;
- }
- res.data = strtol(strres.data, &endptr, 10);
- if (*endptr != '\0')
- res.code = fvr_invalid;
- return res;
+ fputs(BTASKTD_HELP_STR, f);
}
int
main(int argc, char **argv)
{
- int server_fd, opt = 1, res, flags, port;
+ int server_fd, opt = 1, res, fflags, port, passed_flags = 1;
struct sockaddr_in addr = {0};
- struct int_flag_val port_res =
- extract_int_flag('p', argc, argv);
+ struct int_flag_val port_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) {
+ printf("btasktd version %s\n", BTASKTD_VERSION_STR);
+ return 0;
+ }
+
+ show_help = extract_bool_flag('h', argc, argv);
+ if (show_help.code == fvr_ok && show_help.data) {
+ fprint_help(stdout);
+ return 0;
+ }
+
+ port_res = extract_int_flag('p', argc, argv);
switch (port_res.code) {
case fvr_not_found:
# ifdef BTASKTD_DEFAULT_PORT
port = BTASKTD_DEFAULT_PORT;
# else
fputs("No port specified!\n", stderr);
- return 1;
+ passed_flags = 0;
# endif
break;
case fvr_invalid:
@@ -123,6 +99,12 @@ main(int argc, char **argv)
return 1;
case fvr_ok:
port = port_res.data;
+ break;
+ }
+
+ if (!passed_flags) {
+ fprint_help(stderr);
+ return 1;
}
server_fd = socket(AF_INET, SOCK_STREAM, 0);
@@ -139,7 +121,7 @@ main(int argc, char **argv)
perror("bind");
return 1;
}
- res = listen(server_fd, QUEUE_LEN);
+ res = listen(server_fd, BTASKTD_QUEUE_LEN);
if (0 != res) {
close(server_fd);
perror("listen");
@@ -152,8 +134,8 @@ main(int argc, char **argv)
perror("setsockopt");
return 1;
}
- flags = fcntl(server_fd, F_GETFL);
- fcntl(server_fd, F_SETFL, flags|O_NONBLOCK);
+ fflags = fcntl(server_fd, F_GETFL);
+ fcntl(server_fd, F_SETFL, fflags|O_NONBLOCK);
printf("btaskt server btasktd started on port %d\n", port);