X-Git-Url: https://git.xinqibao.xyz/slstatus.git/blobdiff_plain/5a70f920f04f1bfc2df959d2ae131f511b7c8e38..62f40164309cd6f22be9fae89c071221944618e4:/slstatus.c diff --git a/slstatus.c b/slstatus.c index 9272c54..ff81e0c 100644 --- a/slstatus.c +++ b/slstatus.c @@ -1,11 +1,11 @@ /* See LICENSE file for copyright and license details. */ -#include #include #include #include #include #include +#include #include #include #include @@ -17,8 +17,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -56,6 +58,10 @@ static char *ram_perc(void); static char *ram_used(void); static char *ram_total(void); static char *run_command(const char *cmd); +static char *swap_free(void); +static char *swap_perc(void); +static char *swap_used(void); +static char *swap_total(void); static char *temp(const char *file); static char *uid(void); static char *uptime(void); @@ -63,6 +69,7 @@ static char *username(void); static char *vol_perc(const char *card); static char *wifi_perc(const char *iface); static char *wifi_essid(const char *iface); +static char *kernel_release(void); static void set_status(const char *str); static void sighandler(const int signo); static void usage(void); @@ -400,7 +407,7 @@ static char * run_command(const char *cmd) { FILE *fp; - char buf[64] = "n/a"; + char buf[1024] = "n/a"; fp = popen(cmd, "r"); if (fp == NULL) { @@ -408,12 +415,153 @@ run_command(const char *cmd) return smprintf(UNKNOWN_STR); } fgets(buf, sizeof(buf)-1, fp); - buf[strlen(buf)-1] = '\0'; pclose(fp); + buf[strlen(buf)] = '\0'; + strtok(buf, "\n"); + return smprintf("%s", buf); } +static char * +swap_free(void) +{ + long total, free; + FILE *fp; + char buf[2048]; + size_t bytes_read; + char *match; + + fp = fopen("/proc/meminfo", "r"); + if (fp == NULL) { + warn("Failed to open file /proc/meminfo"); + return smprintf(UNKNOWN_STR); + } + bytes_read = fread(buf, sizeof(char), sizeof(buf), fp); + buf[bytes_read] = '\0'; + fclose(fp); + if (bytes_read == 0 || bytes_read == sizeof(buf)) { + warn("Failed to read /proc/meminfo\n"); + return smprintf(UNKNOWN_STR); + } + + match = strstr(buf, "SwapTotal"); + sscanf(match, "SwapTotal: %ld kB\n", &total); + if (total == 0) { + return smprintf(UNKNOWN_STR); + } + + match = strstr(buf, "SwapFree"); + sscanf(match, "SwapFree: %ld kB\n", &free); + + return smprintf("%f", (float)free / 1024 / 1024); +} + +static char * +swap_perc(void) +{ + long total, free, cached; + FILE *fp; + char buf[2048]; + size_t bytes_read; + char *match; + + fp = fopen("/proc/meminfo", "r"); + if (fp == NULL) { + warn("Failed to open file /proc/meminfo"); + return smprintf(UNKNOWN_STR); + } + bytes_read = fread(buf, sizeof(char), sizeof(buf), fp); + buf[bytes_read] = '\0'; + fclose(fp); + if (bytes_read == 0 || bytes_read == sizeof(buf)) { + warn("Failed to read /proc/meminfo\n"); + return smprintf(UNKNOWN_STR); + } + + match = strstr(buf, "SwapTotal"); + sscanf(match, "SwapTotal: %ld kB\n", &total); + if (total == 0) { + return smprintf(UNKNOWN_STR); + } + + match = strstr(buf, "SwapCached"); + sscanf(match, "SwapCached: %ld kB\n", &cached); + + match = strstr(buf, "SwapFree"); + sscanf(match, "SwapFree: %ld kB\n", &free); + + return smprintf("%d%%", 100 * (total - free - cached) / total); +} + +static char * +swap_total(void) +{ + long total; + FILE *fp; + char buf[2048]; + size_t bytes_read; + char *match; + + fp = fopen("/proc/meminfo", "r"); + if (fp == NULL) { + warn("Failed to open file /proc/meminfo"); + return smprintf(UNKNOWN_STR); + } + bytes_read = fread(buf, sizeof(char), sizeof(buf), fp); + buf[bytes_read] = '\0'; + fclose(fp); + if (bytes_read == 0 || bytes_read == sizeof(buf)) { + warn("Failed to read /proc/meminfo\n"); + return smprintf(UNKNOWN_STR); + } + + match = strstr(buf, "SwapTotal"); + sscanf(match, "SwapTotal: %ld kB\n", &total); + if (total == 0) { + return smprintf(UNKNOWN_STR); + } + + return smprintf("%f", (float)total / 1024 / 1024); +} + +static char * +swap_used(void) +{ + long total, free, cached; + FILE *fp; + char buf[2048]; + size_t bytes_read; + char *match; + + fp = fopen("/proc/meminfo", "r"); + if (fp == NULL) { + warn("Failed to open file /proc/meminfo"); + return smprintf(UNKNOWN_STR); + } + bytes_read = fread(buf, sizeof(char), sizeof(buf), fp); + buf[bytes_read] = '\0'; + fclose(fp); + if (bytes_read == 0 || bytes_read == sizeof(buf)) { + warn("Failed to read /proc/meminfo\n"); + return smprintf(UNKNOWN_STR); + } + + match = strstr(buf, "SwapTotal"); + sscanf(match, "SwapTotal: %ld kB\n", &total); + if (total == 0) { + return smprintf(UNKNOWN_STR); + } + + match = strstr(buf, "SwapCached"); + sscanf(match, "SwapCached: %ld kB\n", &cached); + + match = strstr(buf, "SwapFree"); + sscanf(match, "SwapFree: %ld kB\n", &free); + + return smprintf("%f", (float)(total - free - cached) / 1024 / 1024); +} + static char * temp(const char *file) { @@ -469,37 +617,30 @@ uid(void) static char * vol_perc(const char *card) { - long int vol, max, min; - snd_mixer_t *handle; - snd_mixer_elem_t *elem; - snd_mixer_selem_id_t *s_elem; + unsigned int i; + int v, afd, devmask; + char *vnames[] = SOUND_DEVICE_NAMES; - snd_mixer_open(&handle, 0); - snd_mixer_attach(handle, card); - snd_mixer_selem_register(handle, NULL, NULL); - snd_mixer_load(handle); - snd_mixer_selem_id_malloc(&s_elem); - snd_mixer_selem_id_set_name(s_elem, "Master"); - elem = snd_mixer_find_selem(handle, s_elem); - - if (elem == NULL) { - snd_mixer_selem_id_free(s_elem); - snd_mixer_close(handle); - warn("Failed to get volume percentage for %s", card); + afd = open(card, O_RDONLY); + if (afd < 0) { + warn("Cannot open %s", card); return smprintf(UNKNOWN_STR); } - snd_mixer_handle_events(handle); - snd_mixer_selem_get_playback_volume_range(elem, &min, &max); - snd_mixer_selem_get_playback_volume(elem, 0, &vol); - - snd_mixer_selem_id_free(s_elem); - snd_mixer_close(handle); + ioctl(afd, MIXER_READ(SOUND_MIXER_DEVMASK), &devmask); + for (i = 0; i < (sizeof(vnames) / sizeof((vnames[0]))); i++) { + if (devmask & (1 << i)) { + if (!strcmp("vol", vnames[i])) { + ioctl(afd, MIXER_READ(i), &v); + } + } + } - if (max == 0) - return smprintf("0%%"); - else - return smprintf("%lu%%", ((uint_fast16_t)(vol * 100) / max)); + close(afd); + if (v == 0) { + return smprintf("mute"); + } + return smprintf("%d%%", v & 0xff); } static char * @@ -571,6 +712,16 @@ wifi_essid(const char *iface) return smprintf("%s", (char *)wreq.u.essid.pointer); } +static char * +kernel_release(void) +{ + struct utsname udata; + if (uname(&udata) < 0) + return smprintf(UNKNOWN_STR); + + return smprintf("%s", udata.release); +} + static void set_status(const char *str) { @@ -619,8 +770,8 @@ main(int argc, char *argv[]) if (dflag && oflag) { usage(); } - if (dflag) { - (void)daemon(1, 1); + if (dflag && daemon(1, 1) < 0) { + err(1, "daemon"); } memset(&act, 0, sizeof(act)); @@ -632,6 +783,8 @@ main(int argc, char *argv[]) dpy = XOpenDisplay(NULL); } + setlocale(LC_ALL, ""); + while (!done) { status_string[0] = '\0';