Exemple #1
0
int
set_snaplen(int snap)
{
	if (priv_set_snaplen(snap))
		return (1);

	if (cur_snaplen > snap)
		purge_buffer();

	cur_snaplen = snap;

	return (0);
}
Exemple #2
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");
}
Exemple #3
0
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;
}
Exemple #4
0
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);
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}