diff options
| -rw-r--r-- | i3status.c | 5 | ||||
| -rw-r--r-- | i3status.h | 2 | ||||
| -rw-r--r-- | src/print_ipv6_addr.c | 63 | 
3 files changed, 36 insertions, 34 deletions
| @@ -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")); @@ -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 <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"); +                        }                  }          }  } | 
