1
0

Compare commits

..

28 Commits

Author SHA1 Message Date
f68f49273e Release stable 1.0 version 2023-07-04 20:47:18 +02:00
86c7a84c23 Add back version flag to prepare for release 2023-05-15 19:16:12 +02:00
483169021b Fix release tarball to prepare for release
Correctly copies components to sub-directory, adds all required files
2023-05-15 19:11:39 +02:00
e0c155e9ab README: Sync description from manpage 2023-04-23 23:48:47 +02:00
ee586cfea9 manpage: Quality improvements
Adds signals section to the manpage and generally improves contents and
wording
2023-04-23 23:43:14 +02:00
c919def84f More LICENSE updates
Regarding 305aa5138a
2022-12-19 22:04:07 +01:00
034c591a95 Revert "config.mk: Fix PREFIX assignment"
"?=" is not POSIX, packagers should use "make PREFIX=".
This reverts commit c225c43151.
2022-12-19 19:26:57 +01:00
305aa5138a Update LICENSE
Real names should be used if possible, as the license is legally binding
2022-12-19 19:26:18 +01:00
1ae616190c Update LICENSE 2022-12-19 02:44:21 +01:00
581d937e51 entropy: Use Unicode escape sequence in string
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
c225c43151 config.mk: Fix PREFIX assignment
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
984f45719e num_files: opendir() returns a directory stream
opendir() returns a directory stream, not a file descriptor

Co-authored-by: drkhsh <me@drkhsh.at>
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
c432c981df Make LEN macro consistent with other suckless repos
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
87c3dd2c36 battery: Consistent naming for capacity percentage
https://www.kernel.org/doc/html/latest/power/power_supply_class.html

Co-authored-by: drkhsh <me@drkhsh.at>
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
d77f216fae Sort functions by name
Co-authored-by: drkhsh <me@drkhsh.at>
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
40f13be551 uptime: Use sizeof instead of repeating the size
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
c75cb9ad7a keymap: Variable "layout" should be const
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
89f8476110 disk: Cast fsblkcnt_t to double instead of float
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
0e2ff8dc10 verr: Remove special "usage" case
In function verr, remove special case for "usage"
string

Co-authored-by: drkhsh <me@drkhsh.at>
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
e22d447684 config.def.h: Remove stray double quote in comment
Signed-off-by: drkhsh <me@drkhsh.at>
2022-12-19 02:44:21 +01:00
173b03417d Update README 2022-12-19 02:44:21 +01:00
982eb223a0 battery: Fix remaining on Linux
The current version displays the remaining time as 'n/a'.

Fixes this regression introduced in 69b2487650
where current_now and power_now were incorrectly replaced with current and
power when they were moved to a macro.
2022-12-01 09:04:32 +01:00
57c6e7340d New component: cat
Generically reads an arbitrary file natively.

Saves a few layers of execution in comparison to using `run_command`
with an argument like `cat ./file`.
2022-11-24 00:01:52 +01:00
4bd78c94ba README: Add note about FreeBSD sndio dep 2022-10-28 01:03:56 +02:00
cce2e5ecb0 radical re-formatting 3/3: Error checks
Check for `< 0` instead of `== -1`.

Fixes coding style. Formatting commits suck, incoherent coding style
sucks more.
https://suckless.org/coding_style/
2022-10-28 01:03:46 +02:00
3251e91187 radical re-formatting 2/3: Fix blocks
Fixes coding style. Formatting commits suck, incoherent coding style
sucks more.
https://suckless.org/coding_style/
2022-10-28 01:03:38 +02:00
2104dc362c radical re-formatting 1/3: Fix spacing
Fixes coding style. Formatting commits suck, incoherent coding style
sucks more.
https://suckless.org/coding_style/
2022-10-28 01:03:31 +02:00
0696635bcb radical re-formatting 0/3: Alphabetic headers
Except stated otherwise in comment.

Fixes coding style. Formatting commits suck, incoherent coding style
sucks more.
https://suckless.org/coding_style/
2022-10-28 01:03:20 +02:00
33 changed files with 274 additions and 275 deletions

View File

@ -9,7 +9,7 @@ Copyright 2016-2018 Ali H. Fardan <raiz@firemail.cc>
Copyright 2016 Jody Leonard <me@jodyleonard.com> Copyright 2016 Jody Leonard <me@jodyleonard.com>
Copyright 2016-2018 Quentin Rameau <quinq@fifth.space> Copyright 2016-2018 Quentin Rameau <quinq@fifth.space>
Copyright 2016 Mike Coddington <mike@coddington.us> Copyright 2016 Mike Coddington <mike@coddington.us>
Copyright 2016-2018 parazyd <parazyd@dyne.org> Copyright 2016-2018 Ivan J. <parazyd@dyne.org>
Copyright 2017 Tobias Stoeckmann <tobias@stoeckmann.org> Copyright 2017 Tobias Stoeckmann <tobias@stoeckmann.org>
Copyright 2017-2018 Laslo Hunhold <dev@frign.de> Copyright 2017-2018 Laslo Hunhold <dev@frign.de>
Copyright 2018 Darron Anderson <darronanderson@protonmail.com> Copyright 2018 Darron Anderson <darronanderson@protonmail.com>
@ -21,12 +21,14 @@ Copyright 2018 Ian Remmler <ian@remmler.org>
Copyright 2016-2019 Joerg Jung <jung@openbsd.org> Copyright 2016-2019 Joerg Jung <jung@openbsd.org>
Copyright 2019 Ryan Kes <alrayyes@gmail.com> Copyright 2019 Ryan Kes <alrayyes@gmail.com>
Copyright 2019 Cem Keylan <cem@ckyln.com> Copyright 2019 Cem Keylan <cem@ckyln.com>
Copyright 2019 dsp <dsp@2f30.org> Copyright 2019 Dimitris Papastamos <dsp@2f30.org>
Copyright 2019-2022 Ingo Feinerer <feinerer@logic.at> Copyright 2019-2022 Ingo Feinerer <feinerer@logic.at>
Copyright 2020 Alexandre Ratchov <alex@caoua.org> Copyright 2020 Alexandre Ratchov <alex@caoua.org>
Copyright 2020 Mart Lubbers <mart@martlubbers.net> Copyright 2020 Mart Lubbers <mart@martlubbers.net>
Copyright 2020 Daniel Moch <daniel@danielmoch.com> Copyright 2020 Daniel Moch <daniel@danielmoch.com>
Copyright 2022 NRK <nrk@disroot.org> Copyright 2022 Nickolas Raymond Kaczynski <nrk@disroot.org>
Copyright 2022 Patrick Iacob <iacobp@oregonstate.edu>
Copyright 2021-2022 Steven Ward <planet36@gmail.com>
Permission to use, copy, modify, and/or distribute this software for any Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above purpose with or without fee is hereby granted, provided that the above

View File

