int set_snaplen(int snap) { if (priv_set_snaplen(snap)) return (1); if (cur_snaplen > snap) purge_buffer(); cur_snaplen = snap; return (0); }
void display_map_debug(const struct map *map) { int i, j, z; putchar('+'); for(i = 0; i < map->columns; ++i) printf("---+"); putchar('\n'); for(i = 0; i < map->rows; ++i) { putchar('|'); for(j = 0; j < map->columns; ++j) { #if defined WIN if(map->Map[i][j].value == MINE) { color(BACKGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY); printf(" X "); reset_color(); putchar('|'); } else { color(colors_tab[map->Map[i][j].value - '1']); printf(" %c ", map->Map[i][j].value); reset_color(); putchar('|'); } #else if(map->Map[i][j].value == MINE) printf(" X |"); else printf(" %c |", map->Map[i][j].value); #endif } putchar('\n'); putchar('+'); for(z = 0; z < map->columns; ++z) printf("---+"); putchar('\n'); } purge_buffer(); printf("\n"); }
int rdr_repeater_init_connection(struct rdr_repeater_ctx_t *ctx, unsigned socket_buf_size, int verbose) { struct endpoint_t *ep; assert(ctx); ctx->s_bufsize = socket_buf_size; ctx->verbose = verbose; if (ctx->verbose && (ctx->head != NULL)) { fprintf(stderr, "Repeat all incoming TCP packets to hosts: "); for (ep = ctx->head; ep != NULL; ep = ep->next) { fprintf(stderr, "%s%s", get_endpoint_name(ep), ep->next == NULL ? "\n" : ", "); } } for (ep = ctx->head; ep != NULL; ep = ep->next) { purge_buffer(ep); try_reopen_socket(ctx, ep); assert(ep->status != S_NOT_INITIALIZED); } return 1; }
int main(int argc, char **argv) { int ch, np, ret, Xflag = 0; pcap_handler phandler = dump_packet; const char *errstr = NULL; char *pidf = NULL; ret = 0; closefrom(STDERR_FILENO + 1); while ((ch = getopt(argc, argv, "Dxd:f:i:p:s:")) != -1) { switch (ch) { case 'D': Debug = 1; break; case 'd': delay = strtonum(optarg, 5, 60*60, &errstr); if (errstr) usage(); break; case 'f': filename = optarg; break; case 'i': interface = optarg; break; case 'p': pidf = optarg; break; case 's': snaplen = strtonum(optarg, 0, PFLOGD_MAXSNAPLEN, &errstr); if (snaplen <= 0) snaplen = DEF_SNAPLEN; if (errstr) snaplen = PFLOGD_MAXSNAPLEN; break; case 'x': Xflag++; break; default: usage(); } } log_debug = Debug; argc -= optind; argv += optind; /* does interface exist */ if (!if_exists(interface)) { warn("Failed to initialize: %s", interface); logmsg(LOG_ERR, "Failed to initialize: %s", interface); logmsg(LOG_ERR, "Exiting, init failure"); exit(1); } if (!Debug) { openlog("pflogd", LOG_PID | LOG_CONS, LOG_DAEMON); if (daemon(0, 0)) { logmsg(LOG_WARNING, "Failed to become daemon: %s", strerror(errno)); } pidfile(pidf); } tzset(); (void)umask(S_IRWXG | S_IRWXO); /* filter will be used by the privileged process */ if (argc) { filter = copy_argv(argv); if (filter == NULL) logmsg(LOG_NOTICE, "Failed to form filter expression"); } /* initialize pcap before dropping privileges */ if (init_pcap()) { logmsg(LOG_ERR, "Exiting, init failure"); exit(1); } /* Privilege separation begins here */ if (priv_init()) { logmsg(LOG_ERR, "unable to privsep"); exit(1); } setproctitle("[initializing]"); /* Process is now unprivileged and inside a chroot */ signal(SIGTERM, sig_close); signal(SIGINT, sig_close); signal(SIGQUIT, sig_close); signal(SIGALRM, sig_alrm); signal(SIGUSR1, sig_usr1); signal(SIGHUP, sig_hup); alarm(delay); buffer = malloc(PFLOGD_BUFSIZE); if (buffer == NULL) { logmsg(LOG_WARNING, "Failed to allocate output buffer"); phandler = dump_packet_nobuf; } else { bufleft = buflen = PFLOGD_BUFSIZE; bufpos = buffer; bufpkt = 0; } if (reset_dump(Xflag) < 0) { if (Xflag) return (1); logmsg(LOG_ERR, "Logging suspended: open error"); set_suspended(1); } else if (Xflag) return (0); while (1) { np = pcap_dispatch(hpcap, PCAP_NUM_PKTS, phandler, (u_char *)dpcap); if (np < 0) { if (!if_exists(interface) == -1) { logmsg(LOG_NOTICE, "interface %s went away", interface); ret = -1; break; } logmsg(LOG_NOTICE, "%s", pcap_geterr(hpcap)); } if (gotsig_close) break; if (gotsig_hup) { if (reset_dump(0)) { logmsg(LOG_ERR, "Logging suspended: open error"); set_suspended(1); } gotsig_hup = 0; } if (gotsig_alrm) { if (dpcap) flush_buffer(dpcap); else gotsig_hup = 1; gotsig_alrm = 0; alarm(delay); } if (gotsig_usr1) { log_pcap_stats(); gotsig_usr1 = 0; } } logmsg(LOG_NOTICE, "Exiting"); if (dpcap) { flush_buffer(dpcap); fclose(dpcap); } purge_buffer(); log_pcap_stats(); pcap_close(hpcap); if (!Debug) closelog(); return (ret); }
static int buffered_write(struct rdr_repeater_ctx_t *ctx, struct endpoint_t *ep, void *data, size_t data_size) { ssize_t written; assert(ctx); assert(ep); /* TODO useless memory move */ if (data != NULL) { /* Append data */ if (sizeof(ep->buf) < data_size) { if (ctx->verbose >= 10) fprintf(stderr, "%s %s Buffer overflow. %u bytes packet skipped\n", TAG, get_endpoint_name(ep), (unsigned)data_size); return 0; } if (sizeof(ep->buf) - ep->iptr < data_size) { if (sizeof(ep->buf) - ep->iptr + ep->optr >= data_size) { memmove(ep->buf, &ep->buf[ep->optr], ep->iptr - ep->optr); ep->iptr -= ep->optr; ep->optr = 0; }else { if (ctx->verbose >= 10) fprintf(stderr, "%s %s Buffer overflow. %u bytes skipped\n", TAG, get_endpoint_name(ep), ep->iptr+1); purge_buffer(ep); } } assert(ep->iptr + data_size <= sizeof(ep->buf)); memcpy(&ep->buf[ep->iptr], data, data_size); ep->iptr += data_size; } if (ep->status != S_WRITING) return 0; if (ep->iptr == ep->optr) { if (data == NULL) { int error; socklen_t error_len; /* No data. Check socket status */ error = 0; error_len = sizeof(error); if (getsockopt(ep->s, SOL_SOCKET, SO_ERROR, &error, &error_len) < 0) error = errno; if (error != 0) { if (ctx->verbose) fprintf(stderr, "%s %s socket error: %s\n", TAG, get_endpoint_name(ep), strerror(error)); try_reopen_socket(ctx, ep); return -1; } } return 0; } assert(ep->optr < ep->iptr); written = write(ep->s, &ep->buf[ep->optr], ep->iptr - ep->optr); if (written < 0) { if (errno == EAGAIN || (errno == EINTR)) return 0; /* Error */ if (ctx->verbose) fprintf(stderr, "%s write() error: %s\n", TAG, strerror(errno)); try_reopen_socket(ctx, ep); }else { ep->optr += written; if (ep->optr == ep->iptr) ep->iptr = ep->optr = 0; } return written; }
int rdr_repeater_add_endpoint(struct rdr_repeater_ctx_t *ctx, const char *addrport, FILE *err_stream) { int error; char *servname; struct endpoint_t *ep; struct addrinfo hints; assert(ctx != NULL); assert(addrport != NULL); ep = (struct endpoint_t *)malloc(sizeof(*ep)); if (ep == NULL) { return -1; } ep->hostname = NULL; ep->servname = NULL; ep->addrinfo = NULL; ep->cur_addr = NULL; ep->next = NULL; ep->s = -1; ep->status = S_NOT_INITIALIZED; purge_buffer(ep); ep->hostname = strdup(addrport); if (ep->hostname == NULL) { destroy_endpoint(ep); if (err_stream != NULL) fprintf(err_stream, "%s strdup() error\n", TAG); return -1; } if (ep->hostname[0] == '\0') { destroy_endpoint(ep); if (err_stream != NULL) fprintf(err_stream, "%s empty hostname\n", TAG); return -1; } servname = strrchr(ep->hostname, '/'); if (servname != NULL) { *servname++ = '\0'; if (*servname == '\0') ep->servname = NULL; else { ep->servname = strdup(servname); if (ep->servname == NULL) { destroy_endpoint(ep); if (err_stream != NULL) fprintf(err_stream, "%s strdup() error\n", TAG); return -1; } } if (ep->hostname[0] == '\0') { free((void *)ep->hostname); ep->hostname = NULL; if (ep->servname == NULL) { destroy_endpoint(ep); if (err_stream != NULL) fprintf(err_stream, "%s hostname not defined\n", TAG); return -2; } } } assert(! ((ep->hostname == NULL) && (ep->servname == NULL))); if (ep->hostname != NULL) assert(ep->hostname[0] != '\0'); if (ep->servname != NULL) assert(ep->servname[0] != '\0'); if (ep->hostname == NULL) { ep->hostname = strdup(RDR_REPEATER_DEFAULT_HOST); if (ep->hostname == NULL) { destroy_endpoint(ep); if (err_stream != NULL) fprintf(err_stream, "%s strdup() error\n", TAG); return -1; } } if (ep->servname == NULL) { ep->servname = strdup(RDR_REPEATER_DEFAULT_PORT); if (ep->servname == NULL) { destroy_endpoint(ep); if (err_stream != NULL) fprintf(err_stream, "%s strdup() error\n", TAG); return -1; } } /* resolve */ memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_INET; hints.ai_socktype = SOCK_STREAM; #ifdef AI_ADDRCONFIG hints.ai_flags = AI_ADDRCONFIG; #else hints.ai_flags = 0; #endif error = getaddrinfo(ep->hostname, ep->servname, &hints, &ep->addrinfo); if (error) { if (err_stream != NULL) fprintf(err_stream, "%s getaddrinfo(%s) error: %s\n", TAG, addrport, gai_strerror(error)); destroy_endpoint(ep); return -2; } if (ep->addrinfo == NULL) { if (err_stream != NULL) fprintf(err_stream, "%s No addres found for %s\n", TAG, addrport); destroy_endpoint(ep); return -2; } if (ctx->tail == NULL) { assert(ctx->head == NULL); ctx->head = ctx->tail = ep; }else { ctx->tail->next = ep; ctx->tail = ep; } return 1; }