Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
     }