+-
++
+ switch (ts->nids_state) {
+
+ case NIDS_JUST_EST:
+@@ -573,15 +918,18 @@
+
+ i = 0;
+ SLIST_FOREACH(c, &client_list, next) {
+- if (c->ip == ts->addr.saddr) {
++ if (c->ip == ts->addr.saddr && c->port == ts->addr.source) {
+ i = 1; break;
+ }
+ }
+ if (i == 0) {
+ if ((c = malloc(sizeof(*c))) == NULL)
+ nids_params.no_mem("sniff_msgs");
++ memset(c, 0, sizeof(*c));
+ c->ip = ts->addr.saddr;
++ c->port = ts->addr.source;
+ c->nick = strdup("unknown");
++ c->local_ip = 0;
+ SLIST_INSERT_HEAD(&client_list, c, next);
+ }
+ *conn_save = (void *)c;
+@@ -592,12 +940,14 @@
+
+ if (ts->server.count_new > 0) {
+ i = process_msgs(c, ts->server.data,
+- ts->server.count - ts->server.offset);
++ ts->server.count - ts->server.offset,
++ TO_SERVER);
+ nids_discard(ts, i);
+ }
+ else if (ts->client.count_new > 0) {
+ i = process_msgs(c, ts->client.data,
+- ts->client.count - ts->client.offset);
++ ts->client.count - ts->client.offset,
++ TO_CLIENT);
+ nids_discard(ts, i);
+ }
+ fflush(stdout);
+@@ -608,10 +958,12 @@
+
+ if (ts->server.count > 0)
+ process_msgs(c, ts->server.data,
+- ts->server.count - ts->server.offset);
++ ts->server.count - ts->server.offset,
++ TO_SERVER);
+ else if (ts->client.count > 0)
+ process_msgs(c, ts->client.data,
+- ts->client.count - ts->client.offset);
++ ts->client.count - ts->client.offset,
++ TO_CLIENT);
+ fflush(stdout);
+ break;
+ }
+@@ -627,7 +979,7 @@
+ {
+ int c;
+
+- while ((c = getopt(argc, argv, "i:hv?V")) != -1) {
++ while ((c = getopt(argc, argv, "sdpwi:hv?V")) != -1) {
+ switch (c) {
+ case 'i':
+ nids_params.device = optarg;
+@@ -635,6 +987,19 @@
+ case 'v':
+ Opt_invert = 1;
+ break;
++ case 'd':
++ Opt_debug = 1;
++ break;
++ case 's':
++ Opt_simple = 1;
++ break;
++ case 'w':
++ Opt_pass = 1;
++ break;
++ case 'p':
++ // disable promiscous mode
++ nids_params.promisc = 0;
++ break;
+ default:
+ usage();
+ }
+@@ -653,19 +1018,35 @@
+ nids_params.scan_num_hosts = 0;
+ nids_params.syslog = null_syslog;
+
++ gg_network = inet_addr(GG_NETWORK);;
++ gg_netmask = inet_addr(GG_NETMASK);
++
+ if (!nids_init())
+ errx(1, "%s", nids_errbuf);
+
+ SLIST_INIT(&client_list);
++ SLIST_INIT(&remote_client_list);
+
+ nids_register_tcp(sniff_msgs);
+
++ warnx("ggsniff " GGVERSION " enabled");
++
+ if (nids_params.pcap_filter != NULL) {
+ warnx("listening on %s [%s]", nids_params.device,
+ nids_params.pcap_filter);
+ }
+ else warnx("listening on %s", nids_params.device);
+
++ if (nids_params.promisc == 0) {
++ warnx("promiscous mode disabled");
++ } else
++ warnx("promiscous mode enabled");
++
++ if (Opt_pass == 0) {
++ warnx("password sniffing disabled");
++ } else
++ warnx("password sniffing enabled");
++
+ nids_run();