diff options
author | Christian Dietrich <stettberger@dokucode.de> | 2010-04-05 15:47:56 +0200 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2010-04-06 14:54:25 +0200 |
commit | 8edce057640ec4e4d1d644317a585495de4f1865 (patch) | |
tree | ba41dc310e19bcef422ba5526346bacd5505d313 /src/print_ipv6_addr.c | |
parent | d60fc3fa43d8f8674a150bfa61bad4ae7407521a (diff) |
ipv6: provide format strings for ipv6 up and ipv6 down
Diffstat (limited to 'src/print_ipv6_addr.c')
-rw-r--r-- | src/print_ipv6_addr.c | 63 |
1 files changed, 32 insertions, 31 deletions
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 <string.h> #include <arpa/inet.h> -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"); + } } } } |