Ethereal-dev: [Ethereal-dev] Better control for name resolving (patch for tethereal)

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Joerg Mayer <jmayer@xxxxxxxxx>
Date: Tue, 8 May 2001 21:49:53 +0200
attached patch impelements some better control for name resolving with
tethereal. As I don't know how to program gtk buttons (or anything
graphical :-) this patch is *t*ethereal only. I've made some adjustments
to ethereal which I hope are OK.
The new option is -N<flags> where flags are the following:
m (resolve Mac vendor id), n (resolve network address), t (resolve trans-
port address). If someone will provide the buttons, I'll be happy to
basically copy the missing patches for commandline handling and manpage
from tethereal to ethereal.

 Ciao
   Jörg
-- 
Joerg Mayer                                          <jmayer@xxxxxxxxx>
I found out that "pro" means "instead of" (as in proconsul). Now I know
what proactive means.
Index: ethereal/prefs.c
===================================================================
RCS file: /cvsroot/ethereal/prefs.c,v
retrieving revision 1.50
diff -u -u -r1.50 prefs.c
--- prefs.c	2001/04/15 03:37:13	1.50
+++ prefs.c	2001/05/08 00:37:29
@@ -615,7 +615,7 @@
     prefs.capture_prom_mode   =     0;
     prefs.capture_real_time   =     0;
     prefs.capture_auto_scroll =     0;
-    prefs.name_resolve=     1;
+    prefs.name_resolve= PREFS_RESOLV_ALL;
 
   }
 
@@ -1011,7 +1011,7 @@
  
   } else if (strcmp(pref_name, PRS_NAME_RESOLVE) == 0 ||
 	     strcmp(pref_name, PRS_CAP_NAME_RESOLVE) == 0) {
-    prefs.name_resolve = ((strcmp(value, "TRUE") == 0)?TRUE:FALSE); 
+    prefs.name_resolve = ((strcmp(value, "TRUE") == 0)?PREFS_RESOLV_ALL:PREFS_RESOLV_NONE); 
 
   } else {
     /* To which module does this preference belong? */
@@ -1339,7 +1339,7 @@
 
   fprintf(pf, "\n# Resolve addresses to names? TRUE/FALSE\n");
   fprintf(pf, PRS_NAME_RESOLVE ": %s\n",
-		  prefs.name_resolve == TRUE ? "TRUE" : "FALSE");
+		  prefs.name_resolve == PREFS_RESOLV_ALL ? "TRUE" : "FALSE");
 
 /* write the capture options */
   fprintf(pf, "\n# Capture in promiscuous mode? TRUE/FALSE\n");
Index: ethereal/prefs.h
===================================================================
RCS file: /cvsroot/ethereal/prefs.h,v
retrieving revision 1.29
diff -u -u -r1.29 prefs.h
--- prefs.h	2001/04/15 03:37:13	1.29
+++ prefs.h	2001/05/08 00:37:29
@@ -33,6 +33,15 @@
 #define PR_DEST_CMD  0
 #define PR_DEST_FILE 1
 