@ -7,6 +7,7 @@ include config.mk
REQ = util REQ = util
COM =\ COM =\
components/battery\ components/battery\
components/cat\
components/cpu\ components/cpu\
components/datetime\ components/datetime\
components/disk\ components/disk\
@ -43,14 +44,15 @@ slstatus: slstatus.o $(COM:=.o) $(REQ:=.o)
$(CC) -o $@ $(LDFLAGS) $(COM:=.o) $(REQ:=.o) slstatus.o $(LDLIBS) $(CC) -o $@ $(LDFLAGS) $(COM:=.o) $(REQ:=.o) slstatus.o $(LDLIBS)
clean: clean:
rm -f slstatus slstatus.o $(COM:=.o) $(REQ:=.o) rm -f slstatus slstatus.o $(COM:=.o) $(REQ:=.o) slstatus-${VERSION}.tar.gz
dist: dist:
rm -rf "slstatus-$(VERSION)" rm -rf "slstatus-$(VERSION)"
mkdir -p "slstatus-$(VERSION)/components" mkdir -p "slstatus-$(VERSION)/components"
cp -R LICENSE Makefile README config.mk config.def.h \ cp -R LICENSE Makefile README config.mk config.def.h \
arg.h slstatus.c $(COM:=.c) $(REQ:=.c) $(REQ:=.h) \ arg.h slstatus.h slstatus.c $(REQ:=.c) $(REQ:=.h) \
slstatus.1 "slstatus-$(VERSION)" slstatus.1 "slstatus-$(VERSION)"
cp -R $(COM:=.c) "slstatus-$(VERSION)/components"
tar -cf - "slstatus-$(VERSION)" | gzip -c > "slstatus-$(VERSION).tar.gz" tar -cf - "slstatus-$(VERSION)" | gzip -c > "slstatus-$(VERSION).tar.gz"
rm -rf "slstatus-$(VERSION)" rm -rf "slstatus-$(VERSION)"

19
README
View File

@ -1,12 +1,15 @@
slstatus - suckless status slstatus - suckless status
========================== ==========================
slstatus is a suckless status monitor for window managers that use WM_NAME slstatus is a small tool for providing system status information to other
(e.g. dwm) or stdin to fill the status bar. programs over the EWMH property of the root window (used by dwm(1)) or
standard input/output. It is designed to be as efficient as possible by
only issuing the minimum of system calls required.
Features Features
-------- --------
- Battery percentage/state/time left - Battery percentage/state/time left
- Cat (read file)
- CPU usage - CPU usage
- CPU frequency - CPU frequency
- Custom shell commands - Custom shell commands
@ -35,8 +38,9 @@ Requirements
Currently slstatus works on FreeBSD, Linux and OpenBSD. Currently slstatus works on FreeBSD, Linux and OpenBSD.
In order to build slstatus you need the Xlib header files. In order to build slstatus you need the Xlib header files.
For volume percentage on Linux the kernel module `snd-mixer-oss` must be - For volume percentage on Linux the kernel module `snd-mixer-oss` must be
loaded. loaded.
- For volume percentage on FreeBSD, `sndio` must be installed.
Installation Installation
@ -59,10 +63,3 @@ Configuration
------------- -------------
slstatus can be customized by creating a custom config.h and (re)compiling the slstatus can be customized by creating a custom config.h and (re)compiling the
source code. This keeps it fast, secure and simple. source code. This keeps it fast, secure and simple.
Upcoming
--------
A release (v1.0) will come soon... ;)
After a long phase of inactivity, development has been continued!

4
arg.h
View File

@ -13,7 +13,7 @@ extern char *argv0;
break; \ break; \
} \ } \
for (i_ = 1, argused_ = 0; (*argv)[i_]; i_++) { \ for (i_ = 1, argused_ = 0; (*argv)[i_]; i_++) { \
switch((*argv)[i_]) switch ((*argv)[i_])
#define ARGEND if (argused_) { \ #define ARGEND if (argused_) { \
if ((*argv)[i_ + 1]) { \ if ((*argv)[i_ + 1]) { \
break; \ break; \
@ -24,7 +24,7 @@ extern char *argv0;
} \ } \
} \ } \
} }
#define ARGC() ((*argv)[i_]) #define ARGC() ((*argv)[i_])
#define ARGF_(x) (((*argv)[i_ + 1]) ? (argused_ = 1, &((*argv)[i_ + 1])) : \ #define ARGF_(x) (((*argv)[i_ + 1]) ? (argused_ = 1, &((*argv)[i_ + 1])) : \
(*(argv + 1)) ? (argused_ = 1, *(argv + 1)) : (x)) (*(argv + 1)) ? (argused_ = 1, *(argv + 1)) : (x))
#define EARGF(x) ARGF_(((x), exit(1), (char *)0)) #define EARGF(x) ARGF_(((x), exit(1), (char *)0))

View File

@ -2,10 +2,13 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
#if defined(__linux__) #if defined(__linux__)
/*
* https://www.kernel.org/doc/html/latest/power/power_supply_class.html
*/
#include <limits.h> #include <limits.h>
#include <stdint.h> #include <stdint.h>
#include <unistd.h> #include <unistd.h>
@ -14,22 +17,20 @@
#define POWER_SUPPLY_STATUS "/sys/class/power_supply/%s/status" #define POWER_SUPPLY_STATUS "/sys/class/power_supply/%s/status"
#define POWER_SUPPLY_CHARGE "/sys/class/power_supply/%s/charge_now" #define POWER_SUPPLY_CHARGE "/sys/class/power_supply/%s/charge_now"
#define POWER_SUPPLY_ENERGY "/sys/class/power_supply/%s/energy_now" #define POWER_SUPPLY_ENERGY "/sys/class/power_supply/%s/energy_now"
#define POWER_SUPPLY_CURRENT "/sys/class/power_supply/%s/current" #define POWER_SUPPLY_CURRENT "/sys/class/power_supply/%s/current_now"
#define POWER_SUPPLY_POWER "/sys/class/power_supply/%s/power" #define POWER_SUPPLY_POWER "/sys/class/power_supply/%s/power_now"
static const char * static const char *
pick(const char *bat, const char *f1, const char *f2, char *path, pick(const char *bat, const char *f1, const char *f2, char *path,
size_t length) size_t length)
{ {
if (esnprintf(path, length, f1, bat) > 0 && if (esnprintf(path, length, f1, bat) > 0 &&
access(path, R_OK) == 0) { access(path, R_OK) == 0)
return f1; return f1;
}
if (esnprintf(path, length, f2, bat) > 0 && if (esnprintf(path, length, f2, bat) > 0 &&
access(path, R_OK) == 0) { access(path, R_OK) == 0)
return f2; return f2;
}
return NULL; return NULL;
} }
@ -37,16 +38,15 @@
const char * const char *
battery_perc(const char *bat) battery_perc(const char *bat)
{ {
int perc; int cap_perc;
char path[PATH_MAX]; char path[PATH_MAX];
if (esnprintf(path, sizeof(path), POWER_SUPPLY_CAPACITY, bat) < 0) if (esnprintf(path, sizeof(path), POWER_SUPPLY_CAPACITY, bat) < 0)
return NULL; return NULL;
if (pscanf(path, "%d", &perc) != 1) { if (pscanf(path, "%d", &cap_perc) != 1)
return NULL; return NULL;
}
return bprintf("%d", perc); return bprintf("%d", cap_perc);
} }
const char * const char *
@ -66,15 +66,13 @@
if (esnprintf(path, sizeof(path), POWER_SUPPLY_STATUS, bat) < 0) if (esnprintf(path, sizeof(path), POWER_SUPPLY_STATUS, bat) < 0)
return NULL; return NULL;
if (pscanf(path, "%12[a-zA-Z ]", state) != 1) { if (pscanf(path, "%12[a-zA-Z ]", state) != 1)
return NULL; return NULL;
}
for (i = 0; i < LEN(map); i++) { for (i = 0; i < LEN(map); i++)
if (!strcmp(map[i].state, state)) { if (!strcmp(map[i].state, state))
break; break;
}
}
return (i == LEN(map)) ? "?" : map[i].symbol; return (i == LEN(map)) ? "?" : map[i].symbol;
} }
@ -87,9 +85,8 @@
if (esnprintf(path, sizeof(path), POWER_SUPPLY_STATUS, bat) < 0) if (esnprintf(path, sizeof(path), POWER_SUPPLY_STATUS, bat) < 0)
return NULL; return NULL;
if (pscanf(path, "%12[a-zA-Z ]", state) != 1) { if (pscanf(path, "%12[a-zA-Z ]", state) != 1)
return NULL; return NULL;
}
if (!pick(bat, POWER_SUPPLY_CHARGE, POWER_SUPPLY_ENERGY, path, if (!pick(bat, POWER_SUPPLY_CHARGE, POWER_SUPPLY_ENERGY, path,
sizeof(path)) || sizeof(path)) ||
@ -102,9 +99,8 @@
pscanf(path, "%ju", &current_now) < 0) pscanf(path, "%ju", &current_now) < 0)
return NULL; return NULL;
if (current_now == 0) { if (current_now == 0)
return NULL; return NULL;
}
timeleft = (double)charge_now / (double)current_now; timeleft = (double)charge_now / (double)current_now;
h = timeleft; h = timeleft;
@ -146,9 +142,8 @@
{ {
struct apm_power_info apm_info; struct apm_power_info apm_info;
if (load_apm_power_info(&apm_info)) { if (load_apm_power_info(&apm_info))
return bprintf("%d", apm_info.battery_life); return bprintf("%d", apm_info.battery_life);
}
return NULL; return NULL;
} }
@ -167,11 +162,10 @@
size_t i; size_t i;
if (load_apm_power_info(&apm_info)) { if (load_apm_power_info(&apm_info)) {
for (i = 0; i < LEN(map); i++) { for (i = 0; i < LEN(map); i++)
if (map[i].state == apm_info.ac_state) { if (map[i].state == apm_info.ac_state)
break; break;
}
}
return (i == LEN(map)) ? "?" : map[i].symbol; return (i == LEN(map)) ? "?" : map[i].symbol;
} }
@ -206,14 +200,14 @@
const char * const char *
battery_perc(const char *unused) battery_perc(const char *unused)
{ {
int cap; int cap_perc;
size_t len; size_t len;
len = sizeof(cap); len = sizeof(cap_perc);
if (sysctlbyname(BATTERY_LIFE, &cap, &len, NULL, 0) < 0 || !len) if (sysctlbyname(BATTERY_LIFE, &cap_perc, &len, NULL, 0) < 0 || !len)
return NULL; return NULL;
return bprintf("%d", cap); return bprintf("%d", cap_perc);
} }
const char * const char *
@ -226,14 +220,14 @@
if (sysctlbyname(BATTERY_STATE, &state, &len, NULL, 0) < 0 || !len) if (sysctlbyname(BATTERY_STATE, &state, &len, NULL, 0) < 0 || !len)
return NULL; return NULL;
switch(state) { switch (state) {
case 0: case 0: /* FALLTHROUGH */
case 2: case 2:
return "+"; return "+";
case 1: case 1:
return "-"; return "-";
default: default:
return "?"; return "?";
} }
} }

