slstatus

My fork of https://tools.suckless.org/slstatus/
git clone https://git.inz.fi/slstatus
Log | Files | Refs | README | LICENSE

commit 67203c66600113259f4f25b1021c6395f3a62dd6
parent 5a943fa59cab43f4a2cf6c133c4ef5676d6358b1
Author: Aaron Marcher <info@nulltime.net>
Date:   Wed,  8 Jun 2016 09:42:32 +0200

added ip address function

Diffstat:
Mconfig.def.h | 2+-
Mslstatus.c | 46+++++++++++++++++++++++++++++++++++++++++++++-
Mslstatus.h | 1+
3 files changed, 47 insertions(+), 2 deletions(-)

diff --git 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 @@ -2,8 +2,11 @@ /* global libraries */ #include <alsa/asoundlib.h> +#include <arpa/inet.h> #include <fcntl.h> +#include <ifaddrs.h> #include <locale.h> +#include <netdb.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> @@ -11,6 +14,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <sys/statvfs.h> +#include <sys/socket.h> #include <time.h> #include <unistd.h> #include <X11/Xlib.h> @@ -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 @@ -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 *);