diff options
author | Ren Kararou <[email protected]> | 2024-12-26 19:44:59 -0600 |
---|---|---|
committer | Ren Kararou <[email protected]> | 2024-12-26 19:44:59 -0600 |
commit | fbd5505a5983c28fccf2283cfd844d23e15a4425 (patch) | |
tree | 9bf6d0ffc5e416bc02873fb8794a9c5ff126c895 | |
parent | fe076d7d465e2adba3d5e0855b48145c42df9805 (diff) | |
download | nbtpd-fbd5505a5983c28fccf2283cfd844d23e15a4425.tar.gz nbtpd-fbd5505a5983c28fccf2283cfd844d23e15a4425.tar.bz2 nbtpd-fbd5505a5983c28fccf2283cfd844d23e15a4425.zip |
add daemonize; add getopt
-rw-r--r-- | makefile | 10 | ||||
-rw-r--r-- | src/main.c | 84 |
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; } |