32
components/cat.c Normal file
View File

@ -0,0 +1,32 @@
/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <string.h>
#include "../slstatus.h"
#include "../util.h"
const char *
cat(const char *path)
{
char *f;
FILE *fp;
if (!(fp = fopen(path, "r"))) {
warn("fopen '%s':", path);
return NULL;
}
f = fgets(buf, sizeof(buf) - 1, fp);
if (fclose(fp) < 0) {
warn("fclose '%s':", path);
return NULL;
}
if (!f)
return NULL;
if ((f = strrchr(buf, '\n')))
f[0] = '\0';
return buf[0] ? buf : NULL;
}

View File

@ -3,8 +3,8 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
#if defined(__linux__) #if defined(__linux__)
#define CPU_FREQ "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq" #define CPU_FREQ "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
@ -31,19 +31,17 @@
/* cpu user nice system idle iowait irq softirq */ /* cpu user nice system idle iowait irq softirq */
if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf",
&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6]) &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])
!= 7) { != 7)
return NULL; return NULL;
}
if (b[0] == 0) { if (b[0] == 0)
return NULL; return NULL;
}
sum = (b[0] + b[1] + b[2] + b[3] + b[4] + b[5] + b[6]) - sum = (b[0] + b[1] + b[2] + b[3] + b[4] + b[5] + b[6]) -
(a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6]); (a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6]);
if (sum == 0) { if (sum == 0)
return NULL; return NULL;
}
return bprintf("%d", (int)(100 * return bprintf("%d", (int)(100 *
((b[0] + b[1] + b[2] + b[5] + b[6]) - ((b[0] + b[1] + b[2] + b[5] + b[6]) -
@ -92,16 +90,14 @@
warn("sysctl 'KERN_CPTIME':"); warn("sysctl 'KERN_CPTIME':");
return NULL; return NULL;
} }
if (b[0] == 0) { if (b[0] == 0)
return NULL; return NULL;
}
sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] + a[CP_IDLE]) - sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] + a[CP_IDLE]) -
(b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] + b[CP_IDLE]); (b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] + b[CP_IDLE]);
if (sum == 0) { if (sum == 0)
return NULL; return NULL;
}
return bprintf("%d", 100 * return bprintf("%d", 100 *
((a[CP_USER] + a[CP_NICE] + a[CP_SYS] + ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
@ -110,9 +106,9 @@
b[CP_INTR])) / sum); b[CP_INTR])) / sum);
} }
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
#include <devstat.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <devstat.h>
const char * const char *
cpu_freq(const char *unused) cpu_freq(const char *unused)
@ -122,8 +118,7 @@
size = sizeof(freq); size = sizeof(freq);
/* in MHz */ /* in MHz */
if (sysctlbyname("hw.clockrate", &freq, &size, NULL, 0) == -1 if (sysctlbyname("hw.clockrate", &freq, &size, NULL, 0) < 0 || !size) {
|| !size) {
warn("sysctlbyname 'hw.clockrate':"); warn("sysctlbyname 'hw.clockrate':");
return NULL; return NULL;
} }
@ -140,21 +135,18 @@
size = sizeof(a); size = sizeof(a);
memcpy(b, a, sizeof(b)); memcpy(b, a, sizeof(b));
if (sysctlbyname("kern.cp_time", &a, &size, NULL, 0) == -1 if (sysctlbyname("kern.cp_time", &a, &size, NULL, 0) < 0 || !size) {
|| !size) {
warn("sysctlbyname 'kern.cp_time':"); warn("sysctlbyname 'kern.cp_time':");
return NULL; return NULL;
} }
if (b[0] == 0) { if (b[0] == 0)
return NULL; return NULL;
}
sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] + a[CP_IDLE]) - sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] + a[CP_IDLE]) -
(b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] + b[CP_IDLE]); (b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] + b[CP_IDLE]);
if (sum == 0) { if (sum == 0)
return NULL; return NULL;
}
return bprintf("%d", 100 * return bprintf("%d", 100 *
((a[CP_USER] + a[CP_NICE] + a[CP_SYS] + ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +

View File

@ -2,8 +2,8 @@
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
const char * const char *
datetime(const char *fmt) datetime(const char *fmt)

View File

@ -2,8 +2,8 @@
#include <stdio.h> #include <stdio.h>
#include <sys/statvfs.h> #include <sys/statvfs.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
const char * const char *
disk_free(const char *path) disk_free(const char *path)
@ -29,7 +29,7 @@ disk_perc(const char *path)
} }
return bprintf("%d", (int)(100 * return bprintf("%d", (int)(100 *
(1.0f - ((float)fs.f_bavail / (float)fs.f_blocks)))); (1 - ((double)fs.f_bavail / (double)fs.f_blocks))));
} }
const char * const char *