+/* 31 types are sufficient (as are 640k of RAM) */
+/* FIXME: Maybe MANUF/m, IP/i, IP6/6, IPX/x, UDP+TCP/t etc would be
+   more useful/consistent */
+#define PREFS_RESOLV_NONE	0x0
+#define PREFS_RESOLV_MAC	0x1
+#define PREFS_RESOLV_NETWORK	0x2
+#define PREFS_RESOLV_TRANSPORT	0x4
+#define PREFS_RESOLV_ALL	0xFFFFFFFF	
+
 typedef struct _e_prefs {
   gint     pr_format;
   gint     pr_dest;
@@ -50,7 +59,7 @@
   gchar   *gui_font_name;
   color_t  gui_marked_fg;
   color_t  gui_marked_bg;
-  gboolean name_resolve;
+  gint     name_resolve;
   gboolean capture_prom_mode;
   gboolean capture_real_time;
   gboolean capture_auto_scroll;
Index: ethereal/tethereal.c
===================================================================
RCS file: /cvsroot/ethereal/tethereal.c,v
retrieving revision 1.82
diff -u -u -r1.82 tethereal.c
--- tethereal.c	2001/04/20 21:50:06	1.82
+++ tethereal.c	2001/05/08 00:37:31
@@ -336,7 +336,7 @@
 #endif
     
   /* Now get our args */
-  while ((opt = getopt(argc, argv, "c:Df:F:hi:lno:pr:R:s:t:vw:Vx")) != EOF) {
+  while ((opt = getopt(argc, argv, "c:Df:F:hi:lnN:o:pr:R:s:t:vw:Vx")) != EOF) {
     switch (opt) {
       case 'c':        /* Capture xxx packets */
 #ifdef HAVE_LIBPCAP
@@ -417,8 +417,30 @@
 	line_buffered = TRUE;
 	break;
       case 'n':        /* No name resolution */
-	prefs->name_resolve = 0;
+	prefs->name_resolve = PREFS_RESOLV_NONE;
 	break;
+      case 'N':        /* No name resolution */
+	if (prefs->name_resolve == PREFS_RESOLV_ALL) {
+	  prefs->name_resolve = PREFS_RESOLV_NONE;
+        }
+	for (; *optarg; optarg++) {
+	  switch (*optarg) {
+	  case 'm':
+	    prefs->name_resolve |= PREFS_RESOLV_MAC;
+	    break;
+	  case 'n':
+	    prefs->name_resolve |= PREFS_RESOLV_NETWORK;
+	    break;
+	  case 't':
+	    prefs->name_resolve |= PREFS_RESOLV_TRANSPORT;
+	    break;
+	  default:
+            fprintf(stderr, "tethereal: -N specifies unknown resolving option '%c', valid are: m,n,t\n",
+			*optarg);
+            exit(1);
+	  }
+        }
+	break;
       case 'o':        /* Override preference from command line */
         switch (prefs_set_pref(optarg)) {
 
Index: ethereal/doc/tethereal.pod.template
===================================================================
RCS file: /cvsroot/ethereal/doc/tethereal.pod.template,v
retrieving revision 1.27
diff -u -u -r1.27 tethereal.pod.template
--- tethereal.pod.template	2001/03/27 06:16:11	1.27
+++ tethereal.pod.template	2001/05/08 00:37:32
@@ -14,6 +14,7 @@
 S<[ B<-i> interface ]> 
 S<[ B<-l> ]>
 S<[ B<-n> ]>
+S<[ B<-N> resolving flags ] ...>
 S<[ B<-o> preference setting ] ...>
 S<[ B<-p> ]>
 S<[ B<-r> infile ]>
@@ -162,6 +163,12 @@
 
 Disables network object name resolution (such as hostname, TCP and UDP port
 names).
+
+=item -N
+
+Flags to turn on specific name resolving for MAC B<m>, network B<n> and
+transport B<t> layer addresses. This overrides -n if both -N and -n are
+present.
 
 =item -o
 
Index: ethereal/epan/resolv.c
===================================================================
RCS file: /cvsroot/ethereal/epan/resolv.c,v
retrieving revision 1.9
diff -u -u -r1.9 resolv.c
--- resolv.c	2001/04/15 03:37:15	1.9
+++ resolv.c	2001/05/08 00:37:33
@@ -220,7 +220,7 @@
   tp->addr = port;
   tp->next = NULL;
 
-  if (!prefs.name_resolve || 
+  if (!(prefs.name_resolve & PREFS_RESOLV_TRANSPORT) || 
       (servp = getservbyport(htons(port), serv_proto)) == NULL) {
     /* unknown port */
     sprintf(tp->name, "%d", port);
@@ -279,7 +279,7 @@
   tp->addr = addr;
   tp->next = NULL;
 
-  if (prefs.name_resolve) {
+  if (prefs.name_resolve & PREFS_RESOLV_NETWORK) {
 #ifdef AVOID_DNS_TIMEOUT
     
     /* Quick hack to avoid DNS/YP timeout */
@@ -319,7 +319,7 @@
 #ifdef INET6
   struct hostent *hostp;
 
-  if (prefs.name_resolve) {
+  if (prefs.name_resolve & PREFS_RESOLV_NETWORK) {
 #ifdef AVOID_DNS_TIMEOUT
     
     /* Quick hack to avoid DNS/YP timeout */
@@ -1036,7 +1036,7 @@
 {
   gboolean found;
 
-  if (!prefs.name_resolve)
+  if (!(prefs.name_resolve & PREFS_RESOLV_NETWORK))
     return ip_to_str((guint8 *)&addr);
 
   return host_name_lookup(addr, &found);
@@ -1047,7 +1047,7 @@
   gboolean found;
 
 #ifdef INET6
-  if (!prefs.name_resolve)
+  if (!(prefs.name_resolve & PREFS_RESOLV_NETWORK))
     return ip6_to_str(addr);
   if (IN6_IS_ADDR_LINKLOCAL(addr) || IN6_IS_ADDR_MULTICAST(addr))
     return ip6_to_str(addr);
@@ -1100,7 +1100,7 @@
   static gchar  str[3][MAXNAMELEN];
   static gchar *cur;
 
-  if (!prefs.name_resolve) {
+  if (!(prefs.name_resolve & PREFS_RESOLV_TRANSPORT)) {
     if (cur == &str[0][0]) {
       cur = &str[1][0];
     } else if (cur == &str[1][0]) {  
@@ -1121,7 +1121,7 @@
   static gchar  str[3][MAXNAMELEN];
   static gchar *cur;
 
-  if (!prefs.name_resolve) {
+  if (!(prefs.name_resolve & PREFS_RESOLV_TRANSPORT)) {
     if (cur == &str[0][0]) {
       cur = &str[1][0];
     } else if (cur == &str[1][0]) {  
@@ -1142,7 +1142,7 @@
   static gchar  str[3][MAXNAMELEN];
   static gchar *cur;
 
-  if (!prefs.name_resolve) {
+  if (!(prefs.name_resolve & PREFS_RESOLV_TRANSPORT)) {
     if (cur == &str[0][0]) {
       cur = &str[1][0];
     } else if (cur == &str[1][0]) {  
@@ -1160,7 +1160,7 @@
 
 extern guchar *get_ether_name(const guint8 *addr)
 {
-  if (!prefs.name_resolve)
+  if (!(prefs.name_resolve & PREFS_RESOLV_MAC))
     return ether_to_str((guint8 *)addr);
 
   if (!eth_resolution_initialized) {
@@ -1184,7 +1184,7 @@
 
   /* Initialize ether structs if we're the first
    * ether-related function called */
-  if (!prefs.name_resolve)
+  if (!(prefs.name_resolve & PREFS_RESOLV_MAC))
     return NULL;
   
   if (!eth_resolution_initialized) {
@@ -1268,7 +1268,7 @@
 extern const guchar *get_ipxnet_name(const guint32 addr)
 {
 
-  if (!prefs.name_resolve) {
+  if (!(prefs.name_resolve & PREFS_RESOLV_NETWORK)) {
 	  return ipxnet_to_str_punct(addr, '\0');
   }
 
@@ -1306,12 +1306,12 @@
   static gchar *cur;
   hashmanuf_t  *manufp;
 
-  if (prefs.name_resolve && !eth_resolution_initialized) {
+  if ((prefs.name_resolve & PREFS_RESOLV_MAC) && !eth_resolution_initialized) {
     initialize_ethers();
     eth_resolution_initialized = 1;
   }
 
-  if (!prefs.name_resolve || ((manufp = manuf_name_lookup(addr)) == NULL)) {
+  if (!(prefs.name_resolve & PREFS_RESOLV_MAC) || ((manufp = manuf_name_lookup(addr)) == NULL)) {
     if (cur == &str[0][0]) {
       cur = &str[1][0];
     } else if (cur == &str[1][0]) {  
Index: ethereal/gtk/capture_dlg.c
===================================================================
RCS file: /cvsroot/ethereal/gtk/capture_dlg.c,v
retrieving revision 1.41
diff -u -u -r1.41 capture_dlg.c
--- capture_dlg.c	2001/04/15 03:37:16	1.41
+++ capture_dlg.c	2001/05/08 00:37:34
@@ -502,7 +502,7 @@
 
   prefs.capture_auto_scroll = GTK_TOGGLE_BUTTON (auto_scroll_cb)->active;
 
-  prefs.name_resolve = GTK_TOGGLE_BUTTON (resolv_cb)->active;
+  prefs.name_resolve = (GTK_TOGGLE_BUTTON (resolv_cb)->active ? PREFS_RESOLV_ALL : PREFS_RESOLV_NONE);
 
   gtk_widget_destroy(GTK_WIDGET(parent_w));
 
Index: ethereal/gtk/display_opts.c
===================================================================
RCS file: /cvsroot/ethereal/gtk/display_opts.c,v
retrieving revision 1.20
diff -u -u -r1.20 display_opts.c
--- display_opts.c	2001/04/15 03:37:16	1.20
+++ display_opts.c	2001/05/08 00:37:34
@@ -269,7 +269,7 @@
 
   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
 					     E_DISPLAY_NAME_RESOLUTION_KEY);
-  prefs.name_resolve = (GTK_TOGGLE_BUTTON (button)->active);
+  prefs.name_resolve = (GTK_TOGGLE_BUTTON (button)->active ? PREFS_RESOLV_ALL : PREFS_RESOLV_NONE);
 
 }
 
Index: ethereal/gtk/main.c
===================================================================
RCS file: /cvsroot/ethereal/gtk/main.c,v
retrieving revision 1.198
diff -u -u -r1.198 main.c
--- main.c	2001/05/01 00:41:46	1.198
+++ main.c	2001/05/08 00:37:36
@@ -539,8 +539,8 @@
 
 void resolve_name_cb(GtkWidget *widget, gpointer data) {
   if (cfile.protocol_tree) {
-    int tmp = prefs.name_resolve;
-    prefs.name_resolve = 1;
+    gint tmp = prefs.name_resolve;
+    prefs.name_resolve = PREFS_RESOLV_ALL;
     gtk_clist_clear ( GTK_CLIST(tree_view) );
     proto_tree_draw(cfile.protocol_tree, tree_view);
     prefs.name_resolve = tmp;
@@ -1035,7 +1035,7 @@
 	prefs->gui_font_name = g_strdup(optarg);
 	break;
       case 'n':        /* No name resolution */
-	prefs->name_resolve = 0;
+	prefs->name_resolve = PREFS_RESOLV_NONE;
 	break;
       case 'o':        /* Override preference from command line */
         switch (prefs_set_pref(optarg)) {