From Mike Morrin:
[obnox/wireshark/wip.git] / util.c
diff --git a/util.c b/util.c
index 5a9c7b81c29e796509107dda32a815eec57178c8..500330a8fc04e3f2c2909b830a1dcbd81ea6b41e 100644 (file)
--- a/util.c
+++ b/util.c
 
 #include <epan/address.h>
 #include <epan/addr_resolv.h>
-#include <epan/ws_strsplit.h>
+#include <epan/strutil.h>
 
 #include "util.h"
 
-#ifdef NEED_G_ASCII_STRCASECMP_H
-#include "epan/g_ascii_strcasecmp.h"
-#endif
-
 /*
  * Collect command-line arguments as a string consisting of the arguments,
  * separated by spaces.
  */
 char *
-get_args_as_string(int argc, char **argv, int optind)
+get_args_as_string(int argc, char **argv, int optindex)
 {
        int len;
        int i;
@@ -62,27 +58,27 @@ get_args_as_string(int argc, char **argv, int optind)
         * Find out how long the string will be.
         */
        len = 0;
-       for (i = optind; i < argc; i++) {
-               len += strlen(argv[i]);
+       for (i = optindex; i < argc; i++) {
+               len += (int) strlen(argv[i]);
                len++;  /* space, or '\0' if this is the last argument */
        }
 
        /*
         * Allocate the buffer for the string.
         */
-       argstring = g_malloc(len);
+       argstring = (char *)g_malloc(len);
 
        /*
         * Now construct the string.
         */
-       strcpy(argstring, "");
-       i = optind;
+       argstring[0] = '\0';
+       i = optindex;
        for (;;) {
-               strcat(argstring, argv[i]);
+               g_strlcat(argstring, argv[i], len);
                i++;
                if (i == argc)
                        break;
-               strcat(argstring, " ");
+               g_strlcat(argstring, " ", len);
        }
        return argstring;
 }
@@ -131,6 +127,21 @@ compute_timestamp_diff(gint *diffsec, gint *diffusec,
   }
 }
 
+/* Remove any %<interface_name> from an IP address. */
+char *sanitize_filter_ip(char *hostname) {
+    gchar *end;
+    gchar *ret;
+
+    ret = g_strdup(hostname);
+    if (!ret)
+        return NULL;
+
+    end = strchr(ret, '%');
+    if (end)
+        *end = '\0';
+    return ret;
+}
+
 /* Try to figure out if we're remotely connected, e.g. via ssh or
    Terminal Server, and create a capture filter that matches aspects of the
    connection.  We match the following environment variables:
@@ -149,6 +160,7 @@ const gchar *get_conn_cfilter(void) {
        char *pprotocol = NULL;
        char *phostname = NULL;
        size_t hostlen;
+       char *remip, *locip;
 
        if (filter_str == NULL) {
                filter_str = g_string_new("");
@@ -156,27 +168,38 @@ const gchar *get_conn_cfilter(void) {
        if ((env = getenv("SSH_CONNECTION")) != NULL) {
                tokens = g_strsplit(env, " ", 4);
                if (tokens[3]) {
-                       g_string_sprintf(filter_str, "not (tcp port %s and %s host %s "
-                                                        "and tcp port %s and %s host %s)", tokens[1], host_ip_af(tokens[0]), tokens[0],
-                               tokens[3], host_ip_af(tokens[2]), tokens[2]);
+                       remip = sanitize_filter_ip(tokens[0]);
+                       locip = sanitize_filter_ip(tokens[2]);
+                       g_string_printf(filter_str, "not (tcp port %s and %s host %s "
+                                                        "and tcp port %s and %s host %s)", tokens[1], host_ip_af(remip), remip,
+                               tokens[3], host_ip_af(locip), locip);
+                       g_free(remip);
+                       g_free(locip);
                        return filter_str->str;
                }
        } else if ((env = getenv("SSH_CLIENT")) != NULL) {
                tokens = g_strsplit(env, " ", 3);
-               g_string_sprintf(filter_str, "not (tcp port %s and %s host %s "
-                       "and tcp port %s)", tokens[1], host_ip_af(tokens[0]), tokens[0], tokens[2]);
+               remip = sanitize_filter_ip(tokens[2]);
+               g_string_printf(filter_str, "not (tcp port %s and %s host %s "
+                       "and tcp port %s)", tokens[1], host_ip_af(remip), tokens[0], remip);
+               g_free(remip);
                return filter_str->str;
        } else if ((env = getenv("REMOTEHOST")) != NULL) {
-               if (g_ascii_strcasecmp(env, "localhost") == 0 || strcmp(env, "127.0.0.1") == 0) {
+               /* FreeBSD 7.0 sets REMOTEHOST to an empty string */
+               if (g_ascii_strcasecmp(env, "localhost") == 0 ||
+                   strcmp(env, "127.0.0.1") == 0 ||
+                   strcmp(env, "") == 0) {
                        return "";
                }
-               g_string_sprintf(filter_str, "not %s host %s", host_ip_af(env), env);
+               remip = sanitize_filter_ip(env);
+               g_string_printf(filter_str, "not %s host %s", host_ip_af(remip), remip);
+               g_free(remip);
                return filter_str->str;
        } else if ((env = getenv("DISPLAY")) != NULL) {
                /*
                 * This mirrors what _X11TransConnectDisplay() does.
                 * Note that, on some systems, the hostname can
-                * being with "/", which means that it's a pathname
+                * begin with "/", which means that it's a pathname
                 * of a UNIX domain socket to connect to.
                 *
                 * The comments mirror those in _X11TransConnectDisplay(),
@@ -256,7 +279,7 @@ const gchar *get_conn_cfilter(void) {
                if (hostlen == 0)
                        return "";      /* no hostname supplied */
 
-               phostname = g_malloc(hostlen + 1);
+               phostname = (char *)g_malloc(hostlen + 1);
                memcpy(phostname, lastp, hostlen);
                phostname[hostlen] = '\0';
 
@@ -299,7 +322,7 @@ const gchar *get_conn_cfilter(void) {
                        }
                }
 
-               g_string_sprintf(filter_str, "not %s host %s",
+               g_string_printf(filter_str, "not %s host %s",
                        host_ip_af(phostname), phostname);
                g_free(phostname);
                return filter_str->str;
@@ -315,7 +338,7 @@ const gchar *get_conn_cfilter(void) {
                 * http://www.microsoft.com/technet/archive/termsrv/maintain/featusability/tsrvapi.mspx?mfr=true
                 */
                if (g_ascii_strncasecmp(env, "rdp", 3) == 0) {
-                       g_string_sprintf(filter_str, "not tcp port 3389");
+                       g_string_printf(filter_str, "not tcp port 3389");
                        return filter_str->str;
                }
        }