int accept_client() { int rc=-1, i=0; struct sockaddr_in cin; socklen_t cin_sz = sizeof(cin); int fd = accept(cfg.listener_fd,(struct sockaddr*)&cin, &cin_sz); if (fd == -1) { fprintf(stderr,"accept: %s\n", strerror(errno)); goto done; } if (sizeof(cin)==cin_sz) fprintf(stderr,"connection from %s:%d\n", inet_ntoa(cin.sin_addr), (int)ntohs(cin.sin_port)); utarray_push_back(cfg.clients,&fd); /* set up client output buffer. reserve space for full buffer */ UT_string *s; utstring_new(s); utstring_reserve(s,cfg.mb_per_client*1024*1024); utarray_push_back(cfg.outbufs,&s); utarray_push_back(cfg.outidxs,&i); new_epoll(EPOLLIN, fd); rc=0; done: return rc; }
int main(int argc, char *argv[]) { struct epoll_event ev; cfg.prog = argv[0]; int n,opt; while ( (opt=getopt(argc,argv,"vi:o:hPV:s:D:")) != -1) { switch(opt) { case 'v': cfg.verbose++; break; case 'i': cfg.idev=strdup(optarg); break; case 'o': cfg.odev=strdup(optarg); break; case 'P': cfg.nopromisc=1; break; case 'V': cfg.vlan=atoi(optarg); break; case 's': cfg.snaplen=atoi(optarg); break; case 'D': cfg.tail=atoi(optarg); break; case 'h': default: usage(); break; } } /* block all signals. we take signals synchronously via signalfd */ sigset_t all; sigfillset(&all); sigprocmask(SIG_SETMASK,&all,NULL); /* a few signals we'll accept via our signalfd */ sigset_t sw; sigemptyset(&sw); for(n=0; n < sizeof(sigs)/sizeof(*sigs); n++) sigaddset(&sw, sigs[n]); /* create the signalfd for receiving signals */ cfg.signal_fd = signalfd(-1, &sw, 0); if (cfg.signal_fd == -1) { fprintf(stderr,"signalfd: %s\n", strerror(errno)); goto done; } /* set up the raw socket */ if (setup_rx() < 0) goto done; if (setup_tx() < 0) goto done; /* set up the epoll instance */ cfg.epoll_fd = epoll_create(1); if (cfg.epoll_fd == -1) { fprintf(stderr,"epoll: %s\n", strerror(errno)); goto done; } /* add descriptors of interest */ if (new_epoll(EPOLLIN, cfg.signal_fd)) goto done; // signals if (new_epoll(EPOLLIN, cfg.rx_fd)) goto done; // packets alarm(1); while (epoll_wait(cfg.epoll_fd, &ev, 1, -1) > 0) { if (cfg.verbose > 1) fprintf(stderr,"epoll reports fd %d\n", ev.data.fd); if (ev.data.fd == cfg.signal_fd) { if (handle_signal() < 0) goto done; } else if (ev.data.fd == cfg.rx_fd) { if (handle_packet() < 0) goto done; } } done: if (cfg.rx_fd != -1) close(cfg.rx_fd); if (cfg.signal_fd != -1) close(cfg.signal_fd); if (cfg.epoll_fd != -1) close(cfg.epoll_fd); return 0; }
int main(int argc, char *argv[]) { int opt, i, n, rc=-1; struct epoll_event ev; CF.prog = argv[0]; CF.now = time(NULL); utarray_new(CF.rdkafka_options,&ut_str_icd); utarray_new(CF.rdkafka_topic_options,&ut_str_icd); void *res; while ( (opt = getopt(argc, argv, "hv+N:n:d:b:t:c:C:")) != -1) { switch(opt) { case 'v': CF.verbose++; break; case 'n': CF.nthread=atoi(optarg); break; case 'd': CF.dir=strdup(optarg); break; case 't': CF.topic=strdup(optarg); break; case 'b': CF.broker=strdup(optarg); break; case 'c': utarray_push_back(CF.rdkafka_options,&optarg); break; case 'C': utarray_push_back(CF.rdkafka_topic_options,&optarg); break; case 'h': default: usage(); } } if (CF.dir == NULL) usage(); if (CF.broker == NULL) usage(); if (CF.topic == NULL) CF.topic = CF.dir; /* stats (time series) for input/output tracking */ CF.spr_msgs_ts = ts_new(6, STATS_INTERVAL ,&ts_int_mm); CF.kaf_msgs_ts = ts_new(6, STATS_INTERVAL, &ts_int_mm); CF.kaf_bytes_ts = ts_new(6, STATS_INTERVAL, &ts_int_mm); /* block all signals. we take signals synchronously via signalfd */ sigset_t all; sigfillset(&all); sigprocmask(SIG_SETMASK,&all,NULL); /* a few signals we'll accept via our signalfd */ sigset_t sw; sigemptyset(&sw); for(n=0; n < sizeof(sigs)/sizeof(*sigs); n++) sigaddset(&sw, sigs[n]); /* create the signalfd for receiving signals */ CF.signal_fd = signalfd(-1, &sw, 0); if (CF.signal_fd == -1) { fprintf(stderr,"signalfd: %s\n", strerror(errno)); goto done; } /* set up the epoll instance */ CF.epoll_fd = epoll_create(1); if (CF.epoll_fd == -1) { fprintf(stderr,"epoll: %s\n", strerror(errno)); goto done; } if (setup_nano() < 0) goto done; /* add descriptors of interest */ if (new_epoll(EPOLLIN, CF.signal_fd)) goto done; // signal socket /* fire up threads */ rc = pthread_create(&CF.spr_thread, NULL, spr_worker, NULL); if (rc) goto done; CF.enc_thread = malloc(sizeof(pthread_t)*CF.nthread); if (CF.enc_thread == NULL) goto done; long id; for(i=0; i < CF.nthread; i++) { id = i; rc = pthread_create(&CF.enc_thread[i],NULL,enc_worker,(void*)id); if (rc) goto done; } CF.kaf_thread = malloc(sizeof(pthread_t)*CF.nthread); if (CF.kaf_thread == NULL) goto done; for(i=0; i < CF.nthread; i++) { id = i; rc = pthread_create(&CF.kaf_thread[i],NULL,kaf_worker,(void*)id); if (rc) goto done; } alarm(1); while (epoll_wait(CF.epoll_fd, &ev, 1, -1) > 0) { if (ev.data.fd == CF.signal_fd) { if (handle_signal() < 0) goto done; } } rc = 0; done: CF.shutdown=1; nn_term(); fprintf(stderr,"shutting down threads:\n"); fprintf(stderr,"spoolreader...\n"); if (CF.spr_thread) { pthread_cancel(CF.spr_thread); pthread_join(CF.spr_thread,NULL); } fprintf(stderr,"encoders...\n"); if (CF.enc_thread) { for(i=0; i < CF.nthread; i++) { pthread_cancel(CF.enc_thread[i]); pthread_join(CF.enc_thread[i],NULL); } } fprintf(stderr,"transmitters...\n"); if (CF.kaf_thread) { for(i=0; i < CF.nthread; i++) { pthread_cancel(CF.kaf_thread[i]); pthread_join(CF.kaf_thread[i],NULL); } } fprintf(stderr,"terminating...\n"); if (CF.ingress_socket_push >= 0) nn_close(CF.ingress_socket_push); if (CF.ingress_socket_pull >= 0) nn_close(CF.ingress_socket_pull); if (CF.egress_socket_push >= 0) nn_close(CF.egress_socket_push); if (CF.egress_socket_pull >= 0) nn_close(CF.egress_socket_pull); if (CF.egress_socket_filepath) unlink(CF.egress_socket_filepath); if (CF.ingress_socket_filepath) unlink(CF.ingress_socket_filepath); if (CF.epoll_fd != -1) close(CF.epoll_fd); if (CF.signal_fd != -1) close(CF.signal_fd); ts_free(CF.spr_msgs_ts); ts_free(CF.kaf_msgs_ts); ts_free(CF.kaf_bytes_ts); if (CF.enc_thread) free(CF.enc_thread); if (CF.kaf_thread) free(CF.kaf_thread); utarray_free(CF.rdkafka_options); utarray_free(CF.rdkafka_topic_options); return rc; }
int main(int argc, char *argv[]) { int opt, rc, n, *fd; cfg.prog = argv[0]; utarray_new(cfg.clients,&ut_int_icd); utarray_new(cfg.outbufs,&ut_ptr_icd); utarray_new(cfg.outidxs, &ut_int_icd); cfg.set = kv_set_new(); struct epoll_event ev; UT_string **s; utstring_new(cfg.s); utarray_new(output_keys, &ut_str_icd); utarray_new(output_defaults, &ut_str_icd); utarray_new(output_types,&ut_int_icd); while ( (opt=getopt(argc,argv,"vb:p:m:d:rS:h")) != -1) { switch(opt) { case 'v': cfg.verbose++; break; case 'p': cfg.listener_port=atoi(optarg); break; case 'm': cfg.mb_per_client=atoi(optarg); break; case 'd': cfg.dir=strdup(optarg); break; case 'r': cfg.mode=round_robin; break; case 'b': cfg.config_file=strdup(optarg); break; case 'S': cfg.stats_file=strdup(optarg); break; case 'h': default: usage(); break; } } if (cfg.listener_port==0) usage(); if (setup_client_listener()) goto done; if (cfg.config_file==NULL) goto done; if (parse_config(cfg.config_file) < 0) goto done; if ( !(cfg.sp = kv_spoolreader_new(cfg.dir))) goto done; /* block all signals. we take signals synchronously via signalfd */ sigset_t all; sigfillset(&all); sigprocmask(SIG_SETMASK,&all,NULL); /* a few signals we'll accept via our signalfd */ sigset_t sw; sigemptyset(&sw); for(n=0; n < sizeof(sigs)/sizeof(*sigs); n++) sigaddset(&sw, sigs[n]); /* create the signalfd for receiving signals */ cfg.signal_fd = signalfd(-1, &sw, 0); if (cfg.signal_fd == -1) { fprintf(stderr,"signalfd: %s\n", strerror(errno)); goto done; } /* set up the epoll instance */ cfg.epoll_fd = epoll_create(1); if (cfg.epoll_fd == -1) { fprintf(stderr,"epoll: %s\n", strerror(errno)); goto done; } /* add descriptors of interest */ if (new_epoll(EPOLLIN, cfg.listener_fd)) goto done; // new client connections if (new_epoll(EPOLLIN, cfg.signal_fd)) goto done; // signal socket alarm(1); while (epoll_wait(cfg.epoll_fd, &ev, 1, -1) > 0) { if (cfg.verbose > 1) fprintf(stderr,"epoll reports fd %d\n", ev.data.fd); if (ev.data.fd == cfg.signal_fd) { if (handle_signal() < 0) goto done; } else if (ev.data.fd == cfg.listener_fd) { if (accept_client() < 0) goto done; } else feed_client(ev.data.fd, ev.events); } done: /* free the clients: close and deep free their buffers */ fd=NULL; s=NULL; while ( (fd=(int*)utarray_prev(cfg.clients,fd))) { s=(UT_string**)utarray_prev(cfg.outbufs,s); close(*fd); utstring_free(*s); } utarray_free(cfg.clients); utarray_free(cfg.outbufs); utarray_free(cfg.outidxs); utarray_free(output_keys); utarray_free(output_defaults); utarray_free(output_types); utstring_free(cfg.s); if (cfg.listener_fd) close(cfg.listener_fd); if (cfg.signal_fd) close(cfg.signal_fd); if (cfg.sp) kv_spoolreader_free(cfg.sp); if (cfg.set) kv_set_free(cfg.set); return 0; }