mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-28 13:00:45 +00:00
Use inet_ntop(), thanks to pavelo for telling me about this
This commit is contained in:
parent
70b6f35a84
commit
723255f142
18
src/linux.cc
18
src/linux.cc
@ -347,6 +347,21 @@ void print_gateway_ip(struct text_object *obj, char *p, int p_max_size)
|
|||||||
snprintf(p, p_max_size, "%s", gw_info.ip);
|
snprintf(p, p_max_size, "%s", gw_info.ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u_int8_t hextobyte(const char in[2]) {
|
||||||
|
u_int8_t out=0;
|
||||||
|
char currentchar;
|
||||||
|
|
||||||
|
for(int i=0; i<2; i++) {
|
||||||
|
currentchar=in[i];
|
||||||
|
if(currentchar <= '9') currentchar -= '0';
|
||||||
|
else if(currentchar <= 'A') currentchar -= 'A' - 10;
|
||||||
|
else currentchar -= 'a' - 10;
|
||||||
|
out<<=4;
|
||||||
|
out+=currentchar;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
int update_net_stats(void)
|
int update_net_stats(void)
|
||||||
{
|
{
|
||||||
FILE *net_dev_fp;
|
FILE *net_dev_fp;
|
||||||
@ -590,7 +605,8 @@ int update_net_stats(void)
|
|||||||
lastv6->next = (struct v6addr *) malloc(sizeof(struct v6addr));
|
lastv6->next = (struct v6addr *) malloc(sizeof(struct v6addr));
|
||||||
lastv6 = lastv6->next;
|
lastv6 = lastv6->next;
|
||||||
}
|
}
|
||||||
strncpy(lastv6->addr, v6addr, 32);
|
for(int i=0; i<16; i++)
|
||||||
|
lastv6->addr.s6_addr[i]=hextobyte(v6addr+2*i);
|
||||||
lastv6->netmask = netmask;
|
lastv6->netmask = netmask;
|
||||||
switch(scope) {
|
switch(scope) {
|
||||||
case 0: //global
|
case 0: //global
|
||||||
|
@ -236,6 +236,7 @@ void print_v6addrs(struct text_object *obj, char *p, int p_max_size)
|
|||||||
{
|
{
|
||||||
struct net_stat *ns = (struct net_stat *)obj->data.opaque;
|
struct net_stat *ns = (struct net_stat *)obj->data.opaque;
|
||||||
char *current_char = p;
|
char *current_char = p;
|
||||||
|
char tempaddress[INET6_ADDRSTRLEN];
|
||||||
struct v6addr *current_v6 = ns->v6addrs;
|
struct v6addr *current_v6 = ns->v6addrs;
|
||||||
|
|
||||||
if (!ns)
|
if (!ns)
|
||||||
@ -248,37 +249,9 @@ void print_v6addrs(struct text_object *obj, char *p, int p_max_size)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while(current_v6) {
|
while(current_v6) {
|
||||||
char extracompress = 0; //0 until the first '0000', 1 after the first '0000', 2 after the first non-'0000' after a '0000'
|
inet_ntop(AF_INET6, &(current_v6->addr), tempaddress, INET6_ADDRSTRLEN);
|
||||||
for(int i=0; i<8; i++) { //loop trough the 8 parts of the ipv6
|
strcpy(current_char, tempaddress);
|
||||||
//skip the zeros in front of each part
|
current_char+=strlen(current_char);
|
||||||
int j=0;
|
|
||||||
while(j<4) if(*(current_v6->addr+(i*4)+j) == '0') j++; else break;
|
|
||||||
if(j==4) {
|
|
||||||
if(*(current_v6->addr+(i*4)+3) == '0') { //4 zeros
|
|
||||||
switch(extracompress) {
|
|
||||||
case 0: //first time this happens, so replace by '::'
|
|
||||||
*current_char = ':';
|
|
||||||
current_char++;
|
|
||||||
if(current_char == p+1) { //to make sure there is no ':::' when the first '0000' isn't at the beginning
|
|
||||||
*current_char = ':';
|
|
||||||
current_char++;
|
|
||||||
}
|
|
||||||
extracompress=1;
|
|
||||||
continue;
|
|
||||||
case 1: //again, ignore them, they are included in the '::'
|
|
||||||
continue;
|
|
||||||
default: //again, but only remove the first 3 zero's because extra-compression may no longer be applied
|
|
||||||
j=3; //but if there are 4 zero's, keep the last
|
|
||||||
}
|
|
||||||
} else j=0; //no zeros to skip
|
|
||||||
}
|
|
||||||
if(extracompress == 1) extracompress = 2;
|
|
||||||
//place each part followed by : in the ip
|
|
||||||
strncpy(current_char, current_v6->addr+(i*4)+j, 4-j);
|
|
||||||
*(current_char+4-j)=':';
|
|
||||||
current_char+=5-j;
|
|
||||||
}
|
|
||||||
current_char--;
|
|
||||||
//netmask
|
//netmask
|
||||||
if(ns->v6show_nm) {
|
if(ns->v6show_nm) {
|
||||||
char netmaskstr[5]; //max 5 chars (/128 + null-terminator)
|
char netmaskstr[5]; //max 5 chars (/128 + null-terminator)
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
#ifdef BUILD_IPV6
|
#ifdef BUILD_IPV6
|
||||||
struct v6addr {
|
struct v6addr {
|
||||||
char addr[32];
|
struct in6_addr addr;
|
||||||
unsigned int netmask;
|
unsigned int netmask;
|
||||||
char scope;
|
char scope;
|
||||||
struct v6addr *next;
|
struct v6addr *next;
|
||||||
|
Loading…
Reference in New Issue
Block a user