rem: c = getopt_long(argc, argv, "e:g:G:hi:lLno:p:rs:tuvxw:z", long_options,
add: c = getopt_long(argc, argv, "e:g:G:hi:lLno:p:P:rs:S:tuvxw:z", long_options,
context: int main(int argc, char *argv[]){  int c, total_ports, sock_accept = -1, sock_connect = -1;  struct in_addr *ouraddr;  struct sigaction sv;  memset(&local_host, 0, sizeof(local_host));  memset(&remote_host, 0, sizeof(remote_host));#ifdef ENABLE_NLS  setlocale(LC_MESSAGES, "");  bindtextdomain(PACKAGE, LOCALEDIR);  textdomain(PACKAGE);#endif  /* FIXME: what do i need this for? */  res_init();  /* set up the signal handling system */  sigemptyset(&sv.sa_mask);  sv.sa_flags = 0;  sv.sa_handler = got_int;  sigaction(SIGINT, &sv, NULL);  sv.sa_handler = got_term;  sigaction(SIGTERM, &sv, NULL);  /* ignore some boring signals */  sv.sa_handler = SIG_IGN;  sigaction(SIGPIPE, &sv, NULL);  sigaction(SIGURG, &sv, NULL);  /* if no args given at all, get them from stdin */  if (argc == 1)    netcat_commandline_read(&argc, &argv);  /* check for command line switches */  while (TRUE) {    int option_index = 0;    static const struct option long_options[] = {	{ "exec",	required_argument,	NULL, 'e' },	{ "gateway",	required_argument,	NULL, 'g' },	{ "pointer",	required_argument,	NULL, 'G' },	{ "help",	no_argument,		NULL, 'h' },	{ "interval",	required_argument,	NULL, 'i' },	{ "listen",	no_argument,		NULL, 'l' },	{ "tunnel",	no_argument,		NULL, 'L' },	{ "dont-resolve", no_argument,		NULL, 'n' },	{ "output",	required_argument,	NULL, 'o' },	{ "local-port",	required_argument,	NULL, 'p' },	{ "randomize",	no_argument,		NULL, 'r' },	{ "source",	required_argument,	NULL, 's' },	{ "telnet",	no_argument,		NULL, 't' },	{ "udp",		no_argument,		NULL, 'u' },	{ "verbose",	no_argument,		NULL, 'v' },	{ "version",	no_argument,		NULL, 'V' },	{ "hexdump",	no_argument,		NULL, 'x' },	{ "wait",	required_argument,	NULL, 'w' },	{ "zero",	no_argument,		NULL, 'z' },	{ 0, 0, 0, 0 }    };    c = getopt_long(argc, argv, "e:g:G:hi:lLno:p:rs:tuvxw:z", long_options,		    &option_index);    if (c == -1)      break;    switch (c) {    case 'e':			/* prog to exec */      if (opt_exec)	ncprint(NCPRINT_ERROR | NCPRINT_EXIT, _("Cannot specify `-e' option double"));      opt_exec = strdup(optarg);      break;    case 'G':			/* srcrt gateways pointer val */      break;    case 'g':			/* srcroute hop[s] */      break;    case 'h':			/* display help and exit */      netcat_printhelp(argv[0]);      exit(EXIT_SUCCESS);    case 'i':			/* line/ports interval time (seconds) */      opt_interval = atoi(optarg);      if (opt_interval <= 0)	ncprint(NCPRINT_ERROR | NCPRINT_EXIT,		_("Invalid interval time \"%s\""), optarg);      break;    case 'l':			/* listen mode */      if (opt_tunnel)	ncprint(NCPRINT_ERROR | NCPRINT_EXIT,		_("`-L' and '-l' options are incompatible"));      opt_listen = TRUE;      break;    case 'L':			/* tunnel mode */      if (opt_listen)	ncprint(NCPRINT_ERROR | NCPRINT_EXIT,		_("`-L' and '-l' options are incompatible"));      if (opt_zero)	ncprint(NCPRINT_ERROR | NCPRINT_EXIT,		_("`-L' and '-z' options are incompatible"));      opt_tunnel = TRUE;      break;    case 'n':			/* numeric-only, no DNS lookups */      opt_numeric = TRUE;      break;    case 'o':			/* output hexdump log to file */      opt_outputfile = strdup(optarg);      opt_hexdump = TRUE;	/* implied */      break;    case 'p':			/* local source port */      if (!netcat_getport(&local_port, optarg, 0))	ncprint(NCPRINT_ERROR | NCPRINT_EXIT, _("Invalid local port: %s"),		optarg);      break;    case 'r':			/* randomize various things */      opt_random = TRUE;      break;    case 's':			/* local source address */      /* lookup the source address and assign it to the connection address */      if (!netcat_resolvehost(&local_host, optarg))	ncprint(NCPRINT_ERROR | NCPRINT_EXIT, _("Couldn't resolve local host: %s"),		optarg);      ouraddr = &local_host.iaddrs[0];      break;    case 't':			/* do telnet fakeout */      opt_telnet = TRUE;      break;    case 'u':			/* use UDP protocol */      opt_udpmode = TRUE;      break;    case 'v':			/* be verbose (twice=more verbose) */      opt_verbose++;      break;    case 'V':			/* display version and exit */      netcat_printversion();      exit(EXIT_SUCCESS);    case 'w':			/* wait time (in seconds) */      opt_wait = atoi(optarg);      if (opt_wait <= 0)	ncprint(NCPRINT_ERROR | NCPRINT_EXIT, _("Invalid wait-time: %s"),		optarg);      break;    case 'x':			/* hexdump traffic */      opt_hexdump = TRUE;      break;    case 'z':			/* little or no data xfer */      if (opt_tunnel)	ncprint(NCPRINT_ERROR | NCPRINT_EXIT,		_("`-L' and '-z' options are incompatible"));      opt_zero = TRUE;      break;    default:      fprintf(stderr, _("Try `%s --help' for more information.\n"), argv[0]);      exit(EXIT_FAILURE);    }  }  /* initialize the flag buffer to keep track of the specified ports */  netcat_flag_init(65535);  /* randomize only if needed */  if (opt_random)    SRAND(time(0));  if (opt_outputfile) {    output_fd = fopen(opt_outputfile, "w");    if (!output_fd) {      perror(_("Failed to open output file"));      exit(EXIT_FAILURE);    }  }  else    output_fd = stderr;  debug_v("Trying to parse non-args parameters (argc=%d, optind=%d)", argc, optind);  /* try to get an hostname parameter */  if (optind < argc) {    char *myhost = argv[optind++];    if (!netcat_resolvehost(&remote_host, myhost))      ncprint(NCPRINT_ERROR | NCPRINT_EXIT, _("Couldn't resolve host \"%s\""),	      myhost);  }  /* now loop all the other (maybe optional) parameters for port-ranges */  while (optind < argc) {    const char *get_argv = argv[optind++];    char *q, *parse = strdup(get_argv);    int port_lo = 0, port_hi = 65535;    if (!(q = strchr(parse, '-')))		/* simple number? */      q = strchr(parse, ':');			/* try with the other separator */    if (!q) {      if (netcat_getport(&remote_port, parse, 0))	netcat_flag_set(remote_port.num, TRUE);      else	goto got_err;    }    else {		/* could be in the forms: N1-N2, -N2, N1- */      *q++ = 0;      /* FIXME: the form "-" seems to be accepted, but i think it should not */      if (*parse) {	if (netcat_getport(&remote_port, parse, 0))	  port_lo = remote_port.num;	else	  goto got_err;      }      if (*q) {	if (netcat_getport(&remote_port, q, 0))	  port_hi = remote_port.num;	else	  goto got_err;      }      /* now update the flagset (this is int, so it's ok even if hi == 65535) */      while (port_lo <= port_hi)	netcat_flag_set(port_lo++, TRUE);    }    free(parse);    continue; got_err:    free(parse);    ncprint(NCPRINT_ERROR, _("Invalid port specification: %s"), get_argv);    exit(EXIT_FAILURE);  }  debug_dv("Arguments parsing complete! Total ports=%d", netcat_flag_count());#ifdef DEBUG  c = 0;  while ((c = netcat_flag_next(c))) {    printf("Got port=%d\n", c);  }#endif  /* since ports are the second argument, checking ports might be enough */  /* FIXME: i don't like this check here but we must do that in order to make     sure it doesn't fail after we accepted a connection for the tunnel mode */  if ((netcat_flag_count() == 0) && !opt_listen)    ncprint(NCPRINT_ERROR | NCPRINT_EXIT,	_("No ports specified for connection"));  /* Handle listen mode and tunnel mode */  if (opt_listen || opt_tunnel) {    if (opt_udpmode)      sock_accept = core_udp_listen(&local_host.iaddrs[0], local_port.num, opt_wait);    else      sock_accept = core_tcp_listen(&local_host.iaddrs[0], local_port.num, opt_wait);    /* in zero I/O mode the core_tcp_listen() call will always return -1       (ETIMEDOUT) since no connections are accepted, because of this our job       is completed now. */    if (opt_zero)      exit(0);    if (sock_accept < 0)      ncprint(NCPRINT_VERB1 | NCPRINT_EXIT, _("Listen mode failed: %s"),	      strerror(errno));    /* if we are in listen mode, run the core loop and exit when it returns.       otherwise now it's the time to connect to the target host and tunnel       them together (which means passing to the next section. */    if (opt_listen) {      core_readwrite(sock_accept, -1);      debug_dv("Listen: EXIT");      exit(0);    }  }				/* end of listen mode handling */  /* we need to connect outside */  total_ports = netcat_flag_count();  c = 0;  while (total_ports > 0) {    /* `c' is the port number independently of the sorting method (linear       or random).  While in linear mode it is also used to fetch the next       port number */    if (opt_random)      c = netcat_flag_rand();    else      c = netcat_flag_next(c);    total_ports--;		/* decrease the total ports number to try */    /* since we are nonblocking now, we can start as many connections as we want       but it's not a great idea connecting more than one host at time */    if (opt_udpmode)      sock_connect = core_udp_connect(&remote_host.iaddrs[0], c);    else      sock_connect = core_tcp_connect(&remote_host.iaddrs[0], c, opt_wait);    /* connection failure? (we cannot get this in UDP mode) */    if (sock_connect < 0) {      assert(!opt_udpmode);      ncprint(NCPRINT_VERB1, "%s: %s", netcat_strid(&remote_host, c),	      strerror(errno));      continue;			/* go with next port */    }    if (!opt_udpmode)      ncprint(NCPRINT_VERB1, _("%s open"), netcat_strid(&remote_host, c));    if (opt_tunnel)      core_readwrite(sock_connect, sock_accept);    else if (opt_zero) {      /* if we are not in tunnel mode, sock_accept must be untouched */      assert(sock_accept == -1);      shutdown(sock_connect, 2);      close(sock_connect);    }    else {      /* if we are not in tunnel mode, sock_accept must be untouched */      assert(sock_accept == -1);      core_readwrite(sock_connect, -1);    }  }			/* end of while (total_ports > 0) */  debug_v("EXIT");  printstats();			/* FIXME: is this the RIGHT place? */  return 0;}				/* end of main */