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;