+++ /dev/null
-diff -Naur netdiscover-0.3-beta6.orig/src/ifaces.c netdiscover-0.3-beta6/src/ifaces.c
---- netdiscover-0.3-beta6.orig/src/ifaces.c 2009-06-24 18:21:11.000000000 -0400
-+++ netdiscover-0.3-beta6/src/ifaces.c 2009-06-24 21:44:05.000000000 -0400
-@@ -127,6 +127,7 @@
- memcpy(type, packet + 20, 2); /* ARP Opcode */
- new_arprep_l->header = new_header; /* Add header */
- new_arprep_l->count = 1; /* Count */
-+ new_arprep_l->printed = 0;
- new_arprep_l->next = NULL;
-
- /* Source IP */
-diff -Naur netdiscover-0.3-beta6.orig/src/main.c netdiscover-0.3-beta6/src/main.c
---- netdiscover-0.3-beta6.orig/src/main.c 2009-06-24 18:21:11.000000000 -0400
-+++ netdiscover-0.3-beta6/src/main.c 2009-06-24 21:34:59.000000000 -0400
-@@ -30,6 +30,7 @@
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
-+#include <signal.h>
- #include "ifaces.h"
- #include "screen.h"
-
-@@ -39,8 +40,17 @@
- char *disp;
- char *sip;
- int autos;
-+ int machine;
- };
-
-+/* Injection Thread data structure */
-+struct t_inject {
-+ struct t_data *datos;
-+ pthread_t *sniffer;
-+ pthread_t *screen;
-+ pthread_t *keys;
-+ int scan_secs;
-+};
-
- void *inject_arp(void *arg);
- void *screen_refresh(void *arg);
-@@ -77,7 +87,7 @@
-
-
- pthread_t injection, sniffer, screen, keys;
--int fastmode, pcount, node, ssleep;
-+int fastmode, pcount, node, ssleep, nokeywait;
- long sleept;
-
-
-@@ -86,7 +96,9 @@
- {
- while ( 1 == 1 )
- {
-- read_key();
-+ struct t_data *datos;
-+ datos = (struct t_data *)arg;
-+ read_key(datos->machine);
- }
- }
-
-@@ -97,20 +109,24 @@
- int c;
- int esniff = 0;
- int erange = 0;
-+ int scan_secs = 0;
- struct t_data datos;
--
-+ struct t_inject injectdata;
-+
- datos.sip = NULL;
- datos.disp = NULL;
-+ datos.machine = 0;
- datos.autos = 0;
- sleept = 99;
- node = 67;
- pcount = 1;
-+ nokeywait = 0;
-
- current_network = (char *) malloc ((sizeof(char)) * 16);
- sprintf(current_network,"Starting.");
-
- /* Fetch parameters */
-- while ((c = getopt(argc, argv, "i:s:r:n:c:pSfh")) != EOF)
-+ while ((c = getopt(argc, argv, "i:s:r:n:c:t:pSfhkm")) != EOF)
- {
- switch (c)
- {
-@@ -138,12 +154,20 @@
- case 'n':
- node = atoi(optarg);
- break;
-+
-+ case 't':
-+ scan_secs = atoi(optarg);
-+ break;
-
- case 'r':
- datos.sip = (char *) malloc (sizeof(char) * strlen(optarg));
- sprintf(datos.sip, "%s", optarg);
- erange = 1;
- break;
-+
-+ case 'm':
-+ datos.machine = 1;
-+ break;
-
- case 'f':
- fastmode = 1;
-@@ -153,6 +177,10 @@
- usage(argv[0]);
- exit(1);
- break;
-+
-+ case 'k':
-+ nokeywait = 1;
-+ break;
-
- default:
- break;
-@@ -181,7 +209,7 @@
- /* Init some stuff */
- lnet_init(datos.disp);
- init_lists();
-- system("clear");
-+ if (!datos.machine) system("clear");
-
- /* If no mode was selected, enable auto scan */
- if ((erange != 1) && (esniff != 1))
-@@ -189,9 +217,15 @@
- datos.autos = 1;
- }
-
-+
- /* Start the execution */
-- pthread_create(&screen, NULL, screen_refresh, (void *)NULL);
-- pthread_create(&keys, NULL, keys_thread, (void *)NULL);
-+ pthread_create(&screen, NULL, screen_refresh, (void *)&datos);
-+ if (!nokeywait) {
-+ pthread_create(&keys, NULL, keys_thread, (void *)&datos);
-+ injectdata.keys = &keys;
-+ } else {
-+ injectdata.keys = NULL;
-+ }
- pthread_create(&sniffer, NULL, start_sniffer, (void *)&datos);
-
- if (esniff == 1)
-@@ -201,10 +235,19 @@
- }
- else
- {
-- if (pthread_create(&injection, NULL, inject_arp, (void *)&datos))
-+ injectdata.datos = &datos;
-+ injectdata.sniffer = &sniffer;
-+ injectdata.screen = &screen;
-+ injectdata.scan_secs = scan_secs;
-+
-+ if (pthread_create(&injection, NULL, inject_arp, (void *)&injectdata))
- perror("Could not create injection thread");
-
-- pthread_join(sniffer,NULL);
-+ if (scan_secs > 0) {
-+ pthread_join(injection,NULL);
-+ } else {
-+ pthread_join(sniffer,NULL);
-+ }
- }
-
-
-@@ -215,10 +258,11 @@
- /* Refresh screen function called by screen thread */
- void *screen_refresh(void *arg)
- {
--
-+ struct t_data *datos;
-+ datos = (struct t_data *)arg;
- while (1==1)
- {
-- print_screen();
-+ print_screen(datos->machine);
- sleep(1);
- }
-
-@@ -228,9 +272,11 @@
- /* Inject ARP Replys to the network */
- void *inject_arp(void *arg)
- {
-+ struct t_inject *inject;
- struct t_data *datos;
-
-- datos = (struct t_data *)arg;
-+ inject = (struct t_inject *)arg;
-+ datos = inject->datos;
- sleep(2);
-
- if ( datos->autos != 1 )
-@@ -251,6 +297,12 @@
-
- sprintf(current_network,"Finished!");
- lnet_destroy();
-+ if (inject->scan_secs > 0) {
-+ sleep(inject->scan_secs);
-+ pthread_kill(*(inject->sniffer), SIGKILL);
-+ pthread_kill(*(inject->screen), SIGKILL);
-+ pthread_kill(*(inject->keys), SIGKILL);
-+ }
-
- return NULL;
- }
-@@ -400,6 +452,9 @@
- " -n node: last ip octet used for scanning (from 2 to 253)\n"
- " -S enable sleep time supression betwen each request (hardcore mode)\n"
- " -f enable fastmode scan, saves a lot of time, recommended for auto\n\n"
-+ " -k nokeywait: Don't wait for keypress\n"
-+ " -t time: maximum time to listen after last arp request sent (seconds)\n"
-+ " -m don't clear and format screen, just output replies\n"
- "If -p or -r arent enabled, netdiscover will scan for common lan addresses\n",
- VERSION, comando);
- }
-diff -Naur netdiscover-0.3-beta6.orig/src/screen.c netdiscover-0.3-beta6/src/screen.c
---- netdiscover-0.3-beta6.orig/src/screen.c 2009-06-24 18:21:11.000000000 -0400
-+++ netdiscover-0.3-beta6/src/screen.c 2009-06-25 19:15:24.000000000 -0400
-@@ -114,7 +114,7 @@
-
-
- /* Read input keys */
--void read_key()
-+void read_key(int machine)
- {
- int ch;
- ch = getchar();
-@@ -162,12 +162,12 @@
- smode = 2;
- }
-
-- print_screen();
-+ print_screen(machine);
- }
-
-
- /* Clear and fill the screen */
--void print_screen()
-+void print_screen(int machine)
- {
- /* Get Console Size */
- if (ioctl(0, TIOCGWINSZ, &win_sz) < 0)
-@@ -177,16 +177,16 @@
- }
-
- /* Flush and print screen */
-- fprintf( stderr, "\33[1;1H" );
-- fill_screen();
-- fprintf( stderr, "\33[J" );
-+ if (!machine) fprintf( stderr, "\33[1;1H" );
-+ fill_screen(machine);
-+ if (!machine) fprintf( stderr, "\33[J" );
- fflush(stdout);
- }
-
-
- /* Fills the screen using white spaces to avoid refresh problems *
- * not a very smart way, but it works :) */
--void fill_screen()
-+void fill_screen(int machine)
- {
- int x, j;
- struct arp_rep_l *arprep_l;
-@@ -196,40 +196,42 @@
-
- pthread_mutex_lock(listm);
-
-- sprintf(line, " Currently scanning: %s | Our Mac is: %s - %i",
-- current_network, ourmac, scroll);
-- printf("%s", line);
--
-- /* Fill with spaces */
-- for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-- printf(" ");
-- printf("\n");
--
-- /* Print blank line with spaces */
-- for (j=0; j<win_sz.ws_col - 1; j++)
-- printf(" ");
-- printf("\n");
--
--
-- sprintf(line, " %d Captured ARP Req/Rep packets, from %d hosts. Total size: %d",
-- arprep_count->count, arprep_count->hosts, arprep_count->length);
-- printf("%s", line);
--
-- /* Fill with spaces */
-- for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-- printf(" ");
-- printf("\n");
--
--
-- /* Print Header and counters */
-- printf(" _____________________________________________________________________________\n");
-- if (smode == 0 || (oldmode == 0 && smode == 2))
-- printf(" IP At MAC Address Count Len MAC Vendor \n");
-- else if (smode == 1 || (oldmode == 1 && smode == 2))
-- printf(" IP At MAC Address Requests IP Count \n");
-- printf(" ----------------------------------------------------------------------------- \n");
--
--
-+
-+ if (!machine) {
-+ sprintf(line, " Currently scanning: %s | Our Mac is: %s - %i",
-+ current_network, ourmac, scroll);
-+ printf("%s", line);
-+
-+ /* Fill with spaces */
-+ for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-+ printf(" ");
-+ printf("\n");
-+
-+ /* Print blank line with spaces */
-+ for (j=0; j<win_sz.ws_col - 1; j++)
-+ printf(" ");
-+ printf("\n");
-+
-+
-+ sprintf(line, " %d Captured ARP Req/Rep packets, from %d hosts. Total size: %d",
-+ arprep_count->count, arprep_count->hosts, arprep_count->length);
-+ printf("%s", line);
-+
-+ /* Fill with spaces */
-+ for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-+ printf(" ");
-+ printf("\n");
-+
-+
-+ /* Print Header and counters */
-+ printf(" _____________________________________________________________________________\n");
-+ if (smode == 0 || (oldmode == 0 && smode == 2))
-+ printf(" IP At MAC Address Count Len MAC Vendor \n");
-+ else if (smode == 1 || (oldmode == 1 && smode == 2))
-+ printf(" IP At MAC Address Requests IP Count \n");
-+ printf(" ----------------------------------------------------------------------------- \n");
-+ }
-+
- /* Print each found station trough arp reply */
- if (smode == 0)
- {
-@@ -243,12 +245,12 @@
- sprintf(tline, " ");
-
- /* Set IP */
-- sprintf(tline, "%s ", arprep_l->sip);
-+ sprintf(tline, "%s ", arprep_l->sip);
- strcat(line, tline);
--
-- /* Fill with spaces */
-- for (j=strlen(line); j<17; j++)
-- strcat(line, blank);
-+
-+ /* Fill with spaces */
-+ for (j=strlen(line); j<17; j++)
-+ strcat(line, blank);
-
- /* IP & MAC */
- sprintf(tline, "%02x:%02x:%02x:%02x:%02x:%02x ",
-@@ -260,21 +262,29 @@
- /* Count, Length & Vendor */
- sprintf(tline, "%02d %03d %s", arprep_l->count,
- arprep_l->header->length, arprep_l->vendor );
-- strcat(line, tline);
--
-- /* Fill again with spaces */
-- for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-- strcat(line, blank);
-+ strcat(line, tline);
-
-- printf("%s\n", line);
-+ /* Fill again with spaces */
-+ for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-+ strcat(line, blank);
-+
-+ if (!arprep_l->printed) {
-+ printf("%s\n", line);
-+ arprep_l->printed = 1;
-+ if (!machine) {
-+ arprep_l->printed = 0;
-+ }
-+ }
- }
-
- arprep_l = arprep_l->next;
- x += 1;
--
-- /* Check if end of screen was reached */
-- if (x >= ( (win_sz.ws_row + scroll) - 7))
-- break;
-+
-+ if (!machine) {
-+ /* Check if end of screen was reached */
-+ if (x >= ( (win_sz.ws_row + scroll) - 7))
-+ break;
-+ }
- }
-
- } /* Print only arp request */
-@@ -292,10 +302,10 @@
- /* Get source IP */
- sprintf(tline, "%s ", arprep_l->sip);
- strcat(line, tline);
--
-- /* Fill with spaces */
-- for (j=strlen(line); j<17; j++)
-- strcat(line, blank);
-+
-+ /* Fill with spaces */
-+ for (j=strlen(line); j<17; j++)
-+ strcat(line, blank);
-
- /* Get source MAC */
- sprintf(tline, "%02x:%02x:%02x:%02x:%02x:%02x ",
-@@ -308,27 +318,29 @@
- sprintf(tline, "%s", arprep_l->dip);
- strcat(line, tline);
-
-- /* Fill with spaces */
-- for (j=strlen(line); j<54; j++)
-- strcat(line, blank);
-+ /* Fill with spaces */
-+ for (j=strlen(line); j<54; j++)
-+ strcat(line, blank);
-
- /* Count, Length & Vendor */
- sprintf(tline, "%02d", arprep_l->count);
- strcat(line, tline);
-
-- /* Fill again with spaces */
-- for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-- strcat(line, blank);
-+ /* Fill again with spaces */
-+ for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-+ strcat(line, blank);
-
- printf("%s\n", line);
- }
-
- arprep_l = arprep_l->next;
- x += 1;
--
-- /* Check if end of screen was reached */
-- if (x >= ( (win_sz.ws_row + scroll) - 7))
-- break;
-+
-+ if (!machine) {
-+ /* Check if end of screen was reached */
-+ if (x >= ( (win_sz.ws_row + scroll) - 7))
-+ break;
-+ }
- }
- }
- else if(smode == 2)
-diff -Naur netdiscover-0.3-beta6.orig/src/screen.h netdiscover-0.3-beta6/src/screen.h
---- netdiscover-0.3-beta6.orig/src/screen.h 2009-06-24 18:21:11.000000000 -0400
-+++ netdiscover-0.3-beta6/src/screen.h 2009-06-24 21:42:13.000000000 -0400
-@@ -60,6 +60,7 @@
- char *vendor;
- short type;
- unsigned int count;
-+ int printed;
- struct arp_rep_l *next;
- };
-