diff options
author | Ren Kararou <[email protected]> | 2024-12-27 00:12:10 -0600 |
---|---|---|
committer | Ren Kararou <[email protected]> | 2024-12-27 00:12:10 -0600 |
commit | dc3aeb792e176d301915b84f5f6ea69e72053970 (patch) | |
tree | 0dfda0d4982a9ecddc4ed7ae0df191a653e74e53 | |
parent | fe8e86869df900cfea9f7c0895f1563d18915424 (diff) | |
download | nbtpd-dc3aeb792e176d301915b84f5f6ea69e72053970.tar.gz nbtpd-dc3aeb792e176d301915b84f5f6ea69e72053970.tar.bz2 nbtpd-dc3aeb792e176d301915b84f5f6ea69e72053970.zip |
startup code nearly complete
-rw-r--r-- | .builds/freebsd.yml | 2 | ||||
-rw-r--r-- | makefile | 2 | ||||
-rw-r--r-- | src/main.c | 79 |
3 files changed, 70 insertions, 13 deletions
diff --git a/.builds/freebsd.yml b/.builds/freebsd.yml index 282d38f..968bac4 100644 --- a/.builds/freebsd.yml +++ b/.builds/freebsd.yml @@ -1,4 +1,4 @@ -image: freebsd/current +image: freebsd/latest packages: - gmake sources: diff --git a/makefile b/makefile index 628329d..eac6ed1 100644 --- a/makefile +++ b/makefile @@ -1,5 +1,5 @@ CC:=clang -CFLAGS:=-march=native -O3 -funroll-loops +CFLAGS:=-march=native -O3 -funroll-loops -Wall -Wextra -Werror LDFLAGS:=-flto=thin INCLUDES=-Iinc/ diff --git a/src/main.c b/src/main.c index 4cae595..1c242cf 100644 --- a/src/main.c +++ b/src/main.c @@ -11,26 +11,44 @@ #include <pthread.h> #include <pwd.h> #include <errno.h> +#include <signal.h> #include "packet.h" #include "netascii.h" +static int stop = 0; + +void stop_handler() { + stop = 1; +} + void usage(char* name) { - printf("USAGE: %s -d\n", name); + printf("USAGE: %s -d -u nobody -g nobody -a 127.0.0.1 -p 69 -t 128\n", name); printf("\td: daemonize\n"); + printf("\tu: username to run as (default: nobody)\n"); + printf("\tg: group to run as (default: nobody)\n"); + printf("\ta: address to bind to (default: 127.0.0.1)\n"); + printf("\tp: port to bind to (default: 69)\n"); + printf("\tt: number of worker threads to spawn (default 128)\n"); } int main(int argc, char** argv) { int daemonize = 0; - int ch = 0; char addr[16], user[32], group[32]; - strcpy(addr, "172.0.0.1"); + memset(addr, '\0', sizeof(addr)); + memset(user, '\0', sizeof(user)); + memset(group, '\0', sizeof(group)); + strcpy(addr, "127.0.0.1"); strcpy(user, "nobody"); strcpy(group, "nobody"); int port = 69; - while ((ch = getopt(argc, argv, "da:p:u:g:h")) != -1) { + int threadcount = 128; + + int ch = 0; + while ((ch = getopt(argc, argv, "da:p:u:g:t:h")) != -1) { switch (ch) { case 'a': + //TODO: this is unsafe strcpy(addr, optarg); break; case 'p': @@ -40,11 +58,19 @@ int main(int argc, char** argv) { return -1; } break; + case 't': + threadcount = atoi(optarg); + if ((threadcount <= 0) || (threadcount > 51200)) { + fprintf(stderr, "threadcount must be between 1 and 51200\n"); + return -1; + } + break; case 'd': daemonize = 1; break; case 'g': if (daemonize) { + //TODO: this is unsafe strcpy(group, optarg); } else { fprintf(stderr, "-g requires -d\n"); @@ -53,6 +79,7 @@ int main(int argc, char** argv) { break; case 'u': if (daemonize) { + //TODO: this is unsafe strcpy(user, optarg); } else { fprintf(stderr, "-u requires -d\n"); @@ -83,14 +110,44 @@ int main(int argc, char** argv) { syslog(LOG_ERR, "unable to bind socket!"); return -1; } - struct sockaddr_in server_addr; - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(port); - server_addr.sin_addr.s_addr = inet_addr(addr); + struct sockaddr_in saddr; + saddr.sin_family = AF_INET; + saddr.sin_port = htons(port); + saddr.sin_addr.s_addr = inet_addr(addr); + + if (bind(s, (struct sockaddr*)&saddr, sizeof(saddr)) < 0) { + switch (errno) { + case EACCES: + syslog(LOG_ERR, "socket bind failed: permission denied"); + break; + case EADDRINUSE: + syslog(LOG_ERR, "socket bind failed: address already in use"); + break; + case EADDRNOTAVAIL: + syslog(LOG_ERR, "socket bind failed: address not available"); + break; + default: + syslog(LOG_ERR, "socket bind failed"); + } + return -1; + } + syslog(LOG_INFO, "socket bind success"); //TODO: drop privs! - //TODO: threading! - syslog(LOG_INFO, "program completed successfully!"); - close(s); + + pthread_t threads[128]; + memset(threads, '\0', sizeof(threads)); + //TODO: spawn threadpool + while (!stop) { + struct sockaddr_in caddr; + unsigned int clen = sizeof(caddr); + char buf[1024]; + if (recvfrom(s, buf, sizeof(buf), 0, + (struct sockaddr*)&caddr, &clen) < 0) { + syslog(LOG_ERR, + "got a client connection, but unable to receive data!"); + } + //TODO: handle threadpool + } return 0; } |