#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) { 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) { 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! syslog(LOG_INFO, "program completed successfully!"); close(s); return 0; }