Nmap Development mailing list archives

[PATCH] Localize and remove some symbols in NmapFE


From: Kris Katterjohn <kjak () ispwest com>
Date: Wed, 20 Sep 2006 21:58:27 -0500

The attached patch localizes the following symbols:

nmapfe.c:

main_win

nmapfe_sig.c:

next_token
next_line
print_line
read_data
execute_win
execute_unix
build_command


And removes these unused function names from headers:

nmapfe.h:

create_aboutDialog
create_machine_parse_selection

nmapfe_sig.h:

entry_toggle_checkbox
entry_toggle_ping_checkbox
mainMenu_fcb


diff kinda butchered the patch because I had to move some functions
around in nmapfe_sig.c so they'd be defined after removing the
references from the header file.


It's a diff against 4.20ALPHA7


Thanks,
Kris Katterjohn
--- x/nmapfe/nmapfe.c   2006-08-24 20:47:59.000000000 -0500
+++ y/nmapfe/nmapfe.c   2006-09-20 20:07:54.000000000 -0500
@@ -145,7 +145,7 @@ static void Colourize_callback  (GtkActi
 
 void scanType_cb                (GtkComboBox *widget, gpointer data);
 
-GtkWidget *main_win;
+static GtkWidget *main_win;
 
 static GtkActionEntry menu_entries[] = {
     { "FileMenu",   NULL, "_File" }, /* File menu */

--- x/nmapfe/nmapfe.h   2006-08-24 20:47:59.000000000 -0500
+++ y/nmapfe/nmapfe.h   2006-09-20 20:06:29.000000000 -0500
@@ -311,9 +311,7 @@ struct NmapFEoptions {
 };
 
 GtkWidget* create_main_win (void);
-GtkWidget* create_aboutDialog(void);
 GtkWidget* create_fileSelection(const char *title, char *filename, void (*action)(), GtkEntry *entry);
 GtkWidget* create_helpDialog(void);
-GtkWidget* create_machine_parse_selection (void);
 
 #endif /* NMAP_H */

--- x/nmapfe/nmapfe_sig.c       2006-08-24 20:47:59.000000000 -0500
+++ y/nmapfe/nmapfe_sig.c       2006-09-20 19:50:16.000000000 -0500
@@ -202,199 +202,39 @@ main (int   argc, 
     return 0;
 }
 
-void scanButton_toggled_cb(GtkButton *button, void *ignored)
-{
-  if(GTK_TOGGLE_BUTTON(button)->active) {
-  char *command = build_command();
-
-  if(!(opt.appendLog))
-          gtk_text_buffer_set_text (GTK_TEXT_BUFFER(opt.buffer), "\0", -1);
-
-    nmap_pid = execute(command);
-}
-  else {
-    if (stop_scan()) {
-    static char string[256];
-
-      strcpy(string, "CANCELLED!\n\n");
-      print_line(GTK_TEXT_BUFFER(opt.buffer), string);
-}
-}
-}
-
-
-void 
-saveLog (char *filename)
-{
-    GtkTextIter start, end;
-    if (filename && *filename) {
-        FILE *file;
-        if ((file = fopen(filename, "w"))) {
-         gchar *text;
-            gtk_text_buffer_get_start_iter(opt.buffer, &start);
-            gtk_text_buffer_get_end_iter(opt.buffer, &end);
-            text = gtk_text_buffer_get_text(opt.buffer,
-                    &start, &end, FALSE);
-
-            fputs(text, file);
-            fclose(file);
-            free(text);
-        }
-    }
-}
-
-
-void openLog(char *filename)
-{
-  if (filename && *filename) {
-  FILE *file;
-     
-  if (!opt.appendLog) 
-          gtk_text_buffer_set_text (GTK_TEXT_BUFFER(opt.buffer), "\0", -1);
-       
-    if((file = fopen(filename, "r"))) {
-    char buf[BUFSIZ+1];
-
-      while(fgets(buf, BUFSIZ, file) != NULL) {
-        print_line(GTK_TEXT_BUFFER(opt.buffer), buf);
-      }
-
-      fclose(file);
-    }
-  }
-}
-
-
-void okButton_clicked_cb(GtkWidget *window, GtkButton *button)
+// tokensz is the total size of token in characters
+static char *next_token(char *buf, char *token, int tokensz)
 {
-const char *selected = gtk_file_selection_get_filename(GTK_FILE_SELECTION(window));
-void (*action)() = (void (*)())g_object_get_data(G_OBJECT(window), "NmapFE_action");
-GtkEntry *entry = g_object_get_data(G_OBJECT(window), "NmapFE_entry");
-char *filename = g_object_get_data(G_OBJECT(window), "NmapFE_filename");
-
-  if (filename && selected) {
-    strncpy(filename, selected, FILENAME_MAX);
-    filename[FILENAME_MAX-1] = '\0';
-    if (action)
-      (*action)(filename);
-    if (entry)
-      gtk_entry_set_text(GTK_ENTRY(entry), filename);
-  }
-}
+  if ((buf != NULL) && (token != NULL)) {
+  int count = (strchr("\t ", *buf) != NULL)
+              ? strspn(buf, "\t ")
+              : strcspn(buf, "\t ");
 
+    if (count > 0) {
+      char *bol = buf;
+    char *eol;
 
-/* The idea of execute() is to create an Nmap process running in the background with its stdout
-    connected to a pipe we can poll many times per second to collect any new output.  Admittedly 
-       there are much more elegant ways to do this, but this is how it works now.  The functions
-       return the process ID of nmap.  This process is
-       different enough between windows & UNIX that I have two functions for doing it: */
-int execute_unix(char *command)
-{
-#ifdef WIN32
-  fatal("The execute_unix function should not be called from Windows!");
-  return -1;
-#else
+      count = MIN(count, tokensz - 1);
+      eol = buf+count;
 
-  /* Many thanks to Fyodor for helping with the piping */
-  if (pipe(pipes) == -1) {
-    perror("poopy pipe error");
-    exit(1);
-  }
+      /* copy token  */
+      memcpy(token, buf, count);
+      token[count] = '\0';
 
-  if (!(pid = fork())) {
-    char **argv;
-    int argc;
+      /* remove token from str */
+      while (*eol != '\0')
+        *bol++ = *eol++;
+      *bol = '\0';
 
-    argc = arg_parse(command, &argv);
-               
-    if (argc <= 0)
-      exit(1);
-    dup2(pipes[1], 1);
-    dup2(pipes[1], 2);
-    fcntl(pipes[0], F_SETFL, O_NDELAY);
-    if (execvp("nmap", argv) == -1) {
-      fprintf(stderr, "Nmap execution failed.  errno=%d (%s)\n", errno, strerror(errno));
-      exit(1);
+      return(token);
     }
-    /*exit(127);*/
-  }
-  if (pid == -1) {
-    fprintf(stderr, "fork() failed.  errno=%d (%s)", errno, strerror(errno));
-    pid = 0;
-    close(pipes[0]);
-    pipes[0] = -1;
+    return(buf);
   }
-  close(pipes[1]);
-  pipes[1] = -1;
-
-  return(pid);
-
-#endif
-}
-
-
-/* Parts cribbed from _Win32 System Programming Second Edition_ pp 304 */
-int execute_win(char *command)
-{
-#ifndef WIN32
-  fatal("The execute_win function should ONLY be called from Windows!");
-  return -1;
-#else
-
-/* For pipes[] array:  0 == READ; 1 == WRITE */
-
-/* To ensure pipe handles are inheritable */
-SECURITY_ATTRIBUTES PipeSA = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
-PROCESS_INFORMATION Nmap_Proc;
-STARTUPINFO Nmap_Start;
-
-  GetStartupInfo(&Nmap_Start);
-
-  /* Create our pipe for reading Nmap output */
-  if (!CreatePipe(&pipes[0], &pipes[1], &PipeSA, 8196))
-    pfatal("execute_win: Failed to create pipes!");
-
-  /* Insure that stdout/stderr for Nmap will go to our pipe */
-  Nmap_Start.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
-  Nmap_Start.hStdError = pipes[1];
-  Nmap_Start.hStdOutput = pipes[1];
-  Nmap_Start.dwFlags = STARTF_USESTDHANDLES;
-
-  /* Start up Nmap! */
-  if (!CreateProcess ( NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &Nmap_Start, &Nmap_Proc))
-    pfatal("execute_win: Failed to start Nmap process with command '%s'", command);
-
-  /* I don't care about the thread handle or the write pipe anymore */
-  CloseHandle(Nmap_Proc.hThread);
-   CloseHandle(pipes[1]);
-
-  /* I'm gonna squirrel away the Nmap process handle in a global variable.
-     All this nonsense needs to be redone */
-   NmapHandle = Nmap_Proc.hProcess;
-
-  return Nmap_Proc.dwProcessId;
-
-#endif
-}
-
-int execute(char *command)
-{
-#ifdef WIN32
-int pid = execute_win(command);
-#else
-int pid = execute_unix(command);
-#endif /* WIN32 */
-
-/* timer for calling our read function to poll for new data 8 times per second */
- g_timeout_add(125, read_data, NULL);
-
-  return(pid);
+  return(NULL);
 }
 
 
-
-
-char *build_command()
+static char *build_command()
 {
 int size = 2560; /* this should be long enough ;-) */
 static char *command = NULL;
@@ -681,57 +521,487 @@ static int command_size = 0;
   return(command);
 }
 
-void display_nmap_command()
-{
-char *command = build_command();
-
-  gtk_entry_set_text(GTK_ENTRY(opt.commandEntry), command);
-}
-
-
-void display_nmap_command_cb(GtkWidget *target_option, void *ignored)
-{
-  display_nmap_command();
-}
-
-
-void browseButton_pressed_cb(GtkWidget *widget, GtkWidget *text)
+static void 
+print_line (GtkTextBuffer *buffer, 
+            char          *line)
 {
-static char filename[FILENAME_MAX+1] = "";
-const char *name = gtk_entry_get_text(GTK_ENTRY(text));
-
-  if (name && *name) {
-    strncpy(filename, name, FILENAME_MAX);
-    filename[FILENAME_MAX] = '\0';
-  }
-
-  gtk_widget_show(create_fileSelection("Select File", filename, NULL, GTK_ENTRY(text)));
-}
-
-void scanType_cb 
-(GtkComboBox *w, gpointer data)
-{      
-    Entry *user = data;
-    gint i = 0, j, k;
-
-    j = gtk_combo_box_get_active(w);
-
-    if (opt.uid == 0) {
-        k = j;
-    } else {
-        for (k = 0; user[k].scantype; k++) {
-            if (user[k].rootonly != TRUE) {
-                if (i == j) {
-                    break;
-                }
-                i++;
-            }
-        }
-    }
-    opt.scanValue = user[k].scantype;
+  GtkTextIter iter;
+  gtk_text_buffer_get_end_iter (buffer, &iter);
+  
+  if (opt.viewValue == 1) {
+      char token[BUFSIZ+1];
+      char *str;
 
-    if ((opt.scanValue == PING_SCAN) || (opt.scanValue == LIST_SCAN)) {
-      // gtk_widget_set_sensitive(GTK_WIDGET(opt.protportFrame), FALSE);
+      while (((str = next_token(line, token, sizeof(token) / sizeof(*token))) != NULL) && (*str != '\0')) {
+          /* Catch stuff */
+          if (strstr(str, "http://";) ||
+                  strstr(str, "PORT") ||
+                  strstr(str, "PROTOCOL") ||
+                  strstr(str, "STATE") ||
+                  strstr(str, "SERVICE") ||
+                  strstr(str, "VERSION") ||
+                  strstr(str, "(RPC)") ||
+                  strstr(str, "OWNER") ||
+                  strstr(str, "fingerprint")) {
+              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
+                      "bold", NULL);
+              /* Color the ports... */
+          } else if (strstr(str, "sftp") ||
+                  strstr(str, "mftp") ||
+                  strstr(str, "bftp") ||
+                  strstr(str, "tftp") ||
+                  strstr(str, "ftp") ||
+                  strstr(str, "NetBus") ||
+                  strstr(str, "kshell") ||
+                  strstr(str, "shell") ||
+                  strstr(str, "klogin") ||
+                  strstr(str, "login") ||
+                  strstr(str, "rtelnet") ||
+                  strstr(str, "telnet") ||
+                  strstr(str, "exec") ||
+                  strstr(str, "ssh") ||
+                  strstr(str, "linuxconf")) {
+              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
+                      "red", NULL);
+          } else if (strstr(str, "imap2") ||
+                  strstr(str, "pop-3") ||
+                  strstr(str, "imap3") ||
+                  strstr(str, "smtps") ||
+                  strstr(str, "smtp") ||
+                  strstr(str, "pop-2")) {
+              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
+                      "blue", NULL);
+          } else if (strstr(str, "systat") ||
+                  strstr(str, "netstat") ||
+                  strstr(str, "cfingerd") ||
+                  strstr(str, "finger") ||
+                  strstr(str, "netbios") ||
+                  strstr(str, "X11") ||
+                  strstr(str, "nfs") ||
+                  strstr(str, "sunrpc") ||
+                  strstr(str, "kpasswds") ||
+                  strstr(str, "https") ||
+                  strstr(str, "http")) {
+              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
+                      "bold", NULL);
+      /******* BEGIN OS COLOR CODING *****************/                
+              /* Color the Operating systems */
+          } else if (strstr(str, "Linux") ||
+                  strstr(str, "FreeBSD") ||
+                  strstr(str, "Win") ||
+                  strstr(str, "MacOS") ||
+                  strstr(str, "OpenBSD") ||
+                  strstr(str, "IRIX") ||
+                  strstr(str, "Windows")) {
+              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
+                      "green", NULL);
+          } else { 
+              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
+                      "normal", NULL);
+          }
+      }
+  } else {
+      gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, line, -1,
+            "normal", NULL);
+  }
+}
+
+void scanButton_toggled_cb(GtkButton *button, void *ignored)
+{
+  if(GTK_TOGGLE_BUTTON(button)->active) {
+  char *command = build_command();
+
+  if(!(opt.appendLog))
+          gtk_text_buffer_set_text (GTK_TEXT_BUFFER(opt.buffer), "\0", -1);
+
+    nmap_pid = execute(command);
+}
+  else {
+    if (stop_scan()) {
+    static char string[256];
+
+      strcpy(string, "CANCELLED!\n\n");
+      print_line(GTK_TEXT_BUFFER(opt.buffer), string);
+}
+}
+}
+
+
+void 
+saveLog (char *filename)
+{
+    GtkTextIter start, end;
+    if (filename && *filename) {
+        FILE *file;
+        if ((file = fopen(filename, "w"))) {
+         gchar *text;
+            gtk_text_buffer_get_start_iter(opt.buffer, &start);
+            gtk_text_buffer_get_end_iter(opt.buffer, &end);
+            text = gtk_text_buffer_get_text(opt.buffer,
+                    &start, &end, FALSE);
+
+            fputs(text, file);
+            fclose(file);
+            free(text);
+        }
+    }
+}
+
+
+void openLog(char *filename)
+{
+  if (filename && *filename) {
+  FILE *file;
+     
+  if (!opt.appendLog) 
+          gtk_text_buffer_set_text (GTK_TEXT_BUFFER(opt.buffer), "\0", -1);
+       
+    if((file = fopen(filename, "r"))) {
+    char buf[BUFSIZ+1];
+
+      while(fgets(buf, BUFSIZ, file) != NULL) {
+        print_line(GTK_TEXT_BUFFER(opt.buffer), buf);
+      }
+
+      fclose(file);
+    }
+  }
+}
+
+
+void okButton_clicked_cb(GtkWidget *window, GtkButton *button)
+{
+const char *selected = gtk_file_selection_get_filename(GTK_FILE_SELECTION(window));
+void (*action)() = (void (*)())g_object_get_data(G_OBJECT(window), "NmapFE_action");
+GtkEntry *entry = g_object_get_data(G_OBJECT(window), "NmapFE_entry");
+char *filename = g_object_get_data(G_OBJECT(window), "NmapFE_filename");
+
+  if (filename && selected) {
+    strncpy(filename, selected, FILENAME_MAX);
+    filename[FILENAME_MAX-1] = '\0';
+    if (action)
+      (*action)(filename);
+    if (entry)
+      gtk_entry_set_text(GTK_ENTRY(entry), filename);
+  }
+}
+
+/* split buf into first line and remainder by
+   copying the first line into line and stripping it from str;
+   return the first line from str or NULL if str contains no full line.
+   bufsz is the number of chars in buf.
+ */
+static char *next_line(char *buf, int bufsz, char *line)
+{
+  if ((buf != NULL) && (line != NULL)) {
+  char *eol = strchr(buf, '\n');
+
+    if (eol != NULL) {
+      char *bol = buf;
+    int linelen = MIN(bufsz - 1, eol - buf + 1); // we can't exceed buffer size
+
+      /* copy line including \n to line */
+      memcpy(line, buf, linelen);
+      line[linelen] = '\0';
+
+      eol = buf + linelen;
+
+      /* remove line from str */
+      while (*eol != '\0')
+       *bol++ = *eol++;
+      *bol = '\0';
+      
+      return(line);
+    }
+    return(buf);
+  }
+  return(NULL);
+}
+
+/* The read_from_pipe functions (UNIX & Win versions) do a non-blocking read from the pipe
+   given into the buffer given up to a maximum read length of bufsz.  The number of bytes 
+   read is returned.  -1 is returned in the case of heinous error.  Returned buffer is NOT
+   NUL terminated */
+#ifdef WIN32
+
+static int read_from_pipe(HANDLE pipe, char *buf, int bufsz)
+{
+int ret;
+int count = 0;
+
+/* First lets check if anything is ready for us.
+   Note: I don't know if this technique even works! */
+  ret = WaitForSingleObject(pipe, 0);
+  if ( ret == WAIT_OBJECT_0 ) {
+    /* Apparently the pipe is available for reading -- Read up to # of bytes in buffer */
+    if (!ReadFile(pipe, buf, bufsz, &count, NULL)) {
+      if (GetLastError() != ERROR_BROKEN_PIPE)
+       pfatal("ReadFile on Nmap process pipe failed!");
+    }
+  }
+  return count;
+}
+
+#else
+
+/* NOTE:  pipefd must be in O_NONBLOCK mode ( via fcntl ) */
+static int read_from_pipe(int pipefd, char *buf, int bufsz)
+{
+int count;
+
+  if (pipefd == -1) return -1;
+  count = read(pipefd, buf, bufsz);
+  if (count == -1 && errno != EINTR && errno != EAGAIN) {
+    pfatal("Failed to read from nmap process pipe");
+  }
+  return count;
+}
+
+#endif /* read_from_pipe Win32/UNIX selector */
+
+
+static gint read_data(gpointer data)
+{
+  static char buf[BUFSIZ+1] = "";
+  static int buflen = 0;
+  char line[BUFSIZ+1];
+int count;
+
+#ifdef WIN32
+  int rc;
+  char *p=NULL, *q=NULL;
+#endif /* WIN32 */
+
+  while((count = read_from_pipe(pipes[0], buf+buflen, sizeof(buf) - buflen - 1 )) > 0) {
+  char *str;
+
+    /* fprintf(stderr, "\nCount was %d\n", count); */
+    buflen += count;
+    buf[buflen] = '\0';
+
+#ifdef WIN32
+    /* For windows, I have to squeeze \r\n back into \n */
+    p = q = buf;
+    while(*q) { if (*q == '\r') q++; else *p++ = *q++; }
+    *p = '\0';
+#endif /* WIN32 */
+
+    for (str = next_line(buf, sizeof(buf) / sizeof(*buf), line); 
+         (str != buf) && (str != NULL);
+         str = next_line(buf, sizeof(buf) / sizeof(*buf), line)) {
+      buflen = strlen(buf);
+      print_line(opt.buffer, str);
+    }  
+  } 
+
+  /*  fprintf(stderr, "Below loop: Count was %d\n", count); */
+
+  if (buflen > 0) {
+  char *str;
+
+    while ((str = next_line(buf, sizeof(buf) / sizeof(*buf), line)) != NULL) {
+      buflen = strlen(buf);
+      print_line(opt.buffer, str);
+        if (str == buf)
+          break;
+    }
+  }
+
+#ifdef WIN32
+  if (nmap_pid) {
+    rc = WaitForSingleObject(NmapHandle, 0);
+    if (rc == WAIT_FAILED) {
+      pfatal("Failed in WaitForSingleObject to see if Nmap process has died");
+    }
+  }
+  if (!nmap_pid || rc == WAIT_OBJECT_0) {
+    CloseHandle(NmapHandle);
+    CloseHandle(pipes[0]);
+    nmap_pid = 0;
+    buflen = 0;
+    buf[buflen] = '\0';
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt.scanButton), 0);
+    return 0;
+  }
+#else
+  if (!nmap_pid || (waitpid(0, NULL, WNOHANG) == nmap_pid)) {
+    /* fprintf(stderr, "Program gone, dead, kablooey!\n"); */
+    nmap_pid = 0;
+    if (pipes[0] != -1) {
+      close(pipes[0]);
+      pipes[0] = -1;
+    }
+    buflen = 0;
+    buf[buflen] = '\0';
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt.scanButton), 0);
+    return 0;
+  }
+#endif /* waitpid unix/windoze selector */
+
+  return(1);   
+}
+
+
+/* The idea of execute() is to create an Nmap process running in the background with its stdout
+    connected to a pipe we can poll many times per second to collect any new output.  Admittedly 
+       there are much more elegant ways to do this, but this is how it works now.  The functions
+       return the process ID of nmap.  This process is
+       different enough between windows & UNIX that I have two functions for doing it: */
+static int execute_unix(char *command)
+{
+#ifdef WIN32
+  fatal("The execute_unix function should not be called from Windows!");
+  return -1;
+#else
+
+  /* Many thanks to Fyodor for helping with the piping */
+  if (pipe(pipes) == -1) {
+    perror("poopy pipe error");
+    exit(1);
+  }
+
+  if (!(pid = fork())) {
+    char **argv;
+    int argc;
+
+    argc = arg_parse(command, &argv);
+               
+    if (argc <= 0)
+      exit(1);
+    dup2(pipes[1], 1);
+    dup2(pipes[1], 2);
+    fcntl(pipes[0], F_SETFL, O_NDELAY);
+    if (execvp("nmap", argv) == -1) {
+      fprintf(stderr, "Nmap execution failed.  errno=%d (%s)\n", errno, strerror(errno));
+      exit(1);
+    }
+    /*exit(127);*/
+  }
+  if (pid == -1) {
+    fprintf(stderr, "fork() failed.  errno=%d (%s)", errno, strerror(errno));
+    pid = 0;
+    close(pipes[0]);
+    pipes[0] = -1;
+  }
+  close(pipes[1]);
+  pipes[1] = -1;
+
+  return(pid);
+
+#endif
+}
+
+
+/* Parts cribbed from _Win32 System Programming Second Edition_ pp 304 */
+static int execute_win(char *command)
+{
+#ifndef WIN32
+  fatal("The execute_win function should ONLY be called from Windows!");
+  return -1;
+#else
+
+/* For pipes[] array:  0 == READ; 1 == WRITE */
+
+/* To ensure pipe handles are inheritable */
+SECURITY_ATTRIBUTES PipeSA = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+PROCESS_INFORMATION Nmap_Proc;
+STARTUPINFO Nmap_Start;
+
+  GetStartupInfo(&Nmap_Start);
+
+  /* Create our pipe for reading Nmap output */
+  if (!CreatePipe(&pipes[0], &pipes[1], &PipeSA, 8196))
+    pfatal("execute_win: Failed to create pipes!");
+
+  /* Insure that stdout/stderr for Nmap will go to our pipe */
+  Nmap_Start.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+  Nmap_Start.hStdError = pipes[1];
+  Nmap_Start.hStdOutput = pipes[1];
+  Nmap_Start.dwFlags = STARTF_USESTDHANDLES;
+
+  /* Start up Nmap! */
+  if (!CreateProcess ( NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &Nmap_Start, &Nmap_Proc))
+    pfatal("execute_win: Failed to start Nmap process with command '%s'", command);
+
+  /* I don't care about the thread handle or the write pipe anymore */
+  CloseHandle(Nmap_Proc.hThread);
+   CloseHandle(pipes[1]);
+
+  /* I'm gonna squirrel away the Nmap process handle in a global variable.
+     All this nonsense needs to be redone */
+   NmapHandle = Nmap_Proc.hProcess;
+
+  return Nmap_Proc.dwProcessId;
+
+#endif
+}
+
+int execute(char *command)
+{
+#ifdef WIN32
+int pid = execute_win(command);
+#else
+int pid = execute_unix(command);
+#endif /* WIN32 */
+
+/* timer for calling our read function to poll for new data 8 times per second */
+ g_timeout_add(125, read_data, NULL);
+
+  return(pid);
+}
+
+
+void display_nmap_command()
+{
+char *command = build_command();
+
+  gtk_entry_set_text(GTK_ENTRY(opt.commandEntry), command);
+}
+
+
+void display_nmap_command_cb(GtkWidget *target_option, void *ignored)
+{
+  display_nmap_command();
+}
+
+
+void browseButton_pressed_cb(GtkWidget *widget, GtkWidget *text)
+{
+static char filename[FILENAME_MAX+1] = "";
+const char *name = gtk_entry_get_text(GTK_ENTRY(text));
+
+  if (name && *name) {
+    strncpy(filename, name, FILENAME_MAX);
+    filename[FILENAME_MAX] = '\0';
+  }
+
+  gtk_widget_show(create_fileSelection("Select File", filename, NULL, GTK_ENTRY(text)));
+}
+
+void scanType_cb 
+(GtkComboBox *w, gpointer data)
+{      
+    Entry *user = data;
+    gint i = 0, j, k;
+
+    j = gtk_combo_box_get_active(w);
+
+    if (opt.uid == 0) {
+        k = j;
+    } else {
+        for (k = 0; user[k].scantype; k++) {
+            if (user[k].rootonly != TRUE) {
+                if (i == j) {
+                    break;
+                }
+                i++;
+            }
+        }
+    }
+    opt.scanValue = user[k].scantype;
+
+    if ((opt.scanValue == PING_SCAN) || (opt.scanValue == LIST_SCAN)) {
+      // gtk_widget_set_sensitive(GTK_WIDGET(opt.protportFrame), FALSE);
       gtk_widget_set_sensitive(GTK_WIDGET(opt.protportType), FALSE);
       gtk_widget_set_sensitive(GTK_WIDGET(opt.protportLabel), FALSE);
       gtk_widget_set_sensitive(GTK_WIDGET(opt.protportRange), FALSE);
@@ -821,376 +1091,101 @@ gboolean status = gtk_toggle_button_get_
     gtk_widget_set_sensitive(GTK_WIDGET(opt.tcpPingPorts), status);
   }
   else if ((ping_button == opt.synPing) && (opt.uid == 0)) {
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.synPingLabel), status);
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.synPingPorts), status);
-  }
-  else if ((ping_button == opt.udpPing) && (opt.uid == 0)) {
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.udpPingLabel), status);
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.udpPingPorts), status);
-  }
-  
-  display_nmap_command();
-}
-
-
-void throttleType_cb (GtkComboBox *w, gpointer data)
-{      
-    opt.throttleValue = gtk_combo_box_get_active(w);
-    display_nmap_command();
-}
-
-
-void resolveType_cb (GtkComboBox *w, gpointer data)
-{
-    opt.resolveValue = gtk_combo_box_get_active(w);
-    display_nmap_command();
-}
-
-
-void protportType_cb(GtkComboBox *w, gpointer d)
-{
-    opt.protportValue = gtk_combo_box_get_active(w);
-
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.protportLabel), 
-            (opt.protportValue == GIVEN_PROTPORT));
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.protportRange), 
-            (opt.protportValue == GIVEN_PROTPORT));
-    if (opt.protportValue == GIVEN_PROTPORT)
-      gtk_widget_grab_focus(GTK_WIDGET(opt.protportRange));
-
-    display_nmap_command();
-}
-
-
-/* callback for factory generated menu items: set variable to action */
-void verboseType_cb(GtkComboBox *w, gpointer d)
-{
-  opt.verboseValue = gtk_combo_box_get_active(w);
-  display_nmap_command();
-}
-
-
-/* callback for factory generated menu items: set variable to action */
-void outputFormatType_cb(GtkComboBox *w, gpointer d)
-{
-  opt.outputFormatValue = gtk_combo_box_get_active(w);
-  display_nmap_command();
-}
-
-
-/* callback for toggle buttons: control other objects seneistivity */
-void toggle_button_set_sensitive_cb(GtkWidget *master, GtkWidget *slave)
-{
-  if ((master != NULL) && (slave != NULL) && GTK_IS_TOGGLE_BUTTON(master))
-    gtk_widget_set_sensitive(GTK_WIDGET(slave), GTK_TOGGLE_BUTTON(master)->active);
-
-  display_nmap_command();
-}
-
-
-void validate_file_change(GtkWidget *button, void *ignored)
-{      
-gboolean status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
-
-  if (button == opt.useInputFile) {
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.targetHost), !status);
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.inputFilename), status);
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.inputBrowse), status);
-  } else if (button == opt.useOutputFile) {
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputFilename), status);
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputBrowse), status);
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputFormatLabel), status);
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputFormatType), status);
-    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputAppend), status);
-  }
-
-  display_nmap_command();
-}
-
-
-void validate_option_change(GtkWidget *target_option, void *ignored)
-{      
-gboolean status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(target_option));
-
-  if ((target_option == opt.useInputFile) && (status))
-    gtk_entry_set_text(GTK_ENTRY(opt.targetHost), "");
-
-  display_nmap_command();
-}
-
-
-/* The read_from_pipe functions (UNIX & Win versions) do a non-blocking read from the pipe
-   given into the buffer given up to a maximum read length of bufsz.  The number of bytes 
-   read is returned.  -1 is returned in the case of heinous error.  Returned buffer is NOT
-   NUL terminated */
-#ifdef WIN32
-
-static int read_from_pipe(HANDLE pipe, char *buf, int bufsz)
-{
-int ret;
-int count = 0;
-
-/* First lets check if anything is ready for us.
-   Note: I don't know if this technique even works! */
-  ret = WaitForSingleObject(pipe, 0);
-  if ( ret == WAIT_OBJECT_0 ) {
-    /* Apparently the pipe is available for reading -- Read up to # of bytes in buffer */
-    if (!ReadFile(pipe, buf, bufsz, &count, NULL)) {
-      if (GetLastError() != ERROR_BROKEN_PIPE)
-       pfatal("ReadFile on Nmap process pipe failed!");
-    }
-  }
-  return count;
-}
-
-#else
-
-/* NOTE:  pipefd must be in O_NONBLOCK mode ( via fcntl ) */
-static int read_from_pipe(int pipefd, char *buf, int bufsz)
-{
-int count;
-
-  if (pipefd == -1) return -1;
-  count = read(pipefd, buf, bufsz);
-  if (count == -1 && errno != EINTR && errno != EAGAIN) {
-    pfatal("Failed to read from nmap process pipe");
-  }
-  return count;
-}
-
-#endif /* read_from_pipe Win32/UNIX selector */
-
-
-/* split buf into first line and remainder by
-   copying the first line into line and stripping it from str;
-   return the first line from str or NULL if str contains no full line.
-   bufsz is the number of chars in buf.
- */
-char *next_line(char *buf, int bufsz, char *line)
-{
-  if ((buf != NULL) && (line != NULL)) {
-  char *eol = strchr(buf, '\n');
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.synPingLabel), status);
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.synPingPorts), status);
+  }
+  else if ((ping_button == opt.udpPing) && (opt.uid == 0)) {
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.udpPingLabel), status);
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.udpPingPorts), status);
+  }
+  
+  display_nmap_command();
+}
 