View File

@ -22,7 +22,8 @@
const char * const char *
entropy(const char *unused) entropy(const char *unused)
{ {
// https://www.unicode.org/charts/PDF/U2200.pdf
/* Unicode Character 'INFINITY' (U+221E) */ /* Unicode Character 'INFINITY' (U+221E) */
return "\xe2\x88\x9e"; return "\u221E";
} }
#endif #endif

View File

@ -2,8 +2,8 @@
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
const char * const char *
hostname(const char *unused) hostname(const char *unused)

View File

@ -4,15 +4,15 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#if defined(__OpenBSD__) #if defined(__OpenBSD__)
#include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h>
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
#include <netinet/in.h> #include <netinet/in.h>
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
static const char * static const char *
ip(const char *interface, unsigned short sa_family) ip(const char *interface, unsigned short sa_family)
@ -27,9 +27,9 @@ ip(const char *interface, unsigned short sa_family)
} }
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (!ifa->ifa_addr) { if (!ifa->ifa_addr)
continue; continue;
}
s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6),
host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if (!strcmp(ifa->ifa_name, interface) && if (!strcmp(ifa->ifa_name, interface) &&

View File

@ -1,9 +1,9 @@
/* See LICENSE file for copyright and license details. */ /* See LICENSE file for copyright and license details. */
#include <sys/utsname.h>
#include <stdio.h> #include <stdio.h>
#include <sys/utsname.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
const char * const char *
kernel_release(const char *unused) kernel_release(const char *unused)

View File

@ -4,8 +4,8 @@
#include <string.h> #include <string.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
/* /*
* fmt consists of uppercase or lowercase 'c' for caps lock and/or 'n' for num * fmt consists of uppercase or lowercase 'c' for caps lock and/or 'n' for num
@ -33,17 +33,18 @@ keyboard_indicators(const char *fmt)
fmtlen = strnlen(fmt, 4); fmtlen = strnlen(fmt, 4);
for (i = n = 0; i < fmtlen; i++) { for (i = n = 0; i < fmtlen; i++) {
key = tolower(fmt[i]); key = tolower(fmt[i]);
if (key != 'c' && key != 'n') { if (key != 'c' && key != 'n')
continue; continue;
}
togglecase = (i + 1 >= fmtlen || fmt[i + 1] != '?'); togglecase = (i + 1 >= fmtlen || fmt[i + 1] != '?');
isset = (state.led_mask & (1 << (key == 'n'))); isset = (state.led_mask & (1 << (key == 'n')));
if (togglecase) {
if (togglecase)
buf[n++] = isset ? toupper(key) : key; buf[n++] = isset ? toupper(key) : key;
} else if (isset) { else if (isset)
buf[n++] = fmt[i]; buf[n++] = fmt[i];
}
} }
buf[n] = 0; buf[n] = 0;
return buf; return buf;
} }

View File

@ -5,8 +5,8 @@
#include <X11/XKBlib.h> #include <X11/XKBlib.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
static int static int
valid_layout_or_variant(char *sym) valid_layout_or_variant(char *sym)
@ -15,11 +15,9 @@ valid_layout_or_variant(char *sym)
/* invalid symbols from xkb rules config */ /* invalid symbols from xkb rules config */
static const char *invalid[] = { "evdev", "inet", "pc", "base" }; static const char *invalid[] = { "evdev", "inet", "pc", "base" };
for (i = 0; i < LEN(invalid); i++) { for (i = 0; i < LEN(invalid); i++)
if (!strncmp(sym, invalid[i], strlen(invalid[i]))) { if (!strncmp(sym, invalid[i], strlen(invalid[i])))
return 0; return 0;
}
}
return 1; return 1;
} }
@ -52,7 +50,8 @@ keymap(const char *unused)
Display *dpy; Display *dpy;
XkbDescRec *desc; XkbDescRec *desc;
XkbStateRec state; XkbStateRec state;
char *symbols, *layout; char *symbols;
const char *layout;
layout = NULL; layout = NULL;
@ -76,13 +75,12 @@ keymap(const char *unused)
warn("XGetAtomName: Failed to get atom name"); warn("XGetAtomName: Failed to get atom name");
goto end; goto end;
} }
layout = (char *)bprintf("%s", get_layout(symbols, state.group)); layout = bprintf("%s", get_layout(symbols, state.group));
XFree(symbols); XFree(symbols);
end: end:
XkbFreeKeyboard(desc, XkbSymbolsNameMask, 1); XkbFreeKeyboard(desc, XkbSymbolsNameMask, 1);
if (XCloseDisplay(dpy)) { if (XCloseDisplay(dpy))
warn("XCloseDisplay: Failed to close display"); warn("XCloseDisplay: Failed to close display");
}
return layout; return layout;
} }

View File

@ -2,8 +2,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
const char * const char *
load_avg(const char *unused) load_avg(const char *unused)

View File

