about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRen Kararou <[email protected]>2024-12-26 19:44:59 -0600
committerRen Kararou <[email protected]>2024-12-26 19:44:59 -0600
commitfbd5505a5983c28fccf2283cfd844d23e15a4425 (patch)
tree9bf6d0ffc5e416bc02873fb8794a9c5ff126c895
parentfe076d7d465e2adba3d5e0855b48145c42df9805 (diff)
downloadnbtpd-fbd5505a5983c28fccf2283cfd844d23e15a4425.tar.gz
nbtpd-fbd5505a5983c28fccf2283cfd844d23e15a4425.tar.bz2
nbtpd-fbd5505a5983c28fccf2283cfd844d23e15a4425.zip
add daemonize; add getopt
-rw-r--r--makefile10
-rw-r--r--src/main.c84
2 files changed, 86 insertions, 8 deletions
diff --git a/makefile b/makefile
index a1d7711..628329d 100644
--- a/makefile
+++ b/makefile
@@ -4,16 +4,18 @@ LDFLAGS:=-flto=thin
 
 INCLUDES=-Iinc/
 
-OBJECTS=bin/obj/main.o bin/obj/packet.o bin/obj/netascii.o
+OBJECTS=obj/main.o obj/packet.o obj/netascii.o
 
 bin/nbtpd: $(OBJECTS)
+	@if [ ! -d "bin" ]; then mkdir -p bin; fi
 	$(CC) $(CFLAGS) $(LDFLAGS) -o bin/nbtpd $^
 
-bin/obj/%.o: src/%.c
-	@if [ ! -d "./bin/obj" ]; then mkdir -p ./bin/obj; fi
+obj/%.o: src/%.c
+	@if [ ! -d "obj" ]; then mkdir -p obj; fi
 	$(CC) -c $(INCLUDES) $(CFLAGS) -o $@ $^
 
 .PHONY: clean
 clean:
-	rm -rf ./bin
+	@rm -rf obj
+	@rm -rf bin
 
diff --git a/src/main.c b/src/main.c
index 159b0b5..c8e0886 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,20 +1,96 @@
+#include <unistd.h>
+#include <stdlib.h>
 #include <stdint.h>
 #include <stdio.h>
+#include <syslog.h>
+#include <string.h>
 #include <sys/socket.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netdb.h>
 #include <pthread.h>
+#include <pwd.h>
+#include <errno.h>
 
 #include "packet.h"
 #include "netascii.h"
 
+void usage(char* name) {
+	printf("USAGE: %s -d\n", name);
+	printf("\td: daemonize\n");
+}
+
 int main(int argc, char** argv) {
-	//TODO: use getopt() to parse args
+	int daemonize = 0;
+	int ch = 0;
+	char addr[16], user[32], group[32];
+	strcpy(addr, "172.0.0.1");
+	strcpy(user, "nobody");
+	strcpy(group, "nobody");
+	int port = 69;
+	while ((ch = getopt(argc, argv, "da:p:u:g:h")) != -1) {
+		switch (ch) {
+			case 'a':
+				strcpy(addr, optarg);
+				break;
+			case 'p':
+				port = atoi(optarg);
+				if ((port <= 0) || (port >= 65536)) {
+					fprintf(stderr, "invalid port specified.\n");
+					return -1;
+				}
+				break;
+			case 'd':
+				daemonize = 1;
+				break;
+			case 'g':
+				if (daemonize) {
+					strcpy(group, optarg);
+				} else {
+					fprintf(stderr, "-g requires -d\n");
+					return -1;
+				}
+				break
+			case 'u':
+				if (daemonize) {
+					strcpy(user, optarg);
+				} else {
+					fprintf(stderr, "-u requires -d\n");
+					return -1;
+				}
+				break
+			case '?': case 'h':
+				usage(argv[0]);
+				return -1;
+		}
+	}
+
+	setlogmask(LOG_UPTO(LOG_INFO));
+	openlog(argv[0], LOG_PID | LOG_PERROR | LOG_NDELAY, LOG_FTP);
+	syslog(LOG_INFO, "starting up...");
+
+	if (daemonize) {
+		if (daemon(1, 0)) {
+			syslog(LOG_ERR, "failed to daemonize as requested!");
+			return -1;
+		} else {
+			syslog(LOG_INFO, "daemonized");
+		}
+	}
+
 	int s = socket(AF_INET, SOCK_DGRAM, 0);
 	if (s <= 0) {
-		fprintf(stderr, "error: socket cannot be created.\n");
+		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);
+
+	//TODO: drop privs!
 	//TODO: threading!
-	//TODO: daemonize!
-	fprintf(stderr, "error: routine completed successfully.\n");
+	syslog(LOG_INFO, "program completed successfully!");
+	close(s);
 	return 0;
 }