-    if (eol != NULL) {
-      char *bol = buf;
-    int linelen = MIN(bufsz - 1, eol - buf + 1); // we can't exceed buffer size
 
-      /* copy line including \n to line */
-      memcpy(line, buf, linelen);
-      line[linelen] = '\0';
+void throttleType_cb (GtkComboBox *w, gpointer data)
+{      
+    opt.throttleValue = gtk_combo_box_get_active(w);
+    display_nmap_command();
+}
 
-      eol = buf + linelen;
 
-      /* remove line from str */
-      while (*eol != '\0')
-       *bol++ = *eol++;
-      *bol = '\0';
-      
-      return(line);
-    }
-    return(buf);
-  }
-  return(NULL);
+void resolveType_cb (GtkComboBox *w, gpointer data)
+{
+    opt.resolveValue = gtk_combo_box_get_active(w);
+    display_nmap_command();
 }
 
 
-// tokensz is the total size of token in characters
-char *next_token(char *buf, char *token, int tokensz)
+void protportType_cb(GtkComboBox *w, gpointer d)
 {
-  if ((buf != NULL) && (token != NULL)) {
-  int count = (strchr("\t ", *buf) != NULL)
-              ? strspn(buf, "\t ")
-              : strcspn(buf, "\t ");
-
-    if (count > 0) {
-      char *bol = buf;
-    char *eol;
+    opt.protportValue = gtk_combo_box_get_active(w);
 
-      count = MIN(count, tokensz - 1);
-      eol = buf+count;
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.protportLabel), 
+            (opt.protportValue == GIVEN_PROTPORT));
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.protportRange), 
+            (opt.protportValue == GIVEN_PROTPORT));
+    if (opt.protportValue == GIVEN_PROTPORT)
+      gtk_widget_grab_focus(GTK_WIDGET(opt.protportRange));
 
