Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > c0394d3068b44395994f031447c8052d > files > 32

net-snmp-5.3.2.2-7.el5_4.2.src.rpm

diff -up net-snmp-5.3.2.2/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c.tcp-process net-snmp-5.3.2.2/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c
--- net-snmp-5.3.2.2/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c.tcp-process	2006-09-08 17:59:20.000000000 +0200
+++ net-snmp-5.3.2.2/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c	2008-07-10 15:09:49.000000000 +0200
@@ -11,7 +11,7 @@
 
 #include "tcp-mib/tcpConnectionTable/tcpConnectionTable_constants.h"
 #include "tcp-mib/data_access/tcpConn_private.h"
-
+#include "mibgroup/util_funcs.h"
 static int
 linux_states[12] = { 1, 5, 3, 4, 6, 7, 11, 1, 8, 9, 2, 10 };
 
@@ -128,15 +128,16 @@ _load4(netsnmp_container *container, u_i
     while (fgets(line, sizeof(line), in)) {
         netsnmp_tcpconn_entry *entry;
         int             state, rc, local_port, remote_port, tmp_state;
+        unsigned long long inode;
         size_t          buf_len, offset;
         u_char          local_addr[10], remote_addr[10];
         u_char         *tmp_ptr;
 
-        if (5 != (rc = sscanf(line, "%*d: %8[0-9A-Z]:%x %8[0-9A-Z]:%x %x",
+        if (6 != (rc = sscanf(line, "%*d: %8[0-9A-Z]:%x %8[0-9A-Z]:%x %x %*x:%*x %*x:%*x %*x %*x %*x %llu",
                               local_addr, &local_port,
-                              remote_addr, &remote_port, &tmp_state))) {
+                              remote_addr, &remote_port, &tmp_state, &inode))) {
             DEBUGMSGT(("access:tcpconn:container",
-                       "error parsing line (%d != 5)\n", rc));
+                       "error parsing line (%d != 6)\n", rc));
             DEBUGMSGT(("access:tcpconn:container"," line '%s'\n", line));
             continue;
         }
@@ -173,6 +174,7 @@ _load4(netsnmp_container *container, u_i
         entry->loc_port = (unsigned short) local_port;
         entry->rmt_port = (unsigned short) remote_port;
         entry->tcpConnState = state;
+        entry->pid = get_pid_from_inode(inode);
         
         /** the addr string may need work */
         buf_len = strlen(local_addr);
@@ -247,15 +249,26 @@ _load6(netsnmp_container *container, u_i
     int             rc = 0;
     FILE           *in;
     char            line[180];
-    
+    static int      log_open_err = 1;
+
     netsnmp_assert(NULL != container);
 
 #undef PROCFILE
 #define PROCFILE "/proc/net/tcp6"
     if (!(in = fopen(PROCFILE, "r"))) {
         snmp_log(LOG_ERR,"could not open " PROCFILE "\n");
+        if (1 == log_open_err) {
+            snmp_log(LOG_ERR,"could not open " PROCFILE "\n");
+            log_open_err = 0;
+        }
         return -2;
     }
+    /*
+     * if we turned off logging of open errors, turn it back on now that
+     * we have been able to open the file.
+     */
+    if (0 == log_open_err)
+        log_open_err = 1;
     
     fgets(line, sizeof(line), in); /* skip header */
 
@@ -268,15 +281,16 @@ _load6(netsnmp_container *container, u_i
     while (fgets(line, sizeof(line), in)) {
         netsnmp_tcpconn_entry *entry;
         int             state, rc, local_port, remote_port, tmp_state;
+        unsigned long long  inode;
         size_t          buf_len, offset;
         u_char          local_addr[48], remote_addr[48];
         u_char         *tmp_ptr;
 
-        if (5 != (rc = sscanf(line, "%*d: %47[0-9A-Z]:%x %47[0-9A-Z]:%x %x",
+        if (6 != (rc = sscanf(line, "%*d: %47[0-9A-Z]:%x %47[0-9A-Z]:%x %x %*x:%*x %*x:%*x %*x %*x %*x %llu",
                               local_addr, &local_port,
-                              remote_addr, &remote_port, &tmp_state))) {
+                              remote_addr, &remote_port, &tmp_state, &inode))) {
             DEBUGMSGT(("access:tcpconn:container",
-                       "error parsing line (%d != 5)\n", rc));
+                       "error parsing line (%d != 6)\n", rc));
             DEBUGMSGT(("access:tcpconn:container"," line '%s'\n", line));
             continue;
         }
@@ -313,6 +327,7 @@ _load6(netsnmp_container *container, u_i
         entry->loc_port = (unsigned short) local_port;
         entry->rmt_port = (unsigned short) remote_port;
         entry->tcpConnState = state;
+        entry->pid = get_pid_from_inode(inode);
 
         /** the addr string may need work */
         buf_len = strlen((char*)local_addr);
diff -up net-snmp-5.3.2.2/agent/mibgroup/udp-mib/data_access/udp_endpoint_linux.c.tcp-process net-snmp-5.3.2.2/agent/mibgroup/udp-mib/data_access/udp_endpoint_linux.c
--- net-snmp-5.3.2.2/agent/mibgroup/udp-mib/data_access/udp_endpoint_linux.c.tcp-process	2008-07-10 15:05:06.000000000 +0200
+++ net-snmp-5.3.2.2/agent/mibgroup/udp-mib/data_access/udp_endpoint_linux.c	2008-07-10 15:05:08.000000000 +0200
@@ -14,7 +14,7 @@
 #include <net-snmp/data_access/udp_endpoint.h>
 
 #include "udp-mib/udpEndpointTable/udpEndpointTable_constants.h"
-
+#include "mibgroup/util_funcs.h"
 #include "udp_endpoint_private.h"
 
 #include <fcntl.h>
@@ -115,6 +115,8 @@ _process_line_udp_ep(netsnmp_line_info *
     char                 *ptr, *sep;
     u_char               *u_ptr;
     size_t                u_ptr_len, offset, len;
+    unsigned long long    inode;
+    size_t                count = 0;
 
     /*
      * skip 'sl'
@@ -215,6 +217,22 @@ _process_line_udp_ep(netsnmp_line_info *
      */
     ep->instance = 0;
 
+    /*
+     * Use inode as instance value.
+     */
+    while (count != 5) {
+	ptr = skip_white(ptr);
+	ptr = skip_not_white(ptr);
+	count++;
+    }
+    inode = strtoull(ptr, &ptr, 0);
+    ep->instance = (u_int)inode;
+
+    /*
+     * get the pid also
+     */
+    ep->pid = get_pid_from_inode(inode);
+
     ep->index = (u_int)(lpi->user_context);
     lpi->user_context = (void*)((u_int)(lpi->user_context) + 1);
 
diff -up net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable.c.tcp-process net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable.c
--- net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable.c.tcp-process	2006-01-25 17:28:12.000000000 +0100
+++ net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable.c	2008-07-10 15:05:08.000000000 +0200
@@ -223,7 +223,8 @@ udpEndpointTable_indexes_set_tbl_idx(udp
                                      size_t
                                      udpEndpointRemoteAddress_val_ptr_len,
                                      u_long udpEndpointRemotePort_val,
-                                     u_long udpEndpointInstance_val)
+                                     u_long udpEndpointInstance_val,
+                                     u_long udpEndpointProcess_val)
 {
     DEBUGMSGTL(("verbose:udpEndpointTable:udpEndpointTable_indexes_set_tbl_idx", "called\n"));
 
@@ -292,6 +293,10 @@ udpEndpointTable_indexes_set_tbl_idx(udp
      * udpEndpointInstance(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/a/w/e/R/d/h 
      */
     tbl_idx->udpEndpointInstance = udpEndpointInstance_val;
+    /*
+     * udpEndpointProcess(8)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/a/w/e/R/d/h 
+     */
+    tbl_idx->udpEndpointProcess = udpEndpointProcess_val;
 
 
     return MFD_SUCCESS;
@@ -320,7 +325,8 @@ udpEndpointTable_indexes_set(udpEndpoint
                              char *udpEndpointRemoteAddress_val_ptr,
                              size_t udpEndpointRemoteAddress_val_ptr_len,
                              u_long udpEndpointRemotePort_val,
-                             u_long udpEndpointInstance_val)
+                             u_long udpEndpointInstance_val,
+                             u_long udpEndpointProcess_val)
 {
     DEBUGMSGTL(("verbose:udpEndpointTable:udpEndpointTable_indexes_set",
                 "called\n"));
@@ -335,7 +341,8 @@ udpEndpointTable_indexes_set(udpEndpoint
                                              udpEndpointRemoteAddress_val_ptr,
                                              udpEndpointRemoteAddress_val_ptr_len,
                                              udpEndpointRemotePort_val,
-                                             udpEndpointInstance_val))
+                                             udpEndpointInstance_val,
+                                             udpEndpointProcess_val))
         return MFD_ERROR;
 
     /*
@@ -402,9 +409,9 @@ udpEndpointProcess_get(udpEndpointTable_
 
     /*
      * TODO:231:o: |-> Extract the current value of the udpEndpointProcess data.
-     * copy (* udpEndpointProcess_val_ptr ) from rowreq_ctx->data
+     * copy (* udpEndpointProcess_val_ptr ) from rowreq_ctx->tbl_idx.udpEndpointProcess
      */
-    (*udpEndpointProcess_val_ptr) = rowreq_ctx->data.udpEndpointProcess;
+    (*udpEndpointProcess_val_ptr) = rowreq_ctx->tbl_idx.udpEndpointProcess;
 
     return MFD_SUCCESS;
 }                               /* udpEndpointProcess_get */
diff -up net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c.tcp-process net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c
--- net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c.tcp-process	2006-09-19 05:27:05.000000000 +0200
+++ net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c	2008-07-10 15:11:59.000000000 +0200
@@ -265,7 +265,8 @@ udpEndpointTable_container_load(netsnmp_
                                          ep->rmt_addr,
                                          ep->rmt_addr_len,
                                          ep->rmt_port,
-                                         ep->instance)) {
+                                         ep->instance,
+                                         ep->pid)) {
             snmp_log(LOG_ERR,
                      "error setting index while loading "
                      "udpEndpointTable data.\n");
diff -up net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable.h.tcp-process net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable.h
--- net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable.h.tcp-process	2006-01-25 17:28:12.000000000 +0100
+++ net-snmp-5.3.2.2/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable.h	2008-07-10 15:05:08.000000000 +0200
@@ -132,6 +132,11 @@ config_require(udp-mib/udpEndpointTable/
          */
         u_long          udpEndpointInstance;
 
+        /*
+         * udpEndpointProcess(8)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/a/w/e/R/d/h
+         */
+        u_long          udpEndpointProcess;
+
 
     } udpEndpointTable_mib_index;
 
@@ -257,7 +262,9 @@ config_require(udp-mib/udpEndpointTable/
                                              u_long
                                              udpEndpointRemotePort_val,
                                              u_long
-                                             udpEndpointInstance_val);
+                                             udpEndpointInstance_val,
+                                             u_long
+                                             udpEndpointProcess_val);
     int
         udpEndpointTable_indexes_set(udpEndpointTable_rowreq_ctx *
                                      rowreq_ctx,
@@ -273,7 +280,8 @@ config_require(udp-mib/udpEndpointTable/
                                      size_t
                                      udpEndpointRemoteAddress_val_ptr_len,
                                      u_long udpEndpointRemotePort_val,
-                                     u_long udpEndpointInstance_val);
+                                     u_long udpEndpointInstance_val,
+                                     u_long udpEndpointProcess_val);
 
 
 
diff -up net-snmp-5.3.2.2/agent/mibgroup/util_funcs.c.tcp-process net-snmp-5.3.2.2/agent/mibgroup/util_funcs.c
--- net-snmp-5.3.2.2/agent/mibgroup/util_funcs.c.tcp-process	2008-07-10 15:05:08.000000000 +0200
+++ net-snmp-5.3.2.2/agent/mibgroup/util_funcs.c	2008-07-10 15:05:08.000000000 +0200
@@ -89,6 +89,7 @@
 #ifdef HAVE_PTHREAD_H
 #include <pthread.h>
 #endif
+
 #include <net-snmp/net-snmp-includes.h>
 #include <net-snmp/agent/net-snmp-agent-includes.h>
 
@@ -104,6 +105,20 @@
 #else
 #define setPerrorstatus(x) snmp_log_perror(x)
 #endif
+#if HAVE_DIRENT_H
+#include <dirent.h>
+#else
+# define dirent direct
+# if HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif
+# if HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif
+# if HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif
 
 
 #ifdef EXCACHETIME
@@ -363,6 +378,7 @@ get_exec_output(struct extensible *ex)
     
     /* Set global child process handle */
     ex->pid = (int)pi.hProcess;
+    ex->tid = (int)pi.hThread;
 
     /* Close pipe handles to make sure that no handles to the write end of the
      * output pipe are maintained in this process or else the pipe will
@@ -383,7 +399,6 @@ get_exec_output(struct extensible *ex)
     return -1;
 #endif
 }
-
 int
 get_exec_pipes(char *cmd, int *fdIn, int *fdOut, int *pid)
 {
@@ -1265,3 +1280,89 @@ int net_snmp_delete_prefix_info(prefix_c
     return 0;
 }
 #endif
+
+#ifdef linux
+# define PROC_PATH          "/proc"
+# define FILE_DISP          "fd/"
+# define SOCKET_TYPE_1      "socket:["
+# define SOCKET_TYPE_2      "[0000]:"
+
+unsigned long long
+extract_inode(char *format)
+{
+    unsigned long long ret = 0;
+
+    if (!strncmp(format, SOCKET_TYPE_1, 8)) {
+        ret = strtoull(format + 8, NULL, 0);
+    } else if (!strncmp(format, SOCKET_TYPE_2, 7)) {
+        ret = strtoull(format + 7, NULL, 0);
+    }
+
+    return ret;
+}
+
+unsigned int
+get_pid_from_inode(unsigned long long inode)
+{
+    DIR            *procdirs = NULL, *piddirs = NULL;
+    char           *name = NULL;
+    char            path_name[PATH_MAX + 1];
+    char            socket_lnk[NAME_MAX + 1];
+    int             filelen = 0, readlen = 0, iflag = 0;
+    struct dirent  *procinfo, *pidinfo;
+    unsigned int    pid;
+    unsigned long long temp_inode;
+
+    if (!(procdirs = opendir(PROC_PATH))) {
+        snmp_log(LOG_ERR, "snmpd: cannot open /proc\n");       
+        return 0;
+    }
+
+    while ((procinfo = readdir(procdirs)) != NULL) {
+        name = procinfo->d_name;
+        for (; *name; name++) {
+            if (!isdigit(*name))
+                break;
+        }
+        if(*name)
+            continue;
+
+        memset(path_name, '\0', PATH_MAX + 1);
+        filelen = snprintf(path_name, PATH_MAX,
+                           PROC_PATH "/%s/" FILE_DISP, procinfo->d_name);
+        if (filelen <= 0 || PATH_MAX < filelen)
+            continue;
+
+        pid = strtoul(procinfo->d_name, NULL, 0);
+
+        if (!(piddirs = opendir(path_name)))
+            continue;
+
+        while ((pidinfo = readdir(piddirs)) != NULL) {
+            if (filelen + strlen(pidinfo->d_name) > PATH_MAX)
+                continue;
+
+            strcpy(path_name + filelen, pidinfo->d_name);
+
+            memset(socket_lnk, '\0', NAME_MAX + 1);
+            readlen = readlink(path_name, socket_lnk, NAME_MAX);
+            if (readlen < 0)
+                continue;
+            socket_lnk[readlen] = '\0';
+
+            temp_inode = extract_inode(socket_lnk);
+            if (inode == temp_inode) {
+                iflag = 1;
+                break;
+            }
+        }
+        closedir(piddirs);
+        if (iflag == 1)
+            break;
+    }
+    if (procdirs)
+        closedir(procdirs);
+    return pid;
+}
+
+#endif  /* #ifdef linux */
\ No newline at end of file
diff -up net-snmp-5.3.2.2/agent/mibgroup/util_funcs.h.tcp-process net-snmp-5.3.2.2/agent/mibgroup/util_funcs.h
--- net-snmp-5.3.2.2/agent/mibgroup/util_funcs.h.tcp-process	2008-07-10 15:05:08.000000000 +0200
+++ net-snmp-5.3.2.2/agent/mibgroup/util_funcs.h	2008-07-10 15:05:08.000000000 +0200
@@ -45,6 +45,10 @@ void            string_append_int(char *
 void            wait_on_exec(struct extensible *);
 const char     *make_tempfile(void);
 
+#ifdef linux
+unsigned int    get_pid_from_inode(unsigned long long);
+#endif
+
 #define     satosin(x)      ((struct sockaddr_in *) &(x))
 #define     SOCKADDR(x)     (satosin(x)->sin_addr.s_addr)
 #ifndef MIB_STATS_CACHE_TIMEOUT
diff -up net-snmp-5.3.2.2/include/net-snmp/data_access/udp_endpoint.h.tcp-process net-snmp-5.3.2.2/include/net-snmp/data_access/udp_endpoint.h
--- net-snmp-5.3.2.2/include/net-snmp/data_access/udp_endpoint.h.tcp-process	2006-09-19 05:27:05.000000000 +0200
+++ net-snmp-5.3.2.2/include/net-snmp/data_access/udp_endpoint.h	2008-07-10 15:12:55.000000000 +0200
@@ -41,6 +41,7 @@ extern          "C" {
         u_short   rmt_port;
 
         u_int     instance;
+        u_int     pid;
    
     } netsnmp_udp_endpoint_entry;