int main(){ int fd, connfd; struct sockaddr_in cliaddr; socklen_t cliaddrlen = sizeof(cliaddr); /* Attempt to connect to socket */ if((fd = connsock(8080)) == -1){ perror("Connection to socket failed\n"); return -1; } /*Create thread pool with 64 threads */ ThreadPool * tp = init(64); if (tp == NULL){ #ifdef SERVER_DEBUG perror("Could not create ThreadPool"); #endif return -1; } for(;;){ /* Try to accept a connection */ if((connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen)) == -1){ perror("Could not accept a connection"); close(fd); return -1; } /* Add connection to stack inside Thread Pool for processing */ if (addWaiting(tp,connfd)<0){ perror("Could not add connection to stack"); } #ifdef SERVER_DEBUG printf("MAIN: New client added to work queue\n\n"); #endif } return 1; }
int main(int argc, char **argv) { char *dev, *capfile, *bpf_prog; extern char *optarg; extern int optind; extern char *__progname; int ch, dontfork_flag, r; pcap_t *pcap = NULL; struct sockaddr_storage dest, src; socklen_t destlen, srclen; #ifdef NF9 int opt =0; #endif bpf_prog = NULL; dev = capfile = NULL; dontfork_flag = 0; memset(&dest, '\0', sizeof(dest)); memset(&src, '\0', sizeof(src)); destlen = 0; srclen = 0; #ifdef NF9 while ((ch = getopt(argc, argv, "hdDi:n:r:S:s:v:m:p:e:")) != -1) { #else while ((ch = getopt(argc, argv, "hdDi:n:r:S:v:")) != -1) { #endif /*NF9*/ switch (ch) { case 'h': usage(); return (0); case 'S': if (strcasecmp(optarg, "any") == 0) { direction = 0; break; } if (strcasecmp(optarg, "in") == 0) { direction = PF_IN; break; } if (strcasecmp(optarg, "out") == 0) { direction = PF_OUT; break; } usage(); return (0); case 'D': verbose_flag = 1; /* FALLTHROUGH */ case 'd': dontfork_flag = 1; break; case 'i': if (capfile != NULL || dev != NULL) { fprintf(stderr, "Packet source already specified.\n\n"); usage(); exit(1); } dev = optarg; break; case 'n': /* Will exit on failure */ destlen = sizeof(dest); parse_hostport(optarg, (struct sockaddr *)&dest, &destlen); break; case 'r': if (capfile != NULL || dev != NULL) { fprintf(stderr, "Packet source already specified.\n\n"); usage(); exit(1); } capfile = optarg; dontfork_flag = 1; break; case 's': /* Will exit on failure */ srclen = sizeof(src); parse_host(optarg, (struct sockaddr *)&src, &srclen); break; case 'v': switch((export_version = atoi(optarg))) { case 1: case 5: #ifdef NF9 case NF9_VERSION: #endif /*NF9*/ break; default: fprintf(stderr, "Invalid NetFlow version\n"); exit(1); } break; #ifdef NF9 case 'm': { opt= atoi(optarg); if(opt>=0) refresh_minutes_interval=opt; } break; case 'p': { opt= atoi(optarg); if(opt>0) refresh_packets_interval=opt; } break; case 'e': source_id = atoi(optarg); break; #endif /*NF9*/ default: fprintf(stderr, "Invalid commandline option.\n"); usage(); exit(1); } } if (capfile == NULL && dev == NULL) dev = DEFAULT_INTERFACE; /* join remaining arguments (if any) into bpf program */ bpf_prog = argv_join(argc - optind, argv + optind); /* Will exit on failure */ setup_packet_capture(&pcap, dev, capfile, bpf_prog); /* Netflow send socket */ if (dest.ss_family != 0 && src.ss_family != 0) netflow_socket = connsock_bind((struct sockaddr *)&dest, destlen, (struct sockaddr *)&src, srclen); else if (dest.ss_family != 0) netflow_socket = connsock((struct sockaddr *)&dest, destlen); else { fprintf(stderr, "No export target defined\n"); if (!verbose_flag) exit(1); } if (dontfork_flag) { if (!verbose_flag) drop_privs(); openlog(__progname, LOG_PID|LOG_PERROR, LOG_DAEMON); } else { daemon(0, 0); openlog(__progname, LOG_PID, LOG_DAEMON); if (pidfile(NULL) == -1) { syslog(LOG_WARNING, "Couldn't write pidfile: %s", strerror(errno)); } /* Close and reopen syslog to pickup chrooted /dev/log */ closelog(); openlog(__progname, LOG_PID, LOG_DAEMON); drop_privs(); signal(SIGINT, sighand_exit); signal(SIGTERM, sighand_exit); } if (dev != NULL) syslog(LOG_NOTICE, "%s listening on %s", __progname, dev); /* Main processing loop */ gettimeofday(&start_time, NULL); r = pcap_loop(pcap, -1, packet_cb, NULL); if (r == -1) { syslog(LOG_ERR, "pcap_dispatch: %s", pcap_geterr(pcap)); exit(1); } if (r == 0 && capfile == NULL) syslog(LOG_NOTICE, "Exiting on pcap EOF"); exit(0); }