summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--i3status.c9
-rw-r--r--i3status.h1
-rw-r--r--src/print_disk_info.c67
3 files changed, 77 insertions, 0 deletions
diff --git a/i3status.c b/i3status.c
index 141a984..e72b677 100644
--- a/i3status.c
+++ b/i3status.c
@@ -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"));
diff --git a/i3status.h b/i3status.h
index d00d318..b6fdd86 100644
--- a/i3status.h
+++ b/i3status.h
@@ -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");
+ }
+ }
+}