X-Git-Url: https://git.xinqibao.xyz/slstatus.git/blobdiff_plain/83c98554ed39f37921152804e9fda7f4b0da0527..e1ae7d3be6faa710b3a711ed317cfe45d90f28bc:/slstatus.c diff --git a/slstatus.c b/slstatus.c index 87e705d..823b8eb 100644 --- a/slstatus.c +++ b/slstatus.c @@ -18,13 +18,58 @@ #include #include #include +#include #include #include #include #include -/* local headers */ -#include "slstatus.h" +#undef strlcat +#undef strlcpy + +#include "strlcat.h" +#include "strlcpy.h" + +/* statusbar configuration type and struct */ +typedef char *(*op_fun) (const char *); +struct arg { + op_fun func; + const char *format; + const char *args; +}; + +/* function declarations */ +void setstatus(const char *str); +char *smprintf(const char *fmt, ...); +char *battery_perc(const char *battery); +char *cpu_perc(const char *null); +char *datetime(const char *timeformat); +char *disk_free(const char *mountpoint); +char *disk_perc(const char *mountpoint); +char *disk_total(const char *mountpoint); +char *disk_used(const char *mountpoint); +char *entropy(const char *null); +char *gid(const char *null); +char *hostname(const char *null); +char *ip(const char *interface); +char *load_avg(const char *null); +char *ram_free(const char *null); +char *ram_perc(const char *null); +char *ram_used(const char *null); +char *ram_total(const char *null); +char *run_command(const char *command); +char *temp(const char *file); +char *uid(const char *null); +char *uptime(const char *null); +char *username(const char *null); +char *vol_perc(const char *soundcard); +char *wifi_perc(const char *wificard); +char *wifi_essid(const char *wificard); + +/* global variables */ +static Display *dpy; + +/* configuration header */ #include "config.h" /* set statusbar */ @@ -62,16 +107,16 @@ battery_perc(const char *battery) FILE *fp; /* generate battery nowfile path */ - strcat(batterynowfile, batterypath); - strcat(batterynowfile, battery); - strcat(batterynowfile, "/"); - strcat(batterynowfile, batterynow); + strlcat(batterynowfile, batterypath, sizeof(batterynowfile)); + strlcat(batterynowfile, battery, sizeof(batterynowfile)); + strlcat(batterynowfile, "/", sizeof(batterynowfile)); + strlcat(batterynowfile, batterynow, sizeof(batterynowfile)); /* generate battery fullfile path */ - strcat(batteryfullfile, batterypath); - strcat(batteryfullfile, battery); - strcat(batteryfullfile, "/"); - strcat(batteryfullfile, batteryfull); + strlcat(batteryfullfile, batterypath, sizeof(batteryfullfile)); + strlcat(batteryfullfile, battery, sizeof(batteryfullfile)); + strlcat(batteryfullfile, "/", sizeof(batteryfullfile)); + strlcat(batteryfullfile, batteryfull, sizeof(batteryfullfile)); /* open battery now file */ if (!(fp = fopen(batterynowfile, "r"))) { @@ -521,6 +566,23 @@ temp(const char *file) return smprintf("%d°C", temperature / 1000); } +/* uptime */ +char * +uptime(const char *null) +{ + struct sysinfo info; + int hours = 0; + int minutes = 0; + + /* get info */ + sysinfo(&info); + hours = info.uptime / 3600; + minutes = (info.uptime - hours * 3600 ) / 60; + + /* return it */ + return smprintf("%dh %dm", hours, minutes); +} + /* username */ char * username(const char *null) @@ -632,9 +694,9 @@ wifi_perc(const char *wificard) /* generate the path name */ memset(path, 0, sizeof path); - strcat(path, "/sys/class/net/"); - strcat(path, wificard); - strcat(path, "/operstate"); + strlcat(path, "/sys/class/net/", sizeof(path)); + strlcat(path, wificard, sizeof(path)); + strlcat(path, "/operstate", sizeof(path)); /* open wifi file */ if(!(fp = fopen(path, "r"))) { @@ -660,8 +722,8 @@ wifi_perc(const char *wificard) } /* extract the signal strength */ - strcpy(needle, wificard); - strcat(needle, ":"); + strlcpy(needle, wificard, sizeof(needle)); + strlcat(needle, ":", sizeof(needle)); fgets(buf, bufsize, fp); fgets(buf, bufsize, fp); fgets(buf, bufsize, fp); @@ -738,7 +800,7 @@ main(void) element = smprintf(unknowntext); fprintf(stderr, "Failed to format output.\n"); } - strcat(status_string, element); + strlcat(status_string, element, sizeof(status_string)); free(res); free(element); }