implement sigar_net_connection_walk for hpux

This commit is contained in:
Doug MacEachern 2006-07-01 18:14:13 +00:00
parent 525c16a5f9
commit 8115fc3f9e
2 changed files with 52 additions and 48 deletions

View File

@ -788,10 +788,10 @@ int sigar_net_interface_stat_get(sigar_t *sigar, const char *name,
return SIGAR_OK; return SIGAR_OK;
} }
static int net_conn_get_udp_listen(sigar_t *sigar, static int net_conn_get_udp_listen(sigar_net_connection_walker_t *walker)
sigar_net_connection_list_t *connlist,
int flags)
{ {
sigar_t *sigar = walker->sigar;
int flags = walker->flags;
int status, count, i; int status, count, i;
unsigned int len; unsigned int len;
mib_udpLsnEnt *entries; mib_udpLsnEnt *entries;
@ -822,37 +822,38 @@ static int net_conn_get_udp_listen(sigar_t *sigar,
} }
for (i=0; i<count; i++) { for (i=0; i<count; i++) {
sigar_net_connection_t *conn; sigar_net_connection_t conn;
mib_udpLsnEnt *entry = &entries[i]; mib_udpLsnEnt *entry = &entries[i];
SIGAR_NET_CONNLIST_GROW(connlist); SIGAR_ZERO(&conn);
conn = &connlist->data[connlist->number++];
conn->type = SIGAR_NETCONN_UDP; conn.type = SIGAR_NETCONN_UDP;
conn->local_port = (unsigned short)entry->LocalPort; conn.local_port = (unsigned short)entry->LocalPort;
conn->remote_port = 0; conn.remote_port = 0;
sigar_inet_ntoa(sigar, entry->LocalAddress, sigar_inet_ntoa(sigar, entry->LocalAddress,
conn->local_address); conn.local_address);
SIGAR_SSTRCPY(conn->remote_address, "0.0.0.0"); SIGAR_SSTRCPY(conn.remote_address, "0.0.0.0");
conn->send_queue = conn->receive_queue = SIGAR_FIELD_NOTIMPL; conn.send_queue = conn.receive_queue = SIGAR_FIELD_NOTIMPL;
if (walker->add_connection(walker, &conn) != SIGAR_OK) {
break;
}
} }
free(entries); free(entries);
return SIGAR_OK; return SIGAR_OK;
} }
static int net_conn_get_udp(sigar_t *sigar, static int net_conn_get_udp(sigar_net_connection_walker_t *walker)
sigar_net_connection_list_t *connlist,
int flags)
{ {
int status = SIGAR_OK; int status = SIGAR_OK;
if (flags & SIGAR_NETCONN_SERVER) { if (walker->flags & SIGAR_NETCONN_SERVER) {
status = net_conn_get_udp_listen(sigar, connlist, flags); status = net_conn_get_udp_listen(walker);
} }
return status; return status;
@ -864,10 +865,10 @@ static int net_conn_get_udp(sigar_t *sigar,
#define IS_TCP_CLIENT(state, flags) \ #define IS_TCP_CLIENT(state, flags) \
((flags & SIGAR_NETCONN_CLIENT) && (state != TCLISTEN)) ((flags & SIGAR_NETCONN_CLIENT) && (state != TCLISTEN))
static int net_conn_get_tcp(sigar_t *sigar, static int net_conn_get_tcp(sigar_net_connection_walker_t *walker)
sigar_net_connection_list_t *connlist,
int flags)
{ {
sigar_t *sigar = walker->sigar;
int flags = walker->flags;
int status, count, i; int status, count, i;
unsigned int len; unsigned int len;
mib_tcpConnEnt *entries; mib_tcpConnEnt *entries;
@ -898,7 +899,7 @@ static int net_conn_get_tcp(sigar_t *sigar,
} }
for (i=0; i<count; i++) { for (i=0; i<count; i++) {
sigar_net_connection_t *conn; sigar_net_connection_t conn;
mib_tcpConnEnt *entry = &entries[i]; mib_tcpConnEnt *entry = &entries[i];
int state = entry->State; int state = entry->State;
@ -908,60 +909,63 @@ static int net_conn_get_tcp(sigar_t *sigar,
continue; continue;
} }
SIGAR_NET_CONNLIST_GROW(connlist); SIGAR_ZERO(&conn);
conn = &connlist->data[connlist->number++];
switch (state) { switch (state) {
case TCCLOSED: case TCCLOSED:
conn->state = SIGAR_TCP_CLOSE; conn.state = SIGAR_TCP_CLOSE;
break; break;
case TCLISTEN: case TCLISTEN:
conn->state = SIGAR_TCP_LISTEN; conn.state = SIGAR_TCP_LISTEN;
break; break;
case TCSYNSENT: case TCSYNSENT:
conn->state = SIGAR_TCP_SYN_SENT; conn.state = SIGAR_TCP_SYN_SENT;
break; break;
case TCSYNRECEIVE: case TCSYNRECEIVE:
conn->state = SIGAR_TCP_SYN_RECV; conn.state = SIGAR_TCP_SYN_RECV;
break; break;
case TCESTABLISED: case TCESTABLISED:
conn->state = SIGAR_TCP_ESTABLISHED; conn.state = SIGAR_TCP_ESTABLISHED;
break; break;
case TCFINWAIT1: case TCFINWAIT1:
conn->state = SIGAR_TCP_FIN_WAIT1; conn.state = SIGAR_TCP_FIN_WAIT1;
break; break;
case TCFINWAIT2: case TCFINWAIT2:
conn->state = SIGAR_TCP_FIN_WAIT2; conn.state = SIGAR_TCP_FIN_WAIT2;
break; break;
case TCCLOSEWAIT: case TCCLOSEWAIT:
conn->state = SIGAR_TCP_CLOSE_WAIT; conn.state = SIGAR_TCP_CLOSE_WAIT;
break; break;
case TCCLOSING: case TCCLOSING:
conn->state = SIGAR_TCP_CLOSING; conn.state = SIGAR_TCP_CLOSING;
break; break;
case TCLASTACK: case TCLASTACK:
conn->state = SIGAR_TCP_LAST_ACK; conn.state = SIGAR_TCP_LAST_ACK;
break; break;
case TCTIMEWAIT: case TCTIMEWAIT:
conn->state = SIGAR_TCP_TIME_WAIT; conn.state = SIGAR_TCP_TIME_WAIT;
break; break;
case TCDELETETCB: case TCDELETETCB:
default: default:
conn->state = SIGAR_TCP_UNKNOWN; conn.state = SIGAR_TCP_UNKNOWN;
break; break;
} }
conn->local_port = (unsigned short)entry->LocalPort; conn.local_port = (unsigned short)entry->LocalPort;
conn->remote_port = (unsigned short)entry->RemPort; conn.remote_port = (unsigned short)entry->RemPort;
conn->type = SIGAR_NETCONN_TCP; conn.type = SIGAR_NETCONN_TCP;
sigar_inet_ntoa(sigar, entry->LocalAddress, sigar_inet_ntoa(sigar, entry->LocalAddress,
conn->local_address); conn.local_address);
sigar_inet_ntoa(sigar, entry->RemAddress, sigar_inet_ntoa(sigar, entry->RemAddress,
conn->remote_address); conn.remote_address);
conn->send_queue = conn->receive_queue = SIGAR_FIELD_NOTIMPL; conn.send_queue = conn.receive_queue = SIGAR_FIELD_NOTIMPL;
if (walker->add_connection(walker, &conn) != SIGAR_OK) {
break;
}
} }
free(entries); free(entries);
@ -969,16 +973,14 @@ static int net_conn_get_tcp(sigar_t *sigar,
return SIGAR_OK; return SIGAR_OK;
} }
int sigar_net_connection_list_get(sigar_t *sigar, int sigar_net_connection_walk(sigar_net_connection_walker_t *walker)
sigar_net_connection_list_t *connlist,
int flags)
{ {
sigar_t *sigar = walker->sigar;
int flags = walker->flags;
int status; int status;
sigar_net_connection_list_create(connlist);
if (flags & SIGAR_NETCONN_TCP) { if (flags & SIGAR_NETCONN_TCP) {
status = net_conn_get_tcp(sigar, connlist, flags); status = net_conn_get_tcp(walker);
if (status != SIGAR_OK) { if (status != SIGAR_OK) {
return status; return status;
@ -986,7 +988,7 @@ int sigar_net_connection_list_get(sigar_t *sigar,
} }
if (flags & SIGAR_NETCONN_UDP) { if (flags & SIGAR_NETCONN_UDP) {
status = net_conn_get_udp(sigar, connlist, flags); status = net_conn_get_udp(walker);
if (status != SIGAR_OK) { if (status != SIGAR_OK) {
return status; return status;

View File

@ -19,4 +19,6 @@ struct sigar_t {
int hpux_get_mib_ifentry(int ppa, mib_ifEntry *mib); int hpux_get_mib_ifentry(int ppa, mib_ifEntry *mib);
#define SIGAR_USE_NET_CONNECTION_LIST_WALKER
#endif /* SIGAR_OS_H */ #endif /* SIGAR_OS_H */