/* * tcpConnTable MIB architecture support * * $Id: tcpConn_linux.c,v 1.2 2004/10/16 03:35:15 rstory Exp $ */ #include #include #include #include #include "tcp-mib/tcpConnTable/tcpConnTable_constants.h" /* * initialize arch specific storage * * @retval 0: success * @retval <0: error */ int netsnmp_arch_tcpconn_entry_init(netsnmp_tcpconn_entry *entry) { /* * init */ return 0; } /* * cleanup arch specific storage */ void netsnmp_arch_tcpconn_entry_cleanup(netsnmp_tcpconn_entry *entry) { /* * cleanup */ } /* * copy arch specific storage */ int netsnmp_arch_tcpconn_entry_copy(netsnmp_tcpconn_entry *lhs, netsnmp_tcpconn_entry *rhs) { return 0; } /* * delete an entry */ int netsnmp_arch_tcpconn_delete(netsnmp_tcpconn_entry *entry) { if (NULL == entry) return -1; #warning "tcpConn delete" return -1; } /** * * @retval 0 no errors * @retval !0 errors */ int netsnmp_arch_tcpconn_container_load(netsnmp_container *container) { int rc = 0; FILE *in; char line[160]; u_char *buf; netsnmp_tcpconn_entry *entry; netsnmp_assert(NULL != container); #define PROCFILE "/proc/net/tcp" if (!(in = fopen(PROCFILE, "r"))) { snmp_log(LOG_ERR,"could not open " PROCFILE "\n"); return -2; } fgets(line, sizeof(line), in); /* skip header */ /* * sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode * 0: 00000000:8000 00000000:0000 0A 00000000:00000000 00:00000000 00000000 29 0 1028 1 df7b1b80 300 0 0 2 -1 */ while (fgets(line, sizeof(line), in)) { netsnmp_tcpconn_entry *entry; static int linux_states[12] = { 1, 5, 3, 4, 6, 7, 11, 1, 8, 9, 2, 10 }; int state, rc, local_port, remote_port; /* */ entry = netsnmp_access_tcpconn_entry_create(); if(NULL == entry) { rc = -3; break; } if (5 != (rc = sscanf(line, "%*d: %x:%x %x:%x %x", &entry->indexes[NETSNMP_TCPCONN_IDX_LOCAL_ADDR], &local_port, &entry->indexes[NETSNMP_TCPCONN_IDX_REMOTE_ADDR], &remote_port, &state))) { DEBUGMSGT(("access:tcpconn:container", "error parsing line (%d != 5)\n", rc)); DEBUGMSGT(("access:tcpconn:container"," line '%s'\n", line)); netsnmp_access_tcpconn_entry_free(entry); continue; } DEBUGMSGT(("verbose:access:tcpconn:container"," line '%s'\n", line)); entry->indexes[NETSNMP_TCPCONN_IDX_LOCAL_PORT] = htons((unsigned short) local_port); entry->indexes[NETSNMP_TCPCONN_IDX_REMOTE_PORT] = htons((unsigned short) remote_port); entry->tcpConnState = (state & 0xf) < 12 ? linux_states[state & 0xf] : 2; /* * add entry to container */ CONTAINER_INSERT(container, entry); } fclose(in); if(rc<0) return rc; return 0; }