@ -1,9 +1,9 @@
/* See LICENSE file for copyright and license details. */ /* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <limits.h> #include <limits.h>
#include <stdio.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
#if defined(__linux__) #if defined(__linux__)
#include <stdint.h> #include <stdint.h>
@ -23,12 +23,10 @@
if (esnprintf(path, sizeof(path), NET_RX_BYTES, interface) < 0) if (esnprintf(path, sizeof(path), NET_RX_BYTES, interface) < 0)
return NULL; return NULL;
if (pscanf(path, "%ju", &rxbytes) != 1) { if (pscanf(path, "%ju", &rxbytes) != 1)
return NULL; return NULL;
} if (oldrxbytes == 0)
if (oldrxbytes == 0) {
return NULL; return NULL;
}
return fmt_human((rxbytes - oldrxbytes) * 1000 / interval, return fmt_human((rxbytes - oldrxbytes) * 1000 / interval,
1024); 1024);
@ -46,22 +44,20 @@
if (esnprintf(path, sizeof(path), NET_TX_BYTES, interface) < 0) if (esnprintf(path, sizeof(path), NET_TX_BYTES, interface) < 0)
return NULL; return NULL;
if (pscanf(path, "%ju", &txbytes) != 1) { if (pscanf(path, "%ju", &txbytes) != 1)
return NULL; return NULL;
} if (oldtxbytes == 0)
if (oldtxbytes == 0) {
return NULL; return NULL;
}
return fmt_human((txbytes - oldtxbytes) * 1000 / interval, return fmt_human((txbytes - oldtxbytes) * 1000 / interval,
1024); 1024);
} }
#elif defined(__OpenBSD__) | defined(__FreeBSD__) #elif defined(__OpenBSD__) | defined(__FreeBSD__)
#include <string.h>
#include <ifaddrs.h> #include <ifaddrs.h>
#include <net/if.h>
#include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <net/if.h>
const char * const char *
netspeed_rx(const char *interface) netspeed_rx(const char *interface)
@ -75,25 +71,23 @@
oldrxbytes = rxbytes; oldrxbytes = rxbytes;
if (getifaddrs(&ifal) == -1) { if (getifaddrs(&ifal) < 0) {
warn("getifaddrs failed"); warn("getifaddrs failed");
return NULL; return NULL;
} }
rxbytes = 0; rxbytes = 0;
for (ifa = ifal; ifa; ifa = ifa->ifa_next) { for (ifa = ifal; ifa; ifa = ifa->ifa_next)
if (!strcmp(ifa->ifa_name, interface) && if (!strcmp(ifa->ifa_name, interface) &&
(ifd = (struct if_data *)ifa->ifa_data)) { (ifd = (struct if_data *)ifa->ifa_data))
rxbytes += ifd->ifi_ibytes, if_ok = 1; rxbytes += ifd->ifi_ibytes, if_ok = 1;
}
}
freeifaddrs(ifal); freeifaddrs(ifal);
if (!if_ok) { if (!if_ok) {
warn("reading 'if_data' failed"); warn("reading 'if_data' failed");
return NULL; return NULL;
} }
if (oldrxbytes == 0) { if (oldrxbytes == 0)
return NULL; return NULL;
}
return fmt_human((rxbytes - oldrxbytes) * 1000 / interval, return fmt_human((rxbytes - oldrxbytes) * 1000 / interval,
1024); 1024);
@ -111,25 +105,23 @@
oldtxbytes = txbytes; oldtxbytes = txbytes;
if (getifaddrs(&ifal) == -1) { if (getifaddrs(&ifal) < 0) {
warn("getifaddrs failed"); warn("getifaddrs failed");
return NULL; return NULL;
} }
txbytes = 0; txbytes = 0;
for (ifa = ifal; ifa; ifa = ifa->ifa_next) { for (ifa = ifal; ifa; ifa = ifa->ifa_next)
if (!strcmp(ifa->ifa_name, interface) && if (!strcmp(ifa->ifa_name, interface) &&
(ifd = (struct if_data *)ifa->ifa_data)) { (ifd = (struct if_data *)ifa->ifa_data))
txbytes += ifd->ifi_obytes, if_ok = 1; txbytes += ifd->ifi_obytes, if_ok = 1;
}
}
freeifaddrs(ifal); freeifaddrs(ifal);
if (!if_ok) { if (!if_ok) {
warn("reading 'if_data' failed"); warn("reading 'if_data' failed");
return NULL; return NULL;
} }
if (oldtxbytes == 0) { if (oldtxbytes == 0)
return NULL; return NULL;
}
return fmt_human((txbytes - oldtxbytes) * 1000 / interval, return fmt_human((txbytes - oldtxbytes) * 1000 / interval,
1024); 1024);

View File

@ -3,30 +3,30 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
const char * const char *
num_files(const char *path) num_files(const char *path)
{ {
struct dirent *dp; struct dirent *dp;
DIR *fd; DIR *dir;
int num; int num;
if (!(fd = opendir(path))) { if (!(dir = opendir(path))) {
warn("opendir '%s':", path); warn("opendir '%s':", path);
return NULL; return NULL;
} }
num = 0; num = 0;
while ((dp = readdir(fd))) { while ((dp = readdir(dir))) {
if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) { if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
continue; /* skip self and parent */ continue; /* skip self and parent */
}
num++; num++;
} }
closedir(fd); closedir(dir);
return bprintf("%d", num); return bprintf("%d", num);
} }

View File

@ -1,8 +1,8 @@
/* See LICENSE file for copyright and license details. */ /* See LICENSE file for copyright and license details. */
#include <stdio.h> #include <stdio.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
#if defined(__linux__) #if defined(__linux__)
#include <stdint.h> #include <stdint.h>
@ -16,9 +16,8 @@
"MemTotal: %ju kB\n" "MemTotal: %ju kB\n"
"MemFree: %ju kB\n" "MemFree: %ju kB\n"
"MemAvailable: %ju kB\n", "MemAvailable: %ju kB\n",
&free, &free, &free) != 3) { &free, &free, &free) != 3)
return NULL; return NULL;
}
return fmt_human(free * 1024, 1024); return fmt_human(free * 1024, 1024);
} }
@ -35,13 +34,11 @@
"MemAvailable: %ju kB\n" "MemAvailable: %ju kB\n"
"Buffers: %ju kB\n" "Buffers: %ju kB\n"
"Cached: %ju kB\n", "Cached: %ju kB\n",
&total, &free, &buffers, &buffers, &cached) != 5) { &total, &free, &buffers, &buffers, &cached) != 5)
return NULL; return NULL;
}
if (total == 0) { if (total == 0)
return NULL; return NULL;
}
percent = 100 * ((total - free) - (buffers + cached)) / total; percent = 100 * ((total - free) - (buffers + cached)) / total;
return bprintf("%d", percent); return bprintf("%d", percent);
@ -53,9 +50,8 @@
uintmax_t total; uintmax_t total;
if (pscanf("/proc/meminfo", "MemTotal: %ju kB\n", &total) if (pscanf("/proc/meminfo", "MemTotal: %ju kB\n", &total)
!= 1) { != 1)
return NULL; return NULL;
}
return fmt_human(total * 1024, 1024); return fmt_human(total * 1024, 1024);
} }
@ -94,9 +90,8 @@
size = sizeof(*uvmexp); size = sizeof(*uvmexp);
if (sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0) { if (sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0)
return 1; return 1;
}
return 0; return 0;
} }
@ -164,8 +159,8 @@
size_t len; size_t len;
len = sizeof(struct vmtotal); len = sizeof(struct vmtotal);
if (sysctl(mib, 2, &vm_stats, &len, NULL, 0) == -1 if (sysctl(mib, 2, &vm_stats, &len, NULL, 0) < 0
|| !len) || !len)
return NULL; return NULL;
return fmt_human(vm_stats.t_free * getpagesize(), 1024); return fmt_human(vm_stats.t_free * getpagesize(), 1024);
@ -177,8 +172,8 @@
size_t len; size_t len;
len = sizeof(npages); len = sizeof(npages);
if (sysctlbyname("vm.stats.vm.v_page_count", &npages, &len, NULL, 0) == -1 if (sysctlbyname("vm.stats.vm.v_page_count",
|| !len) &npages, &len, NULL, 0) < 0 || !len)
return NULL; return NULL;
return fmt_human(npages * getpagesize(), 1024); return fmt_human(npages * getpagesize(), 1024);
@ -191,12 +186,12 @@
size_t len; size_t len;
len = sizeof(npages); len = sizeof(npages);
if (sysctlbyname("vm.stats.vm.v_page_count", &npages, &len, NULL, 0) == -1 if (sysctlbyname("vm.stats.vm.v_page_count",
|| !len) &npages, &len, NULL, 0) < 0 || !len)
return NULL; return NULL;
if (sysctlbyname("vm.stats.vm.v_active_count", &active, &len, NULL, 0) == -1 if (sysctlbyname("vm.stats.vm.v_active_count",
|| !len) &active, &len, NULL, 0) < 0 || !len)
return NULL; return NULL;
return bprintf("%d", active * 100 / npages); return bprintf("%d", active * 100 / npages);
@ -208,8 +203,8 @@
size_t len; size_t len;
len = sizeof(active); len = sizeof(active);
if (sysctlbyname("vm.stats.vm.v_active_count", &active, &len, NULL, 0) == -1 if (sysctlbyname("vm.stats.vm.v_active_count",
|| !len) &active, &len, NULL, 0) < 0 || !len)
return NULL; return NULL;
return fmt_human(active * getpagesize(), 1024); return fmt_human(active * getpagesize(), 1024);

View File

@ -2,8 +2,8 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
const char * const char *
run_command(const char *cmd) run_command(const char *cmd)
@ -15,17 +15,17 @@ run_command(const char *cmd)
warn("popen '%s':", cmd); warn("popen '%s':", cmd);
return NULL; return NULL;
} }
p = fgets(buf, sizeof(buf) - 1, fp); p = fgets(buf, sizeof(buf) - 1, fp);
if (pclose(fp) < 0) { if (pclose(fp) < 0) {
warn("pclose '%s':", cmd); warn("pclose '%s':", cmd);
return NULL; return NULL;
} }
if (!p) { if (!p)
return NULL; return NULL;
}
if ((p = strrchr(buf, '\n'))) { if ((p = strrchr(buf, '\n')))
p[0] = '\0'; p[0] = '\0';
}
return buf[0] ? buf : NULL; return buf[0] ? buf : NULL;
} }

