diff options
| author | Michael Stapelberg | 2009-10-11 23:27:26 +0200 | 
|---|---|---|
| committer | Michael Stapelberg | 2009-10-11 23:27:26 +0200 | 
| commit | 783707906c102c6b30f18a3837cec523974b882c (patch) | |
| tree | 4df9f8d993637a5042ac6570cd30d52558633d88 | |
| parent | Breaks configfiles! Major refactoring of i3status, see below (diff) | |
Implement disk info (%free/%used/%total)
| -rw-r--r-- | i3status.c | 9 | ||||
| -rw-r--r-- | i3status.h | 1 | ||||
| -rw-r--r-- | src/print_disk_info.c | 67 | 
3 files changed, 77 insertions, 0 deletions
| @@ -114,6 +114,11 @@ int main(int argc, char *argv[]) {                  CFG_END()          }; +        cfg_opt_t disk_opts[] = { +                CFG_STR("format", "%free", CFGF_NONE), +                CFG_END() +        }; +          cfg_opt_t opts[] = {                  CFG_STR_LIST("order", "{ipv6,\"run_watch DHCP\",\"wireless wlan0\",\"ethernet eth0\",\"battery 0\",\"cpu_temperature 0\",load,time}", CFGF_NONE),                  CFG_SEC("general", general_opts, CFGF_NONE), @@ -122,6 +127,7 @@ int main(int argc, char *argv[]) {                  CFG_SEC("ethernet", ethernet_opts, CFGF_TITLE | CFGF_MULTI),                  CFG_SEC("battery", battery_opts, CFGF_TITLE | CFGF_MULTI),                  CFG_SEC("cpu_temperature", temp_opts, CFGF_TITLE | CFGF_MULTI), +                CFG_SEC("disk", disk_opts, CFGF_TITLE | CFGF_MULTI),                  CFG_SEC("ipv6", ipv6_opts, CFGF_TITLE),                  CFG_SEC("time", time_opts, CFGF_NONE),                  CFG_SEC("load", load_opts, CFGF_NONE), @@ -181,6 +187,9 @@ int main(int argc, char *argv[]) {                          CASE_SEC_TITLE("run_watch")                                  print_run_watch(title, cfg_getstr(sec, "pidfile"), cfg_getstr(sec, "format")); +                        CASE_SEC_TITLE("disk") +                                print_disk_info(title, cfg_getstr(sec, "format")); +                          CASE_SEC("load")                                  print_load(cfg_getstr(sec, "format")); @@ -62,6 +62,7 @@ char *color(const char *colorstr);  char *endcolor() __attribute__ ((pure));  void print_ipv6_info(const char *format); +void print_disk_info(const char *path, const char *format);  void print_battery_info(int number, const char *format);  void print_time(const char *format);  const char *get_ip_addr(); diff --git a/src/print_disk_info.c b/src/print_disk_info.c new file mode 100644 index 0000000..84524c3 --- /dev/null +++ b/src/print_disk_info.c @@ -0,0 +1,67 @@ +// vim:ts=8:expandtab +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <stdint.h> +#include <sys/statvfs.h> +#include <sys/types.h> + +#include "i3status.h" + +#define TERABYTE (1024ULL * 1024 * 1024 * 1024) +#define GIGABYTE (1024ULL * 1024 * 1024) +#define MEGABYTE (1024ULL * 1024) +#define KILOBYTE (1024ULL) + +void print_bytes_human(uint64_t bytes) { +        /* 1 TB */ +        if (bytes > TERABYTE) +                printf("%f TB", (double)bytes / TERABYTE); +        else if (bytes > GIGABYTE) +                printf("%.01f GB", (double)bytes / GIGABYTE); +        else if (bytes > MEGABYTE) +                printf("%.01f MB", (double)bytes / MEGABYTE); +        else if (bytes > KILOBYTE) +                printf("%.01f KB", (double)bytes / KILOBYTE); +        else { +                printf("%.01f B", (double)bytes); +        } + +} + +/* + * Just parses /proc/net/wireless looking for lines beginning with + * wlan_interface, extracting the quality of the link and adding the + * current IP address of wlan_interface. + * + */ +void print_disk_info(const char *path, const char *format) { +        const char *walk; +        struct statvfs buf; + +        if (statvfs(path, &buf) == -1) +                return; + +        for (walk = format; *walk != '\0'; walk++) { +                if (*walk != '%') { +                        putchar(*walk); +                        continue; +                } + +                if (BEGINS_WITH(walk+1, "free")) { +                        print_bytes_human(buf.f_bsize * buf.f_bfree); +                        walk += strlen("free"); +                } + +                if (BEGINS_WITH(walk+1, "used")) { +                        print_bytes_human(buf.f_bsize * (buf.f_blocks - buf.f_bfree)); +                        walk += strlen("used"); +                } + +                if (BEGINS_WITH(walk+1, "total")) { +                        print_bytes_human(buf.f_bsize * buf.f_blocks); +                        walk += strlen("total"); +                } +        } +} | 
