diff options
author | Joern Engel <joern@logfs.org> | 2011-12-18 20:05:19 -0800 |
---|---|---|
committer | Joern Engel <joern@logfs.org> | 2011-12-18 20:09:03 -0800 |
commit | 673a435a06b44d5430ad6191e90b8226ecc37702 (patch) | |
tree | ab3abdd06e831f20729758752674e962606880e3 | |
parent | b74052cde99a3631e54cc30dadecdbffc00a4b30 (diff) | |
download | cancd-673a435a06b44d5430ad6191e90b8226ecc37702.tar.gz |
Lindent the source
Signed-off-by: Joern Engel <joern@logfs.org>
-rw-r--r-- | cancd.c | 980 |
1 files changed, 435 insertions, 545 deletions
@@ -48,7 +48,6 @@ #define PROGNAME "cancd" - /* * Log prefix. This is the path all logs are placed under. Modified * with the '-l' option. @@ -80,351 +79,296 @@ static int daemonize = 1; /* What signal did we catch? */ sig_atomic_t caught_sig = 0; - void handler(int signum) { - caught_sig = signum; + caught_sig = signum; } static int setup_signals() { - int rc = 0; - struct sigaction act; + int rc = 0; + struct sigaction act; - act.sa_sigaction = NULL; - act.sa_restorer = NULL; - sigemptyset(&act.sa_mask); - act.sa_handler = handler; + act.sa_sigaction = NULL; + act.sa_restorer = NULL; + sigemptyset(&act.sa_mask); + act.sa_handler = handler; #ifdef SA_INTERRUPT - act.sa_flags = SA_INTERRUPT; + act.sa_flags = SA_INTERRUPT; #endif - rc += sigaction(SIGTERM, &act, NULL); - rc += sigaction(SIGINT, &act, NULL); - act.sa_handler = SIG_IGN; - rc += sigaction(SIGPIPE, &act, NULL); /* Get EPIPE instead */ + rc += sigaction(SIGTERM, &act, NULL); + rc += sigaction(SIGINT, &act, NULL); + act.sa_handler = SIG_IGN; + rc += sigaction(SIGPIPE, &act, NULL); /* Get EPIPE instead */ - return rc; + return rc; } static char *get_path(int af, const void *src) { - char ntop[INET6_ADDRSTRLEN + 1]; - char format[PATH_MAX]; - size_t ntop_len; - char *newstr, *ptr, *fptr; - int havep; - time_t now; - - if (!inet_ntop(af, src, ntop, sizeof(ntop))) - { - syslog(LOG_ERR, "Unable to resolve address: %s", - strerror(errno)); - return NULL; - } - - ntop_len = strlen(ntop); - - for (havep = 0, ptr = log_format, fptr = format; *ptr; ptr++) - { - switch (*ptr) - { - case '%': - if (havep) - { - /* '%%' should be passed on to strftime(3) */ - *fptr = '%'; - fptr++; - *fptr = '%'; - fptr++; - - havep = 0; - } - else - havep = 1; - break; - - case 'Q': - if (havep) - { - /* Copy our address in */ - memmove(fptr, ntop, ntop_len); - fptr += ntop_len; - havep = 0; - break; - } - /* Fall Through */ - - default: - if (havep) - { - *fptr = '%'; - fptr++; - havep = 0; - } - *fptr = *ptr; - fptr++; - break; - } - } - - newstr = malloc(sizeof(char) * PATH_MAX); - if (!newstr) - { - syslog(LOG_ERR, - "Unable to allocate memory while formating log filename"); - return NULL; - } - - *newstr = '\0'; - strncat(newstr, log_prefix, PATH_MAX); - strncat(newstr, "/", PATH_MAX); - - now = time(NULL); - if (!strftime(newstr + strlen(newstr), PATH_MAX - strlen(newstr), - format, localtime(&now))) - { - syslog(LOG_ERR, "Unable to format filename: %s", - strerror(errno)); - free(newstr); - newstr = NULL; - } - - return newstr; + char ntop[INET6_ADDRSTRLEN + 1]; + char format[PATH_MAX]; + size_t ntop_len; + char *newstr, *ptr, *fptr; + int havep; + time_t now; + + if (!inet_ntop(af, src, ntop, sizeof(ntop))) { + syslog(LOG_ERR, "Unable to resolve address: %s", strerror(errno)); + return NULL; + } + + ntop_len = strlen(ntop); + + for (havep = 0, ptr = log_format, fptr = format; *ptr; ptr++) { + switch (*ptr) { + case '%': + if (havep) { + /* '%%' should be passed on to strftime(3) */ + *fptr = '%'; + fptr++; + *fptr = '%'; + fptr++; + + havep = 0; + } else + havep = 1; + break; + case 'Q': + if (havep) { + /* Copy our address in */ + memmove(fptr, ntop, ntop_len); + fptr += ntop_len; + havep = 0; + break; + } + /* Fall Through */ + default: + if (havep) { + *fptr = '%'; + fptr++; + havep = 0; + } + *fptr = *ptr; + fptr++; + break; + } + } + + newstr = malloc(sizeof(char) * PATH_MAX); + if (!newstr) { + syslog(LOG_ERR, "Unable to allocate memory while formating log filename"); + return NULL; + } + + *newstr = '\0'; + strncat(newstr, log_prefix, PATH_MAX); + strncat(newstr, "/", PATH_MAX); + + now = time(NULL); + if (!strftime(newstr + strlen(newstr), PATH_MAX - strlen(newstr), format, localtime(&now))) { + syslog(LOG_ERR, "Unable to format filename: %s", strerror(errno)); + free(newstr); + newstr = NULL; + } + + return newstr; } -struct dir_to_make -{ - struct list_head list; - char *path; +struct dir_to_make { + struct list_head list; + char *path; }; static int make_tree(const char *path, int mode) { - struct stat stat_buf; - char *ptr, *tmp; - int rc; - LIST_HEAD(to_make); - struct list_head *p, *n; - struct dir_to_make *m; - - if (!path) - { - syslog(LOG_ERR, "Can\'t make empty path!"); - return -EINVAL; - } - - ptr = strdup(path); - if (!ptr) - { - syslog(LOG_ERR, "Unable to allocate memory for path \"%s\"", - path); - return -ENOMEM; - } - - while (*ptr && strcmp(ptr, ".") && strcmp(ptr, "/")) - { - rc = stat(ptr, &stat_buf); - if (rc) - { - if (errno != ENOENT) - { - rc = -errno; - syslog(LOG_ERR, - "Unable to stat \"%s\" while creating \"%s\": %s", - ptr, path, strerror(-rc)); - goto out_error; - } - } - else - { - if (!S_ISDIR(stat_buf.st_mode)) - { - rc = -ENOTDIR; - syslog(LOG_ERR, - "Path \"%s\" is not a directory while creating \"%s\"\n", - ptr, path); - goto out_error; - } - - /* Found an existing parent, we're done */ - break; - } - - /* If we got here, there's a path component we need to make */ - rc = -ENOMEM; - m = malloc(sizeof(struct dir_to_make)); - if (!m) - { - syslog(LOG_ERR, - "Unable to allocate memory while creating path \"%s\"", - path); - goto out_error; - } - - list_add(&m->list, &to_make); - m->path = ptr; - - /* Create a temporary copy for dirname(3) */ - tmp = strdup(ptr); - if (!tmp) - { - syslog(LOG_ERR, - "Unable to allocate memory while creating path \"%s\"", - path); - goto out_error; - } - - ptr = dirname(tmp); - ptr = strdup(ptr); /* Because dirname could return static */ - free(tmp); - if (!ptr) - { - syslog(LOG_ERR, - "Unable to allocate memory while creating path \"%s\"", - path); - goto out_error; - } - } - - list_for_each(p, &to_make) { - m = list_entry(p, struct dir_to_make, list); - rc = mkdir(m->path, mode); - if (rc) - { - rc = -errno; - syslog(LOG_ERR, - "Unable to create directory \"%s\" while creating path \"%s\": %s", - m->path, path, strerror(-rc)); - goto out_error; - } - } - - rc = 0; + struct stat stat_buf; + char *ptr, *tmp; + int rc; + LIST_HEAD(to_make); + struct list_head *p, *n; + struct dir_to_make *m; + + if (!path) { + syslog(LOG_ERR, "Can\'t make empty path!"); + return -EINVAL; + } + + ptr = strdup(path); + if (!ptr) { + syslog(LOG_ERR, "Unable to allocate memory for path \"%s\"", path); + return -ENOMEM; + } + + while (*ptr && strcmp(ptr, ".") && strcmp(ptr, "/")) { + rc = stat(ptr, &stat_buf); + if (rc) { + if (errno != ENOENT) { + rc = -errno; + syslog(LOG_ERR, "Unable to stat \"%s\" while creating \"%s\": %s", ptr, path, strerror(-rc)); + goto out_error; + } + } else { + if (!S_ISDIR(stat_buf.st_mode)) { + rc = -ENOTDIR; + syslog(LOG_ERR, "Path \"%s\" is not a directory while creating \"%s\"\n", ptr, path); + goto out_error; + } + + /* Found an existing parent, we're done */ + break; + } + + /* If we got here, there's a path component we need to make */ + rc = -ENOMEM; + m = malloc(sizeof(struct dir_to_make)); + if (!m) { + syslog(LOG_ERR, "Unable to allocate memory while creating path \"%s\"", path); + goto out_error; + } + + list_add(&m->list, &to_make); + m->path = ptr; + + /* Create a temporary copy for dirname(3) */ + tmp = strdup(ptr); + if (!tmp) { + syslog(LOG_ERR, "Unable to allocate memory while creating path \"%s\"", path); + goto out_error; + } + + ptr = dirname(tmp); + ptr = strdup(ptr); /* Because dirname could return static */ + free(tmp); + if (!ptr) { + syslog(LOG_ERR, "Unable to allocate memory while creating path \"%s\"", path); + goto out_error; + } + } + + list_for_each(p, &to_make) { + m = list_entry(p, struct dir_to_make, list); + rc = mkdir(m->path, mode); + if (rc) { + rc = -errno; + syslog(LOG_ERR, "Unable to create directory \"%s\" while creating path \"%s\": %s", m->path, path, strerror(-rc)); + goto out_error; + } + } + + rc = 0; out_error: - free(ptr); + free(ptr); - list_for_each_safe(p, n, &to_make) { - m = list_entry(p, struct dir_to_make, list); - list_del(&m->list); - if (m->path) - free(m->path); - free(m); - } + list_for_each_safe(p, n, &to_make) { + m = list_entry(p, struct dir_to_make, list); + list_del(&m->list); + if (m->path) + free(m->path); + free(m); + } - return rc; + return rc; } static int open_socket() { - int rc; - struct sockaddr_in servaddr = {0, }; - - sock_fd = socket(PF_INET, SOCK_DGRAM, 0); - if (sock_fd < 0) - { - rc = -errno; - syslog(LOG_ERR, "Unable to open socket: %s", strerror(-rc)); - return rc; - } - - servaddr.sin_family = PF_INET; - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - servaddr.sin_port = htons(log_port); - - rc = bind(sock_fd, (struct sockaddr *)&servaddr, - sizeof(struct sockaddr_in)); - if (rc) - { - rc = -errno; - syslog(LOG_ERR, "Unable to bind socket: %s", strerror(-rc)); - close(sock_fd); - sock_fd = -1; - return rc; - } - - return 0; + int rc; + struct sockaddr_in servaddr = { 0, }; + + sock_fd = socket(PF_INET, SOCK_DGRAM, 0); + if (sock_fd < 0) { + rc = -errno; + syslog(LOG_ERR, "Unable to open socket: %s", strerror(-rc)); + return rc; + } + + servaddr.sin_family = PF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(log_port); + + rc = bind(sock_fd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr_in)); + if (rc) { + rc = -errno; + syslog(LOG_ERR, "Unable to bind socket: %s", strerror(-rc)); + close(sock_fd); + sock_fd = -1; + return rc; + } + + return 0; } /* Only return nonzero if fatal */ -static int do_output(const char *buf, int len, - struct sockaddr_in *addr, socklen_t socklen) +static int do_output(const char *buf, int len, struct sockaddr_in *addr, socklen_t socklen) { - int fd, rc, tot; - char *name, *tmp, *dir; - - name = get_path(PF_INET, &addr->sin_addr); - if (!name) - return 0; - - tmp = strdup(name); - if (!tmp) - { - syslog(LOG_ERR, "Unable to allocate memory while logging to \"%s\"", - name); - return 0; - } - - dir = dirname(tmp); - rc = make_tree(dir, 0700); - free(tmp); - - if (rc) - return 0; - - fd = open(name, O_WRONLY | O_APPEND | O_CREAT, 0600); - if (fd < 0) - syslog(LOG_ERR, "Unable to open \"%s\": %s", name, - strerror(errno)); - else - { - tot = 0; - while (tot < len) - { - rc = write(fd, buf + tot, len - tot); - if (rc < 0) - { - if (errno == EINTR) - continue; - syslog(LOG_ERR, "Error writing to \"%s\": %s", name, - strerror(errno)); - break; - } - tot += rc; - } - close(fd); - } - free(name); - - return 0; + int fd, rc, tot; + char *name, *tmp, *dir; + + name = get_path(PF_INET, &addr->sin_addr); + if (!name) + return 0; + + tmp = strdup(name); + if (!tmp) { + syslog(LOG_ERR, "Unable to allocate memory while logging to \"%s\"", name); + return 0; + } + + dir = dirname(tmp); + rc = make_tree(dir, 0700); + free(tmp); + + if (rc) + return 0; + + fd = open(name, O_WRONLY | O_APPEND | O_CREAT, 0600); + if (fd < 0) + syslog(LOG_ERR, "Unable to open \"%s\": %s", name, strerror(errno)); + else { + tot = 0; + while (tot < len) { + rc = write(fd, buf + tot, len - tot); + if (rc < 0) { + if (errno == EINTR) + continue; + syslog(LOG_ERR, "Error writing to \"%s\": %s", name, strerror(errno)); + break; + } + tot += rc; + } + close(fd); + } + free(name); + + return 0; } static int set_blocking(int blocking) { - int flags, rc; - - flags = fcntl(sock_fd, F_GETFL, 0); - if (flags < 0) - { - rc = -errno; - syslog(LOG_ERR, "Cannot get blocking state: %s", strerror(-rc)); - return rc; - } - - if (blocking) - flags &= ~O_NONBLOCK; - else - flags |= O_NONBLOCK; - - rc = fcntl(sock_fd, F_SETFL, flags); - if (rc) - { - rc = -errno; - syslog(LOG_ERR, "Cannot set blocking state: %s", strerror(-rc)); - } - - return rc; + int flags, rc; + + flags = fcntl(sock_fd, F_GETFL, 0); + if (flags < 0) { + rc = -errno; + syslog(LOG_ERR, "Cannot get blocking state: %s", strerror(-rc)); + return rc; + } + + if (blocking) + flags &= ~O_NONBLOCK; + else + flags |= O_NONBLOCK; + + rc = fcntl(sock_fd, F_SETFL, flags); + if (rc) { + rc = -errno; + syslog(LOG_ERR, "Cannot set blocking state: %s", strerror(-rc)); + } + + return rc; } /* @@ -432,171 +376,142 @@ static int set_blocking(int blocking) * if we want, we go O_NONBLOCK once data is available. Once we * see that data isn't available anymore, we go back to blocking. */ -static int do_recvfrom(int fd, void *buf, size_t bufsize, int flags, - struct sockaddr_in *from, socklen_t *fromlen) +static int do_recvfrom(int fd, void *buf, size_t bufsize, int flags, struct sockaddr_in *from, socklen_t * fromlen) { - int rc; - static int block = 1; - - rc = recvfrom(sock_fd, buf, bufsize, 0, - (struct sockaddr *)from, fromlen); - if (rc < 0) - { - rc = -errno; - if (rc == -EAGAIN) - { - if (!block) - { - rc = set_blocking(1); - if (!rc) - { - block = 1; - rc = -EAGAIN; - } - else - syslog(LOG_ERR, - "Never blocking means eating CPU, goodbye"); - } - } - else if (rc != -EINTR) - syslog(LOG_ERR, "Error reading from socket: %s", - strerror(-rc)); - } - else - { - if (block) - { - if (!set_blocking(0)) - block = 0; - else - syslog(LOG_ERR, "Unable to set nonblocking"); - } - } - - return rc; + int rc; + static int block = 1; + + rc = recvfrom(sock_fd, buf, bufsize, 0, (struct sockaddr *)from, fromlen); + if (rc < 0) { + rc = -errno; + if (rc == -EAGAIN) { + if (!block) { + rc = set_blocking(1); + if (!rc) { + block = 1; + rc = -EAGAIN; + } else + syslog(LOG_ERR, "Never blocking means eating CPU, goodbye"); + } + } else if (rc != -EINTR) + syslog(LOG_ERR, "Error reading from socket: %s", strerror(-rc)); + } else { + if (block) { + if (!set_blocking(0)) + block = 0; + else + syslog(LOG_ERR, "Unable to set nonblocking"); + } + } + + return rc; } static int run() { - int rc; - char *buf; - size_t bufsize = 8 * getpagesize(); - struct sockaddr_in from; - socklen_t fromlen; - - buf = malloc(sizeof(char) * bufsize); - if (!buf) - { - syslog(LOG_ERR, - "Unable to allocate memory for receive buffer: %s", - strerror(errno)); - return -ENOMEM; - } - - syslog(LOG_INFO, "Logging to %s on port %d", log_prefix, log_port); - while (1) - { - rc = do_recvfrom(sock_fd, buf, bufsize, 0, &from, &fromlen); - if (rc < 0) - { - if (rc == -EAGAIN) - continue; - if (rc == -EINTR) - syslog(LOG_INFO, "Caught signal %d", - caught_sig); - else - syslog(LOG_ERR, "Error reading from socket: %s", - strerror(-rc)); - break; - } - /* For now, we process one at a time */ - rc = do_output(buf, rc, &from, fromlen); - if (rc) /* do_output() better not return error if nonfatal */ - break; - } - syslog(LOG_INFO, "Shutting down"); - - return 0; + int rc; + char *buf; + size_t bufsize = 8 * getpagesize(); + struct sockaddr_in from; + socklen_t fromlen; + + buf = malloc(sizeof(char) * bufsize); + if (!buf) { + syslog(LOG_ERR, "Unable to allocate memory for receive buffer: %s", strerror(errno)); + return -ENOMEM; + } + + syslog(LOG_INFO, "Logging to %s on port %d", log_prefix, log_port); + while (1) { + rc = do_recvfrom(sock_fd, buf, bufsize, 0, &from, &fromlen); + if (rc < 0) { + if (rc == -EAGAIN) + continue; + if (rc == -EINTR) + syslog(LOG_INFO, "Caught signal %d", caught_sig); + else + syslog(LOG_ERR, "Error reading from socket: %s", strerror(-rc)); + break; + } + /* For now, we process one at a time */ + rc = do_output(buf, rc, &from, fromlen); + if (rc) /* do_output() better not return error if nonfatal */ + break; + } + syslog(LOG_INFO, "Shutting down"); + + return 0; } static int init_dir() { - int rc; - rc = make_tree(log_prefix, 0755); - if (!rc) - { - rc = chdir(log_prefix); - if (rc) - { - rc = -errno; - syslog(LOG_ERR, "Unable to change to \"%s\"; %s", - log_prefix, strerror(-rc)); - } - } - - return rc; + int rc; + rc = make_tree(log_prefix, 0755); + if (!rc) { + rc = chdir(log_prefix); + if (rc) { + rc = -errno; + syslog(LOG_ERR, "Unable to change to \"%s\"; %s", log_prefix, strerror(-rc)); + } + } + + return rc; } static int init_self() { - int rc; - - openlog(PROGNAME, LOG_PERROR | LOG_PID, LOG_DAEMON); - - rc = init_dir(); - if (rc) - return rc; - - if (daemonize) - { - rc = daemon(1, 0); - if (rc) - { - rc = -errno; - syslog(LOG_ERR, "daemon() failed: %s", strerror(-rc)); - } - } - - if (!rc) - { - rc = setup_signals(); - if (rc) - syslog(LOG_ERR, "Unable to set up signal handling"); - } - - return rc; + int rc; + + openlog(PROGNAME, LOG_PERROR | LOG_PID, LOG_DAEMON); + + rc = init_dir(); + if (rc) + return rc; + + if (daemonize) { + rc = daemon(1, 0); + if (rc) { + rc = -errno; + syslog(LOG_ERR, "daemon() failed: %s", strerror(-rc)); + } + } + + if (!rc) { + rc = setup_signals(); + if (rc) + syslog(LOG_ERR, "Unable to set up signal handling"); + } + + return rc; } static int valid_format() { - struct in_addr addr = {0, }; - char *name; - int rc; + struct in_addr addr = { 0, }; + char *name; + int rc; - name = get_path(PF_INET, &addr); - rc = !!name; - if (name) - free(name); + name = get_path(PF_INET, &addr); + rc = ! !name; + if (name) + free(name); - return rc; + return rc; } static void print_version(void) { - fprintf(stdout, PROGNAME " version %s\n", VERSION); - exit(0); + fprintf(stdout, PROGNAME " version %s\n", VERSION); + exit(0); } static void print_usage(int rc) { - FILE *output = rc ? stderr : stdout; + FILE *output = rc ? stderr : stdout; - fprintf(output, - "Usage: " PROGNAME " [-l <log_prefix>] [-o <log_name_format>] [-p <port>]\n" - " " PROGNAME " -h\n" - " " PROGNAME " -V\n"); + fprintf(output, "Usage: " PROGNAME " [-l <log_prefix>] [-o <log_name_format>] [-p <port>]\n" " " PROGNAME " -h\n" " " PROGNAME " -V\n"); - exit(rc); + exit(rc); } extern char *optarg; @@ -604,116 +519,91 @@ extern int optopt; extern int opterr; static int parse_options(int argc, char *argv[]) { - int c; - - opterr = 0; - while ((c = getopt(argc, argv, ":hVDl:o:p:-:")) != EOF) - { - switch (c) - { - case 'h': - print_usage(0); - break; - - case 'V': - print_version(); - break; - - case '-': - if (!strcmp(optarg, "version")) - print_version(); - else if (!strcmp(optarg, "help")) - print_usage(0); - else - { - fprintf(stderr, - PROGNAME ": Invalid option: \'--%s\'\n", - optarg); - print_usage(-EINVAL); - } - break; - - case 'l': - if (!optarg || !*optarg) - { - fprintf(stderr, - PROGNAME ": Invalid log prefix \"%s\"\n", - optarg); - print_usage(-EINVAL); - } - log_prefix = optarg; - break; - - case 'o': - log_format = optarg; - if (!log_format || !*log_format || !valid_format()) - { - fprintf(stderr, - PROGNAME ": Invalid log filename format \"%s\"\n", - optarg); - print_usage(-EINVAL); - } - break; - - case 'p': - log_port = (uint16_t)(atoi(optarg) & (uint16_t)-1); - if (!log_port) - { - fprintf(stderr, - PROGNAME ": Invalid port: \"%s\"\n", - optarg); - print_usage(-EINVAL); - } - break; - - case 'D': - daemonize = 0; - break; - - case '?': - fprintf(stderr, PROGNAME ": Invalid option: \'-%c\'\n", - optopt); - print_usage(-EINVAL); - break; - - case ':': - fprintf(stderr, PROGNAME ": Option \'-%c\' requires an argument\n", - optopt); - print_usage(-EINVAL); - break; - - default: - fprintf(stderr, PROGNAME ": Shouldn\'t get here\n"); - exit(1); - break; - } - } - - return 0; + int c; + + opterr = 0; + while ((c = getopt(argc, argv, ":hVDl:o:p:-:")) != EOF) { + switch (c) { + case 'h': + print_usage(0); + break; + case 'V': + print_version(); + break; + case '-': + if (!strcmp(optarg, "version")) + print_version(); + else if (!strcmp(optarg, "help")) + print_usage(0); + else { + fprintf(stderr, PROGNAME ": Invalid option: \'--%s\'\n", optarg); + print_usage(-EINVAL); + } + break; + case 'l': + if (!optarg || !*optarg) { + fprintf(stderr, PROGNAME ": Invalid log prefix \"%s\"\n", optarg); + print_usage(-EINVAL); + } + log_prefix = optarg; + break; + case 'o': + log_format = optarg; + if (!log_format || !*log_format || !valid_format()) { + fprintf(stderr, PROGNAME ": Invalid log filename format \"%s\"\n", optarg); + print_usage(-EINVAL); + } + break; + case 'p': + log_port = (uint16_t) (atoi(optarg) & (uint16_t) - 1); + if (!log_port) { + fprintf(stderr, PROGNAME ": Invalid port: \"%s\"\n", optarg); + print_usage(-EINVAL); + } + break; + case 'D': + daemonize = 0; + break; + case '?': + fprintf(stderr, PROGNAME ": Invalid option: \'-%c\'\n", optopt); + print_usage(-EINVAL); + break; + case ':': + fprintf(stderr, PROGNAME ": Option \'-%c\' requires an argument\n", optopt); + print_usage(-EINVAL); + break; + default: + fprintf(stderr, PROGNAME ": Shouldn\'t get here\n"); + exit(1); + break; + } + } + + return 0; } int main(int argc, char *argv[]) { - int rc; + int rc; - rc = parse_options(argc, argv); - if (rc) - return rc; + rc = parse_options(argc, argv); + if (rc) + return rc; - rc = init_self(); - if (rc) - goto out; + rc = init_self(); + if (rc) + goto out; - rc = open_socket(); - if (rc) - goto out; + rc = open_socket(); + if (rc) + goto out; - rc = run(); + rc = run(); - close(sock_fd); + close(sock_fd); out: - closelog(); + closelog(); - return rc; + return rc; } |