int main(int argc, char *argv[]) { EPCAP_STATE *ep = NULL; pid_t pid = 0; int ch = 0; IS_NULL(ep = calloc(1, sizeof(EPCAP_STATE))); ep->snaplen = SNAPLEN; ep->timeout = TIMEOUT; while ( (ch = getopt(argc, argv, "d:f:g:hi:MPs:t:u:v")) != -1) { switch (ch) { case 'd': /* chroot directory */ IS_NULL(ep->chroot = strdup(optarg)); break; case 'f': IS_NULL(ep->file = strdup(optarg)); ep->runasuser = 1; break; case 'g': IS_NULL(ep->group = strdup(optarg)); break; case 'i': IS_NULL(ep->dev = strdup(optarg)); break; case 'M': ep->rfmon = 1; break; case 'P': ep->promisc = 1; break; case 's': ep->snaplen = (size_t)atoi(optarg); break; case 't': ep->timeout = (u_int32_t)atoi(optarg); break; case 'u': IS_NULL(ep->user = strdup(optarg)); break; case 'v': ep->verbose++; break; case 'N': ep->no_lookupnet = 1; break; case 'I': ep->filter_in = 1; break; case 'h': default: usage(ep); } } argc -= optind; argv += optind; IS_NULL(ep->filt = strdup( (argc == 1) ? argv[0] : EPCAP_FILTER)); epcap_priv_issetuid(ep); IS_LTZERO(epcap_open(ep)); if (epcap_priv_drop(ep) < 0) exit (1); switch (pid = fork()) { case -1: err(EXIT_FAILURE, "fork"); case 0: (void)close(fileno(stdin)); IS_LTZERO(epcap_init(ep)); epcap_loop(ep); break; default: (void)close(fileno(stdout)); pcap_close(ep->p); epcap_watch(); (void)kill(pid, SIGTERM); free(ep->filt); free(ep); break; } exit (0); }
int main(int argc, char *argv[]) { EPCAP_STATE *ep = NULL; pid_t pid = 0; int ch = 0; int fd = 0; IS_NULL(ep = calloc(1, sizeof(EPCAP_STATE))); ep->snaplen = SNAPLEN; ep->timeout = TIMEOUT; while ( (ch = getopt(argc, argv, "d:f:g:hi:MPs:t:u:v")) != -1) { switch (ch) { case 'd': /* chroot directory */ IS_NULL(ep->chroot = strdup(optarg)); break; case 'f': IS_NULL(ep->file = strdup(optarg)); ep->runasuser = 1; break; case 'g': IS_NULL(ep->group = strdup(optarg)); break; case 'i': IS_NULL(ep->dev = strdup(optarg)); break; case 'M': ep->rfmon = 1; break; case 'P': ep->promisc = 1; break; case 's': ep->snaplen = (size_t)atoi(optarg); break; case 't': ep->timeout = (u_int32_t)atoi(optarg); break; case 'u': IS_NULL(ep->user = strdup(optarg)); break; case 'v': ep->verbose++; break; case 'h': default: usage(ep); } } argc -= optind; argv += optind; IS_NULL(ep->filt = strdup( (argc == 1) ? argv[0] : EPCAP_FILTER)); IS_LTZERO(fd = open("/dev/null", O_RDWR)); epcap_priv_issetuid(ep); IS_LTZERO(epcap_open(ep)); if (epcap_priv_drop(ep) < 0) exit (1); signal(SIGCHLD, gotsig); switch (pid = fork()) { case -1: err(EXIT_FAILURE, "fork"); case 0: IS_LTZERO(dup2(fd, STDIN_FILENO)); IS_LTZERO(close(fd)); IS_LTZERO(epcap_init(ep)); IS_LTZERO(epcap_priv_rlimits(EPCAP_RLIMIT_NOFILES)); epcap_loop(ep); break; default: if ( (dup2(fd, STDOUT_FILENO) < 0) || (close(fd) < 0)) goto CLEANUP; pcap_close(ep->p); if (epcap_priv_rlimits(0) < 0) goto CLEANUP; epcap_watch(); CLEANUP: (void)kill(pid, SIGTERM); break; } exit (0); }