diff --git a/config.def.h b/config.def.h index 813bded..b4b65ac 100644 --- a/config.def.h +++ b/config.def.h @@ -17,6 +17,7 @@ static unsigned int update_interval = 1; - datetime (date and time) [argument: format] - disk_perc (disk usage in percent) [argument: mountpoint] - entropy (available entropy) [argument: NULL] +- ip (ip address) [argument: interface] - ram_perc (ram usage in percent) [argument: NULL] - temp (temperature in degrees) [argument: temperature file] - vol_perc (alsa volume and mute status in percent) [argument: soundcard] @@ -30,6 +31,5 @@ static const struct arg args[] = { { ram_perc, "ram %3s | ", NULL }, { vol_perc, "vol %4s | ", "default" }, { disk_perc, "ssd %3s | ", "/" }, - { entropy, "crypt %s | ", NULL }, { datetime, "%s", "%y-%m-%d %H:%M:%S" }, }; diff --git a/slstatus.c b/slstatus.c index 3574468..9cd5ae2 100644 --- a/slstatus.c +++ b/slstatus.c @@ -2,8 +2,11 @@ /* global libraries */ #include +#include #include +#include #include +#include #include #include #include @@ -11,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -204,6 +208,47 @@ entropy(const char *null) return smprintf("%d", entropy); } +/* ip address */ +char * +ip(const char *interface) +{ + struct ifaddrs *ifaddr, *ifa; + int s; + char host[NI_MAXHOST]; + + /* check if getting ip address works */ + if (getifaddrs(&ifaddr) == -1) + { + fprintf(stderr, "Error getting IP address."); + return smprintf("n/a"); + } + + /* get the ip address */ + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) + { + if (ifa->ifa_addr == NULL) + continue; + + s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + + if ((strcmp(ifa->ifa_name, interface) == 0) && (ifa->ifa_addr->sa_family == AF_INET)) + { + if (s != 0) + { + fprintf(stderr, "Error getting IP address."); + return smprintf("n/a"); + } + return smprintf("%s", host); + } + } + + /* free the address */ + freeifaddrs(ifaddr); + + /* return n/a if nothing works */ + return smprintf("n/a"); +} + /* ram percentage */ char * ram_perc(const char *null) @@ -257,7 +302,6 @@ temp(const char *file) return smprintf("%d°C", temperature / 1000); } - /* alsa volume percentage */ char * vol_perc(const char *soundcard) diff --git a/slstatus.h b/slstatus.h index 12c03c7..0d86f33 100644 --- a/slstatus.h +++ b/slstatus.h @@ -19,6 +19,7 @@ char *cpu_perc(const char *); char *datetime(const char *); char *disk_perc(const char *); char *entropy(const char*); +char *ip(const char *); char *ram_perc(const char *); char *temp(const char *); char *vol_perc(const char *);