-      /* copy token  */
-      memcpy(token, buf, count);
-      token[count] = '\0';
+    display_nmap_command();
+}
 
-      /* remove token from str */
-      while (*eol != '\0')
-        *bol++ = *eol++;
-      *bol = '\0';
 
-      return(token);
-    }
-    return(buf);
-  }
-  return(NULL);
+/* callback for factory generated menu items: set variable to action */
+void verboseType_cb(GtkComboBox *w, gpointer d)
+{
+  opt.verboseValue = gtk_combo_box_get_active(w);
+  display_nmap_command();
 }
 
 
-void 
-print_line (GtkTextBuffer *buffer, 
-            char          *line)
+/* callback for factory generated menu items: set variable to action */
+void outputFormatType_cb(GtkComboBox *w, gpointer d)
 {
-  GtkTextIter iter;
-  gtk_text_buffer_get_end_iter (buffer, &iter);
-  
-  if (opt.viewValue == 1) {
-      char token[BUFSIZ+1];
-      char *str;
-
-      while (((str = next_token(line, token, sizeof(token) / sizeof(*token))) != NULL) && (*str != '\0')) {
-          /* Catch stuff */
-          if (strstr(str, "http://";) ||
-                  strstr(str, "PORT") ||
-                  strstr(str, "PROTOCOL") ||
-                  strstr(str, "STATE") ||
-                  strstr(str, "SERVICE") ||
-                  strstr(str, "VERSION") ||
-                  strstr(str, "(RPC)") ||
-                  strstr(str, "OWNER") ||
-                  strstr(str, "fingerprint")) {
-              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
-                      "bold", NULL);
-              /* Color the ports... */
-          } else if (strstr(str, "sftp") ||
-                  strstr(str, "mftp") ||
-                  strstr(str, "bftp") ||
-                  strstr(str, "tftp") ||
-                  strstr(str, "ftp") ||
-                  strstr(str, "NetBus") ||
-                  strstr(str, "kshell") ||
-                  strstr(str, "shell") ||
-                  strstr(str, "klogin") ||
-                  strstr(str, "login") ||
-                  strstr(str, "rtelnet") ||
-                  strstr(str, "telnet") ||
-                  strstr(str, "exec") ||
-                  strstr(str, "ssh") ||
-                  strstr(str, "linuxconf")) {
-              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
-                      "red", NULL);
-          } else if (strstr(str, "imap2") ||
-                  strstr(str, "pop-3") ||
-                  strstr(str, "imap3") ||
-                  strstr(str, "smtps") ||
-                  strstr(str, "smtp") ||
-                  strstr(str, "pop-2")) {
-              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
-                      "blue", NULL);
-          } else if (strstr(str, "systat") ||
-                  strstr(str, "netstat") ||
-                  strstr(str, "cfingerd") ||
-                  strstr(str, "finger") ||
-                  strstr(str, "netbios") ||
-                  strstr(str, "X11") ||
-                  strstr(str, "nfs") ||
-                  strstr(str, "sunrpc") ||
-                  strstr(str, "kpasswds") ||
-                  strstr(str, "https") ||
-                  strstr(str, "http")) {
-              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
-                      "bold", NULL);
-      /******* BEGIN OS COLOR CODING *****************/                
-              /* Color the Operating systems */
-          } else if (strstr(str, "Linux") ||
-                  strstr(str, "FreeBSD") ||
-                  strstr(str, "Win") ||
-                  strstr(str, "MacOS") ||
-                  strstr(str, "OpenBSD") ||
-                  strstr(str, "IRIX") ||
-                  strstr(str, "Windows")) {
-              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
-                      "green", NULL);
-          } else { 
-              gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, str, -1,
-                      "normal", NULL);
-          }
-      }
-  } else {
-      gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, line, -1,
-            "normal", NULL);
-  }
+  opt.outputFormatValue = gtk_combo_box_get_active(w);
+  display_nmap_command();
 }
 
 
