From: Christian Dietrich Date: Mon, 5 Apr 2010 13:47:56 +0000 (+0200) Subject: ipv6: provide format strings for ipv6 up and ipv6 down X-Git-Tag: 2.1~4 X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3status;a=commitdiff_plain;h=8edce057640ec4e4d1d644317a585495de4f1865 ipv6: provide format strings for ipv6 up and ipv6 down --- diff --git a/i3status.c b/i3status.c index 2486480..903ea92 100644 --- a/i3status.c +++ b/i3status.c @@ -92,7 +92,8 @@ int main(int argc, char *argv[]) { }; cfg_opt_t ipv6_opts[] = { - CFG_STR("format", "%ip", CFGF_NONE), + CFG_STR("format_up", "%ip", CFGF_NONE), + CFG_STR("format_down", "no IPv6", CFGF_NONE), CFG_END() }; @@ -198,7 +199,7 @@ int main(int argc, char *argv[]) { const char *current = cfg_getnstr(cfg, "order", j); CASE_SEC("ipv6") - print_ipv6_info(cfg_getstr(sec, "format")); + print_ipv6_info(cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down")); CASE_SEC_TITLE("wireless") print_wireless_info(title, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down")); diff --git a/i3status.h b/i3status.h index 4c7d4b4..49bd387 100644 --- a/i3status.h +++ b/i3status.h @@ -58,7 +58,7 @@ void print_seperator(); char *color(const char *colorstr); char *endcolor() __attribute__ ((pure)); -void print_ipv6_info(const char *format); +void print_ipv6_info(const char *format_up, const char *format_down); void print_disk_info(const char *path, const char *format); void print_battery_info(int number, const char *format, bool last_full_capacity); void print_time(const char *format); diff --git a/src/print_ipv6_addr.c b/src/print_ipv6_addr.c index b9486be..bfd985d 100644 --- a/src/print_ipv6_addr.c +++ b/src/print_ipv6_addr.c @@ -9,7 +9,7 @@ #include #include -static bool print_sockname(struct addrinfo *addr) { +static char * get_sockname(struct addrinfo *addr) { static char buf[INET6_ADDRSTRLEN+1]; struct sockaddr_storage local; int ret; @@ -17,7 +17,7 @@ static bool print_sockname(struct addrinfo *addr) { if ((fd = socket(addr->ai_family, SOCK_DGRAM, 0)) == -1) { perror("socket()"); - return false; + return NULL; } /* Since the socket was created with SOCK_DGRAM, this is @@ -31,7 +31,7 @@ static bool print_sockname(struct addrinfo *addr) { * Thus, don’t spam the user’s console but just * try the next address. */ (void)close(fd); - return false; + return NULL; } @@ -39,8 +39,7 @@ static bool print_sockname(struct addrinfo *addr) { if (getsockname(fd, (struct sockaddr*)&local, &local_len) == -1) { perror("getsockname()"); (void)close(fd); - printf("no IPv6"); - return true; + return NULL; } memset(buf, 0, INET6_ADDRSTRLEN + 1); @@ -49,20 +48,18 @@ static bool print_sockname(struct addrinfo *addr) { NI_NUMERICHOST)) != 0) { fprintf(stderr, "getnameinfo(): %s\n", gai_strerror(ret)); (void)close(fd); - printf("no IPv6"); - return true; + return NULL; } (void)close(fd); - printf("%s", buf); - return true; + return buf; } /* * Returns the IPv6 address with which you have connectivity at the moment. - * + * The char * is statically allocated and mustn't be freed */ -static void print_ipv6_addr() { +static char *get_ipv6_addr() { struct addrinfo hints; struct addrinfo *result, *resp; static struct addrinfo *cached = NULL; @@ -70,8 +67,7 @@ static void print_ipv6_addr() { /* To save dns lookups (if they are not cached locally) and creating * sockets, we save the fd and keep it open. */ if (cached != NULL) - if (print_sockname(cached)) - return; + return get_sockname(cached); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET6; @@ -83,42 +79,47 @@ static void print_ipv6_addr() { /* We don’t display the error here because most * likely, there just is no connectivity. * Thus, don’t spam the user’s console. */ - printf("no IPv6"); - return; + return NULL; } for (resp = result; resp != NULL; resp = resp->ai_next) { - if (!print_sockname(resp)) + char *addr_string = get_sockname(resp); + if (!addr_string) continue; if ((cached = malloc(sizeof(struct addrinfo))) == NULL) - return; + return NULL; memcpy(cached, resp, sizeof(struct addrinfo)); if ((cached->ai_addr = malloc(resp->ai_addrlen)) == NULL) { cached = NULL; - return; + return NULL; } memcpy(cached->ai_addr, resp->ai_addr, resp->ai_addrlen); freeaddrinfo(result); - return; + return addr_string; } freeaddrinfo(result); - printf("no IPv6"); + return NULL; } -void print_ipv6_info(const char *format) { +void print_ipv6_info(const char *format_up, const char *format_down) { const char *walk; - - for (walk = format; *walk != '\0'; walk++) { - if (*walk != '%') { - putchar(*walk); - continue; - } - - if (strncmp(walk+1, "ip", strlen("ip")) == 0) { - print_ipv6_addr(); - walk += strlen("ip"); + char * addr_string = get_ipv6_addr(); + + if (addr_string == NULL) { + printf("%s", format_down); + } else { + for (walk = format_up; *walk != '\0'; walk++) { + if (*walk != '%') { + putchar(*walk); + continue; + } + + if (strncmp(walk+1, "ip", strlen("ip")) == 0) { + printf("%s", addr_string); + walk += strlen("ip"); + } } } }