View File

@ -4,8 +4,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
#if defined(__linux__) #if defined(__linux__)
static int static int
@ -25,11 +25,9 @@
char *line = NULL; char *line = NULL;
/* get number of fields we want to extract */ /* get number of fields we want to extract */
for (i = 0, left = 0; i < LEN(ent); i++) { for (i = 0, left = 0; i < LEN(ent); i++)
if (ent[i].var) { if (ent[i].var)
left++; left++;
}
}
if (!(fp = fopen("/proc/meminfo", "r"))) { if (!(fp = fopen("/proc/meminfo", "r"))) {
warn("fopen '/proc/meminfo':"); warn("fopen '/proc/meminfo':");
@ -63,9 +61,8 @@
{ {
long free; long free;
if (get_swap_info(NULL, &free, NULL)) { if (get_swap_info(NULL, &free, NULL))
return NULL; return NULL;
}
return fmt_human(free * 1024, 1024); return fmt_human(free * 1024, 1024);
} }
@ -75,9 +72,8 @@
{ {
long total, free, cached; long total, free, cached;
if (get_swap_info(&total, &free, &cached) || total == 0) { if (get_swap_info(&total, &free, &cached) || total == 0)
return NULL; return NULL;
}
return bprintf("%d", 100 * (total - free - cached) / total); return bprintf("%d", 100 * (total - free - cached) / total);
} }
@ -87,9 +83,8 @@
{ {
long total; long total;
if (get_swap_info(&total, NULL, NULL)) { if (get_swap_info(&total, NULL, NULL))
return NULL; return NULL;
}
return fmt_human(total * 1024, 1024); return fmt_human(total * 1024, 1024);
} }
@ -99,9 +94,8 @@
{ {
long total, free, cached; long total, free, cached;
if (get_swap_info(&total, &free, &cached)) { if (get_swap_info(&total, &free, &cached))
return NULL; return NULL;
}
return fmt_human((total - free - cached) * 1024, 1024); return fmt_human((total - free - cached) * 1024, 1024);
} }
@ -152,9 +146,8 @@
{ {
int total, used; int total, used;
if (getstats(&total, &used)) { if (getstats(&total, &used))
return NULL; return NULL;
}
return fmt_human((total - used) * 1024, 1024); return fmt_human((total - used) * 1024, 1024);
} }
@ -164,13 +157,11 @@
{ {
int total, used; int total, used;
if (getstats(&total, &used)) { if (getstats(&total, &used))
return NULL; return NULL;
}
if (total == 0) { if (total == 0)
return NULL; return NULL;
}
return bprintf("%d", 100 * used / total); return bprintf("%d", 100 * used / total);
} }
@ -180,9 +171,8 @@
{ {
int total, used; int total, used;
if (getstats(&total, &used)) { if (getstats(&total, &used))
return NULL; return NULL;
}
return fmt_human(total * 1024, 1024); return fmt_human(total * 1024, 1024);
} }
@ -192,30 +182,29 @@
{ {
int total, used; int total, used;
if (getstats(&total, &used)) { if (getstats(&total, &used))
return NULL; return NULL;
}
return fmt_human(used * 1024, 1024); return fmt_human(used * 1024, 1024);
} }
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
#include <fcntl.h>
#include <kvm.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <kvm.h>
static int getswapinfo(struct kvm_swap *swap_info, size_t size) static int getswapinfo(struct kvm_swap *swap_info, size_t size)
{ {
kvm_t *kd; kvm_t *kd;
kd = kvm_openfiles(NULL, "/dev/null", NULL, 0, NULL); kd = kvm_openfiles(NULL, "/dev/null", NULL, 0, NULL);
if(kd == NULL) { if (kd == NULL) {
warn("kvm_openfiles '/dev/null':"); warn("kvm_openfiles '/dev/null':");
return 0; return 0;
} }
if(kvm_getswapinfo(kd, swap_info, size, 0 /* Unused flags */) == -1) { if (kvm_getswapinfo(kd, swap_info, size, 0 /* Unused flags */) < 0) {
warn("kvm_getswapinfo:"); warn("kvm_getswapinfo:");
kvm_close(kd); kvm_close(kd);
return 0; return 0;
@ -231,7 +220,7 @@
struct kvm_swap swap_info[1]; struct kvm_swap swap_info[1];
long used, total; long used, total;
if(!getswapinfo(swap_info, 1)) if (!getswapinfo(swap_info, 1))
return NULL; return NULL;
total = swap_info[0].ksw_total; total = swap_info[0].ksw_total;
@ -246,7 +235,7 @@
struct kvm_swap swap_info[1]; struct kvm_swap swap_info[1];
long used, total; long used, total;
if(!getswapinfo(swap_info, 1)) if (!getswapinfo(swap_info, 1))
return NULL; return NULL;
total = swap_info[0].ksw_total; total = swap_info[0].ksw_total;
@ -261,7 +250,7 @@
struct kvm_swap swap_info[1]; struct kvm_swap swap_info[1];
long total; long total;
if(!getswapinfo(swap_info, 1)) if (!getswapinfo(swap_info, 1))
return NULL; return NULL;
total = swap_info[0].ksw_total; total = swap_info[0].ksw_total;
@ -275,7 +264,7 @@
struct kvm_swap swap_info[1]; struct kvm_swap swap_info[1];
long used; long used;
if(!getswapinfo(swap_info, 1)) if (!getswapinfo(swap_info, 1))
return NULL; return NULL;
used = swap_info[0].ksw_used; used = swap_info[0].ksw_used;

View File

@ -1,8 +1,8 @@
/* See LICENSE file for copyright and license details. */ /* See LICENSE file for copyright and license details. */
#include <stddef.h> #include <stddef.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
#if defined(__linux__) #if defined(__linux__)
@ -13,9 +13,8 @@
{ {
uintmax_t temp; uintmax_t temp;
if (pscanf(file, "%ju", &temp) != 1) { if (pscanf(file, "%ju", &temp) != 1)
return NULL; return NULL;
}
return bprintf("%ju", temp / 1000); return bprintf("%ju", temp / 1000);
} }

View File

@ -3,8 +3,8 @@
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
#if defined(CLOCK_BOOTTIME) #if defined(CLOCK_BOOTTIME)
#define UPTIME_FLAG CLOCK_BOOTTIME #define UPTIME_FLAG CLOCK_BOOTTIME
@ -22,7 +22,7 @@ uptime(const char *unused)
struct timespec uptime; struct timespec uptime;
if (clock_gettime(UPTIME_FLAG, &uptime) < 0) { if (clock_gettime(UPTIME_FLAG, &uptime) < 0) {
snprintf(warn_buf, 256, "clock_gettime %d", UPTIME_FLAG); snprintf(warn_buf, sizeof(warn_buf), "clock_gettime %d", UPTIME_FLAG);
warn(warn_buf); warn(warn_buf);
return NULL; return NULL;
} }

View File

@ -4,8 +4,8 @@
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
const char * const char *
gid(const char *unused) gid(const char *unused)

View File

@ -5,14 +5,14 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <unistd.h> #include <unistd.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
#if defined(__OpenBSD__) | defined(__FreeBSD__) #if defined(__OpenBSD__) | defined(__FreeBSD__)
#include <sys/queue.h>
#include <poll.h> #include <poll.h>
#include <sndio.h> #include <sndio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/queue.h>
struct control { struct control {
LIST_ENTRY(control) next; LIST_ENTRY(control) next;

View File

@ -6,8 +6,8 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <unistd.h> #include <unistd.h>
#include "../util.h"
#include "../slstatus.h" #include "../slstatus.h"
#include "../util.h"
#define RSSI_TO_PERC(rssi) \ #define RSSI_TO_PERC(rssi) \
rssi >= -50 ? 100 : \ rssi >= -50 ? 100 : \
@ -38,27 +38,24 @@
} }
p = fgets(status, 5, fp); p = fgets(status, 5, fp);
fclose(fp); fclose(fp);
if (!p || strcmp(status, "up\n") != 0) { if (!p || strcmp(status, "up\n") != 0)
return NULL; return NULL;
}
if (!(fp = fopen("/proc/net/wireless", "r"))) { if (!(fp = fopen("/proc/net/wireless", "r"))) {
warn("fopen '/proc/net/wireless':"); warn("fopen '/proc/net/wireless':");
return NULL; return NULL;
} }
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++)
if (!(p = fgets(buf, sizeof(buf) - 1, fp))) if (!(p = fgets(buf, sizeof(buf) - 1, fp)))
break; break;
}
fclose(fp);
if (i < 2 || !p) {
return NULL;
}
if (!(datastart = strstr(buf, interface))) { fclose(fp);
if (i < 2 || !p)
return NULL;
if (!(datastart = strstr(buf, interface)))
return NULL; return NULL;
}
datastart = (datastart+(strlen(interface)+1)); datastart = (datastart+(strlen(interface)+1));
sscanf(datastart + 1, " %*d %d %*d %*d\t\t %*d\t " sscanf(datastart + 1, " %*d %d %*d %*d\t\t %*d\t "
@ -78,9 +75,8 @@
memset(&wreq, 0, sizeof(struct iwreq)); memset(&wreq, 0, sizeof(struct iwreq));
wreq.u.essid.length = IW_ESSID_MAX_SIZE+1; wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;
if (esnprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", if (esnprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s",
interface) < 0) { interface) < 0)
return NULL; return NULL;
}
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
warn("socket 'AF_INET':"); warn("socket 'AF_INET':");
@ -95,9 +91,8 @@
close(sockfd); close(sockfd);
if (!strcmp(id, "")) { if (!strcmp(id, ""))
return NULL; return NULL;
}
return id; return id;
} }
@ -153,11 +148,11 @@
int q; int q;
if (load_ieee80211_nodereq(interface, &nr)) { if (load_ieee80211_nodereq(interface, &nr)) {
if (nr.nr_max_rssi) { if (nr.nr_max_rssi)
q = IEEE80211_NODEREQ_RSSI(&nr); q = IEEE80211_NODEREQ_RSSI(&nr);
} else { else
q = RSSI_TO_PERC(nr.nr_rssi); q = RSSI_TO_PERC(nr.nr_rssi);
}
return bprintf("%d", q); return bprintf("%d", q);
} }
@ -169,9 +164,8 @@
{ {
struct ieee80211_nodereq nr; struct ieee80211_nodereq nr;
if (load_ieee80211_nodereq(interface, &nr)) { if (load_ieee80211_nodereq(interface, &nr))
return bprintf("%s", nr.nr_nwid); return bprintf("%s", nr.nr_nwid);
}
return NULL; return NULL;
} }
@ -257,7 +251,7 @@
fmt = NULL; fmt = NULL;
len = sizeof(ssid); len = sizeof(ssid);
memset(&ssid, 0, len); memset(&ssid, 0, len);
if (load_ieee80211req(sockfd, interface, &ssid, IEEE80211_IOC_SSID, &len )) { if (load_ieee80211req(sockfd, interface, &ssid, IEEE80211_IOC_SSID, &len)) {
if (len < sizeof(ssid)) if (len < sizeof(ssid))
len += 1; len += 1;
else else

View File

@ -14,16 +14,17 @@ static const char unknown_str[] = "n/a";
* *
* battery_perc battery percentage battery name (BAT0) * battery_perc battery percentage battery name (BAT0)
* NULL on OpenBSD/FreeBSD * NULL on OpenBSD/FreeBSD
* battery_state battery charging state battery name (BAT0)
* NULL on OpenBSD/FreeBSD
* battery_remaining battery remaining HH:MM battery name (BAT0) * battery_remaining battery remaining HH:MM battery name (BAT0)
* NULL on OpenBSD/FreeBSD * NULL on OpenBSD/FreeBSD
* cpu_perc cpu usage in percent NULL * battery_state battery charging state battery name (BAT0)
* NULL on OpenBSD/FreeBSD
* cat read arbitrary file path
* cpu_freq cpu frequency in MHz NULL * cpu_freq cpu frequency in MHz NULL
* cpu_perc cpu usage in percent NULL
* datetime date and time format string (%F %T) * datetime date and time format string (%F %T)
* disk_free free disk space in GB mountpoint path (/) * disk_free free disk space in GB mountpoint path (/)
* disk_perc disk usage in percent mountpoint path (/) * disk_perc disk usage in percent mountpoint path (/)
* disk_total total disk space in GB mountpoint path (/") * disk_total total disk space in GB mountpoint path (/)
* disk_used used disk space in GB mountpoint path (/) * disk_used used disk space in GB mountpoint path (/)
* entropy available entropy NULL * entropy available entropy NULL
* gid GID of current user NULL * gid GID of current user NULL
@ -59,8 +60,8 @@ static const char unknown_str[] = "n/a";
* username username of current user NULL * username username of current user NULL
* vol_perc OSS/ALSA volume in percent mixer file (/dev/mixer) * vol_perc OSS/ALSA volume in percent mixer file (/dev/mixer)
* NULL on OpenBSD/FreeBSD * NULL on OpenBSD/FreeBSD
* wifi_perc WiFi signal in percent interface name (wlan0)
* wifi_essid WiFi ESSID interface name (wlan0) * wifi_essid WiFi ESSID interface name (wlan0)
* wifi_perc WiFi signal in percent interface name (wlan0)
*/ */
static const struct arg args[] = { static const struct arg args[] = {
/* function format argument */ /* function format argument */

View File

@ -1,5 +1,5 @@
# slstatus version # slstatus version
VERSION = 0 VERSION = 1.0
# customize below to fit your system # customize below to fit your system
@ -11,7 +11,7 @@ X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib X11LIB = /usr/X11R6/lib
# flags # flags
CPPFLAGS = -I$(X11INC) -D_DEFAULT_SOURCE CPPFLAGS = -I$(X11INC) -D_DEFAULT_SOURCE -DVERSION=\"${VERSION}\"
CFLAGS = -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter -Os CFLAGS = -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter -Os
LDFLAGS = -L$(X11LIB) -s LDFLAGS = -L$(X11LIB) -s
# OpenBSD: add -lsndio # OpenBSD: add -lsndio

View File

@ -1,22 +1,29 @@
.Dd 2020-06-23 .Dd 2023-04-23
.Dt SLSTATUS 1 .Dt SLSTATUS 1
.Os .Os
.Sh NAME .Sh NAME
.Nm slstatus .Nm slstatus
.Nd suckless status monitor .Nd suckless status
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl s .Op Fl s
.Op Fl 1 .Op Fl 1
.Sh DESCRIPTION .Sh DESCRIPTION
.Nm .Nm
is a suckless status monitor for window managers that use WM_NAME (e.g. dwm) or is a small tool for providing system status information to other programs
stdin to fill the status bar. over the EWMH
.Em WM_NAME
property of the root window (used by
.Xr dwm 1 ) or standard input/output. It is designed to be as efficient as possible by
only issuing the minimum of system calls required.
.P
By default, By default,
.Nm .Nm
outputs to WM_NAME. outputs to WM_NAME.
.Sh OPTIONS .Sh OPTIONS
.Bl -tag -width Ds .Bl -tag -width Ds
.It Fl v
Print version information to stderr, then exit.
.It Fl s .It Fl s
Write to stdout instead of WM_NAME. Write to stdout instead of WM_NAME.
.It Fl 1 .It Fl 1
@ -26,3 +33,15 @@ Write once to stdout and quit.
.Nm .Nm
can be customized by creating a custom config.h and (re)compiling the source can be customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple. code. This keeps it fast, secure and simple.
.Sh SIGNALS
.Nm
responds to the following signals:
.Pp
.Bl -tag -width TERM -compact
.It USR1
Triggers an instant redraw.
.El
.Sh AUTHORS
See the LICENSE file for the authors.
.Sh SEE ALSO
.Xr dwm 1

View File

@ -41,7 +41,7 @@ difftimespec(struct timespec *res, struct timespec *a, struct timespec *b)
static void static void
usage(void) usage(void)
{ {
die("usage: %s [-s] [-1]", argv0); die("usage: %s [-v] [-s] [-1]", argv0);
} }
int int
@ -56,19 +56,20 @@ main(int argc, char *argv[])
sflag = 0; sflag = 0;
ARGBEGIN { ARGBEGIN {
case '1': case 'v':
done = 1; die("slstatus-"VERSION);
/* fallthrough */ case '1':
case 's': done = 1;
sflag = 1; /* FALLTHROUGH */
break; case 's':
default: sflag = 1;
usage(); break;
default:
usage();
} ARGEND } ARGEND
if (argc) { if (argc)
usage(); usage();
}
memset(&act, 0, sizeof(act)); memset(&act, 0, sizeof(act));
act.sa_handler = terminate; act.sa_handler = terminate;
@ -77,24 +78,22 @@ main(int argc, char *argv[])
act.sa_flags |= SA_RESTART; act.sa_flags |= SA_RESTART;
sigaction(SIGUSR1, &act, NULL); sigaction(SIGUSR1, &act, NULL);
if (!sflag && !(dpy = XOpenDisplay(NULL))) { if (!sflag && !(dpy = XOpenDisplay(NULL)))
die("XOpenDisplay: Failed to open display"); die("XOpenDisplay: Failed to open display");
}
do { do {
if (clock_gettime(CLOCK_MONOTONIC, &start) < 0) { if (clock_gettime(CLOCK_MONOTONIC, &start) < 0)
die("clock_gettime:"); die("clock_gettime:");
}
status[0] = '\0'; status[0] = '\0';
for (i = len = 0; i < LEN(args); i++) { for (i = len = 0; i < LEN(args); i++) {
if (!(res = args[i].func(args[i].args))) { if (!(res = args[i].func(args[i].args)))
res = unknown_str; res = unknown_str;
}
if ((ret = esnprintf(status + len, sizeof(status) - len, if ((ret = esnprintf(status + len, sizeof(status) - len,
args[i].fmt, res)) < 0) { args[i].fmt, res)) < 0)
break; break;
}
len += ret; len += ret;
} }
@ -104,37 +103,31 @@ main(int argc, char *argv[])
if (ferror(stdout)) if (ferror(stdout))
die("puts:"); die("puts:");
} else { } else {
if (XStoreName(dpy, DefaultRootWindow(dpy), status) if (XStoreName(dpy, DefaultRootWindow(dpy), status) < 0)
< 0) {
die("XStoreName: Allocation failed"); die("XStoreName: Allocation failed");
}
XFlush(dpy); XFlush(dpy);
} }
if (!done) { if (!done) {
if (clock_gettime(CLOCK_MONOTONIC, &current) < 0) { if (clock_gettime(CLOCK_MONOTONIC, &current) < 0)
die("clock_gettime:"); die("clock_gettime:");
}
difftimespec(&diff, &current, &start); difftimespec(&diff, &current, &start);
intspec.tv_sec = interval / 1000; intspec.tv_sec = interval / 1000;
intspec.tv_nsec = (interval % 1000) * 1E6; intspec.tv_nsec = (interval % 1000) * 1E6;
difftimespec(&wait, &intspec, &diff); difftimespec(&wait, &intspec, &diff);
if (wait.tv_sec >= 0) { if (wait.tv_sec >= 0 &&
if (nanosleep(&wait, NULL) < 0 && nanosleep(&wait, NULL) < 0 &&
errno != EINTR) { errno != EINTR)
die("nanosleep:"); die("nanosleep:");
}
}
} }
} while (!done); } while (!done);
if (!sflag) { if (!sflag) {
XStoreName(dpy, DefaultRootWindow(dpy), NULL); XStoreName(dpy, DefaultRootWindow(dpy), NULL);
if (XCloseDisplay(dpy) < 0) { if (XCloseDisplay(dpy) < 0)
die("XCloseDisplay: Failed to close display"); die("XCloseDisplay: Failed to close display");
}
} }
return 0; return 0;

View File

@ -2,8 +2,11 @@
/* battery */ /* battery */
const char *battery_perc(const char *); const char *battery_perc(const char *);
const char *battery_state(const char *);
const char *battery_remaining(const char *); const char *battery_remaining(const char *);
const char *battery_state(const char *);
/* cat */
const char *cat(const char *path);
/* cpu */ /* cpu */
const char *cpu_freq(const char *unused); const char *cpu_freq(const char *unused);
@ -70,12 +73,12 @@ const char *uptime(const char *unused);
/* user */ /* user */
const char *gid(const char *unused); const char *gid(const char *unused);
const char *username(const char *unused);
const char *uid(const char *unused); const char *uid(const char *unused);
const char *username(const char *unused);
/* volume */ /* volume */
const char *vol_perc(const char *card); const char *vol_perc(const char *card);
/* wifi */ /* wifi */
const char *wifi_perc(const char *interface);
const char *wifi_essid(const char *interface); const char *wifi_essid(const char *interface);
const char *wifi_perc(const char *interface);

7
util.c
View File

@ -13,10 +13,6 @@ char *argv0;
static void static void
verr(const char *fmt, va_list ap) verr(const char *fmt, va_list ap)
{ {
if (argv0 && strncmp(fmt, "usage", sizeof("usage") - 1)) {
fprintf(stderr, "%s: ", argv0);
}
vfprintf(stderr, fmt, ap); vfprintf(stderr, fmt, ap);
if (fmt[0] && fmt[strlen(fmt) - 1] == ':') { if (fmt[0] && fmt[strlen(fmt) - 1] == ':') {
@ -119,9 +115,8 @@ fmt_human(uintmax_t num, int base)
} }
scaled = num; scaled = num;
for (i = 0; i < prefixlen && scaled >= base; i++) { for (i = 0; i < prefixlen && scaled >= base; i++)
scaled /= base; scaled /= base;
}
return bprintf("%.1f %s", scaled, prefix[i]); return bprintf("%.1f %s", scaled, prefix[i]);
} }

2
util.h
View File

@ -3,7 +3,7 @@
extern char buf[1024]; extern char buf[1024];
#define LEN(x) (sizeof (x) / sizeof *(x)) #define LEN(x) (sizeof(x) / sizeof((x)[0]))
extern char *argv0; extern char *argv0;