-gint read_data(gpointer data)
+/* callback for toggle buttons: control other objects seneistivity */
+void toggle_button_set_sensitive_cb(GtkWidget *master, GtkWidget *slave)
 {
-  static char buf[BUFSIZ+1] = "";
-  static int buflen = 0;
-  char line[BUFSIZ+1];
-int count;
-
-#ifdef WIN32
-  int rc;
-  char *p=NULL, *q=NULL;
-#endif /* WIN32 */
+  if ((master != NULL) && (slave != NULL) && GTK_IS_TOGGLE_BUTTON(master))
+    gtk_widget_set_sensitive(GTK_WIDGET(slave), GTK_TOGGLE_BUTTON(master)->active);
 
-  while((count = read_from_pipe(pipes[0], buf+buflen, sizeof(buf) - buflen - 1 )) > 0) {
-  char *str;
+  display_nmap_command();
+}
 
-    /* fprintf(stderr, "\nCount was %d\n", count); */
-    buflen += count;
-    buf[buflen] = '\0';
 
-#ifdef WIN32
-    /* For windows, I have to squeeze \r\n back into \n */
-    p = q = buf;
-    while(*q) { if (*q == '\r') q++; else *p++ = *q++; }
-    *p = '\0';
-#endif /* WIN32 */
+void validate_file_change(GtkWidget *button, void *ignored)
+{      
+gboolean status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
 
-    for (str = next_line(buf, sizeof(buf) / sizeof(*buf), line); 
-         (str != buf) && (str != NULL);
-         str = next_line(buf, sizeof(buf) / sizeof(*buf), line)) {
-      buflen = strlen(buf);
-      print_line(opt.buffer, str);
-    }  
-  } 
+  if (button == opt.useInputFile) {
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.targetHost), !status);
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.inputFilename), status);
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.inputBrowse), status);
+  } else if (button == opt.useOutputFile) {
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputFilename), status);
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputBrowse), status);
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputFormatLabel), status);
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputFormatType), status);
+    gtk_widget_set_sensitive(GTK_WIDGET(opt.outputAppend), status);
+  }
 
