start alternative to sigar_net_connection_list_get

This commit is contained in:
Doug MacEachern 2006-06-15 20:50:00 +00:00
parent f2e9982659
commit b279cfa785
2 changed files with 69 additions and 38 deletions

View File

@ -567,6 +567,17 @@ SIGAR_DECLARE(int)
sigar_net_connection_list_destroy(sigar_t *sigar, sigar_net_connection_list_destroy(sigar_t *sigar,
sigar_net_connection_list_t *connlist); sigar_net_connection_list_t *connlist);
typedef struct sigar_net_connection_walker_t sigar_net_connection_walker_t;
/* alternative to sigar_net_connection_list_get */
struct sigar_net_connection_walker_t {
sigar_t *sigar;
int flags;
void *data; /* user data */
int (*add_connection)(sigar_net_connection_walker_t *walker,
sigar_net_connection_t *connection);
};
SIGAR_DECLARE(const char *)sigar_net_connection_type_get(int type); SIGAR_DECLARE(const char *)sigar_net_connection_type_get(int type);
SIGAR_DECLARE(const char *)sigar_net_connection_state_get(int state); SIGAR_DECLARE(const char *)sigar_net_connection_state_get(int state);

View File

@ -1691,14 +1691,36 @@ typedef struct {
unsigned long port; unsigned long port;
} net_conn_getter_t; } net_conn_getter_t;
#define CONN_GET_DONE -2 static int proc_net_walker(sigar_net_connection_walker_t *walker,
sigar_net_connection_t *conn)
{
net_conn_getter_t *getter =
(net_conn_getter_t *)walker->data;
static int proc_net_read(net_conn_getter_t *getter, if (getter->connlist) {
SIGAR_NET_CONNLIST_GROW(getter->connlist);
memcpy(&getter->connlist->data[getter->connlist->number++],
conn, sizeof(*conn));
}
else {
if ((getter->port == conn->local_port) &&
(conn->remote_port == 0))
{
memcpy(getter->conn, conn, sizeof(*conn));
return !SIGAR_OK; /* break loop */
}
}
return SIGAR_OK; /* continue loop */
}
static int proc_net_read(sigar_net_connection_walker_t *walker,
const char *fname, const char *fname,
int flags, int type) int type)
{ {
FILE *fp; FILE *fp;
char buffer[8192], *ptr; char buffer[8192], *ptr;
int flags = walker->flags;
if (!(fp = fopen(fname, "r"))) { if (!(fp = fopen(fname, "r"))) {
return errno; return errno;
@ -1710,7 +1732,7 @@ static int proc_net_read(net_conn_getter_t *getter,
sigar_net_connection_t conn; sigar_net_connection_t conn;
char *port = NULL; char *port = NULL;
char *laddr, *raddr; char *laddr, *raddr;
int status; int status, more;
SIGAR_SKIP_SPACE(ptr); SIGAR_SKIP_SPACE(ptr);
if (IS_NULL_PTR(ptr)) { if (IS_NULL_PTR(ptr)) {
@ -1820,19 +1842,10 @@ static int proc_net_read(net_conn_getter_t *getter,
conn.inode = sigar_strtoul(ptr); conn.inode = sigar_strtoul(ptr);
if (getter->connlist) { more = walker->add_connection(walker, &conn);
SIGAR_NET_CONNLIST_GROW(getter->connlist); if (more != SIGAR_OK) {
memcpy(&getter->connlist->data[getter->connlist->number++],
&conn, sizeof(conn));
}
else {
if ((getter->port == conn.local_port) &&
(conn.remote_port == 0))
{
memcpy(getter->conn, &conn, sizeof(conn));
fclose(fp); fclose(fp);
return CONN_GET_DONE; return SIGAR_OK;
}
} }
} }
@ -1841,24 +1854,23 @@ static int proc_net_read(net_conn_getter_t *getter,
return SIGAR_OK; return SIGAR_OK;
} }
static int net_conn_get(sigar_t *sigar, static int net_conn_get(sigar_net_connection_walker_t *walker)
net_conn_getter_t *getter,
int flags)
{ {
int flags = walker->flags;
int status; int status;
if (flags & SIGAR_NETCONN_TCP) { if (flags & SIGAR_NETCONN_TCP) {
status = proc_net_read(getter, status = proc_net_read(walker,
PROC_FS_ROOT "net/tcp", PROC_FS_ROOT "net/tcp",
flags, SIGAR_NETCONN_TCP); SIGAR_NETCONN_TCP);
if (status != SIGAR_OK) { if (status != SIGAR_OK) {
return status; return status;
} }
status = proc_net_read(getter, status = proc_net_read(walker,
PROC_FS_ROOT "net/tcp6", PROC_FS_ROOT "net/tcp6",
flags, SIGAR_NETCONN_TCP); SIGAR_NETCONN_TCP);
if (!((status == SIGAR_OK) || (status == ENOENT))) { if (!((status == SIGAR_OK) || (status == ENOENT))) {
return status; return status;
@ -1866,17 +1878,17 @@ static int net_conn_get(sigar_t *sigar,
} }
if (flags & SIGAR_NETCONN_UDP) { if (flags & SIGAR_NETCONN_UDP) {
status = proc_net_read(getter, status = proc_net_read(walker,
PROC_FS_ROOT "net/udp", PROC_FS_ROOT "net/udp",
flags, SIGAR_NETCONN_UDP); SIGAR_NETCONN_UDP);
if (status != SIGAR_OK) { if (status != SIGAR_OK) {
return status; return status;
} }
status = proc_net_read(getter, status = proc_net_read(walker,
PROC_FS_ROOT "net/udp6", PROC_FS_ROOT "net/udp6",
flags, SIGAR_NETCONN_UDP); SIGAR_NETCONN_UDP);
if (!((status == SIGAR_OK) || (status == ENOENT))) { if (!((status == SIGAR_OK) || (status == ENOENT))) {
return status; return status;
@ -1884,17 +1896,17 @@ static int net_conn_get(sigar_t *sigar,
} }
if (flags & SIGAR_NETCONN_RAW) { if (flags & SIGAR_NETCONN_RAW) {
status = proc_net_read(getter, status = proc_net_read(walker,
PROC_FS_ROOT "net/raw", PROC_FS_ROOT "net/raw",
flags, SIGAR_NETCONN_RAW); SIGAR_NETCONN_RAW);
if (status != SIGAR_OK) { if (status != SIGAR_OK) {
return status; return status;
} }
status = proc_net_read(getter, status = proc_net_read(walker,
PROC_FS_ROOT "net/raw6", PROC_FS_ROOT "net/raw6",
flags, SIGAR_NETCONN_RAW); SIGAR_NETCONN_RAW);
if (!((status == SIGAR_OK) || (status == ENOENT))) { if (!((status == SIGAR_OK) || (status == ENOENT))) {
return status; return status;
@ -1911,6 +1923,7 @@ int sigar_net_connection_list_get(sigar_t *sigar,
int flags) int flags)
{ {
int status; int status;
sigar_net_connection_walker_t walker;
net_conn_getter_t getter; net_conn_getter_t getter;
sigar_net_connection_list_create(connlist); sigar_net_connection_list_create(connlist);
@ -1918,7 +1931,12 @@ int sigar_net_connection_list_get(sigar_t *sigar,
getter.conn = NULL; getter.conn = NULL;
getter.connlist = connlist; getter.connlist = connlist;
status = net_conn_get(sigar, &getter, flags); walker.sigar = sigar;
walker.flags = flags;
walker.data = &getter;
walker.add_connection = proc_net_walker;
status = net_conn_get(&walker);
if (status != SIGAR_OK) { if (status != SIGAR_OK) {
sigar_net_connection_list_destroy(sigar, connlist); sigar_net_connection_list_destroy(sigar, connlist);
@ -1933,17 +1951,19 @@ static int sigar_net_connection_get(sigar_t *sigar,
int flags) int flags)
{ {
int status; int status;
sigar_net_connection_walker_t walker;
net_conn_getter_t getter; net_conn_getter_t getter;
getter.conn = netconn; getter.conn = netconn;
getter.connlist = NULL; getter.connlist = NULL;
getter.port = port; getter.port = port;
status = net_conn_get(sigar, &getter, flags); walker.sigar = sigar;
walker.flags = flags;
walker.data = &getter;
walker.add_connection = proc_net_walker;
if (status == CONN_GET_DONE) { status = net_conn_get(&walker);
return SIGAR_OK;
}
return status; return status;
} }