Add support for cpu and uptime components on FreeBSD - slstatus - status monitor
 (HTM) git clone git://git.suckless.org/slstatus
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 120d15059425b522db464e6f3f857bee4a781cce
 (DIR) parent ec306623df7321a4e6ec11f70b6152a2e614d1ed
 (HTM) Author: Michael Buch <michaelbuch12@gmail.com>
       Date:   Tue,  5 Feb 2019 02:44:37 +0000
       
       Add support for cpu and uptime components on FreeBSD
       
       Diffstat:
         M components/cpu.c                    |      50 +++++++++++++++++++++++++++++++
         M components/uptime.c                 |      14 ++++++++++++--
       
       2 files changed, 62 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/components/cpu.c b/components/cpu.c
       @@ -103,4 +103,54 @@
                                        (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
                                         b[CP_INTR] + b[CP_IDLE])));
                }
       +#elif defined(__FreeBSD__)
       +        #include <sys/param.h>
       +        #include <sys/sysctl.h>
       +        #include <devstat.h>
       +
       +        const char *
       +        cpu_freq(void)
       +        {
       +                int freq;
       +                size_t size;
       +
       +                size = sizeof(freq);
       +                /* in MHz */
       +                if (sysctlbyname("hw.clockrate", &freq, &size, NULL, 0) == -1
       +                                || !size) {
       +                        warn("sysctlbyname 'hw.clockrate':");
       +                        return NULL;
       +                }
       +
       +                return fmt_human(freq * 1E6, 1000);
       +        }
       +
       +        const char *
       +        cpu_perc(void)
       +        {
       +                size_t size;
       +                static long a[CPUSTATES];
       +                long b[CPUSTATES];
       +
       +                size = sizeof(a);
       +                memcpy(b, a, sizeof(b));
       +                if (sysctlbyname("kern.cp_time", &a, &size, NULL, 0) == -1
       +                                || !size) {
       +                        warn("sysctlbyname 'kern.cp_time':");
       +                        return NULL;
       +                }
       +                if (b[0] == 0) {
       +                        return NULL;
       +                }
       +
       +                return bprintf("%d", 100 *
       +                               ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
       +                                 a[CP_INTR]) -
       +                                (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
       +                                 b[CP_INTR])) /
       +                               ((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])));
       +        }
        #endif
 (DIR) diff --git a/components/uptime.c b/components/uptime.c
       @@ -5,14 +5,24 @@
        
        #include "../util.h"
        
       +#if defined(CLOCK_BOOTTIME)
       +        #define UPTIME_FLAG CLOCK_BOOTTIME
       +#elif defined(CLOCK_UPTIME)
       +        #define UPTIME_FLAG CLOCK_UPTIME
       +#else
       +        #define UPTIME_FLAG CLOCK_MONOTONIC
       +#endif
       +
        const char *
        uptime(void)
        {
       +        char warn_buf[256];
                uintmax_t h, m;
                struct timespec uptime;
        
       -        if (clock_gettime(CLOCK_BOOTTIME, &uptime) < 0) {
       -                warn("clock_gettime 'CLOCK_BOOTTIME'");
       +        if (clock_gettime(UPTIME_FLAG, &uptime) < 0) {
       +                snprintf(warn_buf, 256, "clock_gettime %d", UPTIME_FLAG);
       +                warn(warn_buf);
                        return NULL;
                }