-  /*  fprintf(stderr, "Below loop: Count was %d\n", count); */
+  display_nmap_command();
+}
 
-  if (buflen > 0) {
-  char *str;
 
-    while ((str = next_line(buf, sizeof(buf) / sizeof(*buf), line)) != NULL) {
-      buflen = strlen(buf);
-      print_line(opt.buffer, str);
-        if (str == buf)
-          break;
-    }
-  }
+void validate_option_change(GtkWidget *target_option, void *ignored)
+{      
+gboolean status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(target_option));
 
-#ifdef WIN32
-  if (nmap_pid) {
-    rc = WaitForSingleObject(NmapHandle, 0);
-    if (rc == WAIT_FAILED) {
-      pfatal("Failed in WaitForSingleObject to see if Nmap process has died");
-    }
-  }
-  if (!nmap_pid || rc == WAIT_OBJECT_0) {
-    CloseHandle(NmapHandle);
-    CloseHandle(pipes[0]);
-    nmap_pid = 0;
-    buflen = 0;
-    buf[buflen] = '\0';
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt.scanButton), 0);
-    return 0;
-  }
-#else
-  if (!nmap_pid || (waitpid(0, NULL, WNOHANG) == nmap_pid)) {
-    /* fprintf(stderr, "Program gone, dead, kablooey!\n"); */
-    nmap_pid = 0;
-    if (pipes[0] != -1) {
-      close(pipes[0]);
-      pipes[0] = -1;
-    }
-    buflen = 0;
-    buf[buflen] = '\0';
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt.scanButton), 0);
-    return 0;
-  }
-#endif /* waitpid unix/windoze selector */
+  if ((target_option == opt.useInputFile) && (status))
+    gtk_entry_set_text(GTK_ENTRY(opt.targetHost), "");
 
