aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMr. Goblin <mrgoblin@mrgoblin.net>2026-09-12 20:11:14 +0300
committerMr. Goblin <mrgoblin@mrgoblin.net>2026-09-12 20:11:14 +0300
commit5aab8dccc979a25a60170bb5fe1aafdfc0f04b5c (patch)
tree423d9c00af49f70443cc0b2a297522157829f554
parentb03336f86d660531c89b05fd5389edb4c2f7e22b (diff)
Added Makefile, gitignore, edited LICENSE formatting
-rw-r--r--.gitignore18
-rw-r--r--LICENSE6
-rw-r--r--src/Makefile28
-rw-r--r--src/btasktd.c165
4 files changed, 214 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dba47f7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,18 @@
+# build yourself
+btasktd
+btasktdctl
+*.o
+*.a
+
+.env
+.env.local
+
+# editors
+*.swp
+.idea
+.vscode
+.clion
+
+# other crap
+*.log
+.DS_Store
diff --git a/LICENSE b/LICENSE
index a4deecf..03e1bdd 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
Copyright (c) 2026, Mr. Goblin
- Redistribution and use in source and binary forms, with or without
+Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
@@ -11,8 +11,8 @@ copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..d05ed6d
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,28 @@
+# Copyright (c) 2026, Mr. Goblin
+#
+# SPDX-License-Identifier: BSD-2-Clause
+
+# CC = cc -fno-caret-diagnostics -fno-color-diagnostics
+CC = gcc -fno-diagnostics-show-caret -fdiagnostics-color=never
+# CC = gcc
+CFLAGS = -g -Wall -Wextra -pedantic -std=c99
+STATIC = -static
+# STATIC =
+
+MAINBINARIES = btasktd
+
+all: $(MAINBINARIES)
+
+clean:
+ rm -f $(MAINBINARIES) *.o
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+
+BTASKTD_OBJECTS = btasktd.o
+BTASKTD_LIBS = -lc
+
+btasktd: $(BTASKTD_OBJECTS)
+ $(CC) $(CFLAGS) $(STATIC) $(BTASKTD_OBJECTS) -o $@ \
+ $(BTASKTD_LIBS)
diff --git a/src/btasktd.c b/src/btasktd.c
new file mode 100644
index 0000000..a429e21
--- /dev/null
+++ b/src/btasktd.c
@@ -0,0 +1,165 @@
+/*-
+ * Copyright (c) 2026, Mr. Goblin
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
+ * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/select.h>
+#include <netinet/in.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.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
+};
+
+struct str_flag_val {
+ enum flag_val_res code;
+ char *data;
+};
+
+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;
+}
+
+/* -f number */
+static struct int_flag_val
+extract_int_flag(char flagletter, int argc, char **argv)
+{
+ 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;
+}
+
+int
+main(int argc, char **argv)
+{
+ int server_fd, opt = 1, res, flags, port;
+ struct sockaddr_in addr = {0};
+ struct int_flag_val 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;
+# endif
+ break;
+ case fvr_invalid:
+ fputs("Invalid port!\n", stderr);
+ return 1;
+ case fvr_ok:
+ port = port_res.data;
+ }
+
+ server_fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (server_fd < 0) {
+ perror("socket");
+ return 1;
+ }
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(port);
+ addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ res = bind(server_fd, (struct sockaddr*)&addr, sizeof(addr));
+ if (0 != res) {
+ close(server_fd);
+ perror("bind");
+ return 1;
+ }
+ res = listen(server_fd, QUEUE_LEN);
+ if (0 != res) {
+ close(server_fd);
+ perror("listen");
+ return 1;
+ }
+ res = setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR,
+ &opt, sizeof(opt));
+ if (0 != res) {
+ close(server_fd);
+ perror("setsockopt");
+ return 1;
+ }
+ flags = fcntl(server_fd, F_GETFL);
+ fcntl(server_fd, F_SETFL, flags|O_NONBLOCK);
+
+ printf("btaskt server btasktd started on port %d\n", port);
+
+ /* main loop here */
+
+ printf("btaskt server btasktd stopped\n");
+ close(server_fd);
+ return 0;
+}