From fbd5505a5983c28fccf2283cfd844d23e15a4425 Mon Sep 17 00:00:00 2001 From: Ren Kararou Date: Thu, 26 Dec 2024 19:44:59 -0600 Subject: add daemonize; add getopt --- src/main.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 4 deletions(-) (limited to 'src/main.c') 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 +#include #include #include +#include +#include #include +#include +#include +#include #include +#include +#include #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; } -- cgit 1.4.1-2-gfad0