-  return(1);   
+  display_nmap_command();
 }
 
 gboolean stop_scan()

--- x/nmapfe/nmapfe_sig.h       2006-08-24 20:47:59.000000000 -0500
+++ y/nmapfe/nmapfe_sig.h       2006-09-20 19:47:40.000000000 -0500
@@ -122,13 +122,7 @@
 #include "nmapfe_error.h"
 
 gboolean stop_scan();
-void print_line(GtkTextBuffer *gtktext, char *line);
-gint read_data(gpointer data);
 
-void entry_toggle_checkbox (GtkWidget *entry, GtkWidget *checkbox);
-void entry_toggle_ping_checkbox(GtkWidget *entry, GtkWidget *checkbox);
-
-void mainMenu_fcb(int *variable, guint action, GtkWidget *w);
 void throttleType_cb (GtkComboBox *, gpointer);
 void resolveType_cb (GtkComboBox *, gpointer);
 void protportType_cb (GtkComboBox *, gpointer);
@@ -142,7 +136,6 @@ void validate_option_change(GtkWidget *t
 void browseButton_pressed_cb(GtkWidget *widget, GtkWidget *text);
 void display_nmap_command_cb(GtkWidget *target_option, void *ignored);
 void display_nmap_command();
-char *build_command();
 
 int execute(char *command);
 

_______________________________________________
Sent through the nmap-dev mailing list
http://cgi.insecure.org/mailman/listinfo/nmap-dev
Archived at http://SecLists.Org

Current thread: