store net_connection addresses in binary rather than string
This commit is contained in:
		
							parent
							
								
									196c91703c
								
							
						
					
					
						commit
						e4303ee612
					
				@ -783,7 +783,7 @@ my %classes = (
 | 
			
		||||
         plat => 'LFSW'
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
         name => 'local_address', type => 'String',
 | 
			
		||||
         name => 'local_address', type => 'NetAddress',
 | 
			
		||||
         desc => '',
 | 
			
		||||
         plat => 'LFSW'
 | 
			
		||||
      },
 | 
			
		||||
@ -793,7 +793,7 @@ my %classes = (
 | 
			
		||||
         plat => 'LFSW'
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
         name => 'remote_address', type => 'String',
 | 
			
		||||
         name => 'remote_address', type => 'NetAddress',
 | 
			
		||||
         desc => '',
 | 
			
		||||
         plat => 'LFSW'
 | 
			
		||||
      },
 | 
			
		||||
@ -1070,7 +1070,7 @@ my %pfields = (
 | 
			
		||||
    NetAddr => "Sigar::NetAddr",
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
$jfields{'NetAddr'} = $jfields{'String'};
 | 
			
		||||
$jfields{'NetAddress'} = $jfields{'NetAddr'} = $jfields{'String'};
 | 
			
		||||
 | 
			
		||||
my %jinit = (
 | 
			
		||||
    String => 'null',
 | 
			
		||||
@ -1082,7 +1082,7 @@ my %jtype = (
 | 
			
		||||
 | 
			
		||||
#alias
 | 
			
		||||
for my $j (\%jfields, \%jinit, \%jtype) {
 | 
			
		||||
    $j->{'NetAddr'} = $j->{'String'};
 | 
			
		||||
    $j->{'NetAddress'} = $j->{'NetAddr'} = $j->{'String'};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my %func_alias = (
 | 
			
		||||
 | 
			
		||||
@ -309,6 +309,15 @@ static jstring jinet_ntoa(JNIEnv *env, sigar_t *sigar, sigar_uint64_t val) {
 | 
			
		||||
#define SetNetAddrField(env, obj, fieldID, val) \
 | 
			
		||||
    SetObjectField(env, obj, fieldID, jinet_ntoa(env, sigar, val))
 | 
			
		||||
 | 
			
		||||
static jstring jnet_address_to_string(JNIEnv *env, sigar_t *sigar, sigar_net_address_t *val) {
 | 
			
		||||
    char addr_str[INET6_ADDRSTRLEN];
 | 
			
		||||
    sigar_net_address_to_string(sigar, val, addr_str);
 | 
			
		||||
    return JENV->NewStringUTF(env, addr_str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define SetNetAddressField(env, obj, fieldID, val) \
 | 
			
		||||
    SetObjectField(env, obj, fieldID, jnet_address_to_string(env, sigar, &val))
 | 
			
		||||
 | 
			
		||||
#include "javasigar_generated.c"
 | 
			
		||||
 | 
			
		||||
#define SIGAR_ALLOC_OBJECT(name) \
 | 
			
		||||
 | 
			
		||||
@ -391,6 +391,22 @@ sigar_file_system_usage_get(sigar_t *sigar,
 | 
			
		||||
                            const char *dirname,
 | 
			
		||||
                            sigar_file_system_usage_t *fsusage);
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    enum {
 | 
			
		||||
        SIGAR_AF_UNSPEC,
 | 
			
		||||
        SIGAR_AF_INET,
 | 
			
		||||
        SIGAR_AF_INET6
 | 
			
		||||
    } family;
 | 
			
		||||
    union {
 | 
			
		||||
        sigar_uint32_t in;
 | 
			
		||||
        sigar_uint32_t in6[4];
 | 
			
		||||
    } addr;
 | 
			
		||||
} sigar_net_address_t;
 | 
			
		||||
 | 
			
		||||
SIGAR_DECLARE(int) sigar_net_address_to_string(sigar_t *sigar,
 | 
			
		||||
                                               sigar_net_address_t *address,
 | 
			
		||||
                                               char *addr_str);
 | 
			
		||||
 | 
			
		||||
#ifndef INET6_ADDRSTRLEN
 | 
			
		||||
#   define INET6_ADDRSTRLEN 46
 | 
			
		||||
#endif
 | 
			
		||||
@ -546,9 +562,9 @@ enum {
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    unsigned long local_port;
 | 
			
		||||
    char local_address[INET6_ADDRSTRLEN];
 | 
			
		||||
    sigar_net_address_t local_address;
 | 
			
		||||
    unsigned long remote_port;
 | 
			
		||||
    char remote_address[INET6_ADDRSTRLEN];
 | 
			
		||||
    sigar_net_address_t remote_address;
 | 
			
		||||
    sigar_uid_t uid;
 | 
			
		||||
    unsigned long inode;
 | 
			
		||||
    int type;
 | 
			
		||||
 | 
			
		||||
@ -192,6 +192,14 @@ int sigar_net_connection_list_grow(sigar_net_connection_list_t *connlist);
 | 
			
		||||
        sigar_net_connection_list_grow(connlist); \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#define sigar_net_address_set(a, val) \
 | 
			
		||||
    (a).addr.in = val; \
 | 
			
		||||
    (a).family = SIGAR_AF_INET
 | 
			
		||||
 | 
			
		||||
#define sigar_net_address6_set(addr, val) \
 | 
			
		||||
    memcpy(&((a).addr.in6), val, sizeof((a).addr.in6)); \
 | 
			
		||||
    (a).family = SIGAR_AF_INET6
 | 
			
		||||
 | 
			
		||||
int sigar_who_list_create(sigar_who_list_t *wholist);
 | 
			
		||||
 | 
			
		||||
int sigar_who_list_grow(sigar_who_list_t *wholist);
 | 
			
		||||
 | 
			
		||||
@ -1685,27 +1685,23 @@ int sigar_net_interface_stat_get(sigar_t *sigar, const char *name,
 | 
			
		||||
    return found ? SIGAR_OK : ENXIO;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static SIGAR_INLINE int ip_format(char *buffer, int buflen, char *ptr, int len)
 | 
			
		||||
static SIGAR_INLINE void convert_hex_address(sigar_net_address_t *address,
 | 
			
		||||
                                             char *ptr, int len)
 | 
			
		||||
{
 | 
			
		||||
    if (len > HEX_ENT_LEN) {
 | 
			
		||||
        struct in6_addr addr;
 | 
			
		||||
        int i;
 | 
			
		||||
        for (i=0; i<=3; i++, ptr+=HEX_ENT_LEN) {
 | 
			
		||||
            addr.s6_addr32[i] = hex2int(ptr, HEX_ENT_LEN);
 | 
			
		||||
        }
 | 
			
		||||
        if (!inet_ntop(AF_INET6, &addr, buffer, buflen)) {
 | 
			
		||||
            return errno;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        struct in_addr addr;
 | 
			
		||||
        addr.s_addr = (len == HEX_ENT_LEN) ? hex2int(ptr, HEX_ENT_LEN) : 0;
 | 
			
		||||
        if (!inet_ntop(AF_INET, &addr, buffer, buflen)) {
 | 
			
		||||
            return errno;
 | 
			
		||||
        }
 | 
			
		||||
            address->addr.in6[i] = hex2int(ptr, HEX_ENT_LEN);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
        address->family = SIGAR_AF_INET6;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        address->addr.in =
 | 
			
		||||
            (len == HEX_ENT_LEN) ? hex2int(ptr, HEX_ENT_LEN) : 0;
 | 
			
		||||
 | 
			
		||||
        address->family = SIGAR_AF_INET;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
@ -1761,7 +1757,7 @@ static int proc_net_read(sigar_net_connection_walker_t *walker,
 | 
			
		||||
        sigar_net_connection_t conn;
 | 
			
		||||
        char *laddr, *raddr;
 | 
			
		||||
        int laddr_len=0, raddr_len=0;
 | 
			
		||||
        int status, more;
 | 
			
		||||
        int more;
 | 
			
		||||
 | 
			
		||||
        /* skip leading space */
 | 
			
		||||
        SKIP_WHILE(ptr, ' ');
 | 
			
		||||
@ -1799,22 +1795,12 @@ static int proc_net_read(sigar_net_connection_walker_t *walker,
 | 
			
		||||
 | 
			
		||||
        conn.type = type;
 | 
			
		||||
 | 
			
		||||
        status = ip_format(conn.local_address,
 | 
			
		||||
                           sizeof(conn.local_address),
 | 
			
		||||
        convert_hex_address(&conn.local_address,
 | 
			
		||||
                            laddr, laddr_len);
 | 
			
		||||
 | 
			
		||||
        if (status != SIGAR_OK) {
 | 
			
		||||
            return status;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        status = ip_format(conn.remote_address,
 | 
			
		||||
                           sizeof(conn.remote_address),
 | 
			
		||||
        convert_hex_address(&conn.remote_address,
 | 
			
		||||
                            raddr, raddr_len);
 | 
			
		||||
 | 
			
		||||
        if (status != SIGAR_OK) {
 | 
			
		||||
            return status;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* SIGAR_TCP_* currently matches TCP_* in linux/tcp.h */
 | 
			
		||||
        conn.state = hex2int(ptr, 2);
 | 
			
		||||
        ptr += 2;
 | 
			
		||||
 | 
			
		||||
@ -2032,7 +2032,6 @@ static int tcp_connection_get(sigar_net_connection_walker_t *walker,
 | 
			
		||||
                              struct mib2_tcpConnEntry *entry,
 | 
			
		||||
                              int len)
 | 
			
		||||
{
 | 
			
		||||
    sigar_t *sigar = walker->sigar;
 | 
			
		||||
    int flags = walker->flags;
 | 
			
		||||
    int status;
 | 
			
		||||
    char *end = (char *)entry + len;
 | 
			
		||||
@ -2047,11 +2046,8 @@ static int tcp_connection_get(sigar_net_connection_walker_t *walker,
 | 
			
		||||
 | 
			
		||||
            SIGAR_ZERO(&conn);
 | 
			
		||||
 | 
			
		||||
            sigar_inet_ntoa(sigar, entry->tcpConnLocalAddress,
 | 
			
		||||
                            conn.local_address);
 | 
			
		||||
 | 
			
		||||
            sigar_inet_ntoa(sigar, entry->tcpConnRemAddress,
 | 
			
		||||
                            conn.remote_address);
 | 
			
		||||
            sigar_net_address_set(conn.local_address, entry->tcpConnLocalAddress);
 | 
			
		||||
            sigar_net_address_set(conn.remote_address, entry->tcpConnRemAddress);
 | 
			
		||||
 | 
			
		||||
            conn.local_port = entry->tcpConnLocalPort;
 | 
			
		||||
            conn.remote_port = entry->tcpConnRemPort;
 | 
			
		||||
@ -2124,7 +2120,6 @@ static int udp_connection_get(sigar_net_connection_walker_t *walker,
 | 
			
		||||
                              struct mib2_udpEntry *entry,
 | 
			
		||||
                              int len)
 | 
			
		||||
{
 | 
			
		||||
    sigar_t *sigar = walker->sigar;
 | 
			
		||||
    int flags = walker->flags;
 | 
			
		||||
    int status;
 | 
			
		||||
    char *end = (char *)entry + len;
 | 
			
		||||
@ -2140,9 +2135,9 @@ static int udp_connection_get(sigar_net_connection_walker_t *walker,
 | 
			
		||||
 | 
			
		||||
            SIGAR_ZERO(&conn);
 | 
			
		||||
 | 
			
		||||
            sigar_inet_ntoa(sigar, entry->udpLocalAddress,
 | 
			
		||||
                            conn.local_address);
 | 
			
		||||
            SIGAR_SSTRCPY(conn.remote_address, "0.0.0.0");
 | 
			
		||||
            sigar_net_address_set(conn.local_address, entry->udpLocalAddress);
 | 
			
		||||
            sigar_net_address_set(conn.remote_address, 0);
 | 
			
		||||
 | 
			
		||||
            conn.local_port = entry->udpLocalPort;
 | 
			
		||||
            conn.remote_port = 0;
 | 
			
		||||
            conn.type = SIGAR_NETCONN_UDP;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								src/sigar.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								src/sigar.c
									
									
									
									
									
								
							@ -1634,6 +1634,32 @@ SIGAR_DECLARE(int) sigar_inet_ntoa(sigar_t *sigar,
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SIGAR_DECLARE(int) sigar_net_address_to_string(sigar_t *sigar,
 | 
			
		||||
                                               sigar_net_address_t *address,
 | 
			
		||||
                                               char *addr_str)
 | 
			
		||||
{
 | 
			
		||||
    switch (address->family) {
 | 
			
		||||
      case SIGAR_AF_INET6:
 | 
			
		||||
#if defined(__linux__) /*XXX*/
 | 
			
		||||
        if (inet_ntop(AF_INET6, (const void *)&address->addr.in6,
 | 
			
		||||
                      addr_str, INET6_ADDRSTRLEN))
 | 
			
		||||
        {
 | 
			
		||||
            return SIGAR_OK;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            return errno;
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
      case SIGAR_AF_INET:
 | 
			
		||||
        return sigar_inet_ntoa(sigar, address->addr.in, addr_str);
 | 
			
		||||
      case SIGAR_AF_UNSPEC:
 | 
			
		||||
      default:
 | 
			
		||||
        return EINVAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int fqdn_ip_get(sigar_t *sigar, char *name)
 | 
			
		||||
{
 | 
			
		||||
    int i, status;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user