about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRen Kararou <[email protected]>2024-12-27 00:12:10 -0600
committerRen Kararou <[email protected]>2024-12-27 00:12:10 -0600
commitdc3aeb792e176d301915b84f5f6ea69e72053970 (patch)
tree0dfda0d4982a9ecddc4ed7ae0df191a653e74e53
parentfe8e86869df900cfea9f7c0895f1563d18915424 (diff)
downloadnbtpd-dc3aeb792e176d301915b84f5f6ea69e72053970.tar.gz
nbtpd-dc3aeb792e176d301915b84f5f6ea69e72053970.tar.bz2
nbtpd-dc3aeb792e176d301915b84f5f6ea69e72053970.zip
startup code nearly complete
-rw-r--r--.builds/freebsd.yml2
-rw-r--r--makefile2
-rw-r--r--src/main.c79
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;
 }