From here on, we’ll use clang-format to automatically format the source.
This has worked well in i3, so we are introducing it for i3status.
--- /dev/null
+BasedOnStyle: google
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortBlocksOnASingleLine: false
+AlwaysBreakBeforeMultilineStrings: false
+IndentWidth: 4
+PointerBindsToType: false
+ColumnLimit: 0
+SpaceBeforeParens: ControlStatements
/*
- * vim:ts=8:expandtab
+ * vim:ts=4:sw=4:expandtab
*
* i3status – Generates a status line for dzen2 or xmobar
*
#include "i3status.h"
-#define exit_if_null(pointer, ...) { if (pointer == NULL) die(__VA_ARGS__); }
+#define exit_if_null(pointer, ...) \
+ { \
+ if (pointer == NULL) \
+ die(__VA_ARGS__); \
+ }
#define CFG_CUSTOM_ALIGN_OPT \
CFG_STR_CB("align", NULL, CFGF_NONE, parse_align)
-#define CFG_COLOR_OPTS(good, degraded, bad) \
- CFG_STR("color_good", good, CFGF_NONE), \
- CFG_STR("color_degraded", degraded, CFGF_NONE), \
- CFG_STR("color_bad", bad, CFGF_NONE)
+#define CFG_COLOR_OPTS(good, degraded, bad) \
+ CFG_STR("color_good", good, CFGF_NONE), \
+ CFG_STR("color_degraded", degraded, CFGF_NONE), \
+ CFG_STR("color_bad", bad, CFGF_NONE)
#define CFG_CUSTOM_COLOR_OPTS CFG_COLOR_OPTS(NULL, NULL, NULL)
*
*/
void fatalsig(int signum) {
- exit_upon_signal = true;
+ exit_upon_signal = true;
}
/*
*
*/
static bool path_exists(const char *path) {
- struct stat buf;
- return (stat(path, &buf) == 0);
+ struct stat buf;
+ return (stat(path, &buf) == 0);
}
static void *scalloc(size_t size) {
- void *result = calloc(size, 1);
- exit_if_null(result, "Error: out of memory (calloc(%zd))\n", size);
- return result;
+ void *result = calloc(size, 1);
+ exit_if_null(result, "Error: out of memory (calloc(%zd))\n", size);
+ return result;
}
static char *sstrdup(const char *str) {
- char *result = strdup(str);
- exit_if_null(result, "Error: out of memory (strdup())\n");
- return result;
+ char *result = strdup(str);
+ exit_if_null(result, "Error: out of memory (strdup())\n");
+ return result;
}
/*
* Parses the "align" module option (to validate input).
*/
static int parse_align(cfg_t *context, cfg_opt_t *option, const char *value, void *result) {
- if (strcasecmp(value, "left") != 0 && strcasecmp(value,"right") != 0 && strcasecmp(value, "center") != 0)
- die("Invalid alignment attribute found in section %s, line %d: \"%s\"\n"
- "Valid attributes are: left, center, right\n", context->name, context->line, value);
+ if (strcasecmp(value, "left") != 0 && strcasecmp(value, "right") != 0 && strcasecmp(value, "center") != 0)
+ die("Invalid alignment attribute found in section %s, line %d: \"%s\"\n"
+ "Valid attributes are: left, center, right\n",
+ context->name, context->line, value);
- const char **cresult = result;
- *cresult = value;
+ const char **cresult = result;
+ *cresult = value;
- return 0;
+ return 0;
}
/*
* Parses the "min_width" module option whose value can either be a string or an integer.
*/
static int parse_min_width(cfg_t *context, cfg_opt_t *option, const char *value, void *result) {
- char *end;
- long num = strtol(value, &end, 10);
-
- if (num < 0)
- die("Invalid min_width attribute found in section %s, line %d: %d\n"
- "Expected positive integer or string\n", context->name, context->line, num);
- else if (num == LONG_MIN || num == LONG_MAX || (end && *end != '\0'))
- num = 0;
-
- if (strlen(value) == 0)
- die("Empty min_width attribute found in section %s, line %d\n"
- "Expected positive integer or non-empty string\n", context->name, context->line);
-
- if (strcmp(value, "0") == 0)
- die("Invalid min_width attribute found in section %s, line %d: \"%s\"\n"
- "Expected positive integer or string\n", context->name, context->line, value);
-
- struct min_width *parsed = scalloc(sizeof(struct min_width));
- parsed->num = num;
-
- /* num is preferred, but if it’s 0 (i.e. not valid), store and use
- * the raw string value */
- if (num == 0)
- parsed->str = sstrdup(value);
-
- struct min_width **cresult = result;
- *cresult = parsed;
-
- return 0;
+ char *end;
+ long num = strtol(value, &end, 10);
+
+ if (num < 0)
+ die("Invalid min_width attribute found in section %s, line %d: %d\n"
+ "Expected positive integer or string\n",
+ context->name, context->line, num);
+ else if (num == LONG_MIN || num == LONG_MAX || (end && *end != '\0'))
+ num = 0;
+
+ if (strlen(value) == 0)
+ die("Empty min_width attribute found in section %s, line %d\n"
+ "Expected positive integer or non-empty string\n",
+ context->name, context->line);
+
+ if (strcmp(value, "0") == 0)
+ die("Invalid min_width attribute found in section %s, line %d: \"%s\"\n"
+ "Expected positive integer or string\n",
+ context->name, context->line, value);
+
+ struct min_width *parsed = scalloc(sizeof(struct min_width));
+ parsed->num = num;
+
+ /* num is preferred, but if it’s 0 (i.e. not valid), store and use
+ * the raw string value */
+ if (num == 0)
+ parsed->str = sstrdup(value);
+
+ struct min_width **cresult = result;
+ *cresult = parsed;
+
+ return 0;
}
/*
* Validates a color in "#RRGGBB" format
*
*/
-static int valid_color(const char *value)
-{
- if (strlen(value) != 7) return 0;
- if (value[0] != '#') return 0;
- for (int i = 1; i < 7; ++i) {
- if (value[i] >= '0' && value[i] <= '9') continue;
- if (value[i] >= 'a' && value[i] <= 'f') continue;
- if (value[i] >= 'A' && value[i] <= 'F') continue;
- return 0;
- }
- return 1;
+static int valid_color(const char *value) {
+ if (strlen(value) != 7)
+ return 0;
+ if (value[0] != '#')
+ return 0;
+ for (int i = 1; i < 7; ++i) {
+ if (value[i] >= '0' && value[i] <= '9')
+ continue;
+ if (value[i] >= 'a' && value[i] <= 'f')
+ continue;
+ if (value[i] >= 'A' && value[i] <= 'F')
+ continue;
+ return 0;
+ }
+ return 1;
}
/*
*
*/
static char *resolve_tilde(const char *path) {
- static glob_t globbuf;
- char *head, *tail, *result = NULL;
-
- tail = strchr(path, '/');
- head = strndup(path, tail ? (size_t)(tail - path) : strlen(path));
-
- int res = glob(head, GLOB_TILDE, NULL, &globbuf);
- free(head);
- /* no match, or many wildcard matches are bad */
- if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1)
- result = sstrdup(path);
- else if (res != 0) {
- die("glob() failed");
- } else {
- head = globbuf.gl_pathv[0];
- result = scalloc(strlen(head) + (tail ? strlen(tail) : 0) + 1);
- strncpy(result, head, strlen(head));
- if (tail)
- strncat(result, tail, strlen(tail));
- }
- globfree(&globbuf);
-
- return result;
+ static glob_t globbuf;
+ char *head, *tail, *result = NULL;
+
+ tail = strchr(path, '/');
+ head = strndup(path, tail ? (size_t)(tail - path) : strlen(path));
+
+ int res = glob(head, GLOB_TILDE, NULL, &globbuf);
+ free(head);
+ /* no match, or many wildcard matches are bad */
+ if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1)
+ result = sstrdup(path);
+ else if (res != 0) {
+ die("glob() failed");
+ } else {
+ head = globbuf.gl_pathv[0];
+ result = scalloc(strlen(head) + (tail ? strlen(tail) : 0) + 1);
+ strncpy(result, head, strlen(head));
+ if (tail)
+ strncat(result, tail, strlen(tail));
+ }
+ globfree(&globbuf);
+
+ return result;
}
static char *get_config_path(void) {
- char *xdg_config_home, *xdg_config_dirs, *config_path;
-
- /* 1: check the traditional path under the home directory */
- config_path = resolve_tilde("~/.i3status.conf");
- if (path_exists(config_path))
- return config_path;
-
- /* 2: check for $XDG_CONFIG_HOME/i3status/config */
- if ((xdg_config_home = getenv("XDG_CONFIG_HOME")) == NULL)
- xdg_config_home = "~/.config";
-
- xdg_config_home = resolve_tilde(xdg_config_home);
- if (asprintf(&config_path, "%s/i3status/config", xdg_config_home) == -1)
- die("asprintf() failed");
- free(xdg_config_home);
-
- if (path_exists(config_path))
- return config_path;
- free(config_path);
-
- /* 3: check the traditional path under /etc */
- config_path = SYSCONFDIR "/i3status.conf";
- if (path_exists(config_path))
- return sstrdup(config_path);
-
- /* 4: check for $XDG_CONFIG_DIRS/i3status/config */
- if ((xdg_config_dirs = getenv("XDG_CONFIG_DIRS")) == NULL)
- xdg_config_dirs = "/etc/xdg";
-
- char *buf = strdup(xdg_config_dirs);
- char *tok = strtok(buf, ":");
- while (tok != NULL) {
- tok = resolve_tilde(tok);
- if (asprintf(&config_path, "%s/i3status/config", tok) == -1)
- die("asprintf() failed");
- free(tok);
- if (path_exists(config_path)) {
- free(buf);
- return config_path;
- }
- free(config_path);
- tok = strtok(NULL, ":");
+ char *xdg_config_home, *xdg_config_dirs, *config_path;
+
+ /* 1: check the traditional path under the home directory */
+ config_path = resolve_tilde("~/.i3status.conf");
+ if (path_exists(config_path))
+ return config_path;
+
+ /* 2: check for $XDG_CONFIG_HOME/i3status/config */
+ if ((xdg_config_home = getenv("XDG_CONFIG_HOME")) == NULL)
+ xdg_config_home = "~/.config";
+
+ xdg_config_home = resolve_tilde(xdg_config_home);
+ if (asprintf(&config_path, "%s/i3status/config", xdg_config_home) == -1)
+ die("asprintf() failed");
+ free(xdg_config_home);
+
+ if (path_exists(config_path))
+ return config_path;
+ free(config_path);
+
+ /* 3: check the traditional path under /etc */
+ config_path = SYSCONFDIR "/i3status.conf";
+ if (path_exists(config_path))
+ return sstrdup(config_path);
+
+ /* 4: check for $XDG_CONFIG_DIRS/i3status/config */
+ if ((xdg_config_dirs = getenv("XDG_CONFIG_DIRS")) == NULL)
+ xdg_config_dirs = "/etc/xdg";
+
+ char *buf = strdup(xdg_config_dirs);
+ char *tok = strtok(buf, ":");
+ while (tok != NULL) {
+ tok = resolve_tilde(tok);
+ if (asprintf(&config_path, "%s/i3status/config", tok) == -1)
+ die("asprintf() failed");
+ free(tok);
+ if (path_exists(config_path)) {
+ free(buf);
+ return config_path;
}
- free(buf);
-
- die("Unable to find the configuration file (looked at "
- "~/.i3status.conf, $XDG_CONFIG_HOME/i3status/config, "
- "/etc/i3status.conf and $XDG_CONFIG_DIRS/i3status/config)");
- return NULL;
+ free(config_path);
+ tok = strtok(NULL, ":");
+ }
+ free(buf);
+
+ die("Unable to find the configuration file (looked at "
+ "~/.i3status.conf, $XDG_CONFIG_HOME/i3status/config, "
+ "/etc/i3status.conf and $XDG_CONFIG_DIRS/i3status/config)");
+ return NULL;
}
/*
* Returns the default separator to use if no custom separator has been specified.
*/
static char *get_default_separator() {
- if (output_format == O_DZEN2)
- return "^p(5;-2)^ro(2)^p()^p(5)";
- if (output_format == O_I3BAR)
- // anything besides the empty string indicates that the default separator should be used
- return "default";
- return " | ";
+ if (output_format == O_DZEN2)
+ return "^p(5;-2)^ro(2)^p()^p(5)";
+ if (output_format == O_I3BAR)
+ // anything besides the empty string indicates that the default separator should be used
+ return "default";
+ return " | ";
}
int main(int argc, char *argv[]) {
- unsigned int j;
-
- cfg_opt_t general_opts[] = {
- CFG_STR("output_format", "auto", CFGF_NONE),
- CFG_BOOL("colors", 1, CFGF_NONE),
- CFG_STR("separator", "default", CFGF_NONE),
- CFG_STR("color_separator", "#333333", CFGF_NONE),
- CFG_INT("interval", 1, CFGF_NONE),
- CFG_COLOR_OPTS("#00FF00", "#FFFF00", "#FF0000"),
- CFG_END()
- };
-
- cfg_opt_t run_watch_opts[] = {
- CFG_STR("pidfile", NULL, CFGF_NONE),
- CFG_STR("format", "%title: %status", CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t path_exists_opts[] = {
- CFG_STR("path", NULL, CFGF_NONE),
- CFG_STR("format", "%title: %status", CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t wireless_opts[] = {
- CFG_STR("format_up", "W: (%quality at %essid, %bitrate) %ip", CFGF_NONE),
- CFG_STR("format_down", "W: down", CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t ethernet_opts[] = {
- CFG_STR("format_up", "E: %ip (%speed)", CFGF_NONE),
- CFG_STR("format_down", "E: down", CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t ipv6_opts[] = {
- CFG_STR("format_up", "%ip", CFGF_NONE),
- CFG_STR("format_down", "no IPv6", CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t battery_opts[] = {
- CFG_STR("format", "%status %percentage %remaining", CFGF_NONE),
- CFG_STR("format_down", "No battery", CFGF_NONE),
- CFG_STR("status_chr", "CHR", CFGF_NONE),
- CFG_STR("status_bat", "BAT", CFGF_NONE),
- CFG_STR("status_full", "FULL", CFGF_NONE),
- CFG_STR("path", "/sys/class/power_supply/BAT%d/uevent", CFGF_NONE),
- CFG_INT("low_threshold", 30, CFGF_NONE),
- CFG_STR("threshold_type", "time", CFGF_NONE),
- CFG_BOOL("last_full_capacity", false, CFGF_NONE),
- CFG_BOOL("integer_battery_capacity", false, CFGF_NONE),
- CFG_BOOL("hide_seconds", false, CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t time_opts[] = {
- CFG_STR("format", "%Y-%m-%d %H:%M:%S", CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t tztime_opts[] = {
- CFG_STR("format", "%Y-%m-%d %H:%M:%S %Z", CFGF_NONE),
- CFG_STR("timezone", "", CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t ddate_opts[] = {
- CFG_STR("format", "%{%a, %b %d%}, %Y%N - %H", CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t load_opts[] = {
- CFG_STR("format", "%1min %5min %15min", CFGF_NONE),
- CFG_FLOAT("max_threshold", 5, CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t usage_opts[] = {
- CFG_STR("format", "%usage", CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t temp_opts[] = {
- CFG_STR("format", "%degrees C", CFGF_NONE),
- CFG_STR("path", NULL, CFGF_NONE),
- CFG_INT("max_threshold", 75, CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t disk_opts[] = {
- CFG_STR("format", "%free", CFGF_NONE),
- CFG_STR("format_not_mounted", NULL, CFGF_NONE),
- CFG_STR("prefix_type", "binary", CFGF_NONE),
- CFG_STR("threshold_type", "percentage_avail", CFGF_NONE),
- CFG_FLOAT("low_threshold", 0, CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t volume_opts[] = {
- CFG_STR("format", "♪: %volume", CFGF_NONE),
- CFG_STR("format_muted", "♪: 0%%", CFGF_NONE),
- CFG_STR("device", "default", CFGF_NONE),
- CFG_STR("mixer", "Master", CFGF_NONE),
- CFG_INT("mixer_idx", 0, CFGF_NONE),
- CFG_CUSTOM_ALIGN_OPT,
- CFG_CUSTOM_COLOR_OPTS,
- CFG_CUSTOM_MIN_WIDTH_OPT,
- CFG_END()
- };
-
- cfg_opt_t opts[] = {
- CFG_STR_LIST("order", "{}", CFGF_NONE),
- CFG_SEC("general", general_opts, CFGF_NONE),
- CFG_SEC("run_watch", run_watch_opts, CFGF_TITLE | CFGF_MULTI),
- CFG_SEC("path_exists", path_exists_opts, CFGF_TITLE | CFGF_MULTI),
- CFG_SEC("wireless", wireless_opts, CFGF_TITLE | CFGF_MULTI),
- 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("volume", volume_opts, CFGF_TITLE | CFGF_MULTI),
- CFG_SEC("ipv6", ipv6_opts, CFGF_NONE),
- CFG_SEC("time", time_opts, CFGF_NONE),
- CFG_SEC("tztime", tztime_opts, CFGF_TITLE | CFGF_MULTI),
- CFG_SEC("ddate", ddate_opts, CFGF_NONE),
- CFG_SEC("load", load_opts, CFGF_NONE),
- CFG_SEC("cpu_usage", usage_opts, CFGF_NONE),
- CFG_END()
- };
-
- char *configfile = NULL;
- int o, option_index = 0;
- struct option long_options[] = {
- {"config", required_argument, 0, 'c'},
- {"help", no_argument, 0, 'h'},
- {"version", no_argument, 0, 'v'},
- {0, 0, 0, 0}
- };
-
- struct sigaction action;
- memset(&action, 0, sizeof(struct sigaction));
- action.sa_handler = fatalsig;
-
- /* Exit upon SIGPIPE because when we have nowhere to write to, gathering system
- * information is pointless. Also exit explicitly on SIGTERM and SIGINT because
- * only this will trigger a reset of the cursor in the terminal output-format.
- */
- sigaction(SIGPIPE, &action, NULL);
- sigaction(SIGTERM, &action, NULL);
- sigaction(SIGINT, &action, NULL);
-
- memset(&action, 0, sizeof(struct sigaction));
- action.sa_handler = sigusr1;
- sigaction(SIGUSR1, &action, NULL);
-
- if (setlocale(LC_ALL, "") == NULL)
- die("Could not set locale. Please make sure all your LC_* / LANG settings are correct.");
-
- while ((o = getopt_long(argc, argv, "c:hv", long_options, &option_index)) != -1)
- if ((char)o == 'c')
- configfile = optarg;
- else if ((char)o == 'h') {
- printf("i3status " VERSION " © 2008-2012 Michael Stapelberg and contributors\n"
- "Syntax: %s [-c <configfile>] [-h] [-v]\n", argv[0]);
- return 0;
- } else if ((char)o == 'v') {
- printf("i3status " VERSION " © 2008-2012 Michael Stapelberg and contributors\n");
- return 0;
- }
-
-
- if (configfile == NULL)
- configfile = get_config_path();
-
- cfg = cfg_init(opts, CFGF_NOCASE);
- if (cfg_parse(cfg, configfile) == CFG_PARSE_ERROR)
- return EXIT_FAILURE;
-
- if (cfg_size(cfg, "order") == 0)
- die("Your 'order' array is empty. Please fix your config.\n");
-
- cfg_general = cfg_getsec(cfg, "general");
- if (cfg_general == NULL)
- die("Could not get section \"general\"\n");
-
- char *output_str = cfg_getstr(cfg_general, "output_format");
- if (strcasecmp(output_str, "auto") == 0) {
- fprintf(stderr, "i3status: trying to auto-detect output_format setting\n");
- output_str = auto_detect_format();
- if (!output_str) {
- output_str = "none";
- fprintf(stderr, "i3status: falling back to \"none\"\n");
- } else {
- fprintf(stderr, "i3status: auto-detected \"%s\"\n", output_str);
- }
+ unsigned int j;
+
+ cfg_opt_t general_opts[] = {
+ CFG_STR("output_format", "auto", CFGF_NONE),
+ CFG_BOOL("colors", 1, CFGF_NONE),
+ CFG_STR("separator", "default", CFGF_NONE),
+ CFG_STR("color_separator", "#333333", CFGF_NONE),
+ CFG_INT("interval", 1, CFGF_NONE),
+ CFG_COLOR_OPTS("#00FF00", "#FFFF00", "#FF0000"),
+ CFG_END()};
+
+ cfg_opt_t run_watch_opts[] = {
+ CFG_STR("pidfile", NULL, CFGF_NONE),
+ CFG_STR("format", "%title: %status", CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t path_exists_opts[] = {
+ CFG_STR("path", NULL, CFGF_NONE),
+ CFG_STR("format", "%title: %status", CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t wireless_opts[] = {
+ CFG_STR("format_up", "W: (%quality at %essid, %bitrate) %ip", CFGF_NONE),
+ CFG_STR("format_down", "W: down", CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t ethernet_opts[] = {
+ CFG_STR("format_up", "E: %ip (%speed)", CFGF_NONE),
+ CFG_STR("format_down", "E: down", CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t ipv6_opts[] = {
+ CFG_STR("format_up", "%ip", CFGF_NONE),
+ CFG_STR("format_down", "no IPv6", CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t battery_opts[] = {
+ CFG_STR("format", "%status %percentage %remaining", CFGF_NONE),
+ CFG_STR("format_down", "No battery", CFGF_NONE),
+ CFG_STR("status_chr", "CHR", CFGF_NONE),
+ CFG_STR("status_bat", "BAT", CFGF_NONE),
+ CFG_STR("status_full", "FULL", CFGF_NONE),
+ CFG_STR("path", "/sys/class/power_supply/BAT%d/uevent", CFGF_NONE),
+ CFG_INT("low_threshold", 30, CFGF_NONE),
+ CFG_STR("threshold_type", "time", CFGF_NONE),
+ CFG_BOOL("last_full_capacity", false, CFGF_NONE),
+ CFG_BOOL("integer_battery_capacity", false, CFGF_NONE),
+ CFG_BOOL("hide_seconds", false, CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t time_opts[] = {
+ CFG_STR("format", "%Y-%m-%d %H:%M:%S", CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t tztime_opts[] = {
+ CFG_STR("format", "%Y-%m-%d %H:%M:%S %Z", CFGF_NONE),
+ CFG_STR("timezone", "", CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t ddate_opts[] = {
+ CFG_STR("format", "%{%a, %b %d%}, %Y%N - %H", CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t load_opts[] = {
+ CFG_STR("format", "%1min %5min %15min", CFGF_NONE),
+ CFG_FLOAT("max_threshold", 5, CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t usage_opts[] = {
+ CFG_STR("format", "%usage", CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t temp_opts[] = {
+ CFG_STR("format", "%degrees C", CFGF_NONE),
+ CFG_STR("path", NULL, CFGF_NONE),
+ CFG_INT("max_threshold", 75, CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t disk_opts[] = {
+ CFG_STR("format", "%free", CFGF_NONE),
+ CFG_STR("format_not_mounted", NULL, CFGF_NONE),
+ CFG_STR("prefix_type", "binary", CFGF_NONE),
+ CFG_STR("threshold_type", "percentage_avail", CFGF_NONE),
+ CFG_FLOAT("low_threshold", 0, CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t volume_opts[] = {
+ CFG_STR("format", "♪: %volume", CFGF_NONE),
+ CFG_STR("format_muted", "♪: 0%%", CFGF_NONE),
+ CFG_STR("device", "default", CFGF_NONE),
+ CFG_STR("mixer", "Master", CFGF_NONE),
+ CFG_INT("mixer_idx", 0, CFGF_NONE),
+ CFG_CUSTOM_ALIGN_OPT,
+ CFG_CUSTOM_COLOR_OPTS,
+ CFG_CUSTOM_MIN_WIDTH_OPT,
+ CFG_END()};
+
+ cfg_opt_t opts[] = {
+ CFG_STR_LIST("order", "{}", CFGF_NONE),
+ CFG_SEC("general", general_opts, CFGF_NONE),
+ CFG_SEC("run_watch", run_watch_opts, CFGF_TITLE | CFGF_MULTI),
+ CFG_SEC("path_exists", path_exists_opts, CFGF_TITLE | CFGF_MULTI),
+ CFG_SEC("wireless", wireless_opts, CFGF_TITLE | CFGF_MULTI),
+ 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("volume", volume_opts, CFGF_TITLE | CFGF_MULTI),
+ CFG_SEC("ipv6", ipv6_opts, CFGF_NONE),
+ CFG_SEC("time", time_opts, CFGF_NONE),
+ CFG_SEC("tztime", tztime_opts, CFGF_TITLE | CFGF_MULTI),
+ CFG_SEC("ddate", ddate_opts, CFGF_NONE),
+ CFG_SEC("load", load_opts, CFGF_NONE),
+ CFG_SEC("cpu_usage", usage_opts, CFGF_NONE),
+ CFG_END()};
+
+ char *configfile = NULL;
+ int o, option_index = 0;
+ struct option long_options[] = {
+ {"config", required_argument, 0, 'c'},
+ {"help", no_argument, 0, 'h'},
+ {"version", no_argument, 0, 'v'},
+ {0, 0, 0, 0}};
+
+ struct sigaction action;
+ memset(&action, 0, sizeof(struct sigaction));
+ action.sa_handler = fatalsig;
+
+ /* Exit upon SIGPIPE because when we have nowhere to write to, gathering system
+ * information is pointless. Also exit explicitly on SIGTERM and SIGINT because
+ * only this will trigger a reset of the cursor in the terminal output-format.
+ */
+ sigaction(SIGPIPE, &action, NULL);
+ sigaction(SIGTERM, &action, NULL);
+ sigaction(SIGINT, &action, NULL);
+
+ memset(&action, 0, sizeof(struct sigaction));
+ action.sa_handler = sigusr1;
+ sigaction(SIGUSR1, &action, NULL);
+
+ if (setlocale(LC_ALL, "") == NULL)
+ die("Could not set locale. Please make sure all your LC_* / LANG settings are correct.");
+
+ while ((o = getopt_long(argc, argv, "c:hv", long_options, &option_index)) != -1)
+ if ((char)o == 'c')
+ configfile = optarg;
+ else if ((char)o == 'h') {
+ printf("i3status " VERSION " © 2008-2012 Michael Stapelberg and contributors\n"
+ "Syntax: %s [-c <configfile>] [-h] [-v]\n",
+ argv[0]);
+ return 0;
+ } else if ((char)o == 'v') {
+ printf("i3status " VERSION " © 2008-2012 Michael Stapelberg and contributors\n");
+ return 0;
}
- if (strcasecmp(output_str, "dzen2") == 0)
- output_format = O_DZEN2;
- else if (strcasecmp(output_str, "xmobar") == 0)
- output_format = O_XMOBAR;
- else if (strcasecmp(output_str, "i3bar") == 0)
- output_format = O_I3BAR;
- else if (strcasecmp(output_str, "term") == 0)
- output_format = O_TERM;
- else if (strcasecmp(output_str, "none") == 0)
- output_format = O_NONE;
- else die("Unknown output format: \"%s\"\n", output_str);
-
- const char *separator = cfg_getstr(cfg_general, "separator");
-
- // if no custom separator has been provided, use the default one
- if (strcasecmp(separator, "default") == 0)
- separator = get_default_separator();
-
- if (!valid_color(cfg_getstr(cfg_general, "color_good"))
- || !valid_color(cfg_getstr(cfg_general, "color_degraded"))
- || !valid_color(cfg_getstr(cfg_general, "color_bad"))
- || !valid_color(cfg_getstr(cfg_general, "color_separator")))
- die("Bad color format");
+ if (configfile == NULL)
+ configfile = get_config_path();
+
+ cfg = cfg_init(opts, CFGF_NOCASE);
+ if (cfg_parse(cfg, configfile) == CFG_PARSE_ERROR)
+ return EXIT_FAILURE;
+
+ if (cfg_size(cfg, "order") == 0)
+ die("Your 'order' array is empty. Please fix your config.\n");
+
+ cfg_general = cfg_getsec(cfg, "general");
+ if (cfg_general == NULL)
+ die("Could not get section \"general\"\n");
+
+ char *output_str = cfg_getstr(cfg_general, "output_format");
+ if (strcasecmp(output_str, "auto") == 0) {
+ fprintf(stderr, "i3status: trying to auto-detect output_format setting\n");
+ output_str = auto_detect_format();
+ if (!output_str) {
+ output_str = "none";
+ fprintf(stderr, "i3status: falling back to \"none\"\n");
+ } else {
+ fprintf(stderr, "i3status: auto-detected \"%s\"\n", output_str);
+ }
+ }
+
+ if (strcasecmp(output_str, "dzen2") == 0)
+ output_format = O_DZEN2;
+ else if (strcasecmp(output_str, "xmobar") == 0)
+ output_format = O_XMOBAR;
+ else if (strcasecmp(output_str, "i3bar") == 0)
+ output_format = O_I3BAR;
+ else if (strcasecmp(output_str, "term") == 0)
+ output_format = O_TERM;
+ else if (strcasecmp(output_str, "none") == 0)
+ output_format = O_NONE;
+ else
+ die("Unknown output format: \"%s\"\n", output_str);
+
+ const char *separator = cfg_getstr(cfg_general, "separator");
+
+ // if no custom separator has been provided, use the default one
+ if (strcasecmp(separator, "default") == 0)
+ separator = get_default_separator();
+
+ if (!valid_color(cfg_getstr(cfg_general, "color_good")) || !valid_color(cfg_getstr(cfg_general, "color_degraded")) || !valid_color(cfg_getstr(cfg_general, "color_bad")) || !valid_color(cfg_getstr(cfg_general, "color_separator")))
+ die("Bad color format");
#if YAJL_MAJOR >= 2
- yajl_gen json_gen = yajl_gen_alloc(NULL);
+ yajl_gen json_gen = yajl_gen_alloc(NULL);
#else
- yajl_gen json_gen = yajl_gen_alloc(NULL, NULL);
+ yajl_gen json_gen = yajl_gen_alloc(NULL, NULL);
#endif
- if (output_format == O_I3BAR) {
- /* Initialize the i3bar protocol. See i3/docs/i3bar-protocol
- * for details. */
- printf("{\"version\":1}\n[\n");
- fflush(stdout);
- yajl_gen_array_open(json_gen);
- yajl_gen_clear(json_gen);
+ if (output_format == O_I3BAR) {
+ /* Initialize the i3bar protocol. See i3/docs/i3bar-protocol
+ * for details. */
+ printf("{\"version\":1}\n[\n");
+ fflush(stdout);
+ yajl_gen_array_open(json_gen);
+ yajl_gen_clear(json_gen);
+ }
+ if (output_format == O_TERM) {
+ /* Save the cursor-position and hide the cursor */
+ printf("\033[s\033[?25l");
+ /* Undo at exit */
+ atexit(&reset_cursor);
+ }
+
+ if ((general_socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ die("Could not create socket\n");
+
+ int interval = cfg_getint(cfg_general, "interval");
+
+ /* One memory page which each plugin can use to buffer output.
+ * Even though it’s unclean, we just assume that the user will not
+ * specify a format string which expands to something longer than 4096
+ * bytes — given that the output of i3status is used to display
+ * information on screen, more than 1024 characters for the full line
+ * (!), not individual plugins, seem very unlikely. */
+ char buffer[4096];
+
+ void **per_instance = calloc(cfg_size(cfg, "order"), sizeof(*per_instance));
+
+ while (1) {
+ if (exit_upon_signal) {
+ fprintf(stderr, "Exiting due to signal.\n");
+ exit(1);
}
- if (output_format == O_TERM) {
- /* Save the cursor-position and hide the cursor */
- printf("\033[s\033[?25l");
- /* Undo at exit */
- atexit(&reset_cursor);
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ if (output_format == O_I3BAR)
+ yajl_gen_array_open(json_gen);
+ else if (output_format == O_TERM)
+ /* Restore the cursor-position, clear line */
+ printf("\033[u\033[K");
+ for (j = 0; j < cfg_size(cfg, "order"); j++) {
+ cur_instance = per_instance + j;
+ if (j > 0)
+ print_separator(separator);
+
+ const char *current = cfg_getnstr(cfg, "order", j);
+
+ CASE_SEC("ipv6") {
+ SEC_OPEN_MAP("ipv6");
+ print_ipv6_info(json_gen, buffer, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC_TITLE("wireless") {
+ SEC_OPEN_MAP("wireless");
+ const char *interface = NULL;
+ if (strcasecmp(title, "_first_") == 0)
+ interface = first_eth_interface(NET_TYPE_WIRELESS);
+ if (interface == NULL)
+ interface = title;
+ print_wireless_info(json_gen, buffer, interface, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC_TITLE("ethernet") {
+ SEC_OPEN_MAP("ethernet");
+ const char *interface = NULL;
+ if (strcasecmp(title, "_first_") == 0)
+ interface = first_eth_interface(NET_TYPE_ETHERNET);
+ if (interface == NULL)
+ interface = title;
+ print_eth_info(json_gen, buffer, interface, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC_TITLE("battery") {
+ SEC_OPEN_MAP("battery");
+ print_battery_info(json_gen, buffer, atoi(title), cfg_getstr(sec, "path"), cfg_getstr(sec, "format"), cfg_getstr(sec, "format_down"), cfg_getstr(sec, "status_chr"), cfg_getstr(sec, "status_bat"), cfg_getstr(sec, "status_full"), cfg_getint(sec, "low_threshold"), cfg_getstr(sec, "threshold_type"), cfg_getbool(sec, "last_full_capacity"), cfg_getbool(sec, "integer_battery_capacity"), cfg_getbool(sec, "hide_seconds"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC_TITLE("run_watch") {
+ SEC_OPEN_MAP("run_watch");
+ print_run_watch(json_gen, buffer, title, cfg_getstr(sec, "pidfile"), cfg_getstr(sec, "format"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC_TITLE("path_exists") {
+ SEC_OPEN_MAP("path_exists");
+ print_path_exists(json_gen, buffer, title, cfg_getstr(sec, "path"), cfg_getstr(sec, "format"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC_TITLE("disk") {
+ SEC_OPEN_MAP("disk_info");
+ print_disk_info(json_gen, buffer, title, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_not_mounted"), cfg_getstr(sec, "prefix_type"), cfg_getstr(sec, "threshold_type"), cfg_getfloat(sec, "low_threshold"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC("load") {
+ SEC_OPEN_MAP("load");
+ print_load(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getfloat(sec, "max_threshold"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC("time") {
+ SEC_OPEN_MAP("time");
+ print_time(json_gen, buffer, cfg_getstr(sec, "format"), NULL, tv.tv_sec);
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC_TITLE("tztime") {
+ SEC_OPEN_MAP("tztime");
+ print_time(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getstr(sec, "timezone"), tv.tv_sec);
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC("ddate") {
+ SEC_OPEN_MAP("ddate");
+ print_ddate(json_gen, buffer, cfg_getstr(sec, "format"), tv.tv_sec);
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC_TITLE("volume") {
+ SEC_OPEN_MAP("volume");
+ print_volume(json_gen, buffer, cfg_getstr(sec, "format"),
+ cfg_getstr(sec, "format_muted"),
+ cfg_getstr(sec, "device"),
+ cfg_getstr(sec, "mixer"),
+ cfg_getint(sec, "mixer_idx"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC_TITLE("cpu_temperature") {
+ SEC_OPEN_MAP("cpu_temperature");
+ print_cpu_temperature_info(json_gen, buffer, atoi(title), cfg_getstr(sec, "path"), cfg_getstr(sec, "format"), cfg_getint(sec, "max_threshold"));
+ SEC_CLOSE_MAP;
+ }
+
+ CASE_SEC("cpu_usage") {
+ SEC_OPEN_MAP("cpu_usage");
+ print_cpu_usage(json_gen, buffer, cfg_getstr(sec, "format"));
+ SEC_CLOSE_MAP;
+ }
}
-
- if ((general_socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- die("Could not create socket\n");
-
- int interval = cfg_getint(cfg_general, "interval");
-
- /* One memory page which each plugin can use to buffer output.
- * Even though it’s unclean, we just assume that the user will not
- * specify a format string which expands to something longer than 4096
- * bytes — given that the output of i3status is used to display
- * information on screen, more than 1024 characters for the full line
- * (!), not individual plugins, seem very unlikely. */
- char buffer[4096];
-
- void **per_instance = calloc(cfg_size(cfg, "order"), sizeof(*per_instance));
-
- while (1) {
- if (exit_upon_signal) {
- fprintf(stderr, "Exiting due to signal.\n");
- exit(1);
- }
- struct timeval tv;
- gettimeofday(&tv, NULL);
- if (output_format == O_I3BAR)
- yajl_gen_array_open(json_gen);
- else if (output_format == O_TERM)
- /* Restore the cursor-position, clear line */
- printf("\033[u\033[K");
- for (j = 0; j < cfg_size(cfg, "order"); j++) {
- cur_instance = per_instance + j;
- if (j > 0)
- print_separator(separator);
-
- const char *current = cfg_getnstr(cfg, "order", j);
-
- CASE_SEC("ipv6") {
- SEC_OPEN_MAP("ipv6");
- print_ipv6_info(json_gen, buffer, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC_TITLE("wireless") {
- SEC_OPEN_MAP("wireless");
- const char *interface = NULL;
- if (strcasecmp(title, "_first_") == 0)
- interface = first_eth_interface(NET_TYPE_WIRELESS);
- if (interface == NULL)
- interface = title;
- print_wireless_info(json_gen, buffer, interface, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC_TITLE("ethernet") {
- SEC_OPEN_MAP("ethernet");
- const char *interface = NULL;
- if (strcasecmp(title, "_first_") == 0)
- interface = first_eth_interface(NET_TYPE_ETHERNET);
- if (interface == NULL)
- interface = title;
- print_eth_info(json_gen, buffer, interface, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC_TITLE("battery") {
- SEC_OPEN_MAP("battery");
- print_battery_info(json_gen, buffer, atoi(title), cfg_getstr(sec, "path"), cfg_getstr(sec, "format"), cfg_getstr(sec, "format_down"), cfg_getstr(sec, "status_chr"), cfg_getstr(sec, "status_bat"), cfg_getstr(sec, "status_full"), cfg_getint(sec, "low_threshold"), cfg_getstr(sec, "threshold_type"), cfg_getbool(sec, "last_full_capacity"), cfg_getbool(sec, "integer_battery_capacity"), cfg_getbool(sec, "hide_seconds"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC_TITLE("run_watch") {
- SEC_OPEN_MAP("run_watch");
- print_run_watch(json_gen, buffer, title, cfg_getstr(sec, "pidfile"), cfg_getstr(sec, "format"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC_TITLE("path_exists") {
- SEC_OPEN_MAP("path_exists");
- print_path_exists(json_gen, buffer, title, cfg_getstr(sec, "path"), cfg_getstr(sec, "format"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC_TITLE("disk") {
- SEC_OPEN_MAP("disk_info");
- print_disk_info(json_gen, buffer, title, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_not_mounted"), cfg_getstr(sec, "prefix_type"), cfg_getstr(sec, "threshold_type"), cfg_getfloat(sec, "low_threshold"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC("load") {
- SEC_OPEN_MAP("load");
- print_load(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getfloat(sec, "max_threshold"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC("time") {
- SEC_OPEN_MAP("time");
- print_time(json_gen, buffer, cfg_getstr(sec, "format"), NULL, tv.tv_sec);
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC_TITLE("tztime") {
- SEC_OPEN_MAP("tztime");
- print_time(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getstr(sec, "timezone"), tv.tv_sec);
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC("ddate") {
- SEC_OPEN_MAP("ddate");
- print_ddate(json_gen, buffer, cfg_getstr(sec, "format"), tv.tv_sec);
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC_TITLE("volume") {
- SEC_OPEN_MAP("volume");
- print_volume(json_gen, buffer, cfg_getstr(sec, "format"),
- cfg_getstr(sec, "format_muted"),
- cfg_getstr(sec, "device"),
- cfg_getstr(sec, "mixer"),
- cfg_getint(sec, "mixer_idx"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC_TITLE("cpu_temperature") {
- SEC_OPEN_MAP("cpu_temperature");
- print_cpu_temperature_info(json_gen, buffer, atoi(title), cfg_getstr(sec, "path"), cfg_getstr(sec, "format"), cfg_getint(sec, "max_threshold"));
- SEC_CLOSE_MAP;
- }
-
- CASE_SEC("cpu_usage") {
- SEC_OPEN_MAP("cpu_usage");
- print_cpu_usage(json_gen, buffer, cfg_getstr(sec, "format"));
- SEC_CLOSE_MAP;
- }
- }
- if (output_format == O_I3BAR) {
- yajl_gen_array_close(json_gen);
- const unsigned char *buf;
+ if (output_format == O_I3BAR) {
+ yajl_gen_array_close(json_gen);
+ const unsigned char *buf;
#if YAJL_MAJOR >= 2
- size_t len;
+ size_t len;
#else
- unsigned int len;
+ unsigned int len;
#endif
- yajl_gen_get_buf(json_gen, &buf, &len);
- write(STDOUT_FILENO, buf, len);
- yajl_gen_clear(json_gen);
- }
-
- printf("\n");
- fflush(stdout);
-
- /* To provide updates on every full second (as good as possible)
- * we don’t use sleep(interval) but we sleep until the next
- * second (with microsecond precision) plus (interval-1)
- * seconds. We also align to 60 seconds modulo interval such
- * that we start with :00 on every new minute. */
- struct timeval current_timeval;
- gettimeofday(¤t_timeval, NULL);
- struct timespec ts = {interval - 1 - (current_timeval.tv_sec % interval), (10e5 - current_timeval.tv_usec) * 1000};
- nanosleep(&ts, NULL);
+ yajl_gen_get_buf(json_gen, &buf, &len);
+ write(STDOUT_FILENO, buf, len);
+ yajl_gen_clear(json_gen);
}
+
+ printf("\n");
+ fflush(stdout);
+
+ /* To provide updates on every full second (as good as possible)
+ * we don’t use sleep(interval) but we sleep until the next
+ * second (with microsecond precision) plus (interval-1)
+ * seconds. We also align to 60 seconds modulo interval such
+ * that we start with :00 on every new minute. */
+ struct timeval current_timeval;
+ gettimeofday(¤t_timeval, NULL);
+ struct timespec ts = {interval - 1 - (current_timeval.tv_sec % interval), (10e5 - current_timeval.tv_usec) * 1000};
+ nanosleep(&ts, NULL);
+ }
}
#ifndef _I3STATUS_H
#define _I3STATUS_H
-enum { O_DZEN2, O_XMOBAR, O_I3BAR, O_TERM, O_NONE } output_format;
+enum { O_DZEN2,
+ O_XMOBAR,
+ O_I3BAR,
+ O_TERM,
+ O_NONE } output_format;
#include <stdbool.h>
#include <confuse.h>
/* Allows for the definition of a variable without opening a new scope, thus
* suited for usage in a macro. Idea from wmii. */
#define with(type, var, init) \
- for (type var = (type)-1; (var == (type)-1) && ((var=(init)) || 1); )
+ for (type var = (type)-1; (var == (type)-1) && ((var = (init)) || 1);)
-#define CASE_SEC(name) \
- if (BEGINS_WITH(current, name)) \
- with(cfg_t *, sec, cfg_section = cfg_getsec(cfg, name)) \
- if (sec != NULL)
+#define CASE_SEC(name) \
+ if (BEGINS_WITH(current, name)) \
+ with(cfg_t *, sec, cfg_section = cfg_getsec(cfg, name)) if (sec != NULL)
-#define CASE_SEC_TITLE(name) \
- if (BEGINS_WITH(current, name)) \
- with(const char *, title, current + strlen(name) + 1) \
- with(cfg_t *, sec, cfg_section = cfg_gettsec(cfg, name, title)) \
- if (sec != NULL)
+#define CASE_SEC_TITLE(name) \
+ if (BEGINS_WITH(current, name)) \
+ with(const char *, title, current + strlen(name) + 1) \
+ with(cfg_t *, sec, cfg_section = cfg_gettsec(cfg, name, title)) if (sec != NULL)
/* Macro which any plugin can use to output the full_text part (when the output
* format is JSON) or just output to stdout (any other output format). */
-#define OUTPUT_FULL_TEXT(text) \
- do { \
- /* Terminate the output buffer here in any case, so that it’s \
- * not forgotten in the module */ \
- *outwalk = '\0'; \
- if (output_format == O_I3BAR) { \
- yajl_gen_string(json_gen, (const unsigned char *)"full_text", strlen("full_text")); \
- yajl_gen_string(json_gen, (const unsigned char *)text, strlen(text)); \
- } else { \
- printf("%s", text); \
- } \
- } while (0)
-
-#define SEC_OPEN_MAP(name) \
- do { \
- if (output_format == O_I3BAR) { \
- yajl_gen_map_open(json_gen); \
- yajl_gen_string(json_gen, (const unsigned char *)"name", strlen("name")); \
- yajl_gen_string(json_gen, (const unsigned char *)name, strlen(name)); \
- } \
- } while (0)
-
-#define SEC_CLOSE_MAP \
- do { \
- if (output_format == O_I3BAR) { \
- char *_align = cfg_getstr(sec, "align"); \
- if (_align) { \
- yajl_gen_string(json_gen, (const unsigned char *)"align", strlen("align")); \
- yajl_gen_string(json_gen, (const unsigned char *)_align, strlen(_align)); \
- } \
- struct min_width *_width = cfg_getptr(sec, "min_width"); \
- if (_width) { \
- /* if the value can be parsed as a number, we use the numerical value */ \
- if (_width->num > 0) { \
- yajl_gen_string(json_gen, (const unsigned char *)"min_width", strlen("min_width")); \
- yajl_gen_integer(json_gen, _width->num); \
- } else { \
- yajl_gen_string(json_gen, (const unsigned char *)"min_width", strlen("min_width")); \
- yajl_gen_string(json_gen, (const unsigned char *)_width->str, strlen(_width->str)); \
- } \
- } \
- const char *_sep = cfg_getstr(cfg_general, "separator"); \
- if (strlen(_sep) == 0) {\
- yajl_gen_string(json_gen, (const unsigned char *)"separator", strlen("separator")); \
- yajl_gen_bool(json_gen, false); \
- } \
- yajl_gen_map_close(json_gen); \
- } \
- } while (0)
-
-#define START_COLOR(colorstr) \
- do { \
- if (cfg_getbool(cfg_general, "colors")) { \
- const char *_val = NULL; \
- if (cfg_section) \
- _val = cfg_getstr(cfg_section, colorstr); \
- if (!_val) \
- _val = cfg_getstr(cfg_general, colorstr); \
- if (output_format == O_I3BAR) { \
- yajl_gen_string(json_gen, (const unsigned char *)"color", strlen("color")); \
- yajl_gen_string(json_gen, (const unsigned char *)_val, strlen(_val)); \
- } else { \
- outwalk += sprintf(outwalk, "%s", color(colorstr)); \
- } \
- } \
- } while (0)
-
-#define END_COLOR \
- do { \
- if (cfg_getbool(cfg_general, "colors") && output_format != O_I3BAR) { \
- outwalk += sprintf(outwalk, "%s", endcolor()); \
- } \
- } while (0)
-
-#define INSTANCE(instance) \
- do { \
- if (output_format == O_I3BAR) { \
- yajl_gen_string(json_gen, (const unsigned char *)"instance", strlen("instance")); \
- yajl_gen_string(json_gen, (const unsigned char *)instance, strlen(instance)); \
- } \
- } while (0)
-
-
-typedef enum { CS_DISCHARGING, CS_CHARGING, CS_FULL } charging_status_t;
+#define OUTPUT_FULL_TEXT(text) \
+ do { \
+ /* Terminate the output buffer here in any case, so that it’s \
+ * not forgotten in the module */ \
+ *outwalk = '\0'; \
+ if (output_format == O_I3BAR) { \
+ yajl_gen_string(json_gen, (const unsigned char *) "full_text", strlen("full_text")); \
+ yajl_gen_string(json_gen, (const unsigned char *)text, strlen(text)); \
+ } else { \
+ printf("%s", text); \
+ } \
+ } while (0)
+
+#define SEC_OPEN_MAP(name) \
+ do { \
+ if (output_format == O_I3BAR) { \
+ yajl_gen_map_open(json_gen); \
+ yajl_gen_string(json_gen, (const unsigned char *) "name", strlen("name")); \
+ yajl_gen_string(json_gen, (const unsigned char *)name, strlen(name)); \
+ } \
+ } while (0)
+
+#define SEC_CLOSE_MAP \
+ do { \
+ if (output_format == O_I3BAR) { \
+ char *_align = cfg_getstr(sec, "align"); \
+ if (_align) { \
+ yajl_gen_string(json_gen, (const unsigned char *) "align", strlen("align")); \
+ yajl_gen_string(json_gen, (const unsigned char *)_align, strlen(_align)); \
+ } \
+ struct min_width *_width = cfg_getptr(sec, "min_width"); \
+ if (_width) { \
+ /* if the value can be parsed as a number, we use the numerical value */ \
+ if (_width->num > 0) { \
+ yajl_gen_string(json_gen, (const unsigned char *) "min_width", strlen("min_width")); \
+ yajl_gen_integer(json_gen, _width->num); \
+ } else { \
+ yajl_gen_string(json_gen, (const unsigned char *) "min_width", strlen("min_width")); \
+ yajl_gen_string(json_gen, (const unsigned char *)_width->str, strlen(_width->str)); \
+ } \
+ } \
+ const char *_sep = cfg_getstr(cfg_general, "separator"); \
+ if (strlen(_sep) == 0) { \
+ yajl_gen_string(json_gen, (const unsigned char *) "separator", strlen("separator")); \
+ yajl_gen_bool(json_gen, false); \
+ } \
+ yajl_gen_map_close(json_gen); \
+ } \
+ } while (0)
+
+#define START_COLOR(colorstr) \
+ do { \
+ if (cfg_getbool(cfg_general, "colors")) { \
+ const char *_val = NULL; \
+ if (cfg_section) \
+ _val = cfg_getstr(cfg_section, colorstr); \
+ if (!_val) \
+ _val = cfg_getstr(cfg_general, colorstr); \
+ if (output_format == O_I3BAR) { \
+ yajl_gen_string(json_gen, (const unsigned char *) "color", strlen("color")); \
+ yajl_gen_string(json_gen, (const unsigned char *)_val, strlen(_val)); \
+ } else { \
+ outwalk += sprintf(outwalk, "%s", color(colorstr)); \
+ } \
+ } \
+ } while (0)
+
+#define END_COLOR \
+ do { \
+ if (cfg_getbool(cfg_general, "colors") && output_format != O_I3BAR) { \
+ outwalk += sprintf(outwalk, "%s", endcolor()); \
+ } \
+ } while (0)
+
+#define INSTANCE(instance) \
+ do { \
+ if (output_format == O_I3BAR) { \
+ yajl_gen_string(json_gen, (const unsigned char *) "instance", strlen("instance")); \
+ yajl_gen_string(json_gen, (const unsigned char *)instance, strlen(instance)); \
+ } \
+ } while (0)
+
+typedef enum { CS_DISCHARGING,
+ CS_CHARGING,
+ CS_FULL } charging_status_t;
/*
* The "min_width" module option may either be defined as a string or a number.
/* src/output.c */
void print_separator(const char *separator);
char *color(const char *colorstr);
-char *endcolor() __attribute__ ((pure));
+char *endcolor() __attribute__((pure));
void reset_cursor(void);
/* src/auto_detect_format.c */
/* src/first_network_device.c */
typedef enum {
- NET_TYPE_WIRELESS = 0,
- NET_TYPE_ETHERNET = 1
+ NET_TYPE_WIRELESS = 0,
+ NET_TYPE_ETHERNET = 1
} net_type_t;
const char *first_eth_interface(const net_type_t type);
* @(#)queue.h 8.5 (Berkeley) 8/20/94
*/
-#ifndef _SYS_QUEUE_H_
-#define _SYS_QUEUE_H_
+#ifndef _SYS_QUEUE_H_
+#define _SYS_QUEUE_H_
/*
* This file defines five types of data structures: singly-linked lists,
/*
* Singly-linked List definitions.
*/
-#define SLIST_HEAD(name, type) \
-struct name { \
- struct type *slh_first; /* first element */ \
-}
+#define SLIST_HEAD(name, type) \
+ struct name { \
+ struct type *slh_first; /* first element */ \
+ }
-#define SLIST_HEAD_INITIALIZER(head) \
- { NULL }
+#define SLIST_HEAD_INITIALIZER(head) \
+ { NULL }
-#define SLIST_ENTRY(type) \
-struct { \
- struct type *sle_next; /* next element */ \
-}
+#define SLIST_ENTRY(type) \
+ struct { \
+ struct type *sle_next; /* next element */ \
+ }
/*
* Singly-linked List access methods.
*/
-#define SLIST_FIRST(head) ((head)->slh_first)
-#define SLIST_END(head) NULL
-#define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))
-#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
+#define SLIST_FIRST(head) ((head)->slh_first)
+#define SLIST_END(head) NULL
+#define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))
+#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
-#define SLIST_FOREACH(var, head, field) \
- for((var) = SLIST_FIRST(head); \
- (var) != SLIST_END(head); \
- (var) = SLIST_NEXT(var, field))
+#define SLIST_FOREACH(var, head, field) \
+ for ((var) = SLIST_FIRST(head); \
+ (var) != SLIST_END(head); \
+ (var) = SLIST_NEXT(var, field))
-#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \
- for ((varp) = &SLIST_FIRST((head)); \
- ((var) = *(varp)) != SLIST_END(head); \
- (varp) = &SLIST_NEXT((var), field))
+#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \
+ for ((varp) = &SLIST_FIRST((head)); \
+ ((var) = *(varp)) != SLIST_END(head); \
+ (varp) = &SLIST_NEXT((var), field))
/*
* Singly-linked List functions.
*/
-#define SLIST_INIT(head) { \
- SLIST_FIRST(head) = SLIST_END(head); \
-}
-
-#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
- (elm)->field.sle_next = (slistelm)->field.sle_next; \
- (slistelm)->field.sle_next = (elm); \
-} while (0)
-
-#define SLIST_INSERT_HEAD(head, elm, field) do { \
- (elm)->field.sle_next = (head)->slh_first; \
- (head)->slh_first = (elm); \
-} while (0)
-
-#define SLIST_REMOVE_NEXT(head, elm, field) do { \
- (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \
-} while (0)
-
-#define SLIST_REMOVE_HEAD(head, field) do { \
- (head)->slh_first = (head)->slh_first->field.sle_next; \
-} while (0)
-
-#define SLIST_REMOVE(head, elm, type, field) do { \
- if ((head)->slh_first == (elm)) { \
- SLIST_REMOVE_HEAD((head), field); \
- } else { \
- struct type *curelm = (head)->slh_first; \
- \
- while (curelm->field.sle_next != (elm)) \
- curelm = curelm->field.sle_next; \
- curelm->field.sle_next = \
- curelm->field.sle_next->field.sle_next; \
- _Q_INVALIDATE((elm)->field.sle_next); \
- } \
-} while (0)
+#define SLIST_INIT(head) \
+ { \
+ SLIST_FIRST(head) = SLIST_END(head); \
+ }
+
+#define SLIST_INSERT_AFTER(slistelm, elm, field) \
+ do { \
+ (elm)->field.sle_next = (slistelm)->field.sle_next; \
+ (slistelm)->field.sle_next = (elm); \
+ } while (0)
+
+#define SLIST_INSERT_HEAD(head, elm, field) \
+ do { \
+ (elm)->field.sle_next = (head)->slh_first; \
+ (head)->slh_first = (elm); \
+ } while (0)
+
+#define SLIST_REMOVE_NEXT(head, elm, field) \
+ do { \
+ (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \
+ } while (0)
+
+#define SLIST_REMOVE_HEAD(head, field) \
+ do { \
+ (head)->slh_first = (head)->slh_first->field.sle_next; \
+ } while (0)
+
+#define SLIST_REMOVE(head, elm, type, field) \
+ do { \
+ if ((head)->slh_first == (elm)) { \
+ SLIST_REMOVE_HEAD((head), field); \
+ } else { \
+ struct type *curelm = (head)->slh_first; \
+ \
+ while (curelm->field.sle_next != (elm)) \
+ curelm = curelm->field.sle_next; \
+ curelm->field.sle_next = curelm->field.sle_next->field.sle_next; \
+ _Q_INVALIDATE((elm)->field.sle_next); \
+ } \
+ } while (0)
/*
* List definitions.
*/
-#define LIST_HEAD(name, type) \
-struct name { \
- struct type *lh_first; /* first element */ \
-}
+#define LIST_HEAD(name, type) \
+ struct name { \
+ struct type *lh_first; /* first element */ \
+ }
-#define LIST_HEAD_INITIALIZER(head) \
- { NULL }
+#define LIST_HEAD_INITIALIZER(head) \
+ { NULL }
-#define LIST_ENTRY(type) \
-struct { \
- struct type *le_next; /* next element */ \
- struct type **le_prev; /* address of previous next element */ \
-}
+#define LIST_ENTRY(type) \
+ struct { \
+ struct type *le_next; /* next element */ \
+ struct type **le_prev; /* address of previous next element */ \
+ }
/*
* List access methods
*/
-#define LIST_FIRST(head) ((head)->lh_first)
-#define LIST_END(head) NULL
-#define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head))
-#define LIST_NEXT(elm, field) ((elm)->field.le_next)
+#define LIST_FIRST(head) ((head)->lh_first)
+#define LIST_END(head) NULL
+#define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head))
+#define LIST_NEXT(elm, field) ((elm)->field.le_next)
-#define LIST_FOREACH(var, head, field) \
- for((var) = LIST_FIRST(head); \
- (var)!= LIST_END(head); \
- (var) = LIST_NEXT(var, field))
+#define LIST_FOREACH(var, head, field) \
+ for ((var) = LIST_FIRST(head); \
+ (var) != LIST_END(head); \
+ (var) = LIST_NEXT(var, field))
/*
* List functions.
*/
-#define LIST_INIT(head) do { \
- LIST_FIRST(head) = LIST_END(head); \
-} while (0)
-
-#define LIST_INSERT_AFTER(listelm, elm, field) do { \
- if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
- (listelm)->field.le_next->field.le_prev = \
- &(elm)->field.le_next; \
- (listelm)->field.le_next = (elm); \
- (elm)->field.le_prev = &(listelm)->field.le_next; \
-} while (0)
-
-#define LIST_INSERT_BEFORE(listelm, elm, field) do { \
- (elm)->field.le_prev = (listelm)->field.le_prev; \
- (elm)->field.le_next = (listelm); \
- *(listelm)->field.le_prev = (elm); \
- (listelm)->field.le_prev = &(elm)->field.le_next; \
-} while (0)
-
-#define LIST_INSERT_HEAD(head, elm, field) do { \
- if (((elm)->field.le_next = (head)->lh_first) != NULL) \
- (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
- (head)->lh_first = (elm); \
- (elm)->field.le_prev = &(head)->lh_first; \
-} while (0)
-
-#define LIST_REMOVE(elm, field) do { \
- if ((elm)->field.le_next != NULL) \
- (elm)->field.le_next->field.le_prev = \
- (elm)->field.le_prev; \
- *(elm)->field.le_prev = (elm)->field.le_next; \
- _Q_INVALIDATE((elm)->field.le_prev); \
- _Q_INVALIDATE((elm)->field.le_next); \
-} while (0)
-
-#define LIST_REPLACE(elm, elm2, field) do { \
- if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \
- (elm2)->field.le_next->field.le_prev = \
- &(elm2)->field.le_next; \
- (elm2)->field.le_prev = (elm)->field.le_prev; \
- *(elm2)->field.le_prev = (elm2); \
- _Q_INVALIDATE((elm)->field.le_prev); \
- _Q_INVALIDATE((elm)->field.le_next); \
-} while (0)
+#define LIST_INIT(head) \
+ do { \
+ LIST_FIRST(head) = LIST_END(head); \
+ } while (0)
+
+#define LIST_INSERT_AFTER(listelm, elm, field) \
+ do { \
+ if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
+ (listelm)->field.le_next->field.le_prev = &(elm)->field.le_next; \
+ (listelm)->field.le_next = (elm); \
+ (elm)->field.le_prev = &(listelm)->field.le_next; \
+ } while (0)
+
+#define LIST_INSERT_BEFORE(listelm, elm, field) \
+ do { \
+ (elm)->field.le_prev = (listelm)->field.le_prev; \
+ (elm)->field.le_next = (listelm); \
+ *(listelm)->field.le_prev = (elm); \
+ (listelm)->field.le_prev = &(elm)->field.le_next; \
+ } while (0)
+
+#define LIST_INSERT_HEAD(head, elm, field) \
+ do { \
+ if (((elm)->field.le_next = (head)->lh_first) != NULL) \
+ (head)->lh_first->field.le_prev = &(elm)->field.le_next; \
+ (head)->lh_first = (elm); \
+ (elm)->field.le_prev = &(head)->lh_first; \
+ } while (0)
+
+#define LIST_REMOVE(elm, field) \
+ do { \
+ if ((elm)->field.le_next != NULL) \
+ (elm)->field.le_next->field.le_prev = (elm)->field.le_prev; \
+ *(elm)->field.le_prev = (elm)->field.le_next; \
+ _Q_INVALIDATE((elm)->field.le_prev); \
+ _Q_INVALIDATE((elm)->field.le_next); \
+ } while (0)
+
+#define LIST_REPLACE(elm, elm2, field) \
+ do { \
+ if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \
+ (elm2)->field.le_next->field.le_prev = &(elm2)->field.le_next; \
+ (elm2)->field.le_prev = (elm)->field.le_prev; \
+ *(elm2)->field.le_prev = (elm2); \
+ _Q_INVALIDATE((elm)->field.le_prev); \
+ _Q_INVALIDATE((elm)->field.le_next); \
+ } while (0)
/*
* Simple queue definitions.
*/
-#define SIMPLEQ_HEAD(name, type) \
-struct name { \
- struct type *sqh_first; /* first element */ \
- struct type **sqh_last; /* addr of last next element */ \
-}
+#define SIMPLEQ_HEAD(name, type) \
+ struct name { \
+ struct type *sqh_first; /* first element */ \
+ struct type **sqh_last; /* addr of last next element */ \
+ }
-#define SIMPLEQ_HEAD_INITIALIZER(head) \
- { NULL, &(head).sqh_first }
+#define SIMPLEQ_HEAD_INITIALIZER(head) \
+ { NULL, &(head).sqh_first }
-#define SIMPLEQ_ENTRY(type) \
-struct { \
- struct type *sqe_next; /* next element */ \
-}
+#define SIMPLEQ_ENTRY(type) \
+ struct { \
+ struct type *sqe_next; /* next element */ \
+ }
/*
* Simple queue access methods.
*/
-#define SIMPLEQ_FIRST(head) ((head)->sqh_first)
-#define SIMPLEQ_END(head) NULL
-#define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
-#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
+#define SIMPLEQ_FIRST(head) ((head)->sqh_first)
+#define SIMPLEQ_END(head) NULL
+#define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
+#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
-#define SIMPLEQ_FOREACH(var, head, field) \
- for((var) = SIMPLEQ_FIRST(head); \
- (var) != SIMPLEQ_END(head); \
- (var) = SIMPLEQ_NEXT(var, field))
+#define SIMPLEQ_FOREACH(var, head, field) \
+ for ((var) = SIMPLEQ_FIRST(head); \
+ (var) != SIMPLEQ_END(head); \
+ (var) = SIMPLEQ_NEXT(var, field))
/*
* Simple queue functions.
*/
-#define SIMPLEQ_INIT(head) do { \
- (head)->sqh_first = NULL; \
- (head)->sqh_last = &(head)->sqh_first; \
-} while (0)
-
-#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \
- if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
- (head)->sqh_last = &(elm)->field.sqe_next; \
- (head)->sqh_first = (elm); \
-} while (0)
-
-#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \
- (elm)->field.sqe_next = NULL; \
- *(head)->sqh_last = (elm); \
- (head)->sqh_last = &(elm)->field.sqe_next; \
-} while (0)
-
-#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
- if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
- (head)->sqh_last = &(elm)->field.sqe_next; \
- (listelm)->field.sqe_next = (elm); \
-} while (0)
-
-#define SIMPLEQ_REMOVE_HEAD(head, field) do { \
- if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
- (head)->sqh_last = &(head)->sqh_first; \
-} while (0)
+#define SIMPLEQ_INIT(head) \
+ do { \
+ (head)->sqh_first = NULL; \
+ (head)->sqh_last = &(head)->sqh_first; \
+ } while (0)
+
+#define SIMPLEQ_INSERT_HEAD(head, elm, field) \
+ do { \
+ if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+ (head)->sqh_first = (elm); \
+ } while (0)
+
+#define SIMPLEQ_INSERT_TAIL(head, elm, field) \
+ do { \
+ (elm)->field.sqe_next = NULL; \
+ *(head)->sqh_last = (elm); \
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+ } while (0)
+
+#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) \
+ do { \
+ if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL) \
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+ (listelm)->field.sqe_next = (elm); \
+ } while (0)
+
+#define SIMPLEQ_REMOVE_HEAD(head, field) \
+ do { \
+ if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
+ (head)->sqh_last = &(head)->sqh_first; \
+ } while (0)
/*
* Tail queue definitions.
*/
-#define TAILQ_HEAD(name, type) \
-struct name { \
- struct type *tqh_first; /* first element */ \
- struct type **tqh_last; /* addr of last next element */ \
-}
+#define TAILQ_HEAD(name, type) \
+ struct name { \
+ struct type *tqh_first; /* first element */ \
+ struct type **tqh_last; /* addr of last next element */ \
+ }
-#define TAILQ_HEAD_INITIALIZER(head) \
- { NULL, &(head).tqh_first }
+#define TAILQ_HEAD_INITIALIZER(head) \
+ { NULL, &(head).tqh_first }
-#define TAILQ_ENTRY(type) \
-struct { \
- struct type *tqe_next; /* next element */ \
- struct type **tqe_prev; /* address of previous next element */ \
-}
+#define TAILQ_ENTRY(type) \
+ struct { \
+ struct type *tqe_next; /* next element */ \
+ struct type **tqe_prev; /* address of previous next element */ \
+ }
/*
* tail queue access methods
*/
-#define TAILQ_FIRST(head) ((head)->tqh_first)
-#define TAILQ_END(head) NULL
-#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
-#define TAILQ_LAST(head, headname) \
- (*(((struct headname *)((head)->tqh_last))->tqh_last))
+#define TAILQ_FIRST(head) ((head)->tqh_first)
+#define TAILQ_END(head) NULL
+#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
+#define TAILQ_LAST(head, headname) \
+ (*(((struct headname *)((head)->tqh_last))->tqh_last))
/* XXX */
-#define TAILQ_PREV(elm, headname, field) \
- (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
-#define TAILQ_EMPTY(head) \
- (TAILQ_FIRST(head) == TAILQ_END(head))
+#define TAILQ_PREV(elm, headname, field) \
+ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
+#define TAILQ_EMPTY(head) \
+ (TAILQ_FIRST(head) == TAILQ_END(head))
-#define TAILQ_FOREACH(var, head, field) \
- for((var) = TAILQ_FIRST(head); \
- (var) != TAILQ_END(head); \
- (var) = TAILQ_NEXT(var, field))
+#define TAILQ_FOREACH(var, head, field) \
+ for ((var) = TAILQ_FIRST(head); \
+ (var) != TAILQ_END(head); \
+ (var) = TAILQ_NEXT(var, field))
-#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
- for((var) = TAILQ_LAST(head, headname); \
- (var) != TAILQ_END(head); \
- (var) = TAILQ_PREV(var, headname, field))
+#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
+ for ((var) = TAILQ_LAST(head, headname); \
+ (var) != TAILQ_END(head); \
+ (var) = TAILQ_PREV(var, headname, field))
/*
* Tail queue functions.
*/
-#define TAILQ_INIT(head) do { \
- (head)->tqh_first = NULL; \
- (head)->tqh_last = &(head)->tqh_first; \
-} while (0)
-
-#define TAILQ_INSERT_HEAD(head, elm, field) do { \
- if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
- (head)->tqh_first->field.tqe_prev = \
- &(elm)->field.tqe_next; \
- else \
- (head)->tqh_last = &(elm)->field.tqe_next; \
- (head)->tqh_first = (elm); \
- (elm)->field.tqe_prev = &(head)->tqh_first; \
-} while (0)
-
-#define TAILQ_INSERT_TAIL(head, elm, field) do { \
- (elm)->field.tqe_next = NULL; \
- (elm)->field.tqe_prev = (head)->tqh_last; \
- *(head)->tqh_last = (elm); \
- (head)->tqh_last = &(elm)->field.tqe_next; \
-} while (0)
-
-#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
- if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
- (elm)->field.tqe_next->field.tqe_prev = \
- &(elm)->field.tqe_next; \
- else \
- (head)->tqh_last = &(elm)->field.tqe_next; \
- (listelm)->field.tqe_next = (elm); \
- (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
-} while (0)
-
-#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
- (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
- (elm)->field.tqe_next = (listelm); \
- *(listelm)->field.tqe_prev = (elm); \
- (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
-} while (0)
-
-#define TAILQ_REMOVE(head, elm, field) do { \
- if (((elm)->field.tqe_next) != NULL) \
- (elm)->field.tqe_next->field.tqe_prev = \
- (elm)->field.tqe_prev; \
- else \
- (head)->tqh_last = (elm)->field.tqe_prev; \
- *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
- _Q_INVALIDATE((elm)->field.tqe_prev); \
- _Q_INVALIDATE((elm)->field.tqe_next); \
-} while (0)
-
-#define TAILQ_REPLACE(head, elm, elm2, field) do { \
- if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \
- (elm2)->field.tqe_next->field.tqe_prev = \
- &(elm2)->field.tqe_next; \
- else \
- (head)->tqh_last = &(elm2)->field.tqe_next; \
- (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \
- *(elm2)->field.tqe_prev = (elm2); \
- _Q_INVALIDATE((elm)->field.tqe_prev); \
- _Q_INVALIDATE((elm)->field.tqe_next); \
-} while (0)
+#define TAILQ_INIT(head) \
+ do { \
+ (head)->tqh_first = NULL; \
+ (head)->tqh_last = &(head)->tqh_first; \
+ } while (0)
+
+#define TAILQ_INSERT_HEAD(head, elm, field) \
+ do { \
+ if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
+ (head)->tqh_first->field.tqe_prev = &(elm)->field.tqe_next; \
+ else \
+ (head)->tqh_last = &(elm)->field.tqe_next; \
+ (head)->tqh_first = (elm); \
+ (elm)->field.tqe_prev = &(head)->tqh_first; \
+ } while (0)
+
+#define TAILQ_INSERT_TAIL(head, elm, field) \
+ do { \
+ (elm)->field.tqe_next = NULL; \
+ (elm)->field.tqe_prev = (head)->tqh_last; \
+ *(head)->tqh_last = (elm); \
+ (head)->tqh_last = &(elm)->field.tqe_next; \
+ } while (0)
+
+#define TAILQ_INSERT_AFTER(head, listelm, elm, field) \
+ do { \
+ if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL) \
+ (elm)->field.tqe_next->field.tqe_prev = &(elm)->field.tqe_next; \
+ else \
+ (head)->tqh_last = &(elm)->field.tqe_next; \
+ (listelm)->field.tqe_next = (elm); \
+ (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
+ } while (0)
+
+#define TAILQ_INSERT_BEFORE(listelm, elm, field) \
+ do { \
+ (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
+ (elm)->field.tqe_next = (listelm); \
+ *(listelm)->field.tqe_prev = (elm); \
+ (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
+ } while (0)
+
+#define TAILQ_REMOVE(head, elm, field) \
+ do { \
+ if (((elm)->field.tqe_next) != NULL) \
+ (elm)->field.tqe_next->field.tqe_prev = (elm)->field.tqe_prev; \
+ else \
+ (head)->tqh_last = (elm)->field.tqe_prev; \
+ *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
+ _Q_INVALIDATE((elm)->field.tqe_prev); \
+ _Q_INVALIDATE((elm)->field.tqe_next); \
+ } while (0)
+
+#define TAILQ_REPLACE(head, elm, elm2, field) \
+ do { \
+ if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \
+ (elm2)->field.tqe_next->field.tqe_prev = &(elm2)->field.tqe_next; \
+ else \
+ (head)->tqh_last = &(elm2)->field.tqe_next; \
+ (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \
+ *(elm2)->field.tqe_prev = (elm2); \
+ _Q_INVALIDATE((elm)->field.tqe_prev); \
+ _Q_INVALIDATE((elm)->field.tqe_next); \
+ } while (0)
/*
* Circular queue definitions.
*/
-#define CIRCLEQ_HEAD(name, type) \
-struct name { \
- struct type *cqh_first; /* first element */ \
- struct type *cqh_last; /* last element */ \
-}
+#define CIRCLEQ_HEAD(name, type) \
+ struct name { \
+ struct type *cqh_first; /* first element */ \
+ struct type *cqh_last; /* last element */ \
+ }
-#define CIRCLEQ_HEAD_INITIALIZER(head) \
- { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
+#define CIRCLEQ_HEAD_INITIALIZER(head) \
+ { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
-#define CIRCLEQ_ENTRY(type) \
-struct { \
- struct type *cqe_next; /* next element */ \
- struct type *cqe_prev; /* previous element */ \
-}
+#define CIRCLEQ_ENTRY(type) \
+ struct { \
+ struct type *cqe_next; /* next element */ \
+ struct type *cqe_prev; /* previous element */ \
+ }
/*
* Circular queue access methods
*/
-#define CIRCLEQ_FIRST(head) ((head)->cqh_first)
-#define CIRCLEQ_LAST(head) ((head)->cqh_last)
-#define CIRCLEQ_END(head) ((void *)(head))
-#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
-#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
-#define CIRCLEQ_EMPTY(head) \
- (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
-
-#define CIRCLEQ_FOREACH(var, head, field) \
- for((var) = CIRCLEQ_FIRST(head); \
- (var) != CIRCLEQ_END(head); \
- (var) = CIRCLEQ_NEXT(var, field))
-
-#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \
- for((var) = CIRCLEQ_LAST(head); \
- (var) != CIRCLEQ_END(head); \
- (var) = CIRCLEQ_PREV(var, field))
+#define CIRCLEQ_FIRST(head) ((head)->cqh_first)
+#define CIRCLEQ_LAST(head) ((head)->cqh_last)
+#define CIRCLEQ_END(head) ((void *)(head))
+#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
+#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
+#define CIRCLEQ_EMPTY(head) \
+ (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
+
+#define CIRCLEQ_FOREACH(var, head, field) \
+ for ((var) = CIRCLEQ_FIRST(head); \
+ (var) != CIRCLEQ_END(head); \
+ (var) = CIRCLEQ_NEXT(var, field))
+
+#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \
+ for ((var) = CIRCLEQ_LAST(head); \
+ (var) != CIRCLEQ_END(head); \
+ (var) = CIRCLEQ_PREV(var, field))
/*
* Circular queue functions.
*/
-#define CIRCLEQ_INIT(head) do { \
- (head)->cqh_first = CIRCLEQ_END(head); \
- (head)->cqh_last = CIRCLEQ_END(head); \
-} while (0)
-
-#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
- (elm)->field.cqe_next = (listelm)->field.cqe_next; \
- (elm)->field.cqe_prev = (listelm); \
- if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \
- (head)->cqh_last = (elm); \
- else \
- (listelm)->field.cqe_next->field.cqe_prev = (elm); \
- (listelm)->field.cqe_next = (elm); \
-} while (0)
-
-#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \
- (elm)->field.cqe_next = (listelm); \
- (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
- if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \
- (head)->cqh_first = (elm); \
- else \
- (listelm)->field.cqe_prev->field.cqe_next = (elm); \
- (listelm)->field.cqe_prev = (elm); \
-} while (0)
-
-#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \
- (elm)->field.cqe_next = (head)->cqh_first; \
- (elm)->field.cqe_prev = CIRCLEQ_END(head); \
- if ((head)->cqh_last == CIRCLEQ_END(head)) \
- (head)->cqh_last = (elm); \
- else \
- (head)->cqh_first->field.cqe_prev = (elm); \
- (head)->cqh_first = (elm); \
-} while (0)
-
-#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \
- (elm)->field.cqe_next = CIRCLEQ_END(head); \
- (elm)->field.cqe_prev = (head)->cqh_last; \
- if ((head)->cqh_first == CIRCLEQ_END(head)) \
- (head)->cqh_first = (elm); \
- else \
- (head)->cqh_last->field.cqe_next = (elm); \
- (head)->cqh_last = (elm); \
-} while (0)
-
-#define CIRCLEQ_REMOVE(head, elm, field) do { \
- if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \
- (head)->cqh_last = (elm)->field.cqe_prev; \
- else \
- (elm)->field.cqe_next->field.cqe_prev = \
- (elm)->field.cqe_prev; \
- if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \
- (head)->cqh_first = (elm)->field.cqe_next; \
- else \
- (elm)->field.cqe_prev->field.cqe_next = \
- (elm)->field.cqe_next; \
- _Q_INVALIDATE((elm)->field.cqe_prev); \
- _Q_INVALIDATE((elm)->field.cqe_next); \
-} while (0)
-
-#define CIRCLEQ_REPLACE(head, elm, elm2, field) do { \
- if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \
- CIRCLEQ_END(head)) \
- (head)->cqh_last = (elm2); \
- else \
- (elm2)->field.cqe_next->field.cqe_prev = (elm2); \
- if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \
- CIRCLEQ_END(head)) \
- (head)->cqh_first = (elm2); \
- else \
- (elm2)->field.cqe_prev->field.cqe_next = (elm2); \
- _Q_INVALIDATE((elm)->field.cqe_prev); \
- _Q_INVALIDATE((elm)->field.cqe_next); \
-} while (0)
-
-#endif /* !_SYS_QUEUE_H_ */
+#define CIRCLEQ_INIT(head) \
+ do { \
+ (head)->cqh_first = CIRCLEQ_END(head); \
+ (head)->cqh_last = CIRCLEQ_END(head); \
+ } while (0)
+
+#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) \
+ do { \
+ (elm)->field.cqe_next = (listelm)->field.cqe_next; \
+ (elm)->field.cqe_prev = (listelm); \
+ if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \
+ (head)->cqh_last = (elm); \
+ else \
+ (listelm)->field.cqe_next->field.cqe_prev = (elm); \
+ (listelm)->field.cqe_next = (elm); \
+ } while (0)
+
+#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) \
+ do { \
+ (elm)->field.cqe_next = (listelm); \
+ (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
+ if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \
+ (head)->cqh_first = (elm); \
+ else \
+ (listelm)->field.cqe_prev->field.cqe_next = (elm); \
+ (listelm)->field.cqe_prev = (elm); \
+ } while (0)
+
+#define CIRCLEQ_INSERT_HEAD(head, elm, field) \
+ do { \
+ (elm)->field.cqe_next = (head)->cqh_first; \
+ (elm)->field.cqe_prev = CIRCLEQ_END(head); \
+ if ((head)->cqh_last == CIRCLEQ_END(head)) \
+ (head)->cqh_last = (elm); \
+ else \
+ (head)->cqh_first->field.cqe_prev = (elm); \
+ (head)->cqh_first = (elm); \
+ } while (0)
+
+#define CIRCLEQ_INSERT_TAIL(head, elm, field) \
+ do { \
+ (elm)->field.cqe_next = CIRCLEQ_END(head); \
+ (elm)->field.cqe_prev = (head)->cqh_last; \
+ if ((head)->cqh_first == CIRCLEQ_END(head)) \
+ (head)->cqh_first = (elm); \
+ else \
+ (head)->cqh_last->field.cqe_next = (elm); \
+ (head)->cqh_last = (elm); \
+ } while (0)
+
+#define CIRCLEQ_REMOVE(head, elm, field) \
+ do { \
+ if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \
+ (head)->cqh_last = (elm)->field.cqe_prev; \
+ else \
+ (elm)->field.cqe_next->field.cqe_prev = (elm)->field.cqe_prev; \
+ if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \
+ (head)->cqh_first = (elm)->field.cqe_next; \
+ else \
+ (elm)->field.cqe_prev->field.cqe_next = (elm)->field.cqe_next; \
+ _Q_INVALIDATE((elm)->field.cqe_prev); \
+ _Q_INVALIDATE((elm)->field.cqe_next); \
+ } while (0)
+
+#define CIRCLEQ_REPLACE(head, elm, elm2, field) \
+ do { \
+ if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == CIRCLEQ_END(head)) \
+ (head)->cqh_last = (elm2); \
+ else \
+ (elm2)->field.cqe_next->field.cqe_prev = (elm2); \
+ if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == CIRCLEQ_END(head)) \
+ (head)->cqh_first = (elm2); \
+ else \
+ (elm2)->field.cqe_prev->field.cqe_next = (elm2); \
+ _Q_INVALIDATE((elm)->field.cqe_prev); \
+ _Q_INVALIDATE((elm)->field.cqe_next); \
+ } while (0)
+
+#endif /* !_SYS_QUEUE_H_ */
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <sys/stat.h>
#include <stdlib.h>
#include <ifaddrs.h>
#include "i3status.h"
const char *first_eth_interface(const net_type_t type) {
- static char *interface = NULL;
- struct ifaddrs *ifaddr, *addrp;
- struct stat stbuf;
- static char path[1024];
+ static char *interface = NULL;
+ struct ifaddrs *ifaddr, *addrp;
+ struct stat stbuf;
+ static char path[1024];
- getifaddrs(&ifaddr);
+ getifaddrs(&ifaddr);
- if (ifaddr == NULL)
- return NULL;
+ if (ifaddr == NULL)
+ return NULL;
- free(interface);
- interface = NULL;
- for (addrp = ifaddr;
- addrp != NULL;
- addrp = addrp->ifa_next) {
- if (strncasecmp("lo", addrp->ifa_name, strlen("lo")) == 0)
- continue;
- // Skip this interface if it is a wireless interface.
- snprintf(path, sizeof(path), "/sys/class/net/%s/wireless", addrp->ifa_name);
- const bool is_wireless = (stat(path, &stbuf) == 0);
- if (( is_wireless && type == NET_TYPE_ETHERNET) ||
- (!is_wireless && type == NET_TYPE_WIRELESS))
- continue;
- interface = strdup(addrp->ifa_name);
- break;
- }
+ free(interface);
+ interface = NULL;
+ for (addrp = ifaddr;
+ addrp != NULL;
+ addrp = addrp->ifa_next) {
+ if (strncasecmp("lo", addrp->ifa_name, strlen("lo")) == 0)
+ continue;
+ // Skip this interface if it is a wireless interface.
+ snprintf(path, sizeof(path), "/sys/class/net/%s/wireless", addrp->ifa_name);
+ const bool is_wireless = (stat(path, &stbuf) == 0);
+ if ((is_wireless && type == NET_TYPE_ETHERNET) ||
+ (!is_wireless && type == NET_TYPE_WIRELESS))
+ continue;
+ interface = strdup(addrp->ifa_name);
+ break;
+ }
- freeifaddrs(ifaddr);
- return interface;
+ freeifaddrs(ifaddr);
+ return interface;
}
-
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <sys/types.h>
#include <string.h>
#include <stdarg.h>
*
*/
bool slurp(const char *filename, char *destination, int size) {
- int fd;
+ int fd;
- if ((fd = open(filename, O_RDONLY)) == -1)
- return false;
+ if ((fd = open(filename, O_RDONLY)) == -1)
+ return false;
- /* We need one byte for the trailing 0 byte */
- int n = read(fd, destination, size-1);
- if (n != -1)
- destination[n] = '\0';
- (void)close(fd);
+ /* We need one byte for the trailing 0 byte */
+ int n = read(fd, destination, size - 1);
+ if (n != -1)
+ destination[n] = '\0';
+ (void)close(fd);
- return true;
+ return true;
}
/*
*
*/
char *skip_character(char *input, char character, int amount) {
- char *walk;
- size_t len = strlen(input);
- int blanks = 0;
+ char *walk;
+ size_t len = strlen(input);
+ int blanks = 0;
- for (walk = input; ((size_t)(walk - input) < len) && (blanks < amount); walk++)
- if (*walk == character)
- blanks++;
+ for (walk = input; ((size_t)(walk - input) < len) && (blanks < amount); walk++)
+ if (*walk == character)
+ blanks++;
- return (walk == input ? walk : walk-1);
+ return (walk == input ? walk : walk - 1);
}
/*
*
*/
void die(const char *fmt, ...) {
- char buffer[512];
- va_list ap;
- va_start(ap, fmt);
- (void)vsnprintf(buffer, sizeof(buffer), fmt, ap);
- va_end(ap);
-
- fprintf(stderr, "%s", buffer);
- exit(EXIT_FAILURE);
+ char buffer[512];
+ va_list ap;
+ va_start(ap, fmt);
+ (void)vsnprintf(buffer, sizeof(buffer), fmt, ap);
+ va_end(ap);
+
+ fprintf(stderr, "%s", buffer);
+ exit(EXIT_FAILURE);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
*
*/
char *color(const char *colorstr) {
- static char colorbuf[32];
- if (!cfg_getbool(cfg_general, "colors")) {
- colorbuf[0] = '\0';
- return colorbuf;
- }
- if (output_format == O_DZEN2)
- (void)snprintf(colorbuf, sizeof(colorbuf), "^fg(%s)", cfg_getstr(cfg_general, colorstr));
- else if (output_format == O_XMOBAR)
- (void)snprintf(colorbuf, sizeof(colorbuf), "<fc=%s>", cfg_getstr(cfg_general, colorstr));
- else if (output_format == O_TERM) {
- /* The escape-sequence for color is <CSI><col>;1m (bright/bold
- * output), where col is a 3-bit rgb-value with b in the
- * least-significant bit. We round the given color to the
- * nearist 3-bit-depth color and output the escape-sequence */
- char *str = cfg_getstr(cfg_general, colorstr);
- int col = strtol(str + 1, NULL, 16);
- int r = (col & (0xFF << 0)) / 0x80;
- int g = (col & (0xFF << 8)) / 0x8000;
- int b = (col & (0xFF << 16)) / 0x800000;
- col = (r << 2) | (g << 1) | b;
- (void)snprintf(colorbuf, sizeof(colorbuf), "\033[3%d;1m", col);
- }
+ static char colorbuf[32];
+ if (!cfg_getbool(cfg_general, "colors")) {
+ colorbuf[0] = '\0';
return colorbuf;
+ }
+ if (output_format == O_DZEN2)
+ (void)snprintf(colorbuf, sizeof(colorbuf), "^fg(%s)", cfg_getstr(cfg_general, colorstr));
+ else if (output_format == O_XMOBAR)
+ (void)snprintf(colorbuf, sizeof(colorbuf), "<fc=%s>", cfg_getstr(cfg_general, colorstr));
+ else if (output_format == O_TERM) {
+ /* The escape-sequence for color is <CSI><col>;1m (bright/bold
+ * output), where col is a 3-bit rgb-value with b in the
+ * least-significant bit. We round the given color to the
+ * nearist 3-bit-depth color and output the escape-sequence */
+ char *str = cfg_getstr(cfg_general, colorstr);
+ int col = strtol(str + 1, NULL, 16);
+ int r = (col & (0xFF << 0)) / 0x80;
+ int g = (col & (0xFF << 8)) / 0x8000;
+ int b = (col & (0xFF << 16)) / 0x800000;
+ col = (r << 2) | (g << 1) | b;
+ (void)snprintf(colorbuf, sizeof(colorbuf), "\033[3%d;1m", col);
+ }
+ return colorbuf;
}
/*
*
*/
char *endcolor(void) {
- if (output_format == O_XMOBAR)
- return "</fc>";
- else if (output_format == O_TERM)
- return "\033[0m";
- else return "";
+ if (output_format == O_XMOBAR)
+ return "</fc>";
+ else if (output_format == O_TERM)
+ return "\033[0m";
+ else
+ return "";
}
void print_separator(const char *separator) {
- if (output_format == O_I3BAR || strlen(separator) == 0)
- return;
+ if (output_format == O_I3BAR || strlen(separator) == 0)
+ return;
- if (output_format == O_DZEN2)
- printf("^fg(%s)%s^fg()", cfg_getstr(cfg_general, "color_separator"), separator);
- else if (output_format == O_XMOBAR)
- printf("<fc=%s>%s</fc>", cfg_getstr(cfg_general, "color_separator"), separator);
- else if (output_format == O_TERM)
- printf("%s%s%s", color("color_separator"), separator, endcolor());
- else if (output_format == O_NONE)
- printf("%s", separator);
+ if (output_format == O_DZEN2)
+ printf("^fg(%s)%s^fg()", cfg_getstr(cfg_general, "color_separator"), separator);
+ else if (output_format == O_XMOBAR)
+ printf("<fc=%s>%s</fc>", cfg_getstr(cfg_general, "color_separator"), separator);
+ else if (output_format == O_TERM)
+ printf("%s%s%s", color("color_separator"), separator, endcolor());
+ else if (output_format == O_NONE)
+ printf("%s", separator);
}
/*
* The term-output hides the cursor. We call this on exit to reset that.
*/
void reset_cursor(void) {
- printf("\033[?25h");
+ printf("\033[?25h");
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <ctype.h>
#include <time.h>
#include <string.h>
*
*/
void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char *path, const char *format, const char *format_down, const char *status_chr, const char *status_bat, const char *status_full, int low_threshold, char *threshold_type, bool last_full_capacity, bool integer_battery_capacity, bool hide_seconds) {
- time_t empty_time;
- struct tm *empty_tm;
- char buf[1024];
- char statusbuf[16];
- char percentagebuf[16];
- char remainingbuf[256];
- char emptytimebuf[256];
- char consumptionbuf[256];
- const char *walk, *last;
- char *outwalk = buffer;
- bool watt_as_unit = false;
- bool colorful_output = false;
- int full_design = -1,
- remaining = -1,
- present_rate = -1,
- voltage = -1;
- charging_status_t status = CS_DISCHARGING;
-
- memset(statusbuf, '\0', sizeof(statusbuf));
- memset(percentagebuf, '\0', sizeof(percentagebuf));
- memset(remainingbuf, '\0', sizeof(remainingbuf));
- memset(emptytimebuf, '\0', sizeof(emptytimebuf));
- memset(consumptionbuf, '\0', sizeof(consumptionbuf));
-
- static char batpath[512];
- sprintf(batpath, path, number);
- INSTANCE(batpath);
+ time_t empty_time;
+ struct tm *empty_tm;
+ char buf[1024];
+ char statusbuf[16];
+ char percentagebuf[16];
+ char remainingbuf[256];
+ char emptytimebuf[256];
+ char consumptionbuf[256];
+ const char *walk, *last;
+ char *outwalk = buffer;
+ bool watt_as_unit = false;
+ bool colorful_output = false;
+ int full_design = -1,
+ remaining = -1,
+ present_rate = -1,
+ voltage = -1;
+ charging_status_t status = CS_DISCHARGING;
+
+ memset(statusbuf, '\0', sizeof(statusbuf));
+ memset(percentagebuf, '\0', sizeof(percentagebuf));
+ memset(remainingbuf, '\0', sizeof(remainingbuf));
+ memset(emptytimebuf, '\0', sizeof(emptytimebuf));
+ memset(consumptionbuf, '\0', sizeof(consumptionbuf));
+
+ static char batpath[512];
+ sprintf(batpath, path, number);
+ INSTANCE(batpath);
#define BATT_STATUS_NAME(status) \
- (status == CS_CHARGING ? status_chr : \
- (status == CS_DISCHARGING ? status_bat : status_full))
+ (status == CS_CHARGING ? status_chr : (status == CS_DISCHARGING ? status_bat : status_full))
#if defined(LINUX)
- if (!slurp(batpath, buf, sizeof(buf))) {
- OUTPUT_FULL_TEXT(format_down);
- return;
+ if (!slurp(batpath, buf, sizeof(buf))) {
+ OUTPUT_FULL_TEXT(format_down);
+ return;
+ }
+
+ for (walk = buf, last = buf; (walk - buf) < 1024; walk++) {
+ if (*walk == '\n') {
+ last = walk + 1;
+ continue;
}
- for (walk = buf, last = buf; (walk-buf) < 1024; walk++) {
- if (*walk == '\n') {
- last = walk+1;
- continue;
- }
-
- if (*walk != '=')
- continue;
-
- if (BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_NOW")) {
- watt_as_unit = true;
- remaining = atoi(walk+1);
- }
- else if (BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_NOW")) {
- watt_as_unit = false;
- remaining = atoi(walk+1);
- }
- else if (BEGINS_WITH(last, "POWER_SUPPLY_CURRENT_NOW"))
- present_rate = abs(atoi(walk+1));
- else if (BEGINS_WITH(last, "POWER_SUPPLY_VOLTAGE_NOW"))
- voltage = abs(atoi(walk+1));
- /* on some systems POWER_SUPPLY_POWER_NOW does not exist, but actually
- * it is the same as POWER_SUPPLY_CURRENT_NOW but with μWh as
- * unit instead of μAh. We will calculate it as we need it
- * later. */
- else if (BEGINS_WITH(last, "POWER_SUPPLY_POWER_NOW"))
- present_rate = abs(atoi(walk+1));
- else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Charging"))
- status = CS_CHARGING;
- else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Full"))
- status = CS_FULL;
- else {
- /* The only thing left is the full capacity */
- if (last_full_capacity) {
- if (!BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL") &&
- !BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL"))
- continue;
- } else {
- if (!BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL_DESIGN") &&
- !BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL_DESIGN"))
- continue;
- }
-
- full_design = atoi(walk+1);
- }
- }
-
- /* the difference between POWER_SUPPLY_ENERGY_NOW and
- * POWER_SUPPLY_CHARGE_NOW is the unit of measurement. The energy is
- * given in mWh, the charge in mAh. So calculate every value given in
- * ampere to watt */
- if (!watt_as_unit) {
- present_rate = (((float)voltage / 1000.0) * ((float)present_rate / 1000.0));
-
- if (voltage != -1) {
- remaining = (((float)voltage / 1000.0) * ((float)remaining / 1000.0));
- full_design = (((float)voltage / 1000.0) * ((float)full_design / 1000.0));
+ if (*walk != '=')
+ continue;
+
+ if (BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_NOW")) {
+ watt_as_unit = true;
+ remaining = atoi(walk + 1);
+ } else if (BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_NOW")) {
+ watt_as_unit = false;
+ remaining = atoi(walk + 1);
+ } else if (BEGINS_WITH(last, "POWER_SUPPLY_CURRENT_NOW"))
+ present_rate = abs(atoi(walk + 1));
+ else if (BEGINS_WITH(last, "POWER_SUPPLY_VOLTAGE_NOW"))
+ voltage = abs(atoi(walk + 1));
+ /* on some systems POWER_SUPPLY_POWER_NOW does not exist, but actually
+ * it is the same as POWER_SUPPLY_CURRENT_NOW but with μWh as
+ * unit instead of μAh. We will calculate it as we need it
+ * later. */
+ else if (BEGINS_WITH(last, "POWER_SUPPLY_POWER_NOW"))
+ present_rate = abs(atoi(walk + 1));
+ else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Charging"))
+ status = CS_CHARGING;
+ else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Full"))
+ status = CS_FULL;
+ else {
+ /* The only thing left is the full capacity */
+ if (last_full_capacity) {
+ if (!BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL") &&
+ !BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL"))
+ continue;
+ } else {
+ if (!BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL_DESIGN") &&
+ !BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL_DESIGN"))
+ continue;
}
- }
- if ((full_design == -1) || (remaining == -1)) {
- OUTPUT_FULL_TEXT(format_down);
- return;
+ full_design = atoi(walk + 1);
}
-
- (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
-
- float percentage_remaining = (((float)remaining / (float)full_design) * 100);
- if (integer_battery_capacity) {
- (void)snprintf(percentagebuf, sizeof(percentagebuf), "%.00f%%", percentage_remaining);
- } else {
- (void)snprintf(percentagebuf, sizeof(percentagebuf), "%.02f%%", percentage_remaining);
+ }
+
+ /* the difference between POWER_SUPPLY_ENERGY_NOW and
+ * POWER_SUPPLY_CHARGE_NOW is the unit of measurement. The energy is
+ * given in mWh, the charge in mAh. So calculate every value given in
+ * ampere to watt */
+ if (!watt_as_unit) {
+ present_rate = (((float)voltage / 1000.0) * ((float)present_rate / 1000.0));
+
+ if (voltage != -1) {
+ remaining = (((float)voltage / 1000.0) * ((float)remaining / 1000.0));
+ full_design = (((float)voltage / 1000.0) * ((float)full_design / 1000.0));
}
+ }
- if (present_rate > 0) {
- float remaining_time;
- int seconds, hours, minutes, seconds_remaining;
- if (status == CS_CHARGING)
- remaining_time = ((float)full_design - (float)remaining) / (float)present_rate;
- else if (status == CS_DISCHARGING)
- remaining_time = ((float)remaining / (float)present_rate);
- else remaining_time = 0;
-
- seconds_remaining = (int)(remaining_time * 3600.0);
-
- hours = seconds_remaining / 3600;
- seconds = seconds_remaining - (hours * 3600);
- minutes = seconds / 60;
- seconds -= (minutes * 60);
-
- if (status == CS_DISCHARGING && low_threshold > 0) {
- if (strcasecmp(threshold_type, "percentage") == 0
- && percentage_remaining < low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- } else if (strcasecmp(threshold_type, "time") == 0
- && seconds_remaining < 60 * low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- } else {
- colorful_output = false;
- }
- }
-
- if (hide_seconds)
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d",
- max(hours, 0), max(minutes, 0));
- else
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d:%02d",
- max(hours, 0), max(minutes, 0), max(seconds, 0));
+ if ((full_design == -1) || (remaining == -1)) {
+ OUTPUT_FULL_TEXT(format_down);
+ return;
+ }
- empty_time = time(NULL);
- empty_time += seconds_remaining;
- empty_tm = localtime(&empty_time);
+ (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
- if (hide_seconds)
- (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d",
- max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0));
- else
- (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d:%02d",
- max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0), max(empty_tm->tm_sec, 0));
-
- (void)snprintf(consumptionbuf, sizeof(consumptionbuf), "%1.2fW",
- ((float)present_rate / 1000.0 / 1000.0));
- } else {
- /* On some systems, present_rate may not exist. Still, make sure
- * we colorize the output if threshold_type is set to percentage
- * (since we don't have any information on remaining time). */
- if (status == CS_DISCHARGING && low_threshold > 0) {
- if (strcasecmp(threshold_type, "percentage") == 0
- && percentage_remaining < low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- }
- }
-#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
- int state;
- int sysctl_rslt;
- size_t sysctl_size = sizeof(sysctl_rslt);
+ float percentage_remaining = (((float)remaining / (float)full_design) * 100);
+ if (integer_battery_capacity) {
+ (void)snprintf(percentagebuf, sizeof(percentagebuf), "%.00f%%", percentage_remaining);
+ } else {
+ (void)snprintf(percentagebuf, sizeof(percentagebuf), "%.02f%%", percentage_remaining);
+ }
- if (sysctlbyname(BATT_LIFE, &sysctl_rslt, &sysctl_size, NULL, 0) != 0) {
- OUTPUT_FULL_TEXT(format_down);
- return;
- }
+ if (present_rate > 0) {
+ float remaining_time;
+ int seconds, hours, minutes, seconds_remaining;
+ if (status == CS_CHARGING)
+ remaining_time = ((float)full_design - (float)remaining) / (float)present_rate;
+ else if (status == CS_DISCHARGING)
+ remaining_time = ((float)remaining / (float)present_rate);
+ else
+ remaining_time = 0;
- present_rate = sysctl_rslt;
- if (sysctlbyname(BATT_TIME, &sysctl_rslt, &sysctl_size, NULL, 0) != 0) {
- OUTPUT_FULL_TEXT(format_down);
- return;
- }
+ seconds_remaining = (int)(remaining_time * 3600.0);
- remaining = sysctl_rslt;
- if (sysctlbyname(BATT_STATE, &sysctl_rslt, &sysctl_size, NULL,0) != 0) {
- OUTPUT_FULL_TEXT(format_down);
- return;
+ hours = seconds_remaining / 3600;
+ seconds = seconds_remaining - (hours * 3600);
+ minutes = seconds / 60;
+ seconds -= (minutes * 60);
+
+ if (status == CS_DISCHARGING && low_threshold > 0) {
+ if (strcasecmp(threshold_type, "percentage") == 0 && percentage_remaining < low_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ } else if (strcasecmp(threshold_type, "time") == 0 && seconds_remaining < 60 * low_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ } else {
+ colorful_output = false;
+ }
}
- state = sysctl_rslt;
- if (state == 0 && present_rate == 100)
- status = CS_FULL;
- else if (state == 0 && present_rate < 100)
- status = CS_CHARGING;
+ if (hide_seconds)
+ (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d",
+ max(hours, 0), max(minutes, 0));
else
- status = CS_DISCHARGING;
+ (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d:%02d",
+ max(hours, 0), max(minutes, 0), max(seconds, 0));
- full_design = sysctl_rslt;
+ empty_time = time(NULL);
+ empty_time += seconds_remaining;
+ empty_tm = localtime(&empty_time);
- (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
+ if (hide_seconds)
+ (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d",
+ max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0));
+ else
+ (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d:%02d",
+ max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0), max(empty_tm->tm_sec, 0));
- (void)snprintf(percentagebuf, sizeof(percentagebuf), "%02d%%",
- present_rate);
-
- if (state == 1) {
- int hours, minutes;
- minutes = remaining;
- hours = minutes / 60;
- minutes -= (hours * 60);
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02dh%02d",
- max(hours, 0), max(minutes, 0));
- if (strcasecmp(threshold_type, "percentage") == 0
- && present_rate < low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- } else if (strcasecmp(threshold_type, "time") == 0
- && remaining < (u_int) low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
+ (void)snprintf(consumptionbuf, sizeof(consumptionbuf), "%1.2fW",
+ ((float)present_rate / 1000.0 / 1000.0));
+ } else {
+ /* On some systems, present_rate may not exist. Still, make sure
+ * we colorize the output if threshold_type is set to percentage
+ * (since we don't have any information on remaining time). */
+ if (status == CS_DISCHARGING && low_threshold > 0) {
+ if (strcasecmp(threshold_type, "percentage") == 0 && percentage_remaining < low_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ }
+ }
+ }
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
+ int state;
+ int sysctl_rslt;
+ size_t sysctl_size = sizeof(sysctl_rslt);
+
+ if (sysctlbyname(BATT_LIFE, &sysctl_rslt, &sysctl_size, NULL, 0) != 0) {
+ OUTPUT_FULL_TEXT(format_down);
+ return;
+ }
+
+ present_rate = sysctl_rslt;
+ if (sysctlbyname(BATT_TIME, &sysctl_rslt, &sysctl_size, NULL, 0) != 0) {
+ OUTPUT_FULL_TEXT(format_down);
+ return;
+ }
+
+ remaining = sysctl_rslt;
+ if (sysctlbyname(BATT_STATE, &sysctl_rslt, &sysctl_size, NULL, 0) != 0) {
+ OUTPUT_FULL_TEXT(format_down);
+ return;
+ }
+
+ state = sysctl_rslt;
+ if (state == 0 && present_rate == 100)
+ status = CS_FULL;
+ else if (state == 0 && present_rate < 100)
+ status = CS_CHARGING;
+ else
+ status = CS_DISCHARGING;
+
+ full_design = sysctl_rslt;
+
+ (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
+
+ (void)snprintf(percentagebuf, sizeof(percentagebuf), "%02d%%",
+ present_rate);
+
+ if (state == 1) {
+ int hours, minutes;
+ minutes = remaining;
+ hours = minutes / 60;
+ minutes -= (hours * 60);
+ (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02dh%02d",
+ max(hours, 0), max(minutes, 0));
+ if (strcasecmp(threshold_type, "percentage") == 0 && present_rate < low_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ } else if (strcasecmp(threshold_type, "time") == 0 && remaining < (u_int)low_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
}
+ }
#elif defined(__OpenBSD__)
- /*
+ /*
* We're using apm(4) here, which is the interface to acpi(4) on amd64/i386 and
* the generic interface on macppc/sparc64/zaurus, instead of using sysctl(3) and
* probing acpi(4) devices.
*/
- struct apm_power_info apm_info;
- int apm_fd;
-
- apm_fd = open("/dev/apm", O_RDONLY);
- if (apm_fd < 0) {
- OUTPUT_FULL_TEXT("can't open /dev/apm");
- return;
- }
- if (ioctl(apm_fd, APM_IOC_GETPOWER, &apm_info) < 0)
- OUTPUT_FULL_TEXT("can't read power info");
-
- close(apm_fd);
-
- /* Don't bother to go further if there's no battery present. */
- if ((apm_info.battery_state == APM_BATTERY_ABSENT) ||
- (apm_info.battery_state == APM_BATT_UNKNOWN)) {
- OUTPUT_FULL_TEXT(format_down);
- return;
- }
-
- switch(apm_info.ac_state) {
- case APM_AC_OFF:
- status = CS_DISCHARGING;
- break;
- case APM_AC_ON:
- status = CS_CHARGING;
- break;
- default:
- /* If we don't know what's going on, just assume we're discharging. */
- status = CS_DISCHARGING;
- break;
- }
-
- (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
- /* integer_battery_capacity is implied as battery_life is already in whole numbers. */
- (void)snprintf(percentagebuf, sizeof(percentagebuf), "%.00d%%", apm_info.battery_life);
-
- if (status == CS_DISCHARGING && low_threshold > 0) {
- if (strcasecmp(threshold_type, "percentage") == 0
- && apm_info.battery_life < low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- } else if (strcasecmp(threshold_type, "time") == 0
- && apm_info.minutes_left < (u_int) low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- }
-
- /* Can't give a meaningful value for remaining minutes if we're charging. */
- if (status != CS_CHARGING) {
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%d", apm_info.minutes_left);
- } else {
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%s", "(CHR)");
- }
-
- if (colorful_output)
- END_COLOR;
-#elif defined(__NetBSD__)
- /*
- * Using envsys(4) via sysmon(4).
- */
- int fd, rval, last_full_cap;
- bool is_found = false;
- char *sensor_desc;
- bool is_full = false;
-
- prop_dictionary_t dict;
- prop_array_t array;
- prop_object_iterator_t iter;
- prop_object_iterator_t iter2;
- prop_object_t obj, obj2, obj3, obj4, obj5;
-
- asprintf(&sensor_desc, "acpibat%d", number);
-
- fd = open("/dev/sysmon", O_RDONLY);
- if (fd < 0) {
- OUTPUT_FULL_TEXT("can't open /dev/sysmon");
- return;
- }
-
- rval = prop_dictionary_recv_ioctl(fd, ENVSYS_GETDICTIONARY, &dict);
- if (rval == -1) {
- close(fd);
- return;
+ struct apm_power_info apm_info;
+ int apm_fd;
+
+ apm_fd = open("/dev/apm", O_RDONLY);
+ if (apm_fd < 0) {
+ OUTPUT_FULL_TEXT("can't open /dev/apm");
+ return;
+ }
+ if (ioctl(apm_fd, APM_IOC_GETPOWER, &apm_info) < 0)
+ OUTPUT_FULL_TEXT("can't read power info");
+
+ close(apm_fd);
+
+ /* Don't bother to go further if there's no battery present. */
+ if ((apm_info.battery_state == APM_BATTERY_ABSENT) ||
+ (apm_info.battery_state == APM_BATT_UNKNOWN)) {
+ OUTPUT_FULL_TEXT(format_down);
+ return;
+ }
+
+ switch (apm_info.ac_state) {
+ case APM_AC_OFF:
+ status = CS_DISCHARGING;
+ break;
+ case APM_AC_ON:
+ status = CS_CHARGING;
+ break;
+ default:
+ /* If we don't know what's going on, just assume we're discharging. */
+ status = CS_DISCHARGING;
+ break;
+ }
+
+ (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
+ /* integer_battery_capacity is implied as battery_life is already in whole numbers. */
+ (void)snprintf(percentagebuf, sizeof(percentagebuf), "%.00d%%", apm_info.battery_life);
+
+ if (status == CS_DISCHARGING && low_threshold > 0) {
+ if (strcasecmp(threshold_type, "percentage") == 0 && apm_info.battery_life < low_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ } else if (strcasecmp(threshold_type, "time") == 0 && apm_info.minutes_left < (u_int)low_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
}
+ }
- if (prop_dictionary_count(dict) == 0) {
- prop_object_release(dict);
- close(fd);
- return;
- }
+ /* Can't give a meaningful value for remaining minutes if we're charging. */
+ if (status != CS_CHARGING) {
+ (void)snprintf(remainingbuf, sizeof(remainingbuf), "%d", apm_info.minutes_left);
+ } else {
+ (void)snprintf(remainingbuf, sizeof(remainingbuf), "%s", "(CHR)");
+ }
- iter = prop_dictionary_iterator(dict);
- if (iter == NULL) {
- prop_object_release(dict);
- close(fd);
- }
-
- /* iterate over the dictionary returned by the kernel */
- while ((obj = prop_object_iterator_next(iter)) != NULL) {
- /* skip this dict if it's not what we're looking for */
- if ((strlen(prop_dictionary_keysym_cstring_nocopy(obj)) == strlen(sensor_desc)) &&
- (strncmp(sensor_desc,
- prop_dictionary_keysym_cstring_nocopy(obj),
- strlen(sensor_desc)) != 0))
- continue;
-
- is_found = true;
-
- array = prop_dictionary_get_keysym(dict, obj);
- if (prop_object_type(array) != PROP_TYPE_ARRAY) {
- prop_object_iterator_release(iter);
- prop_object_release(dict);
- close(fd);
- return;
- }
-
- iter2 = prop_array_iterator(array);
- if (!iter2) {
- prop_object_iterator_release(iter);
- prop_object_release(dict);
- close(fd);
- return;
- }
-
- /* iterate over array of dicts specific to target battery */
- while ((obj2 = prop_object_iterator_next(iter2)) != NULL) {
- obj3 = prop_dictionary_get(obj2, "description");
-
- if (obj3 &&
- strlen(prop_string_cstring_nocopy(obj3)) == 8 &&
- strncmp("charging",
- prop_string_cstring_nocopy(obj3),
- 8) == 0)
- {
- obj3 = prop_dictionary_get(obj2, "cur-value");
-
- if (prop_number_integer_value(obj3))
- status = CS_CHARGING;
- else
- status = CS_DISCHARGING;
-
- continue;
- }
-
- if (obj3 &&
- strlen(prop_string_cstring_nocopy(obj3)) == 6 &&
- strncmp("charge",
- prop_string_cstring_nocopy(obj3),
- 6) == 0)
- {
- obj3 = prop_dictionary_get(obj2, "cur-value");
- obj4 = prop_dictionary_get(obj2, "max-value");
- obj5 = prop_dictionary_get(obj2, "type");
-
- remaining = prop_number_integer_value(obj3);
- full_design = prop_number_integer_value(obj4);
-
- if (remaining == full_design)
- is_full = true;
-
- if (strncmp("Ampere hour",
- prop_string_cstring_nocopy(obj5),
- 11) == 0)
- watt_as_unit = false;
- else
- watt_as_unit = true;
-
- continue;
- }
-
- if (obj3 &&
- strlen(prop_string_cstring_nocopy(obj3)) == 14 &&
- strncmp("discharge rate",
- prop_string_cstring_nocopy(obj3),
- 14) == 0)
- {
- obj3 = prop_dictionary_get(obj2, "cur-value");
- present_rate = prop_number_integer_value(obj3);
- continue;
- }
-
- if (obj3 &&
- strlen(prop_string_cstring_nocopy(obj3)) == 13 &&
- strncmp("last full cap",
- prop_string_cstring_nocopy(obj3),
- 13) == 0)
- {
- obj3 = prop_dictionary_get(obj2, "cur-value");
- last_full_cap = prop_number_integer_value(obj3);
- continue;
- }
-
- if (obj3 &&
- strlen(prop_string_cstring_nocopy(obj3)) == 7 &&
- strncmp("voltage",
- prop_string_cstring_nocopy(obj3),
- 7) == 0)
- {
- obj3 = prop_dictionary_get(obj2, "cur-value");
- voltage = prop_number_integer_value(obj3);
- continue;
- }
- }
- prop_object_iterator_release(iter2);
- }
+ if (colorful_output)
+ END_COLOR;
+#elif defined(__NetBSD__)
+ /*
+ * Using envsys(4) via sysmon(4).
+ */
+ int fd, rval, last_full_cap;
+ bool is_found = false;
+ char *sensor_desc;
+ bool is_full = false;
+
+ prop_dictionary_t dict;
+ prop_array_t array;
+ prop_object_iterator_t iter;
+ prop_object_iterator_t iter2;
+ prop_object_t obj, obj2, obj3, obj4, obj5;
+
+ asprintf(&sensor_desc, "acpibat%d", number);
+
+ fd = open("/dev/sysmon", O_RDONLY);
+ if (fd < 0) {
+ OUTPUT_FULL_TEXT("can't open /dev/sysmon");
+ return;
+ }
+
+ rval = prop_dictionary_recv_ioctl(fd, ENVSYS_GETDICTIONARY, &dict);
+ if (rval == -1) {
+ close(fd);
+ return;
+ }
- prop_object_iterator_release(iter);
+ if (prop_dictionary_count(dict) == 0) {
prop_object_release(dict);
close(fd);
+ return;
+ }
- if (! is_found) {
- OUTPUT_FULL_TEXT(format_down);
- return;
+ iter = prop_dictionary_iterator(dict);
+ if (iter == NULL) {
+ prop_object_release(dict);
+ close(fd);
+ }
+
+ /* iterate over the dictionary returned by the kernel */
+ while ((obj = prop_object_iterator_next(iter)) != NULL) {
+ /* skip this dict if it's not what we're looking for */
+ if ((strlen(prop_dictionary_keysym_cstring_nocopy(obj)) == strlen(sensor_desc)) &&
+ (strncmp(sensor_desc,
+ prop_dictionary_keysym_cstring_nocopy(obj),
+ strlen(sensor_desc)) != 0))
+ continue;
+
+ is_found = true;
+
+ array = prop_dictionary_get_keysym(dict, obj);
+ if (prop_object_type(array) != PROP_TYPE_ARRAY) {
+ prop_object_iterator_release(iter);
+ prop_object_release(dict);
+ close(fd);
+ return;
}
- if (last_full_capacity)
- full_design = last_full_cap;
-
- if (! watt_as_unit) {
- present_rate = (((float)voltage / 1000.0) * ((float)present_rate / 1000.0));
- remaining = (((float)voltage / 1000.0) * ((float)remaining / 1000.0));
- full_design = (((float)voltage / 1000.0) * ((float)full_design / 1000.0));
+ iter2 = prop_array_iterator(array);
+ if (!iter2) {
+ prop_object_iterator_release(iter);
+ prop_object_release(dict);
+ close(fd);
+ return;
}
- float percentage_remaining =
- (((float)remaining / (float)full_design) * 100);
+ /* iterate over array of dicts specific to target battery */
+ while ((obj2 = prop_object_iterator_next(iter2)) != NULL) {
+ obj3 = prop_dictionary_get(obj2, "description");
- if (integer_battery_capacity)
- (void)snprintf(percentagebuf,
- sizeof(percentagebuf),
- "%d%%",
- (int) percentage_remaining);
- else
- (void)snprintf(percentagebuf,
- sizeof(percentagebuf),
- "%.02f%%",
- percentage_remaining);
-
- /*
- * Handle percentage low_threshold here, and time low_threshold when
- * we have it.
- */
- if (status == CS_DISCHARGING && low_threshold > 0) {
- if (strcasecmp(threshold_type, "percentage") == 0
- && (((float)remaining / (float)full_design) * 100) < low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- }
+ if (obj3 &&
+ strlen(prop_string_cstring_nocopy(obj3)) == 8 &&
+ strncmp("charging",
+ prop_string_cstring_nocopy(obj3),
+ 8) == 0) {
+ obj3 = prop_dictionary_get(obj2, "cur-value");
- if (is_full)
- (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(CS_FULL));
- else
- (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
+ if (prop_number_integer_value(obj3))
+ status = CS_CHARGING;
+ else
+ status = CS_DISCHARGING;
- /*
- * The envsys(4) ACPI routines do not appear to provide a 'time
- * remaining' figure, so we must deduce it.
- */
- float remaining_time;
- int seconds, hours, minutes, seconds_remaining;
+ continue;
+ }
- if (status == CS_CHARGING)
- remaining_time = ((float)full_design - (float)remaining)
- / (float)present_rate;
- else if (status == CS_DISCHARGING)
- remaining_time = ((float)remaining / (float)present_rate);
- else remaining_time = 0;
+ if (obj3 &&
+ strlen(prop_string_cstring_nocopy(obj3)) == 6 &&
+ strncmp("charge",
+ prop_string_cstring_nocopy(obj3),
+ 6) == 0) {
+ obj3 = prop_dictionary_get(obj2, "cur-value");
+ obj4 = prop_dictionary_get(obj2, "max-value");
+ obj5 = prop_dictionary_get(obj2, "type");
+
+ remaining = prop_number_integer_value(obj3);
+ full_design = prop_number_integer_value(obj4);
+
+ if (remaining == full_design)
+ is_full = true;
+
+ if (strncmp("Ampere hour",
+ prop_string_cstring_nocopy(obj5),
+ 11) == 0)
+ watt_as_unit = false;
+ else
+ watt_as_unit = true;
- seconds_remaining = (int)(remaining_time * 3600.0);
+ continue;
+ }
- hours = seconds_remaining / 3600;
- seconds = seconds_remaining - (hours * 3600);
- minutes = seconds / 60;
- seconds -= (minutes * 60);
+ if (obj3 &&
+ strlen(prop_string_cstring_nocopy(obj3)) == 14 &&
+ strncmp("discharge rate",
+ prop_string_cstring_nocopy(obj3),
+ 14) == 0) {
+ obj3 = prop_dictionary_get(obj2, "cur-value");
+ present_rate = prop_number_integer_value(obj3);
+ continue;
+ }
- if (status != CS_CHARGING) {
- if (hide_seconds)
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d",
- max(hours, 0), max(minutes, 0));
- else
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d:%02d",
- max(hours, 0), max(minutes, 0), max(seconds, 0));
-
- if (low_threshold > 0) {
- if (strcasecmp(threshold_type, "time") == 0
- && ((float) seconds_remaining / 60.0) < (u_int) low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- }
- } else {
- if (hide_seconds)
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "(%02d:%02d until full)",
- max(hours, 0), max(minutes, 0));
- else
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "(%02d:%02d:%02d until full)",
- max(hours, 0), max(minutes, 0), max(seconds, 0));
+ if (obj3 &&
+ strlen(prop_string_cstring_nocopy(obj3)) == 13 &&
+ strncmp("last full cap",
+ prop_string_cstring_nocopy(obj3),
+ 13) == 0) {
+ obj3 = prop_dictionary_get(obj2, "cur-value");
+ last_full_cap = prop_number_integer_value(obj3);
+ continue;
+ }
+
+ if (obj3 &&
+ strlen(prop_string_cstring_nocopy(obj3)) == 7 &&
+ strncmp("voltage",
+ prop_string_cstring_nocopy(obj3),
+ 7) == 0) {
+ obj3 = prop_dictionary_get(obj2, "cur-value");
+ voltage = prop_number_integer_value(obj3);
+ continue;
+ }
+ }
+ prop_object_iterator_release(iter2);
+ }
+
+ prop_object_iterator_release(iter);
+ prop_object_release(dict);
+ close(fd);
+
+ if (!is_found) {
+ OUTPUT_FULL_TEXT(format_down);
+ return;
+ }
+
+ if (last_full_capacity)
+ full_design = last_full_cap;
+
+ if (!watt_as_unit) {
+ present_rate = (((float)voltage / 1000.0) * ((float)present_rate / 1000.0));
+ remaining = (((float)voltage / 1000.0) * ((float)remaining / 1000.0));
+ full_design = (((float)voltage / 1000.0) * ((float)full_design / 1000.0));
+ }
+
+ float percentage_remaining =
+ (((float)remaining / (float)full_design) * 100);
+
+ if (integer_battery_capacity)
+ (void)snprintf(percentagebuf,
+ sizeof(percentagebuf),
+ "%d%%",
+ (int)percentage_remaining);
+ else
+ (void)snprintf(percentagebuf,
+ sizeof(percentagebuf),
+ "%.02f%%",
+ percentage_remaining);
+
+ /*
+ * Handle percentage low_threshold here, and time low_threshold when
+ * we have it.
+ */
+ if (status == CS_DISCHARGING && low_threshold > 0) {
+ if (strcasecmp(threshold_type, "percentage") == 0 && (((float)remaining / (float)full_design) * 100) < low_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
}
+ }
- empty_time = time(NULL);
- empty_time += seconds_remaining;
- empty_tm = localtime(&empty_time);
+ if (is_full)
+ (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(CS_FULL));
+ else
+ (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
- /* No need to show empty time if battery is charging */
- if (status != CS_CHARGING) {
- if (hide_seconds)
- (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d",
- max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0));
- else
- (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d:%02d",
- max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0), max(empty_tm->tm_sec, 0));
+ /*
+ * The envsys(4) ACPI routines do not appear to provide a 'time
+ * remaining' figure, so we must deduce it.
+ */
+ float remaining_time;
+ int seconds, hours, minutes, seconds_remaining;
+
+ if (status == CS_CHARGING)
+ remaining_time = ((float)full_design - (float)remaining) / (float)present_rate;
+ else if (status == CS_DISCHARGING)
+ remaining_time = ((float)remaining / (float)present_rate);
+ else
+ remaining_time = 0;
+
+ seconds_remaining = (int)(remaining_time * 3600.0);
+
+ hours = seconds_remaining / 3600;
+ seconds = seconds_remaining - (hours * 3600);
+ minutes = seconds / 60;
+ seconds -= (minutes * 60);
+
+ if (status != CS_CHARGING) {
+ if (hide_seconds)
+ (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d",
+ max(hours, 0), max(minutes, 0));
+ else
+ (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d:%02d",
+ max(hours, 0), max(minutes, 0), max(seconds, 0));
+
+ if (low_threshold > 0) {
+ if (strcasecmp(threshold_type, "time") == 0 && ((float)seconds_remaining / 60.0) < (u_int)low_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ }
}
+ } else {
+ if (hide_seconds)
+ (void)snprintf(remainingbuf, sizeof(remainingbuf), "(%02d:%02d until full)",
+ max(hours, 0), max(minutes, 0));
+ else
+ (void)snprintf(remainingbuf, sizeof(remainingbuf), "(%02d:%02d:%02d until full)",
+ max(hours, 0), max(minutes, 0), max(seconds, 0));
+ }
+
+ empty_time = time(NULL);
+ empty_time += seconds_remaining;
+ empty_tm = localtime(&empty_time);
+
+ /* No need to show empty time if battery is charging */
+ if (status != CS_CHARGING) {
+ if (hide_seconds)
+ (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d",
+ max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0));
+ else
+ (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d:%02d",
+ max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0), max(empty_tm->tm_sec, 0));
+ }
- (void)snprintf(consumptionbuf, sizeof(consumptionbuf), "%1.2fW",
- ((float)present_rate / 1000.0 / 1000.0));
+ (void)snprintf(consumptionbuf, sizeof(consumptionbuf), "%1.2fW",
+ ((float)present_rate / 1000.0 / 1000.0));
#endif
-#define EAT_SPACE_FROM_OUTPUT_IF_EMPTY(_buf) \
- do { \
- if (strlen(_buf) == 0) { \
- if (outwalk > buffer && isspace(outwalk[-1])) \
- outwalk--; \
- else if (isspace(*(walk+1))) \
- walk++; \
- } \
- } while (0)
-
- for (walk = format; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
-
- if (BEGINS_WITH(walk+1, "status")) {
- outwalk += sprintf(outwalk, "%s", statusbuf);
- walk += strlen("status");
- } else if (BEGINS_WITH(walk+1, "percentage")) {
- outwalk += sprintf(outwalk, "%s", percentagebuf);
- walk += strlen("percentage");
- } else if (BEGINS_WITH(walk+1, "remaining")) {
- outwalk += sprintf(outwalk, "%s", remainingbuf);
- walk += strlen("remaining");
- EAT_SPACE_FROM_OUTPUT_IF_EMPTY(remainingbuf);
- } else if (BEGINS_WITH(walk+1, "emptytime")) {
- outwalk += sprintf(outwalk, "%s", emptytimebuf);
- walk += strlen("emptytime");
- EAT_SPACE_FROM_OUTPUT_IF_EMPTY(emptytimebuf);
- } else if (BEGINS_WITH(walk+1, "consumption")) {
- outwalk += sprintf(outwalk, "%s", consumptionbuf);
- walk += strlen("consumption");
- EAT_SPACE_FROM_OUTPUT_IF_EMPTY(consumptionbuf);
- }
+#define EAT_SPACE_FROM_OUTPUT_IF_EMPTY(_buf) \
+ do { \
+ if (strlen(_buf) == 0) { \
+ if (outwalk > buffer && isspace(outwalk[-1])) \
+ outwalk--; \
+ else if (isspace(*(walk + 1))) \
+ walk++; \
+ } \
+ } while (0)
+
+ for (walk = format; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
+ }
+
+ if (BEGINS_WITH(walk + 1, "status")) {
+ outwalk += sprintf(outwalk, "%s", statusbuf);
+ walk += strlen("status");
+ } else if (BEGINS_WITH(walk + 1, "percentage")) {
+ outwalk += sprintf(outwalk, "%s", percentagebuf);
+ walk += strlen("percentage");
+ } else if (BEGINS_WITH(walk + 1, "remaining")) {
+ outwalk += sprintf(outwalk, "%s", remainingbuf);
+ walk += strlen("remaining");
+ EAT_SPACE_FROM_OUTPUT_IF_EMPTY(remainingbuf);
+ } else if (BEGINS_WITH(walk + 1, "emptytime")) {
+ outwalk += sprintf(outwalk, "%s", emptytimebuf);
+ walk += strlen("emptytime");
+ EAT_SPACE_FROM_OUTPUT_IF_EMPTY(emptytimebuf);
+ } else if (BEGINS_WITH(walk + 1, "consumption")) {
+ outwalk += sprintf(outwalk, "%s", consumptionbuf);
+ walk += strlen("consumption");
+ EAT_SPACE_FROM_OUTPUT_IF_EMPTY(consumptionbuf);
}
+ }
- if (colorful_output)
- END_COLOR;
+ if (colorful_output)
+ END_COLOR;
- OUTPUT_FULL_TEXT(buffer);
+ OUTPUT_FULL_TEXT(buffer);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#define TZ_ZEROC 2732
-#define TZ_KELVTOC(x) (((x) - TZ_ZEROC) / 10), abs(((x) - TZ_ZEROC) % 10)
-#define TZ_AVG(x) ((x) - TZ_ZEROC) / 10
+#define TZ_KELVTOC(x) (((x)-TZ_ZEROC) / 10), abs(((x)-TZ_ZEROC) % 10)
+#define TZ_AVG(x) ((x)-TZ_ZEROC) / 10
#endif
#if defined(__DragonFly__)
#define MUKTOC(v) ((v - 273150000) / 1000000.0)
#endif
-
/*
* Reads the CPU temperature from /sys/class/thermal/thermal_zone%d/temp (or
* the user provided path) and returns the temperature in degree celcius.
*
*/
void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format, int max_threshold) {
- char *outwalk = buffer;
+ char *outwalk = buffer;
#ifdef THERMAL_ZONE
- const char *walk;
- bool colorful_output = false;
- char *thermal_zone;
+ const char *walk;
+ bool colorful_output = false;
+ char *thermal_zone;
- if (path == NULL)
- asprintf(&thermal_zone, THERMAL_ZONE, zone);
- else
- asprintf(&thermal_zone, path, zone);
+ if (path == NULL)
+ asprintf(&thermal_zone, THERMAL_ZONE, zone);
+ else
+ asprintf(&thermal_zone, path, zone);
- INSTANCE(thermal_zone);
+ INSTANCE(thermal_zone);
- for (walk = format; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
+ for (walk = format; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
+ }
- if (BEGINS_WITH(walk+1, "degrees")) {
+ if (BEGINS_WITH(walk + 1, "degrees")) {
#if defined(LINUX)
- static char buf[16];
- long int temp;
- if (!slurp(thermal_zone, buf, sizeof(buf)))
- goto error;
- temp = strtol(buf, NULL, 10);
- if (temp == LONG_MIN || temp == LONG_MAX || temp <= 0)
- *(outwalk++) = '?';
- else {
- if ((temp/1000) >= max_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- outwalk += sprintf(outwalk, "%ld", (temp/1000));
- if (colorful_output) {
- END_COLOR;
- colorful_output = false;
- }
- }
+ static char buf[16];
+ long int temp;
+ if (!slurp(thermal_zone, buf, sizeof(buf)))
+ goto error;
+ temp = strtol(buf, NULL, 10);
+ if (temp == LONG_MIN || temp == LONG_MAX || temp <= 0)
+ *(outwalk++) = '?';
+ else {
+ if ((temp / 1000) >= max_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ }
+ outwalk += sprintf(outwalk, "%ld", (temp / 1000));
+ if (colorful_output) {
+ END_COLOR;
+ colorful_output = false;
+ }
+ }
#elif defined(__DragonFly__)
- struct sensor th_sensor;
- size_t th_sensorlen;
-
- th_sensorlen = sizeof(th_sensor);
-
- if (sysctlbyname(thermal_zone, &th_sensor, &th_sensorlen, NULL, 0) == -1) {
- perror("sysctlbyname");
- goto error;
- }
- if (MUKTOC(th_sensor.value) >= max_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- outwalk += sprintf(outwalk, "%.2f", MUKTOC(th_sensor.value));
- if (colorful_output) {
- END_COLOR;
- colorful_output = false;
- }
+ struct sensor th_sensor;
+ size_t th_sensorlen;
+
+ th_sensorlen = sizeof(th_sensor);
+
+ if (sysctlbyname(thermal_zone, &th_sensor, &th_sensorlen, NULL, 0) == -1) {
+ perror("sysctlbyname");
+ goto error;
+ }
+ if (MUKTOC(th_sensor.value) >= max_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ }
+ outwalk += sprintf(outwalk, "%.2f", MUKTOC(th_sensor.value));
+ if (colorful_output) {
+ END_COLOR;
+ colorful_output = false;
+ }
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
- int sysctl_rslt;
- size_t sysctl_size = sizeof(sysctl_rslt);
- if (sysctlbyname(thermal_zone, &sysctl_rslt, &sysctl_size, NULL, 0))
- goto error;
-
- if (TZ_AVG(sysctl_rslt) >= max_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- outwalk += sprintf(outwalk, "%d.%d", TZ_KELVTOC(sysctl_rslt));
- if (colorful_output) {
- END_COLOR;
- colorful_output = false;
- }
+ int sysctl_rslt;
+ size_t sysctl_size = sizeof(sysctl_rslt);
+ if (sysctlbyname(thermal_zone, &sysctl_rslt, &sysctl_size, NULL, 0))
+ goto error;
+
+ if (TZ_AVG(sysctl_rslt) >= max_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ }
+ outwalk += sprintf(outwalk, "%d.%d", TZ_KELVTOC(sysctl_rslt));
+ if (colorful_output) {
+ END_COLOR;
+ colorful_output = false;
+ }
#elif defined(__OpenBSD__)
- struct sensordev sensordev;
- struct sensor sensor;
- size_t sdlen, slen;
- int dev, numt, mib[5] = { CTL_HW, HW_SENSORS, 0, 0, 0 };
+ struct sensordev sensordev;
+ struct sensor sensor;
+ size_t sdlen, slen;
+ int dev, numt, mib[5] = {CTL_HW, HW_SENSORS, 0, 0, 0};
- sdlen = sizeof(sensordev);
- slen = sizeof(sensor);
+ sdlen = sizeof(sensordev);
+ slen = sizeof(sensor);
- for (dev = 0; ; dev++) {
+ for (dev = 0;; dev++) {
mib[2] = dev;
if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) {
- if (errno == ENXIO)
- continue;
- if (errno == ENOENT)
- break;
- goto error;
+ if (errno == ENXIO)
+ continue;
+ if (errno == ENOENT)
+ break;
+ goto error;
}
/* 'path' is the node within the full path (defaults to acpitz0). */
if (BEGINS_WITH(sensordev.xname, thermal_zone)) {
- mib[3] = SENSOR_TEMP;
- /* Limit to temo0, but should retrieve from a full path... */
- for (numt = 0; numt < 1 /*sensordev.maxnumt[SENSOR_TEMP]*/; numt++) {
- mib[4] = numt;
- if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) {
- if (errno != ENOENT) {
- warn("sysctl");
- continue;
- }
- }
- if ((int)MUKTOC(sensor.value) >= max_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
-
- outwalk += sprintf(outwalk, "%.2f", MUKTOC(sensor.value));
-
- if (colorful_output) {
- END_COLOR;
- colorful_output = false;
- }
+ mib[3] = SENSOR_TEMP;
+ /* Limit to temo0, but should retrieve from a full path... */
+ for (numt = 0; numt < 1 /*sensordev.maxnumt[SENSOR_TEMP]*/; numt++) {
+ mib[4] = numt;
+ if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) {
+ if (errno != ENOENT) {
+ warn("sysctl");
+ continue;
+ }
+ }
+ if ((int)MUKTOC(sensor.value) >= max_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
}
+
+ outwalk += sprintf(outwalk, "%.2f", MUKTOC(sensor.value));
+
+ if (colorful_output) {
+ END_COLOR;
+ colorful_output = false;
+ }
+ }
}
- }
+ }
#elif defined(__NetBSD__)
- int fd, rval;
- bool err = false;
- prop_dictionary_t dict;
- prop_array_t array;
- prop_object_iterator_t iter;
- prop_object_iterator_t iter2;
- prop_object_t obj, obj2, obj3;
-
- fd = open("/dev/sysmon", O_RDONLY);
- if (fd == -1)
+ int fd, rval;
+ bool err = false;
+ prop_dictionary_t dict;
+ prop_array_t array;
+ prop_object_iterator_t iter;
+ prop_object_iterator_t iter2;
+ prop_object_t obj, obj2, obj3;
+
+ fd = open("/dev/sysmon", O_RDONLY);
+ if (fd == -1)
goto error;
- rval = prop_dictionary_recv_ioctl(fd, ENVSYS_GETDICTIONARY, &dict);
- if (rval == -1) {
- err = true;
- goto error_netbsd1;
- }
-
- /* No drivers registered? */
- if (prop_dictionary_count(dict) == 0) {
- err = true;
- goto error_netbsd2;
- }
-
- iter = prop_dictionary_iterator(dict);
- if (iter == NULL) {
- err = true;
- goto error_netbsd2;
- }
-
- /* iterate over the dictionary returned by the kernel */
- while ((obj = prop_object_iterator_next(iter)) != NULL) {
+ rval = prop_dictionary_recv_ioctl(fd, ENVSYS_GETDICTIONARY, &dict);
+ if (rval == -1) {
+ err = true;
+ goto error_netbsd1;
+ }
+
+ /* No drivers registered? */
+ if (prop_dictionary_count(dict) == 0) {
+ err = true;
+ goto error_netbsd2;
+ }
+
+ iter = prop_dictionary_iterator(dict);
+ if (iter == NULL) {
+ err = true;
+ goto error_netbsd2;
+ }
+
+ /* iterate over the dictionary returned by the kernel */
+ while ((obj = prop_object_iterator_next(iter)) != NULL) {
/* skip this dict if it's not what we're looking for */
if ((strlen(prop_dictionary_keysym_cstring_nocopy(obj)) != strlen(thermal_zone)) ||
(strncmp(thermal_zone,
prop_dictionary_keysym_cstring_nocopy(obj),
strlen(thermal_zone)) != 0))
- continue;
+ continue;
array = prop_dictionary_get_keysym(dict, obj);
if (prop_object_type(array) != PROP_TYPE_ARRAY) {
/* iterate over array of dicts specific to target sensor */
while ((obj2 = prop_object_iterator_next(iter2)) != NULL) {
- obj3 = prop_dictionary_get(obj2, "cur-value");
+ obj3 = prop_dictionary_get(obj2, "cur-value");
- float temp = MUKTOC(prop_number_integer_value(obj3));
- if ((int)temp >= max_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
+ float temp = MUKTOC(prop_number_integer_value(obj3));
+ if ((int)temp >= max_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ }
- outwalk += sprintf(outwalk, "%.2f", temp);
+ outwalk += sprintf(outwalk, "%.2f", temp);
- if (colorful_output) {
- END_COLOR;
- colorful_output = false;
- }
+ if (colorful_output) {
+ END_COLOR;
+ colorful_output = false;
+ }
- break;
+ break;
}
prop_object_iterator_release(iter2);
- }
-error_netbsd3:
- prop_object_iterator_release(iter);
-error_netbsd2:
- prop_object_release(dict);
-error_netbsd1:
- close(fd);
- if (err) goto error;
+ }
+ error_netbsd3:
+ prop_object_iterator_release(iter);
+ error_netbsd2:
+ prop_object_release(dict);
+ error_netbsd1:
+ close(fd);
+ if (err)
+ goto error;
#endif
-
- walk += strlen("degrees");
- }
+ walk += strlen("degrees");
}
+ }
- free(thermal_zone);
+ free(thermal_zone);
- OUTPUT_FULL_TEXT(buffer);
- return;
+ OUTPUT_FULL_TEXT(buffer);
+ return;
error:
#endif
- free(thermal_zone);
+ free(thermal_zone);
- OUTPUT_FULL_TEXT("cant read temp");
- (void)fputs("i3status: Cannot read temperature. Verify that you have a thermal zone in /sys/class/thermal or disable the cpu_temperature module in your i3status config.\n", stderr);
+ OUTPUT_FULL_TEXT("cant read temp");
+ (void)fputs("i3status: Cannot read temperature. Verify that you have a thermal zone in /sys/class/thermal or disable the cpu_temperature module in your i3status config.\n", stderr);
}
-// vim:sw=8:sts=8:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include "i3status.h"
static int prev_total = 0;
-static int prev_idle = 0;
+static int prev_idle = 0;
/*
* Reads the CPU utilization from /proc/stat and returns the usage as a
*
*/
void print_cpu_usage(yajl_gen json_gen, char *buffer, const char *format) {
- const char *walk;
- char *outwalk = buffer;
- char buf[1024];
- int curr_user = 0, curr_nice = 0, curr_system = 0, curr_idle = 0, curr_total;
- int diff_idle, diff_total, diff_usage;
+ const char *walk;
+ char *outwalk = buffer;
+ char buf[1024];
+ int curr_user = 0, curr_nice = 0, curr_system = 0, curr_idle = 0, curr_total;
+ int diff_idle, diff_total, diff_usage;
#if defined(LINUX)
- static char statpath[512];
- strcpy(statpath, "/proc/stat");
- if (!slurp(statpath, buf, sizeof(buf)) ||
- sscanf(buf, "cpu %d %d %d %d", &curr_user, &curr_nice, &curr_system, &curr_idle) != 4)
- goto error;
+ static char statpath[512];
+ strcpy(statpath, "/proc/stat");
+ if (!slurp(statpath, buf, sizeof(buf)) ||
+ sscanf(buf, "cpu %d %d %d %d", &curr_user, &curr_nice, &curr_system, &curr_idle) != 4)
+ goto error;
- curr_total = curr_user + curr_nice + curr_system + curr_idle;
- diff_idle = curr_idle - prev_idle;
- diff_total = curr_total - prev_total;
- diff_usage = (diff_total ? (1000 * (diff_total - diff_idle)/diff_total + 5)/10 : 0);
- prev_total = curr_total;
- prev_idle = curr_idle;
+ curr_total = curr_user + curr_nice + curr_system + curr_idle;
+ diff_idle = curr_idle - prev_idle;
+ diff_total = curr_total - prev_total;
+ diff_usage = (diff_total ? (1000 * (diff_total - diff_idle) / diff_total + 5) / 10 : 0);
+ prev_total = curr_total;
+ prev_idle = curr_idle;
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
- size_t size;
- long cp_time[CPUSTATES];
- size = sizeof cp_time;
- if (sysctlbyname("kern.cp_time", &cp_time, &size, NULL, 0) < 0)
- goto error;
+ size_t size;
+ long cp_time[CPUSTATES];
+ size = sizeof cp_time;
+ if (sysctlbyname("kern.cp_time", &cp_time, &size, NULL, 0) < 0)
+ goto error;
#else
- /* This information is taken from the boot cpu, any other cpus are currently ignored. */
- long cp_time[CPUSTATES];
- int mib[2];
- size_t size = sizeof(cp_time);
+ /* This information is taken from the boot cpu, any other cpus are currently ignored. */
+ long cp_time[CPUSTATES];
+ int mib[2];
+ size_t size = sizeof(cp_time);
- mib[0] = CTL_KERN;
- mib[1] = KERN_CPTIME;
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_CPTIME;
- if (sysctl(mib, 2, cp_time, &size, NULL, 0))
- goto error;
+ if (sysctl(mib, 2, cp_time, &size, NULL, 0))
+ goto error;
#endif
- curr_user = cp_time[CP_USER];
- curr_nice = cp_time[CP_NICE];
- curr_system = cp_time[CP_SYS];
- curr_idle = cp_time[CP_IDLE];
- curr_total = curr_user + curr_nice + curr_system + curr_idle;
- diff_idle = curr_idle - prev_idle;
- diff_total = curr_total - prev_total;
- diff_usage = (diff_total ? (1000 * (diff_total - diff_idle)/diff_total + 5)/10 : 0);
- prev_total = curr_total;
- prev_idle = curr_idle;
+ curr_user = cp_time[CP_USER];
+ curr_nice = cp_time[CP_NICE];
+ curr_system = cp_time[CP_SYS];
+ curr_idle = cp_time[CP_IDLE];
+ curr_total = curr_user + curr_nice + curr_system + curr_idle;
+ diff_idle = curr_idle - prev_idle;
+ diff_total = curr_total - prev_total;
+ diff_usage = (diff_total ? (1000 * (diff_total - diff_idle) / diff_total + 5) / 10 : 0);
+ prev_total = curr_total;
+ prev_idle = curr_idle;
#else
- goto error;
+ goto error;
#endif
- for (walk = format; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
+ for (walk = format; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
+ }
- if (BEGINS_WITH(walk+1, "usage")) {
- outwalk += sprintf(outwalk, "%02d%%", diff_usage);
- walk += strlen("usage");
- }
+ if (BEGINS_WITH(walk + 1, "usage")) {
+ outwalk += sprintf(outwalk, "%02d%%", diff_usage);
+ walk += strlen("usage");
}
+ }
- OUTPUT_FULL_TEXT(buffer);
- return;
+ OUTPUT_FULL_TEXT(buffer);
+ return;
error:
- OUTPUT_FULL_TEXT("cant read cpu usage");
- (void)fputs("i3status: Cannot read CPU usage\n", stderr);
+ OUTPUT_FULL_TEXT("cant read cpu usage");
+ (void)fputs("i3status: Cannot read CPU usage\n", stderr);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
/* define fixed output-Strings */
char *season_long[5] = {
- "Chaos",
- "Discord",
- "Confusion",
- "Bureaucracy",
- "The Aftermath"
-};
+ "Chaos",
+ "Discord",
+ "Confusion",
+ "Bureaucracy",
+ "The Aftermath"};
char *season_short[5] = {
- "Chs",
- "Dsc",
- "Cfn",
- "Bcy",
- "Afm"
-};
+ "Chs",
+ "Dsc",
+ "Cfn",
+ "Bcy",
+ "Afm"};
char *day_long[5] = {
- "Sweetmorn",
- "Boomtime",
- "Pungenday",
- "Prickle-Prickle",
- "Setting Orange"
-};
+ "Sweetmorn",
+ "Boomtime",
+ "Pungenday",
+ "Prickle-Prickle",
+ "Setting Orange"};
char *day_short[5] = {
- "SM",
- "BT",
- "PD",
- "PP",
- "SO"
-};
+ "SM",
+ "BT",
+ "PD",
+ "PP",
+ "SO"};
char *holidays[10] = {
- "Mungday",
- "Mojoday",
- "Syaday",
- "Zaraday",
- "Maladay",
- "Chaoflux",
- "Discoflux",
- "Confuflux",
- "Bureflux",
- "Afflux"
-};
+ "Mungday",
+ "Mojoday",
+ "Syaday",
+ "Zaraday",
+ "Maladay",
+ "Chaoflux",
+ "Discoflux",
+ "Confuflux",
+ "Bureflux",
+ "Afflux"};
/* A helper-struct, taking the discordian date */
struct disc_time {
- int year;
- int season;
- int week_day;
- int season_day;
- int st_tibs_day;
+ int year;
+ int season;
+ int week_day;
+ int season_day;
+ int st_tibs_day;
};
/* Print the date *dt in format *format */
static int format_output(char *outwalk, char *format, struct disc_time *dt) {
- char *orig_outwalk = outwalk;
- char *i;
- char *tibs_end = 0;
-
- for (i = format; *i != '\0'; i++) {
- if (*i != '%') {
- *(outwalk++) = *i;
- continue;
+ char *orig_outwalk = outwalk;
+ char *i;
+ char *tibs_end = 0;
+
+ for (i = format; *i != '\0'; i++) {
+ if (*i != '%') {
+ *(outwalk++) = *i;
+ continue;
+ }
+ switch (*(i + 1)) {
+ /* Weekday in long and abbreviation */
+ case 'A':
+ outwalk += sprintf(outwalk, "%s", day_long[dt->week_day]);
+ break;
+ case 'a':
+ outwalk += sprintf(outwalk, "%s", day_short[dt->week_day]);
+ break;
+ /* Season in long and abbreviation */
+ case 'B':
+ outwalk += sprintf(outwalk, "%s", season_long[dt->season]);
+ break;
+ case 'b':
+ outwalk += sprintf(outwalk, "%s", season_short[dt->season]);
+ break;
+ /* Day of the season (ordinal and cardinal) */
+ case 'd':
+ outwalk += sprintf(outwalk, "%d", dt->season_day + 1);
+ break;
+ case 'e':
+ outwalk += sprintf(outwalk, "%d", dt->season_day + 1);
+ if (dt->season_day > 9 && dt->season_day < 13) {
+ outwalk += sprintf(outwalk, "th");
+ break;
+ }
+
+ switch (dt->season_day % 10) {
+ case 0:
+ outwalk += sprintf(outwalk, "st");
+ break;
+ case 1:
+ outwalk += sprintf(outwalk, "nd");
+ break;
+ case 2:
+ outwalk += sprintf(outwalk, "rd");
+ break;
+ default:
+ outwalk += sprintf(outwalk, "th");
+ break;
+ }
+ break;
+ /* YOLD */
+ case 'Y':
+ outwalk += sprintf(outwalk, "%d", dt->year);
+ break;
+ /* Holidays */
+ case 'H':
+ if (dt->season_day == 4) {
+ outwalk += sprintf(outwalk, "%s", holidays[dt->season]);
}
- switch (*(i+1)) {
- /* Weekday in long and abbreviation */
- case 'A':
- outwalk += sprintf(outwalk, "%s", day_long[dt->week_day]);
- break;
- case 'a':
- outwalk += sprintf(outwalk, "%s", day_short[dt->week_day]);
- break;
- /* Season in long and abbreviation */
- case 'B':
- outwalk += sprintf(outwalk, "%s", season_long[dt->season]);
- break;
- case 'b':
- outwalk += sprintf(outwalk, "%s", season_short[dt->season]);
- break;
- /* Day of the season (ordinal and cardinal) */
- case 'd':
- outwalk += sprintf(outwalk, "%d", dt->season_day + 1);
- break;
- case 'e':
- outwalk += sprintf(outwalk, "%d", dt->season_day + 1);
- if (dt->season_day > 9 && dt->season_day < 13) {
- outwalk += sprintf(outwalk, "th");
- break;
- }
-
- switch (dt->season_day % 10) {
- case 0:
- outwalk += sprintf(outwalk, "st");
- break;
- case 1:
- outwalk += sprintf(outwalk, "nd");
- break;
- case 2:
- outwalk += sprintf(outwalk, "rd");
- break;
- default:
- outwalk += sprintf(outwalk, "th");
- break;
- }
- break;
- /* YOLD */
- case 'Y':
- outwalk += sprintf(outwalk, "%d", dt->year);
- break;
- /* Holidays */
- case 'H':
- if (dt->season_day == 4) {
- outwalk += sprintf(outwalk, "%s", holidays[dt->season]);
- }
- if (dt->season_day == 49) {
- outwalk += sprintf(outwalk, "%s", holidays[dt->season + 5]);
- }
- break;
- /* Stop parsing the format string, except on Holidays */
- case 'N':
- if (dt->season_day != 4 && dt->season_day != 49) {
- return (outwalk - orig_outwalk);
- }
- break;
- /* Newline- and Tabbing-characters */
- case 'n':
- outwalk += sprintf(outwalk, "\n");
- break;
- case 't':
- outwalk += sprintf(outwalk, "\t");
- break;
- /* The St. Tib's Day replacement */
- case '{':
- tibs_end = strstr(i, "%}");
- if (tibs_end == NULL) {
- i++;
- break;
- }
- if (dt->st_tibs_day) {
- /* We outpt "St. Tib's Day... */
- outwalk += sprintf(outwalk, "St. Tib's Day");
- } else {
- /* ...or parse the substring between %{ and %} ... */
- *tibs_end = '\0';
- outwalk += format_output(outwalk, i + 2, dt);
- *tibs_end = '%';
- }
- /* ...and continue with the rest */
- i = tibs_end;
- break;
- case '}':
- i++;
- break;
- default:
- /* No escape-sequence, so we just skip */
- outwalk += sprintf(outwalk, "%%%c", *(i+1));
- break;
+ if (dt->season_day == 49) {
+ outwalk += sprintf(outwalk, "%s", holidays[dt->season + 5]);
}
+ break;
+ /* Stop parsing the format string, except on Holidays */
+ case 'N':
+ if (dt->season_day != 4 && dt->season_day != 49) {
+ return (outwalk - orig_outwalk);
+ }
+ break;
+ /* Newline- and Tabbing-characters */
+ case 'n':
+ outwalk += sprintf(outwalk, "\n");
+ break;
+ case 't':
+ outwalk += sprintf(outwalk, "\t");
+ break;
+ /* The St. Tib's Day replacement */
+ case '{':
+ tibs_end = strstr(i, "%}");
+ if (tibs_end == NULL) {
+ i++;
+ break;
+ }
+ if (dt->st_tibs_day) {
+ /* We outpt "St. Tib's Day... */
+ outwalk += sprintf(outwalk, "St. Tib's Day");
+ } else {
+ /* ...or parse the substring between %{ and %} ... */
+ *tibs_end = '\0';
+ outwalk += format_output(outwalk, i + 2, dt);
+ *tibs_end = '%';
+ }
+ /* ...and continue with the rest */
+ i = tibs_end;
+ break;
+ case '}':
i++;
+ break;
+ default:
+ /* No escape-sequence, so we just skip */
+ outwalk += sprintf(outwalk, "%%%c", *(i + 1));
+ break;
}
- return (outwalk - orig_outwalk);
+ i++;
+ }
+ return (outwalk - orig_outwalk);
}
/* Get the current date and convert it to discordian */
struct disc_time *get_ddate(struct tm *current_tm) {
- static struct disc_time dt;
-
- if (current_tm == NULL)
- return NULL;
-
- /* We have to know, whether we have to insert St. Tib's Day, so whether it's a leap
- year in gregorian calendar */
- int is_leap_year = !(current_tm->tm_year % 4) &&
- (!(current_tm->tm_year % 400) || current_tm->tm_year % 100);
-
- /* If St. Tib's Day has passed, it will be necessary to skip a day. */
- int yday = current_tm->tm_yday;
-
- if (is_leap_year && yday == 59) {
- /* On St. Tibs Day we don't have to define a date */
- dt.st_tibs_day = 1;
- } else {
- dt.st_tibs_day = 0;
- if (is_leap_year && yday > 59)
- yday -= 1;
-
- dt.season_day = yday % 73;
- dt.week_day = yday % 5;
- }
- dt.year = current_tm->tm_year + 3066;
- dt.season = yday / 73;
- return &dt;
+ static struct disc_time dt;
+
+ if (current_tm == NULL)
+ return NULL;
+
+ /* We have to know, whether we have to insert St. Tib's Day, so whether it's a leap
+ * year in gregorian calendar */
+ int is_leap_year = !(current_tm->tm_year % 4) &&
+ (!(current_tm->tm_year % 400) || current_tm->tm_year % 100);
+
+ /* If St. Tib's Day has passed, it will be necessary to skip a day. */
+ int yday = current_tm->tm_yday;
+
+ if (is_leap_year && yday == 59) {
+ /* On St. Tibs Day we don't have to define a date */
+ dt.st_tibs_day = 1;
+ } else {
+ dt.st_tibs_day = 0;
+ if (is_leap_year && yday > 59)
+ yday -= 1;
+
+ dt.season_day = yday % 73;
+ dt.week_day = yday % 5;
+ }
+ dt.year = current_tm->tm_year + 3066;
+ dt.season = yday / 73;
+ return &dt;
}
void print_ddate(yajl_gen json_gen, char *buffer, const char *format, time_t t) {
- char *outwalk = buffer;
- static char *form = NULL;
- struct tm current_tm;
- struct disc_time *dt;
- set_timezone(NULL); /* Use local time. */
- localtime_r(&t, ¤t_tm);
- if ((dt = get_ddate(¤t_tm)) == NULL)
- return;
- if (form == NULL)
- if ((form = malloc(strlen(format) + 1)) == NULL)
- return;
- strcpy(form, format);
- outwalk += format_output(outwalk, form, dt);
- OUTPUT_FULL_TEXT(buffer);
+ char *outwalk = buffer;
+ static char *form = NULL;
+ struct tm current_tm;
+ struct disc_time *dt;
+ set_timezone(NULL); /* Use local time. */
+ localtime_r(&t, ¤t_tm);
+ if ((dt = get_ddate(¤t_tm)) == NULL)
+ return;
+ if (form == NULL)
+ if ((form = malloc(strlen(format) + 1)) == NULL)
+ return;
+ strcpy(form, format);
+ outwalk += format_output(outwalk, form, dt);
+ OUTPUT_FULL_TEXT(buffer);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_EXPONENT 4
-static const char * const iec_symbols[MAX_EXPONENT+1] = {"", "Ki", "Mi", "Gi", "Ti"};
-static const char * const si_symbols[MAX_EXPONENT+1] = {"", "k", "M", "G", "T"};
-static const char * const custom_symbols[MAX_EXPONENT+1] = {"", "K", "M", "G", "T"};
+static const char *const iec_symbols[MAX_EXPONENT + 1] = {"", "Ki", "Mi", "Gi", "Ti"};
+static const char *const si_symbols[MAX_EXPONENT + 1] = {"", "k", "M", "G", "T"};
+static const char *const custom_symbols[MAX_EXPONENT + 1] = {"", "K", "M", "G", "T"};
/*
* Formats bytes according to the given base and set of symbols.
*
*/
-static int format_bytes(char *outwalk, uint64_t bytes, uint64_t base, const char * const symbols[]) {
- double size = bytes;
- int exponent = 0;
- while (size >= base && exponent < MAX_EXPONENT) {
- size /= base;
- exponent += 1;
- }
- return sprintf(outwalk, "%.1f %sB", size, symbols[exponent]);
+static int format_bytes(char *outwalk, uint64_t bytes, uint64_t base, const char *const symbols[]) {
+ double size = bytes;
+ int exponent = 0;
+ while (size >= base && exponent < MAX_EXPONENT) {
+ size /= base;
+ exponent += 1;
+ }
+ return sprintf(outwalk, "%.1f %sB", size, symbols[exponent]);
}
/*
*
*/
static int print_bytes_human(char *outwalk, uint64_t bytes, const char *prefix_type) {
- if (strcasecmp(prefix_type, "decimal") == 0) {
- return format_bytes(outwalk, bytes, DECIMAL_BASE, si_symbols);
- } else if (strcasecmp(prefix_type, "custom") == 0) {
- return format_bytes(outwalk, bytes, BINARY_BASE, custom_symbols);
- } else {
- return format_bytes(outwalk, bytes, BINARY_BASE, iec_symbols);
- }
+ if (strcasecmp(prefix_type, "decimal") == 0) {
+ return format_bytes(outwalk, bytes, DECIMAL_BASE, si_symbols);
+ } else if (strcasecmp(prefix_type, "custom") == 0) {
+ return format_bytes(outwalk, bytes, BINARY_BASE, custom_symbols);
+ } else {
+ return format_bytes(outwalk, bytes, BINARY_BASE, iec_symbols);
+ }
}
/*
#else
static bool below_threshold(struct statvfs buf, const char *prefix_type, const char *threshold_type, const double low_threshold) {
#endif
- if (strcasecmp(threshold_type, "percentage_free") == 0) {
- return 100.0 * (double)buf.f_bfree / (double)buf.f_blocks < low_threshold;
- } else if (strcasecmp(threshold_type, "percentage_avail") == 0) {
- return 100.0 * (double)buf.f_bavail / (double)buf.f_blocks < low_threshold;
- } else if (strcasecmp(threshold_type, "bytes_free") == 0) {
- return (double)buf.f_bsize * (double)buf.f_bfree < low_threshold;
- } else if (strcasecmp(threshold_type, "bytes_avail") == 0) {
- return (double)buf.f_bsize * (double)buf.f_bavail < low_threshold;
- } else if (threshold_type[0] != '\0' && strncasecmp(threshold_type+1, "bytes_", strlen("bytes_")) == 0) {
- uint64_t base = strcasecmp(prefix_type, "decimal") == 0 ? DECIMAL_BASE : BINARY_BASE;
- double factor = 1;
-
- switch (threshold_type[0]) {
- case 'T':
- case 't':
- factor *= base;
- case 'G':
- case 'g':
- factor *= base;
- case 'M':
- case 'm':
- factor *= base;
- case 'K':
- case 'k':
- factor *= base;
- break;
- default:
- return false;
- }
-
- if (strcasecmp(threshold_type+1, "bytes_free") == 0) {
- return (double)buf.f_bsize * (double)buf.f_bfree < low_threshold * factor;
- } else if (strcasecmp(threshold_type+1, "bytes_avail") == 0) {
- return (double)buf.f_bsize * (double)buf.f_bavail < low_threshold * factor;
- }
+ if (strcasecmp(threshold_type, "percentage_free") == 0) {
+ return 100.0 * (double)buf.f_bfree / (double)buf.f_blocks < low_threshold;
+ } else if (strcasecmp(threshold_type, "percentage_avail") == 0) {
+ return 100.0 * (double)buf.f_bavail / (double)buf.f_blocks < low_threshold;
+ } else if (strcasecmp(threshold_type, "bytes_free") == 0) {
+ return (double)buf.f_bsize * (double)buf.f_bfree < low_threshold;
+ } else if (strcasecmp(threshold_type, "bytes_avail") == 0) {
+ return (double)buf.f_bsize * (double)buf.f_bavail < low_threshold;
+ } else if (threshold_type[0] != '\0' && strncasecmp(threshold_type + 1, "bytes_", strlen("bytes_")) == 0) {
+ uint64_t base = strcasecmp(prefix_type, "decimal") == 0 ? DECIMAL_BASE : BINARY_BASE;
+ double factor = 1;
+
+ switch (threshold_type[0]) {
+ case 'T':
+ case 't':
+ factor *= base;
+ case 'G':
+ case 'g':
+ factor *= base;
+ case 'M':
+ case 'm':
+ factor *= base;
+ case 'K':
+ case 'k':
+ factor *= base;
+ break;
+ default:
+ return false;
+ }
+
+ if (strcasecmp(threshold_type + 1, "bytes_free") == 0) {
+ return (double)buf.f_bsize * (double)buf.f_bfree < low_threshold * factor;
+ } else if (strcasecmp(threshold_type + 1, "bytes_avail") == 0) {
+ return (double)buf.f_bsize * (double)buf.f_bavail < low_threshold * factor;
}
+ }
- return false;
+ return false;
}
/*
*
*/
void print_disk_info(yajl_gen json_gen, char *buffer, const char *path, const char *format, const char *format_not_mounted, const char *prefix_type, const char *threshold_type, const double low_threshold) {
- const char *walk;
- char *outwalk = buffer;
- bool colorful_output = false;
+ const char *walk;
+ char *outwalk = buffer;
+ bool colorful_output = false;
- INSTANCE(path);
+ INSTANCE(path);
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__DragonFly__)
- struct statfs buf;
+ struct statfs buf;
- if (statfs(path, &buf) == -1)
- return;
+ if (statfs(path, &buf) == -1)
+ return;
#else
- struct statvfs buf;
-
- if (statvfs(path, &buf) == -1)
- return;
-
- if (format_not_mounted != NULL) {
- FILE *mntentfile = setmntent("/etc/mtab", "r");
- struct mntent *m;
- bool found = false;
-
- while ((m = getmntent(mntentfile)) != NULL) {
- if (strcmp(m->mnt_dir, path) == 0) {
- found = true;
- break;
- }
- }
- endmntent(mntentfile);
-
- if (!found) {
- format = format_not_mounted;
- }
+ struct statvfs buf;
+
+ if (statvfs(path, &buf) == -1)
+ return;
+
+ if (format_not_mounted != NULL) {
+ FILE *mntentfile = setmntent("/etc/mtab", "r");
+ struct mntent *m;
+ bool found = false;
+
+ while ((m = getmntent(mntentfile)) != NULL) {
+ if (strcmp(m->mnt_dir, path) == 0) {
+ found = true;
+ break;
+ }
+ }
+ endmntent(mntentfile);
+
+ if (!found) {
+ format = format_not_mounted;
}
+ }
#endif
- if (low_threshold > 0 && below_threshold(buf, prefix_type, threshold_type, low_threshold)) {
- START_COLOR("color_bad");
- colorful_output = true;
+ if (low_threshold > 0 && below_threshold(buf, prefix_type, threshold_type, low_threshold)) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ }
+
+ for (walk = format; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
+ }
+
+ if (BEGINS_WITH(walk + 1, "free")) {
+ outwalk += print_bytes_human(outwalk, (uint64_t)buf.f_bsize * (uint64_t)buf.f_bfree, prefix_type);
+ walk += strlen("free");
+ }
+
+ if (BEGINS_WITH(walk + 1, "used")) {
+ outwalk += print_bytes_human(outwalk, (uint64_t)buf.f_bsize * ((uint64_t)buf.f_blocks - (uint64_t)buf.f_bfree), prefix_type);
+ walk += strlen("used");
+ }
+
+ if (BEGINS_WITH(walk + 1, "total")) {
+ outwalk += print_bytes_human(outwalk, (uint64_t)buf.f_bsize * (uint64_t)buf.f_blocks, prefix_type);
+ walk += strlen("total");
+ }
+
+ if (BEGINS_WITH(walk + 1, "avail")) {
+ outwalk += print_bytes_human(outwalk, (uint64_t)buf.f_bsize * (uint64_t)buf.f_bavail, prefix_type);
+ walk += strlen("avail");
+ }
+
+ if (BEGINS_WITH(walk + 1, "percentage_free")) {
+ outwalk += sprintf(outwalk, "%.01f%%", 100.0 * (double)buf.f_bfree / (double)buf.f_blocks);
+ walk += strlen("percentage_free");
+ }
+
+ if (BEGINS_WITH(walk + 1, "percentage_used_of_avail")) {
+ outwalk += sprintf(outwalk, "%.01f%%", 100.0 * (double)(buf.f_blocks - buf.f_bavail) / (double)buf.f_blocks);
+ walk += strlen("percentage_used_of_avail");
+ }
+
+ if (BEGINS_WITH(walk + 1, "percentage_used")) {
+ outwalk += sprintf(outwalk, "%.01f%%", 100.0 * (double)(buf.f_blocks - buf.f_bfree) / (double)buf.f_blocks);
+ walk += strlen("percentage_used");
}
- for (walk = format; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
-
- if (BEGINS_WITH(walk+1, "free")) {
- outwalk += print_bytes_human(outwalk, (uint64_t)buf.f_bsize * (uint64_t)buf.f_bfree, prefix_type);
- walk += strlen("free");
- }
-
- if (BEGINS_WITH(walk+1, "used")) {
- outwalk += print_bytes_human(outwalk, (uint64_t)buf.f_bsize * ((uint64_t)buf.f_blocks - (uint64_t)buf.f_bfree), prefix_type);
- walk += strlen("used");
- }
-
- if (BEGINS_WITH(walk+1, "total")) {
- outwalk += print_bytes_human(outwalk, (uint64_t)buf.f_bsize * (uint64_t)buf.f_blocks, prefix_type);
- walk += strlen("total");
- }
-
- if (BEGINS_WITH(walk+1, "avail")) {
- outwalk += print_bytes_human(outwalk, (uint64_t)buf.f_bsize * (uint64_t)buf.f_bavail, prefix_type);
- walk += strlen("avail");
- }
-
- if (BEGINS_WITH(walk+1, "percentage_free")) {
- outwalk += sprintf(outwalk, "%.01f%%", 100.0 * (double)buf.f_bfree / (double)buf.f_blocks);
- walk += strlen("percentage_free");
- }
-
- if (BEGINS_WITH(walk+1, "percentage_used_of_avail")) {
- outwalk += sprintf(outwalk, "%.01f%%", 100.0 * (double)(buf.f_blocks - buf.f_bavail) / (double)buf.f_blocks);
- walk += strlen("percentage_used_of_avail");
- }
-
- if (BEGINS_WITH(walk+1, "percentage_used")) {
- outwalk += sprintf(outwalk, "%.01f%%", 100.0 * (double)(buf.f_blocks - buf.f_bfree) / (double)buf.f_blocks);
- walk += strlen("percentage_used");
- }
-
- if (BEGINS_WITH(walk+1, "percentage_avail")) {
- outwalk += sprintf(outwalk, "%.01f%%", 100.0 * (double)buf.f_bavail / (double)buf.f_blocks);
- walk += strlen("percentage_avail");
- }
+ if (BEGINS_WITH(walk + 1, "percentage_avail")) {
+ outwalk += sprintf(outwalk, "%.01f%%", 100.0 * (double)buf.f_bavail / (double)buf.f_blocks);
+ walk += strlen("percentage_avail");
}
+ }
- if (colorful_output)
- END_COLOR;
+ if (colorful_output)
+ END_COLOR;
- *outwalk = '\0';
- OUTPUT_FULL_TEXT(buffer);
+ *outwalk = '\0';
+ OUTPUT_FULL_TEXT(buffer);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <string.h>
#include <limits.h>
#include <stdio.h>
#if defined(LINUX)
#include <linux/ethtool.h>
#include <linux/sockios.h>
-#define PART_ETHSPEED "E: %s (%d Mbit/s)"
+#define PART_ETHSPEED "E: %s (%d Mbit/s)"
#endif
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
#include <net/if_media.h>
-#define IFM_TYPE_MATCH(dt, t) \
- (IFM_TYPE((dt)) == 0 || IFM_TYPE((dt)) == IFM_TYPE((t)))
+#define IFM_TYPE_MATCH(dt, t) \
+ (IFM_TYPE((dt)) == 0 || IFM_TYPE((dt)) == IFM_TYPE((t)))
-#define PART_ETHSPEED "E: %s (%s)"
+#define PART_ETHSPEED "E: %s (%s)"
#endif
#if defined(__OpenBSD__) || defined(__NetBSD__)
static int print_eth_speed(char *outwalk, const char *interface) {
#if defined(LINUX)
- /* This code path requires root privileges */
- int ethspeed = 0;
- struct ifreq ifr;
- struct ethtool_cmd ecmd;
-
- ecmd.cmd = ETHTOOL_GSET;
- (void)memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_data = (caddr_t)&ecmd;
- (void)strcpy(ifr.ifr_name, interface);
- if (ioctl(general_socket, SIOCETHTOOL, &ifr) == 0) {
- ethspeed = (ecmd.speed == USHRT_MAX ? 0 : ecmd.speed);
- return sprintf(outwalk, "%d Mbit/s", ethspeed);
- } else return sprintf(outwalk, "?");
+ /* This code path requires root privileges */
+ int ethspeed = 0;
+ struct ifreq ifr;
+ struct ethtool_cmd ecmd;
+
+ ecmd.cmd = ETHTOOL_GSET;
+ (void)memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_data = (caddr_t)&ecmd;
+ (void)strcpy(ifr.ifr_name, interface);
+ if (ioctl(general_socket, SIOCETHTOOL, &ifr) == 0) {
+ ethspeed = (ecmd.speed == USHRT_MAX ? 0 : ecmd.speed);
+ return sprintf(outwalk, "%d Mbit/s", ethspeed);
+ } else
+ return sprintf(outwalk, "?");
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
- char *ethspeed;
- struct ifmediareq ifm;
- (void)memset(&ifm, 0, sizeof(ifm));
- (void)strncpy(ifm.ifm_name, interface, sizeof(ifm.ifm_name));
- int ret = ioctl(general_socket, SIOCGIFMEDIA, (caddr_t)&ifm);
-
- /* Get the description of the media type, partially taken from
- * FreeBSD's ifconfig */
- const struct ifmedia_description *desc;
- struct ifmedia_description ifm_subtype_descriptions[] =
- IFM_SUBTYPE_ETHERNET_DESCRIPTIONS;
-
- for (desc = ifm_subtype_descriptions;
- desc->ifmt_string != NULL;
- desc++) {
- if (IFM_TYPE_MATCH(desc->ifmt_word, ifm.ifm_active) &&
- IFM_SUBTYPE(desc->ifmt_word) == IFM_SUBTYPE(ifm.ifm_active))
- break;
- }
- ethspeed = (desc->ifmt_string != NULL ? desc->ifmt_string : "?");
- return sprintf(outwalk, "%s", ethspeed);
+ char *ethspeed;
+ struct ifmediareq ifm;
+ (void)memset(&ifm, 0, sizeof(ifm));
+ (void)strncpy(ifm.ifm_name, interface, sizeof(ifm.ifm_name));
+ int ret = ioctl(general_socket, SIOCGIFMEDIA, (caddr_t)&ifm);
+
+ /* Get the description of the media type, partially taken from
+ * FreeBSD's ifconfig */
+ const struct ifmedia_description *desc;
+ struct ifmedia_description ifm_subtype_descriptions[] =
+ IFM_SUBTYPE_ETHERNET_DESCRIPTIONS;
+
+ for (desc = ifm_subtype_descriptions;
+ desc->ifmt_string != NULL;
+ desc++) {
+ if (IFM_TYPE_MATCH(desc->ifmt_word, ifm.ifm_active) &&
+ IFM_SUBTYPE(desc->ifmt_word) == IFM_SUBTYPE(ifm.ifm_active))
+ break;
+ }
+ ethspeed = (desc->ifmt_string != NULL ? desc->ifmt_string : "?");
+ return sprintf(outwalk, "%s", ethspeed);
#elif defined(__OpenBSD__) || defined(__NetBSD__)
- char *ethspeed;
- struct ifmediareq ifmr;
+ char *ethspeed;
+ struct ifmediareq ifmr;
- (void) memset(&ifmr, 0, sizeof(ifmr));
- (void) strlcpy(ifmr.ifm_name, interface, sizeof(ifmr.ifm_name));
+ (void)memset(&ifmr, 0, sizeof(ifmr));
+ (void)strlcpy(ifmr.ifm_name, interface, sizeof(ifmr.ifm_name));
- if (ioctl(general_socket, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
- if (errno != E2BIG)
- return sprintf(outwalk, "?");
- }
+ if (ioctl(general_socket, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
+ if (errno != E2BIG)
+ return sprintf(outwalk, "?");
+ }
- struct ifmedia_description *desc;
- struct ifmedia_description ifm_subtype_descriptions[] =
- IFM_SUBTYPE_DESCRIPTIONS;
+ struct ifmedia_description *desc;
+ struct ifmedia_description ifm_subtype_descriptions[] =
+ IFM_SUBTYPE_DESCRIPTIONS;
- for (desc = ifm_subtype_descriptions; desc->ifmt_string != NULL; desc++) {
- /*
+ for (desc = ifm_subtype_descriptions; desc->ifmt_string != NULL; desc++) {
+ /*
* Skip these non-informative values and go right ahead to the
* actual speeds.
*/
- if (BEGINS_WITH(desc->ifmt_string, "autoselect") ||
- BEGINS_WITH(desc->ifmt_string, "auto"))
- continue;
+ if (BEGINS_WITH(desc->ifmt_string, "autoselect") ||
+ BEGINS_WITH(desc->ifmt_string, "auto"))
+ continue;
- if (IFM_TYPE_MATCH(desc->ifmt_word, ifmr.ifm_active) &&
- IFM_SUBTYPE(desc->ifmt_word) == IFM_SUBTYPE(ifmr.ifm_active))
- break;
- }
- ethspeed = (desc->ifmt_string != NULL ? desc->ifmt_string : "?");
- return sprintf(outwalk, "%s", ethspeed);
+ if (IFM_TYPE_MATCH(desc->ifmt_word, ifmr.ifm_active) &&
+ IFM_SUBTYPE(desc->ifmt_word) == IFM_SUBTYPE(ifmr.ifm_active))
+ break;
+ }
+ ethspeed = (desc->ifmt_string != NULL ? desc->ifmt_string : "?");
+ return sprintf(outwalk, "%s", ethspeed);
#else
- return sprintf(outwalk, "?");
+ return sprintf(outwalk, "?");
#endif
}
*
*/
void print_eth_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down) {
- const char *walk;
- const char *ip_address = get_ip_addr(interface);
- char *outwalk = buffer;
+ const char *walk;
+ const char *ip_address = get_ip_addr(interface);
+ char *outwalk = buffer;
+
+ INSTANCE(interface);
+
+ if (ip_address == NULL) {
+ START_COLOR("color_bad");
+ outwalk += sprintf(outwalk, "%s", format_down);
+ goto out;
+ }
- INSTANCE(interface);
+ START_COLOR("color_good");
- if (ip_address == NULL) {
- START_COLOR("color_bad");
- outwalk += sprintf(outwalk, "%s", format_down);
- goto out;
+ for (walk = format_up; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
}
- START_COLOR("color_good");
-
- for (walk = format_up; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
-
- if (BEGINS_WITH(walk+1, "ip")) {
- outwalk += sprintf(outwalk, "%s", ip_address);
- walk += strlen("ip");
- } else if (BEGINS_WITH(walk+1, "speed")) {
- outwalk += print_eth_speed(outwalk, interface);
- walk += strlen("speed");
- }
+ if (BEGINS_WITH(walk + 1, "ip")) {
+ outwalk += sprintf(outwalk, "%s", ip_address);
+ walk += strlen("ip");
+ } else if (BEGINS_WITH(walk + 1, "speed")) {
+ outwalk += print_eth_speed(outwalk, interface);
+ walk += strlen("speed");
}
+ }
out:
- END_COLOR;
- OUTPUT_FULL_TEXT(buffer);
+ END_COLOR;
+ OUTPUT_FULL_TEXT(buffer);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
*
*/
const char *get_ip_addr(const char *interface) {
- static char part[512];
- socklen_t len = sizeof(struct sockaddr_in);
- memset(part, 0, sizeof(part));
+ static char part[512];
+ socklen_t len = sizeof(struct sockaddr_in);
+ memset(part, 0, sizeof(part));
- struct ifaddrs *ifaddr, *addrp;
- bool found = false;
+ struct ifaddrs *ifaddr, *addrp;
+ bool found = false;
- getifaddrs(&ifaddr);
+ getifaddrs(&ifaddr);
- if (ifaddr == NULL)
- return NULL;
+ if (ifaddr == NULL)
+ return NULL;
- /* Skip until we are at the AF_INET address of interface */
- for (addrp = ifaddr;
+ /* Skip until we are at the AF_INET address of interface */
+ for (addrp = ifaddr;
- (addrp != NULL &&
- (strcmp(addrp->ifa_name, interface) != 0 ||
- addrp->ifa_addr == NULL ||
- addrp->ifa_addr->sa_family != AF_INET));
+ (addrp != NULL &&
+ (strcmp(addrp->ifa_name, interface) != 0 ||
+ addrp->ifa_addr == NULL ||
+ addrp->ifa_addr->sa_family != AF_INET));
- addrp = addrp->ifa_next) {
- /* Check if the interface is down */
- if (strcmp(addrp->ifa_name, interface) != 0)
- continue;
- found = true;
- if ((addrp->ifa_flags & IFF_RUNNING) == 0) {
- freeifaddrs(ifaddr);
- return NULL;
- }
+ addrp = addrp->ifa_next) {
+ /* Check if the interface is down */
+ if (strcmp(addrp->ifa_name, interface) != 0)
+ continue;
+ found = true;
+ if ((addrp->ifa_flags & IFF_RUNNING) == 0) {
+ freeifaddrs(ifaddr);
+ return NULL;
}
+ }
- if (addrp == NULL) {
- freeifaddrs(ifaddr);
- return (found ? "no IP" : NULL);
- }
-
- int ret;
- if ((ret = getnameinfo(addrp->ifa_addr, len, part, sizeof(part), NULL, 0, NI_NUMERICHOST)) != 0) {
- fprintf(stderr, "i3status: getnameinfo(): %s\n", gai_strerror(ret));
- freeifaddrs(ifaddr);
- return "no IP";
- }
+ if (addrp == NULL) {
+ freeifaddrs(ifaddr);
+ return (found ? "no IP" : NULL);
+ }
+ int ret;
+ if ((ret = getnameinfo(addrp->ifa_addr, len, part, sizeof(part), NULL, 0, NI_NUMERICHOST)) != 0) {
+ fprintf(stderr, "i3status: getnameinfo(): %s\n", gai_strerror(ret));
freeifaddrs(ifaddr);
- return part;
-}
+ return "no IP";
+ }
+ freeifaddrs(ifaddr);
+ return part;
+}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "i3status.h"
static char *get_sockname(struct addrinfo *addr) {
- static char buf[INET6_ADDRSTRLEN+1];
- struct sockaddr_storage local;
- int ret;
- int fd;
-
- if ((fd = socket(addr->ai_family, SOCK_DGRAM, 0)) == -1) {
- perror("socket()");
- return NULL;
- }
-
- /* Since the socket was created with SOCK_DGRAM, this is
- * actually not establishing a connection or generating
- * any other network traffic. Instead, as a side-effect,
- * it saves the local address with which packets would
- * be sent to the destination. */
- if (connect(fd, addr->ai_addr, addr->ai_addrlen) == -1) {
- /* We don’t display the error here because most
- * likely, there just is no IPv6 connectivity.
- * Thus, don’t spam the user’s console but just
- * try the next address. */
- (void)close(fd);
- return NULL;
- }
+ static char buf[INET6_ADDRSTRLEN + 1];
+ struct sockaddr_storage local;
+ int ret;
+ int fd;
- socklen_t local_len = sizeof(struct sockaddr_storage);
- if (getsockname(fd, (struct sockaddr*)&local, &local_len) == -1) {
- perror("getsockname()");
- (void)close(fd);
- return NULL;
- }
+ if ((fd = socket(addr->ai_family, SOCK_DGRAM, 0)) == -1) {
+ perror("socket()");
+ return NULL;
+ }
+
+ /* Since the socket was created with SOCK_DGRAM, this is
+ * actually not establishing a connection or generating
+ * any other network traffic. Instead, as a side-effect,
+ * it saves the local address with which packets would
+ * be sent to the destination. */
+ if (connect(fd, addr->ai_addr, addr->ai_addrlen) == -1) {
+ /* We don’t display the error here because most
+ * likely, there just is no IPv6 connectivity.
+ * Thus, don’t spam the user’s console but just
+ * try the next address. */
+ (void)close(fd);
+ return NULL;
+ }
- memset(buf, 0, INET6_ADDRSTRLEN + 1);
- if ((ret = getnameinfo((struct sockaddr*)&local, local_len,
- buf, sizeof(buf), NULL, 0,
- NI_NUMERICHOST)) != 0) {
- fprintf(stderr, "i3status: getnameinfo(): %s\n", gai_strerror(ret));
- (void)close(fd);
- return NULL;
- }
+ socklen_t local_len = sizeof(struct sockaddr_storage);
+ if (getsockname(fd, (struct sockaddr *)&local, &local_len) == -1) {
+ perror("getsockname()");
+ (void)close(fd);
+ return NULL;
+ }
+ memset(buf, 0, INET6_ADDRSTRLEN + 1);
+ if ((ret = getnameinfo((struct sockaddr *)&local, local_len,
+ buf, sizeof(buf), NULL, 0,
+ NI_NUMERICHOST)) != 0) {
+ fprintf(stderr, "i3status: getnameinfo(): %s\n", gai_strerror(ret));
(void)close(fd);
- return buf;
+ return NULL;
+ }
+
+ (void)close(fd);
+ return buf;
}
/*
* The char * is statically allocated and mustn't be freed
*/
static char *get_ipv6_addr(void) {
- struct addrinfo hints;
- struct addrinfo *result, *resp;
- static struct addrinfo *cached = NULL;
-
- /* To save dns lookups (if they are not cached locally) and creating
- * sockets, we save the fd and keep it open. */
- if (cached != NULL)
- return get_sockname(cached);
-
- memset(&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = AF_INET6;
- hints.ai_socktype = SOCK_DGRAM;
-
- /* We use the public IPv6 of the K root server here. It doesn’t matter
- * which IPv6 address we use (we don’t even send any packets), as long
- * as it’s considered global by the kernel.
- * NB: We don’t use a hostname since that would trigger a DNS lookup.
- * By using an IPv6 address, getaddrinfo() will *not* do a DNS lookup,
- * but return the address in the appropriate struct. */
- if (getaddrinfo("2001:7fd::1", "domain", &hints, &result) != 0) {
- /* We don’t display the error here because most
- * likely, there just is no connectivity.
- * Thus, don’t spam the user’s console. */
- return NULL;
- }
-
- for (resp = result; resp != NULL; resp = resp->ai_next) {
- char *addr_string = get_sockname(resp);
- /* If we could not get our own address and there is more than
- * one result for resolving k.root-servers.net, we cannot
- * cache. Otherwise, no matter if we got IPv6 connectivity or
- * not, we will cache the (single) result and are done. */
- if (!addr_string && result->ai_next != NULL)
- continue;
-
- if ((cached = malloc(sizeof(struct addrinfo))) == NULL)
- return NULL;
- memcpy(cached, resp, sizeof(struct addrinfo));
- if ((cached->ai_addr = malloc(resp->ai_addrlen)) == NULL) {
- cached = NULL;
- return NULL;
- }
- memcpy(cached->ai_addr, resp->ai_addr, resp->ai_addrlen);
- freeaddrinfo(result);
- return addr_string;
+ struct addrinfo hints;
+ struct addrinfo *result, *resp;
+ static struct addrinfo *cached = NULL;
+
+ /* To save dns lookups (if they are not cached locally) and creating
+ * sockets, we save the fd and keep it open. */
+ if (cached != NULL)
+ return get_sockname(cached);
+
+ memset(&hints, 0, sizeof(struct addrinfo));
+ hints.ai_family = AF_INET6;
+ hints.ai_socktype = SOCK_DGRAM;
+
+ /* We use the public IPv6 of the K root server here. It doesn’t matter
+ * which IPv6 address we use (we don’t even send any packets), as long
+ * as it’s considered global by the kernel.
+ * NB: We don’t use a hostname since that would trigger a DNS lookup.
+ * By using an IPv6 address, getaddrinfo() will *not* do a DNS lookup,
+ * but return the address in the appropriate struct. */
+ if (getaddrinfo("2001:7fd::1", "domain", &hints, &result) != 0) {
+ /* We don’t display the error here because most
+ * likely, there just is no connectivity.
+ * Thus, don’t spam the user’s console. */
+ return NULL;
+ }
+
+ for (resp = result; resp != NULL; resp = resp->ai_next) {
+ char *addr_string = get_sockname(resp);
+ /* If we could not get our own address and there is more than
+ * one result for resolving k.root-servers.net, we cannot
+ * cache. Otherwise, no matter if we got IPv6 connectivity or
+ * not, we will cache the (single) result and are done. */
+ if (!addr_string && result->ai_next != NULL)
+ continue;
+
+ if ((cached = malloc(sizeof(struct addrinfo))) == NULL)
+ return NULL;
+ memcpy(cached, resp, sizeof(struct addrinfo));
+ if ((cached->ai_addr = malloc(resp->ai_addrlen)) == NULL) {
+ cached = NULL;
+ return NULL;
}
-
+ memcpy(cached->ai_addr, resp->ai_addr, resp->ai_addrlen);
freeaddrinfo(result);
- return NULL;
+ return addr_string;
+ }
+
+ freeaddrinfo(result);
+ return NULL;
}
void print_ipv6_info(yajl_gen json_gen, char *buffer, const char *format_up, const char *format_down) {
- const char *walk;
- char *addr_string = get_ipv6_addr();
- char *outwalk = buffer;
-
- if (addr_string == NULL) {
- START_COLOR("color_bad");
- outwalk += sprintf(outwalk, "%s", format_down);
- END_COLOR;
- OUTPUT_FULL_TEXT(buffer);
- return;
- }
+ const char *walk;
+ char *addr_string = get_ipv6_addr();
+ char *outwalk = buffer;
- START_COLOR("color_good");
- for (walk = format_up; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
-
- if (BEGINS_WITH(walk+1, "ip")) {
- outwalk += sprintf(outwalk, "%s", addr_string);
- walk += strlen("ip");
- }
- }
+ if (addr_string == NULL) {
+ START_COLOR("color_bad");
+ outwalk += sprintf(outwalk, "%s", format_down);
END_COLOR;
OUTPUT_FULL_TEXT(buffer);
+ return;
+ }
+
+ START_COLOR("color_good");
+ for (walk = format_up; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
+ }
+
+ if (BEGINS_WITH(walk + 1, "ip")) {
+ outwalk += sprintf(outwalk, "%s", addr_string);
+ walk += strlen("ip");
+ }
+ }
+ END_COLOR;
+ OUTPUT_FULL_TEXT(buffer);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include "i3status.h"
#include <stdlib.h>
#include <stdio.h>
#include <yajl/yajl_version.h>
void print_load(yajl_gen json_gen, char *buffer, const char *format, const float max_threshold) {
- char *outwalk = buffer;
- /* Get load */
+ char *outwalk = buffer;
+/* Get load */
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(linux) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) || defined(sun) || defined(__DragonFly__)
- double loadavg[3];
- const char *walk;
- bool colorful_output = false;
-
- if (getloadavg(loadavg, 3) == -1)
- goto error;
-
- for (walk = format; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
- if (loadavg[0] >= max_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
-
- if (BEGINS_WITH(walk+1, "1min")) {
- outwalk += sprintf(outwalk, "%1.2f", loadavg[0]);
- walk += strlen("1min");
- }
-
- if (BEGINS_WITH(walk+1, "5min")) {
- outwalk += sprintf(outwalk, "%1.2f", loadavg[1]);
- walk += strlen("5min");
- }
-
- if (BEGINS_WITH(walk+1, "15min")) {
- outwalk += sprintf(outwalk, "%1.2f", loadavg[2]);
- walk += strlen("15min");
- }
- if (colorful_output)
- END_COLOR;
+ double loadavg[3];
+ const char *walk;
+ bool colorful_output = false;
+
+ if (getloadavg(loadavg, 3) == -1)
+ goto error;
+
+ for (walk = format; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
+ }
+ if (loadavg[0] >= max_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ }
+
+ if (BEGINS_WITH(walk + 1, "1min")) {
+ outwalk += sprintf(outwalk, "%1.2f", loadavg[0]);
+ walk += strlen("1min");
+ }
+
+ if (BEGINS_WITH(walk + 1, "5min")) {
+ outwalk += sprintf(outwalk, "%1.2f", loadavg[1]);
+ walk += strlen("5min");
+ }
+
+ if (BEGINS_WITH(walk + 1, "15min")) {
+ outwalk += sprintf(outwalk, "%1.2f", loadavg[2]);
+ walk += strlen("15min");
}
+ if (colorful_output)
+ END_COLOR;
+ }
- *outwalk = '\0';
- OUTPUT_FULL_TEXT(buffer);
+ *outwalk = '\0';
+ OUTPUT_FULL_TEXT(buffer);
- return;
+ return;
error:
#endif
- OUTPUT_FULL_TEXT("cant read load");
- (void)fputs("i3status: Cannot read system load using getloadavg()\n", stderr);
+ OUTPUT_FULL_TEXT("cant read load");
+ (void)fputs("i3status: Cannot read system load using getloadavg()\n", stderr);
}
+// vim:ts=4:sw=4:expandtab
#include <stdio.h>
#include <string.h>
#include <yajl/yajl_gen.h>
#include "i3status.h"
void print_path_exists(yajl_gen json_gen, char *buffer, const char *title, const char *path, const char *format) {
- const char *walk;
- char *outwalk = buffer;
- struct stat st;
- const bool exists = (stat(path, &st) == 0);
+ const char *walk;
+ char *outwalk = buffer;
+ struct stat st;
+ const bool exists = (stat(path, &st) == 0);
- INSTANCE(path);
+ INSTANCE(path);
- START_COLOR((exists ? "color_good" : "color_bad"));
+ START_COLOR((exists ? "color_good" : "color_bad"));
- for (walk = format; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
+ for (walk = format; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
+ }
- if (BEGINS_WITH(walk+1, "title")) {
- outwalk += sprintf(outwalk, "%s", title);
- walk += strlen("title");
- } else if (BEGINS_WITH(walk+1, "status")) {
- outwalk += sprintf(outwalk, "%s", (exists ? "yes" : "no"));
- walk += strlen("status");
- }
+ if (BEGINS_WITH(walk + 1, "title")) {
+ outwalk += sprintf(outwalk, "%s", title);
+ walk += strlen("title");
+ } else if (BEGINS_WITH(walk + 1, "status")) {
+ outwalk += sprintf(outwalk, "%s", (exists ? "yes" : "no"));
+ walk += strlen("status");
}
+ }
- END_COLOR;
- OUTPUT_FULL_TEXT(buffer);
+ END_COLOR;
+ OUTPUT_FULL_TEXT(buffer);
}
+// vim:ts=4:sw=4:expandtab
#include <stdio.h>
#include <string.h>
#include <yajl/yajl_gen.h>
#include "i3status.h"
void print_run_watch(yajl_gen json_gen, char *buffer, const char *title, const char *pidfile, const char *format) {
- bool running = process_runs(pidfile);
- const char *walk;
- char *outwalk = buffer;
+ bool running = process_runs(pidfile);
+ const char *walk;
+ char *outwalk = buffer;
- INSTANCE(pidfile);
+ INSTANCE(pidfile);
- START_COLOR((running ? "color_good" : "color_bad"));
+ START_COLOR((running ? "color_good" : "color_bad"));
- for (walk = format; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
+ for (walk = format; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
+ }
- if (BEGINS_WITH(walk+1, "title")) {
- outwalk += sprintf(outwalk, "%s", title);
- walk += strlen("title");
- } else if (BEGINS_WITH(walk+1, "status")) {
- outwalk += sprintf(outwalk, "%s", (running ? "yes" : "no"));
- walk += strlen("status");
- }
+ if (BEGINS_WITH(walk + 1, "title")) {
+ outwalk += sprintf(outwalk, "%s", title);
+ walk += strlen("title");
+ } else if (BEGINS_WITH(walk + 1, "status")) {
+ outwalk += sprintf(outwalk, "%s", (running ? "yes" : "no"));
+ walk += strlen("status");
}
+ }
- END_COLOR;
- OUTPUT_FULL_TEXT(buffer);
+ END_COLOR;
+ OUTPUT_FULL_TEXT(buffer);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
static const char *current_timezone = NULL;
void set_timezone(const char *tz) {
- if (!local_timezone_init) {
- /* First call, initialize. */
- local_timezone = getenv("TZ");
- local_timezone_init = true;
- }
- if (tz == NULL || tz[0] == '\0') {
- /* User wants localtime. */
- tz = local_timezone;
- }
- if (tz != current_timezone) {
- if (tz) {
- setenv("TZ", tz, 1);
- } else {
- unsetenv("TZ");
- }
- tzset();
- current_timezone = tz;
+ if (!local_timezone_init) {
+ /* First call, initialize. */
+ local_timezone = getenv("TZ");
+ local_timezone_init = true;
+ }
+ if (tz == NULL || tz[0] == '\0') {
+ /* User wants localtime. */
+ tz = local_timezone;
+ }
+ if (tz != current_timezone) {
+ if (tz) {
+ setenv("TZ", tz, 1);
+ } else {
+ unsetenv("TZ");
}
+ tzset();
+ current_timezone = tz;
+ }
}
void print_time(yajl_gen json_gen, char *buffer, const char *format, const char *tz, time_t t) {
- char *outwalk = buffer;
- struct tm tm;
+ char *outwalk = buffer;
+ struct tm tm;
- /* Convert time and format output. */
- set_timezone(tz);
- localtime_r(&t, &tm);
- outwalk += strftime(outwalk, 4095, format, &tm);
- *outwalk = '\0';
- OUTPUT_FULL_TEXT(buffer);
+ /* Convert time and format output. */
+ set_timezone(tz);
+ localtime_r(&t, &tm);
+ outwalk += strftime(outwalk, 4095, format, &tm);
+ *outwalk = '\0';
+ OUTPUT_FULL_TEXT(buffer);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include "queue.h"
void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *fmt_muted, const char *device, const char *mixer, int mixer_idx) {
- char *outwalk = buffer;
- int pbval = 1;
-
- /* Printing volume only works with ALSA at the moment */
- if (output_format == O_I3BAR) {
- char *instance;
- asprintf(&instance, "%s.%s.%d", device, mixer, mixer_idx);
- INSTANCE(instance);
- free(instance);
- }
+ char *outwalk = buffer;
+ int pbval = 1;
+
+ /* Printing volume only works with ALSA at the moment */
+ if (output_format == O_I3BAR) {
+ char *instance;
+ asprintf(&instance, "%s.%s.%d", device, mixer, mixer_idx);
+ INSTANCE(instance);
+ free(instance);
+ }
#ifdef LINUX
- int err;
- snd_mixer_t *m;
- snd_mixer_selem_id_t *sid;
- snd_mixer_elem_t *elem;
- long min, max, val;
- int avg;
-
- if ((err = snd_mixer_open(&m, 0)) < 0) {
- fprintf(stderr, "i3status: ALSA: Cannot open mixer: %s\n", snd_strerror(err));
- goto out;
- }
-
- /* Attach this mixer handle to the given device */
- if ((err = snd_mixer_attach(m, device)) < 0) {
- fprintf(stderr, "i3status: ALSA: Cannot attach mixer to device: %s\n", snd_strerror(err));
- snd_mixer_close(m);
- goto out;
- }
-
- /* Register this mixer */
- if ((err = snd_mixer_selem_register(m, NULL, NULL)) < 0) {
- fprintf(stderr, "i3status: ALSA: snd_mixer_selem_register: %s\n", snd_strerror(err));
- snd_mixer_close(m);
- goto out;
- }
-
- if ((err = snd_mixer_load(m)) < 0) {
- fprintf(stderr, "i3status: ALSA: snd_mixer_load: %s\n", snd_strerror(err));
- snd_mixer_close(m);
- goto out;
- }
-
- snd_mixer_selem_id_malloc(&sid);
- if (sid == NULL) {
- snd_mixer_close(m);
- goto out;
- }
-
- /* Find the given mixer */
- snd_mixer_selem_id_set_index(sid, mixer_idx);
- snd_mixer_selem_id_set_name(sid, mixer);
- if (!(elem = snd_mixer_find_selem(m, sid))) {
- fprintf(stderr, "i3status: ALSA: Cannot find mixer %s (index %i)\n",
- snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));
- snd_mixer_close(m);
- snd_mixer_selem_id_free(sid);
- goto out;
- }
-
- /* Get the volume range to convert the volume later */
- snd_mixer_selem_get_playback_volume_range(elem, &min, &max);
-
- snd_mixer_handle_events (m);
- snd_mixer_selem_get_playback_volume (elem, 0, &val);
- if (max != 100) {
- float avgf = ((float)val / max) * 100;
- avg = (int)avgf;
- avg = (avgf - avg < 0.5 ? avg : (avg+1));
- } else avg = (int)val;
-
- /* Check for mute */
- if (snd_mixer_selem_has_playback_switch(elem)) {
- if ((err = snd_mixer_selem_get_playback_switch(elem, 0, &pbval)) < 0)
- fprintf (stderr, "i3status: ALSA: playback_switch: %s\n", snd_strerror(err));
- if (!pbval) {
- START_COLOR("color_degraded");
- fmt = fmt_muted;
- }
- }
-
- snd_mixer_close(m);
- snd_mixer_selem_id_free(sid);
-
- const char *walk = fmt;
- for (; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
- if (BEGINS_WITH(walk+1, "%")) {
- outwalk += sprintf(outwalk, "%%");
- walk += strlen("%");
- }
- if (BEGINS_WITH(walk+1, "volume")) {
- outwalk += sprintf(outwalk, "%d%%", avg);
- walk += strlen("volume");
- }
- }
+ int err;
+ snd_mixer_t *m;
+ snd_mixer_selem_id_t *sid;
+ snd_mixer_elem_t *elem;
+ long min, max, val;
+ int avg;
+
+ if ((err = snd_mixer_open(&m, 0)) < 0) {
+ fprintf(stderr, "i3status: ALSA: Cannot open mixer: %s\n", snd_strerror(err));
+ goto out;
+ }
+
+ /* Attach this mixer handle to the given device */
+ if ((err = snd_mixer_attach(m, device)) < 0) {
+ fprintf(stderr, "i3status: ALSA: Cannot attach mixer to device: %s\n", snd_strerror(err));
+ snd_mixer_close(m);
+ goto out;
+ }
+
+ /* Register this mixer */
+ if ((err = snd_mixer_selem_register(m, NULL, NULL)) < 0) {
+ fprintf(stderr, "i3status: ALSA: snd_mixer_selem_register: %s\n", snd_strerror(err));
+ snd_mixer_close(m);
+ goto out;
+ }
+
+ if ((err = snd_mixer_load(m)) < 0) {
+ fprintf(stderr, "i3status: ALSA: snd_mixer_load: %s\n", snd_strerror(err));
+ snd_mixer_close(m);
+ goto out;
+ }
+
+ snd_mixer_selem_id_malloc(&sid);
+ if (sid == NULL) {
+ snd_mixer_close(m);
+ goto out;
+ }
+
+ /* Find the given mixer */
+ snd_mixer_selem_id_set_index(sid, mixer_idx);
+ snd_mixer_selem_id_set_name(sid, mixer);
+ if (!(elem = snd_mixer_find_selem(m, sid))) {
+ fprintf(stderr, "i3status: ALSA: Cannot find mixer %s (index %i)\n",
+ snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));
+ snd_mixer_close(m);
+ snd_mixer_selem_id_free(sid);
+ goto out;
+ }
+
+ /* Get the volume range to convert the volume later */
+ snd_mixer_selem_get_playback_volume_range(elem, &min, &max);
+
+ snd_mixer_handle_events(m);
+ snd_mixer_selem_get_playback_volume(elem, 0, &val);
+ if (max != 100) {
+ float avgf = ((float)val / max) * 100;
+ avg = (int)avgf;
+ avg = (avgf - avg < 0.5 ? avg : (avg + 1));
+ } else
+ avg = (int)val;
+
+ /* Check for mute */
+ if (snd_mixer_selem_has_playback_switch(elem)) {
+ if ((err = snd_mixer_selem_get_playback_switch(elem, 0, &pbval)) < 0)
+ fprintf(stderr, "i3status: ALSA: playback_switch: %s\n", snd_strerror(err));
+ if (!pbval) {
+ START_COLOR("color_degraded");
+ fmt = fmt_muted;
+ }
+ }
+
+ snd_mixer_close(m);
+ snd_mixer_selem_id_free(sid);
+
+ const char *walk = fmt;
+ for (; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
+ }
+ if (BEGINS_WITH(walk + 1, "%")) {
+ outwalk += sprintf(outwalk, "%%");
+ walk += strlen("%");
+ }
+ if (BEGINS_WITH(walk + 1, "volume")) {
+ outwalk += sprintf(outwalk, "%d%%", avg);
+ walk += strlen("volume");
+ }
+ }
#endif
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
- char *mixerpath;
- char defaultmixer[] = "/dev/mixer";
- int mixfd, vol, devmask = 0;
- pbval = 1;
-
- if (mixer_idx > 0)
- asprintf(&mixerpath, "/dev/mixer%d", mixer_idx);
- else
- mixerpath = defaultmixer;
-
- if ((mixfd = open(mixerpath, O_RDWR)) < 0)
- return;
-
- if (mixer_idx > 0)
- free(mixerpath);
-
- if (ioctl(mixfd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
- return;
- if (ioctl(mixfd, MIXER_READ(0),&vol) == -1)
- return;
-
- if (((vol & 0x7f) == 0) && (((vol >> 8) & 0x7f) == 0)) {
- START_COLOR("color_degraded");
- pbval = 0;
+ char *mixerpath;
+ char defaultmixer[] = "/dev/mixer";
+ int mixfd, vol, devmask = 0;
+ pbval = 1;
+
+ if (mixer_idx > 0)
+ asprintf(&mixerpath, "/dev/mixer%d", mixer_idx);
+ else
+ mixerpath = defaultmixer;
+
+ if ((mixfd = open(mixerpath, O_RDWR)) < 0)
+ return;
+
+ if (mixer_idx > 0)
+ free(mixerpath);
+
+ if (ioctl(mixfd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
+ return;
+ if (ioctl(mixfd, MIXER_READ(0), &vol) == -1)
+ return;
+
+ if (((vol & 0x7f) == 0) && (((vol >> 8) & 0x7f) == 0)) {
+ START_COLOR("color_degraded");
+ pbval = 0;
+ }
+
+ const char *walk = fmt;
+ for (; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
}
-
- const char *walk = fmt;
- for (; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
- if (BEGINS_WITH(walk+1, "%")) {
- outwalk += sprintf(outwalk, "%%");
- walk += strlen("%");
- }
- if (BEGINS_WITH(walk+1, "volume")) {
- outwalk += sprintf(outwalk, "%d%%", vol & 0x7f);
- walk += strlen("volume");
- }
+ if (BEGINS_WITH(walk + 1, "%")) {
+ outwalk += sprintf(outwalk, "%%");
+ walk += strlen("%");
+ }
+ if (BEGINS_WITH(walk + 1, "volume")) {
+ outwalk += sprintf(outwalk, "%d%%", vol & 0x7f);
+ walk += strlen("volume");
}
- close(mixfd);
+ }
+ close(mixfd);
#endif
out:
- *outwalk = '\0';
- if (!pbval)
- END_COLOR;
- OUTPUT_FULL_TEXT(buffer);
+ *outwalk = '\0';
+ if (!pbval)
+ END_COLOR;
+ OUTPUT_FULL_TEXT(buffer);
}
-// vim:ts=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <stdio.h>
#include <string.h>
#include <yajl/yajl_gen.h>
#include "i3status.h"
-#define WIRELESS_INFO_FLAG_HAS_ESSID (1 << 0)
-#define WIRELESS_INFO_FLAG_HAS_QUALITY (1 << 1)
-#define WIRELESS_INFO_FLAG_HAS_SIGNAL (1 << 2)
-#define WIRELESS_INFO_FLAG_HAS_NOISE (1 << 3)
-#define WIRELESS_INFO_FLAG_HAS_FREQUENCY (1 << 4)
+#define WIRELESS_INFO_FLAG_HAS_ESSID (1 << 0)
+#define WIRELESS_INFO_FLAG_HAS_QUALITY (1 << 1)
+#define WIRELESS_INFO_FLAG_HAS_SIGNAL (1 << 2)
+#define WIRELESS_INFO_FLAG_HAS_NOISE (1 << 3)
+#define WIRELESS_INFO_FLAG_HAS_FREQUENCY (1 << 4)
#define PERCENT_VALUE(value, total) ((int)(value * 100 / (float)total + 0.5f))
typedef struct {
- int flags;
- char essid[IW_ESSID_MAX_SIZE + 1];
- int quality;
- int quality_max;
- int quality_average;
- int signal_level;
- int signal_level_max;
- int noise_level;
- int noise_level_max;
- int bitrate;
- double frequency;
+ int flags;
+ char essid[IW_ESSID_MAX_SIZE + 1];
+ int quality;
+ int quality_max;
+ int quality_average;
+ int signal_level;
+ int signal_level_max;
+ int noise_level;
+ int noise_level_max;
+ int bitrate;
+ double frequency;
} wireless_info_t;
static int get_wireless_info(const char *interface, wireless_info_t *info) {
- memset(info, 0, sizeof(wireless_info_t));
+ memset(info, 0, sizeof(wireless_info_t));
#ifdef LINUX
- int skfd = iw_sockets_open();
- if (skfd < 0) {
- perror("iw_sockets_open");
- return 0;
- }
-
- wireless_config wcfg;
- if (iw_get_basic_config(skfd, interface, &wcfg) < 0) {
- close(skfd);
- return 0;
- }
-
- if (wcfg.has_essid && wcfg.essid_on) {
- info->flags |= WIRELESS_INFO_FLAG_HAS_ESSID;
- strncpy(&info->essid[0], wcfg.essid, IW_ESSID_MAX_SIZE);
- info->essid[IW_ESSID_MAX_SIZE] = '\0';
- }
-
- if (wcfg.has_freq) {
- info->frequency = wcfg.freq;
- info->flags |= WIRELESS_INFO_FLAG_HAS_FREQUENCY;
- }
-
- /* If the function iw_get_stats does not return proper stats, the
- wifi is considered as down.
- Since ad-hoc network does not have theses stats, we need to return
- here for this mode. */
- if (wcfg.mode == 1) {
- close(skfd);
- return 1;
- }
+ int skfd = iw_sockets_open();
+ if (skfd < 0) {
+ perror("iw_sockets_open");
+ return 0;
+ }
+
+ wireless_config wcfg;
+ if (iw_get_basic_config(skfd, interface, &wcfg) < 0) {
+ close(skfd);
+ return 0;
+ }
- /* Wireless quality is a relative value in a driver-specific range.
- Signal and noise level can be either relative or absolute values
- in dBm. Furthermore, noise and quality can be expressed directly
- in dBm or in RCPI (802.11k), which we convert to dBm. When those
- values are expressed directly in dBm, they range from -192 to 63,
- and since the values are packed into 8 bits, we need to perform
- 8-bit arithmetic on them. Assume absolute values if everything
- else fails (driver bug). */
-
- iwrange range;
- if (iw_get_range_info(skfd, interface, &range) < 0) {
- close(skfd);
- return 0;
- }
+ if (wcfg.has_essid && wcfg.essid_on) {
+ info->flags |= WIRELESS_INFO_FLAG_HAS_ESSID;
+ strncpy(&info->essid[0], wcfg.essid, IW_ESSID_MAX_SIZE);
+ info->essid[IW_ESSID_MAX_SIZE] = '\0';
+ }
+
+ if (wcfg.has_freq) {
+ info->frequency = wcfg.freq;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_FREQUENCY;
+ }
+
+ /* If the function iw_get_stats does not return proper stats, the
+ * wifi is considered as down.
+ * Since ad-hoc network does not have theses stats, we need to return
+ * here for this mode. */
+ if (wcfg.mode == 1) {
+ close(skfd);
+ return 1;
+ }
+
+ /* Wireless quality is a relative value in a driver-specific range.
+ * Signal and noise level can be either relative or absolute values
+ * in dBm. Furthermore, noise and quality can be expressed directly
+ * in dBm or in RCPI (802.11k), which we convert to dBm. When those
+ * values are expressed directly in dBm, they range from -192 to 63,
+ * and since the values are packed into 8 bits, we need to perform
+ * 8-bit arithmetic on them. Assume absolute values if everything
+ * else fails (driver bug). */
+
+ iwrange range;
+ if (iw_get_range_info(skfd, interface, &range) < 0) {
+ close(skfd);
+ return 0;
+ }
- iwstats stats;
- if (iw_get_stats(skfd, interface, &stats, &range, 1) < 0) {
- close(skfd);
- return 0;
+ iwstats stats;
+ if (iw_get_stats(skfd, interface, &stats, &range, 1) < 0) {
+ close(skfd);
+ return 0;
+ }
+
+ if (stats.qual.level != 0 || (stats.qual.updated & (IW_QUAL_DBM | IW_QUAL_RCPI))) {
+ if (!(stats.qual.updated & IW_QUAL_QUAL_INVALID)) {
+ info->quality = stats.qual.qual;
+ info->quality_max = range.max_qual.qual;
+ info->quality_average = range.avg_qual.qual;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_QUALITY;
}
- if (stats.qual.level != 0 || (stats.qual.updated & (IW_QUAL_DBM | IW_QUAL_RCPI))) {
- if (!(stats.qual.updated & IW_QUAL_QUAL_INVALID)) {
- info->quality = stats.qual.qual;
- info->quality_max = range.max_qual.qual;
- info->quality_average = range.avg_qual.qual;
- info->flags |= WIRELESS_INFO_FLAG_HAS_QUALITY;
- }
-
- if (stats.qual.updated & IW_QUAL_RCPI) {
- if (!(stats.qual.updated & IW_QUAL_LEVEL_INVALID)) {
- info->signal_level = stats.qual.level / 2.0 - 110 + 0.5;
- info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
- }
- if (!(stats.qual.updated & IW_QUAL_NOISE_INVALID)) {
- info->noise_level = stats.qual.noise / 2.0 - 110 + 0.5;
- info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
- }
- }
- else {
- if ((stats.qual.updated & IW_QUAL_DBM) || stats.qual.level > range.max_qual.level) {
- if (!(stats.qual.updated & IW_QUAL_LEVEL_INVALID)) {
- info->signal_level = stats.qual.level;
- if (info->signal_level > 63)
- info->signal_level -= 256;
- info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
- }
- if (!(stats.qual.updated & IW_QUAL_NOISE_INVALID)) {
- info->noise_level = stats.qual.noise;
- if (info->noise_level > 63)
- info->noise_level -= 256;
- info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
- }
- }
- else {
- if (!(stats.qual.updated & IW_QUAL_LEVEL_INVALID)) {
- info->signal_level = stats.qual.level;
- info->signal_level_max = range.max_qual.level;
- info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
- }
- if (!(stats.qual.updated & IW_QUAL_NOISE_INVALID)) {
- info->noise_level = stats.qual.noise;
- info->noise_level_max = range.max_qual.noise;
- info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
- }
- }
+ if (stats.qual.updated & IW_QUAL_RCPI) {
+ if (!(stats.qual.updated & IW_QUAL_LEVEL_INVALID)) {
+ info->signal_level = stats.qual.level / 2.0 - 110 + 0.5;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
+ }
+ if (!(stats.qual.updated & IW_QUAL_NOISE_INVALID)) {
+ info->noise_level = stats.qual.noise / 2.0 - 110 + 0.5;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
+ }
+ } else {
+ if ((stats.qual.updated & IW_QUAL_DBM) || stats.qual.level > range.max_qual.level) {
+ if (!(stats.qual.updated & IW_QUAL_LEVEL_INVALID)) {
+ info->signal_level = stats.qual.level;
+ if (info->signal_level > 63)
+ info->signal_level -= 256;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
}
- }
- else {
- if (!(stats.qual.updated & IW_QUAL_QUAL_INVALID)) {
- info->quality = stats.qual.qual;
- info->flags |= WIRELESS_INFO_FLAG_HAS_QUALITY;
+ if (!(stats.qual.updated & IW_QUAL_NOISE_INVALID)) {
+ info->noise_level = stats.qual.noise;
+ if (info->noise_level > 63)
+ info->noise_level -= 256;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
}
+ } else {
if (!(stats.qual.updated & IW_QUAL_LEVEL_INVALID)) {
- info->quality = stats.qual.level;
- info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
+ info->signal_level = stats.qual.level;
+ info->signal_level_max = range.max_qual.level;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
}
if (!(stats.qual.updated & IW_QUAL_NOISE_INVALID)) {
- info->quality = stats.qual.noise;
- info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
+ info->noise_level = stats.qual.noise;
+ info->noise_level_max = range.max_qual.noise;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
}
+ }
+ }
+ } else {
+ if (!(stats.qual.updated & IW_QUAL_QUAL_INVALID)) {
+ info->quality = stats.qual.qual;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_QUALITY;
+ }
+ if (!(stats.qual.updated & IW_QUAL_LEVEL_INVALID)) {
+ info->quality = stats.qual.level;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
}
+ if (!(stats.qual.updated & IW_QUAL_NOISE_INVALID)) {
+ info->quality = stats.qual.noise;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
+ }
+ }
- struct iwreq wrq;
- if (iw_get_ext(skfd, interface, SIOCGIWRATE, &wrq) >= 0)
- info->bitrate = wrq.u.bitrate.value;
+ struct iwreq wrq;
+ if (iw_get_ext(skfd, interface, SIOCGIWRATE, &wrq) >= 0)
+ info->bitrate = wrq.u.bitrate.value;
- close(skfd);
- return 1;
+ close(skfd);
+ return 1;
#endif
#if defined(__FreeBSD__) || defined(__DragonFly__)
- int s, len, inwid;
- uint8_t buf[24 * 1024], *cp;
- struct ieee80211req na;
- char network_id[IEEE80211_NWID_LEN + 1];
-
- if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- return (0);
-
- memset(&na, 0, sizeof(na));
- strlcpy(na.i_name, interface, sizeof(na.i_name));
- na.i_type = IEEE80211_IOC_SSID;
- na.i_data = &info->essid[0];
- na.i_len = IEEE80211_NWID_LEN + 1;
- if ((inwid = ioctl(s, SIOCG80211, (caddr_t)&na)) == -1) {
- close(s);
- return (0);
- }
- if (inwid == 0) {
- if (na.i_len <= IEEE80211_NWID_LEN)
- len = na.i_len + 1;
- else
- len = IEEE80211_NWID_LEN + 1;
- info->essid[len -1] = '\0';
- } else {
- close(s);
- return (0);
- }
- info->flags |= WIRELESS_INFO_FLAG_HAS_ESSID;
+ int s, len, inwid;
+ uint8_t buf[24 * 1024], *cp;
+ struct ieee80211req na;
+ char network_id[IEEE80211_NWID_LEN + 1];
+
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ return (0);
+
+ memset(&na, 0, sizeof(na));
+ strlcpy(na.i_name, interface, sizeof(na.i_name));
+ na.i_type = IEEE80211_IOC_SSID;
+ na.i_data = &info->essid[0];
+ na.i_len = IEEE80211_NWID_LEN + 1;
+ if ((inwid = ioctl(s, SIOCG80211, (caddr_t)&na)) == -1) {
+ close(s);
+ return (0);
+ }
+ if (inwid == 0) {
+ if (na.i_len <= IEEE80211_NWID_LEN)
+ len = na.i_len + 1;
+ else
+ len = IEEE80211_NWID_LEN + 1;
+ info->essid[len - 1] = '\0';
+ } else {
+ close(s);
+ return (0);
+ }
+ info->flags |= WIRELESS_INFO_FLAG_HAS_ESSID;
+
+ memset(&na, 0, sizeof(na));
+ strlcpy(na.i_name, interface, sizeof(na.i_name));
+ na.i_type = IEEE80211_IOC_SCAN_RESULTS;
+ na.i_data = buf;
+ na.i_len = sizeof(buf);
+
+ if (ioctl(s, SIOCG80211, (caddr_t)&na) == -1) {
+ printf("fail\n");
+ close(s);
+ return (0);
+ }
+
+ close(s);
+ len = na.i_len;
+ cp = buf;
+ struct ieee80211req_scan_result *sr;
+ uint8_t *vp;
+ sr = (struct ieee80211req_scan_result *)cp;
+ vp = (u_int8_t *)(sr + 1);
+ strlcpy(network_id, (const char *)vp, sr->isr_ssid_len + 1);
+ if (!strcmp(network_id, &info->essid[0])) {
+ info->signal_level = sr->isr_rssi;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
+ info->noise_level = sr->isr_noise;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
+ info->quality = sr->isr_intval;
+ info->flags |= WIRELESS_INFO_FLAG_HAS_QUALITY;
+ }
+
+ return 1;
+#endif
+#ifdef __OpenBSD__
+ struct ifreq ifr;
+ struct ieee80211_bssid bssid;
+ struct ieee80211_nwid nwid;
+ struct ieee80211_nodereq nr;
- memset(&na, 0, sizeof(na));
- strlcpy(na.i_name, interface, sizeof(na.i_name));
- na.i_type = IEEE80211_IOC_SCAN_RESULTS;
- na.i_data = buf;
- na.i_len = sizeof(buf);
+ struct ether_addr ea;
- if (ioctl(s, SIOCG80211, (caddr_t)&na) == -1) {
- printf("fail\n");
- close(s);
- return (0);
- }
+ int s, len, ibssid, inwid;
+ u_int8_t zero_bssid[IEEE80211_ADDR_LEN];
+
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ return (0);
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_data = (caddr_t)&nwid;
+ (void)strlcpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name));
+ inwid = ioctl(s, SIOCG80211NWID, (caddr_t)&ifr);
+ memset(&bssid, 0, sizeof(bssid));
+ strlcpy(bssid.i_name, interface, sizeof(bssid.i_name));
+ ibssid = ioctl(s, SIOCG80211BSSID, &bssid);
+
+ if (ibssid != 0 || inwid != 0) {
close(s);
- len = na.i_len;
- cp = buf;
- struct ieee80211req_scan_result *sr;
- uint8_t *vp;
- sr = (struct ieee80211req_scan_result *)cp;
- vp = (u_int8_t *)(sr + 1);
- strlcpy(network_id, (const char *)vp, sr->isr_ssid_len + 1);
- if (!strcmp(network_id, &info->essid[0])) {
- info->signal_level = sr->isr_rssi;
+ return 0;
+ }
+
+ /* NWID */
+ {
+ if (nwid.i_len <= IEEE80211_NWID_LEN)
+ len = nwid.i_len + 1;
+ else
+ len = IEEE80211_NWID_LEN + 1;
+
+ strncpy(&info->essid[0], nwid.i_nwid, len);
+ info->essid[IW_ESSID_MAX_SIZE] = '\0';
+ info->flags |= WIRELESS_INFO_FLAG_HAS_ESSID;
+ }
+
+ /* Signal strength */
+ {
+ memset(&zero_bssid, 0, sizeof(zero_bssid));
+ if (ibssid == 0 && memcmp(bssid.i_bssid, zero_bssid, IEEE80211_ADDR_LEN) != 0) {
+ memcpy(&ea.ether_addr_octet, bssid.i_bssid, sizeof(ea.ether_addr_octet));
+
+ bzero(&nr, sizeof(nr));
+ bcopy(bssid.i_bssid, &nr.nr_macaddr, sizeof(nr.nr_macaddr));
+ strlcpy(nr.nr_ifname, interface, sizeof(nr.nr_ifname));
+
+ if (ioctl(s, SIOCG80211NODE, &nr) == 0 && nr.nr_rssi) {
+ if (nr.nr_max_rssi)
+ info->signal_level_max = IEEE80211_NODEREQ_RSSI(&nr);
+ else
+ info->signal_level = nr.nr_rssi;
+
info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
- info->noise_level = sr->isr_noise;
- info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
- info->quality = sr->isr_intval;
- info->flags |= WIRELESS_INFO_FLAG_HAS_QUALITY;
+ }
}
+ }
- return 1;
+ close(s);
+ return 1;
#endif
-#ifdef __OpenBSD__
- struct ifreq ifr;
- struct ieee80211_bssid bssid;
- struct ieee80211_nwid nwid;
- struct ieee80211_nodereq nr;
-
- struct ether_addr ea;
-
- int s, len, ibssid, inwid;
- u_int8_t zero_bssid[IEEE80211_ADDR_LEN];
-
- if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- return (0);
-
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_data = (caddr_t)&nwid;
- (void)strlcpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name));
- inwid = ioctl(s, SIOCG80211NWID, (caddr_t)&ifr);
-
- memset(&bssid, 0, sizeof(bssid));
- strlcpy(bssid.i_name, interface, sizeof(bssid.i_name));
- ibssid = ioctl(s, SIOCG80211BSSID, &bssid);
-
- if (ibssid != 0 || inwid != 0) {
- close(s);
- return 0;
- }
-
- /* NWID */
- {
- if (nwid.i_len <= IEEE80211_NWID_LEN)
- len = nwid.i_len + 1;
- else
- len = IEEE80211_NWID_LEN + 1;
-
- strncpy(&info->essid[0], nwid.i_nwid, len);
- info->essid[IW_ESSID_MAX_SIZE] = '\0';
- info->flags |= WIRELESS_INFO_FLAG_HAS_ESSID;
- }
-
- /* Signal strength */
- {
- memset(&zero_bssid, 0, sizeof(zero_bssid));
- if (ibssid == 0 && memcmp(bssid.i_bssid, zero_bssid, IEEE80211_ADDR_LEN) != 0) {
- memcpy(&ea.ether_addr_octet, bssid.i_bssid, sizeof(ea.ether_addr_octet));
-
- bzero(&nr, sizeof(nr));
- bcopy(bssid.i_bssid, &nr.nr_macaddr, sizeof(nr.nr_macaddr));
- strlcpy(nr.nr_ifname, interface, sizeof(nr.nr_ifname));
-
- if (ioctl(s, SIOCG80211NODE, &nr) == 0 && nr.nr_rssi) {
- if (nr.nr_max_rssi)
- info->signal_level_max = IEEE80211_NODEREQ_RSSI(&nr);
- else
- info->signal_level = nr.nr_rssi;
-
- info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
- }
- }
- }
-
- close(s);
- return 1;
-#endif
- return 0;
+ return 0;
}
void print_wireless_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down) {
- const char *walk;
- char *outwalk = buffer;
- wireless_info_t info;
-
- INSTANCE(interface);
-
- const char *ip_address = get_ip_addr(interface);
- if (ip_address == NULL) {
- START_COLOR("color_bad");
- outwalk += sprintf(outwalk, "%s", format_down);
- goto out;
- }
-
- if (get_wireless_info(interface, &info)) {
- walk = format_up;
- if (info.flags & WIRELESS_INFO_FLAG_HAS_QUALITY)
- START_COLOR((info.quality < info.quality_average ? "color_degraded" : "color_good"));
- else
- START_COLOR("color_good");
- } else {
- walk = format_down;
- START_COLOR("color_bad");
+ const char *walk;
+ char *outwalk = buffer;
+ wireless_info_t info;
+
+ INSTANCE(interface);
+
+ const char *ip_address = get_ip_addr(interface);
+ if (ip_address == NULL) {
+ START_COLOR("color_bad");
+ outwalk += sprintf(outwalk, "%s", format_down);
+ goto out;
+ }
+
+ if (get_wireless_info(interface, &info)) {
+ walk = format_up;
+ if (info.flags & WIRELESS_INFO_FLAG_HAS_QUALITY)
+ START_COLOR((info.quality < info.quality_average ? "color_degraded" : "color_good"));
+ else
+ START_COLOR("color_good");
+ } else {
+ walk = format_down;
+ START_COLOR("color_bad");
+ }
+
+ for (; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ *(outwalk++) = *walk;
+ continue;
}
- for (; *walk != '\0'; walk++) {
- if (*walk != '%') {
- *(outwalk++) = *walk;
- continue;
- }
-
- if (BEGINS_WITH(walk+1, "quality")) {
- if (info.flags & WIRELESS_INFO_FLAG_HAS_QUALITY) {
- if (info.quality_max)
- outwalk += sprintf(outwalk, "%03d%%", PERCENT_VALUE(info.quality, info.quality_max));
- else
- outwalk += sprintf(outwalk, "%d", info.quality);
- } else {
- *(outwalk++) = '?';
- }
- walk += strlen("quality");
- }
+ if (BEGINS_WITH(walk + 1, "quality")) {
+ if (info.flags & WIRELESS_INFO_FLAG_HAS_QUALITY) {
+ if (info.quality_max)
+ outwalk += sprintf(outwalk, "%03d%%", PERCENT_VALUE(info.quality, info.quality_max));
+ else
+ outwalk += sprintf(outwalk, "%d", info.quality);
+ } else {
+ *(outwalk++) = '?';
+ }
+ walk += strlen("quality");
+ }
- if (BEGINS_WITH(walk+1, "signal")) {
- if (info.flags & WIRELESS_INFO_FLAG_HAS_SIGNAL) {
- if (info.signal_level_max)
- outwalk += sprintf(outwalk, "%03d%%", PERCENT_VALUE(info.signal_level, info.signal_level_max));
- else
- outwalk += sprintf(outwalk, "%d dBm", info.signal_level);
- } else {
- *(outwalk++) = '?';
- }
- walk += strlen("signal");
- }
+ if (BEGINS_WITH(walk + 1, "signal")) {
+ if (info.flags & WIRELESS_INFO_FLAG_HAS_SIGNAL) {
+ if (info.signal_level_max)
+ outwalk += sprintf(outwalk, "%03d%%", PERCENT_VALUE(info.signal_level, info.signal_level_max));
+ else
+ outwalk += sprintf(outwalk, "%d dBm", info.signal_level);
+ } else {
+ *(outwalk++) = '?';
+ }
+ walk += strlen("signal");
+ }
- if (BEGINS_WITH(walk+1, "noise")) {
- if (info.flags & WIRELESS_INFO_FLAG_HAS_NOISE) {
- if (info.noise_level_max)
- outwalk += sprintf(outwalk, "%03d%%", PERCENT_VALUE(info.noise_level, info.noise_level_max));
- else
- outwalk += sprintf(outwalk, "%d dBm", info.noise_level);
- } else {
- *(outwalk++) = '?';
- }
- walk += strlen("noise");
- }
+ if (BEGINS_WITH(walk + 1, "noise")) {
+ if (info.flags & WIRELESS_INFO_FLAG_HAS_NOISE) {
+ if (info.noise_level_max)
+ outwalk += sprintf(outwalk, "%03d%%", PERCENT_VALUE(info.noise_level, info.noise_level_max));
+ else
+ outwalk += sprintf(outwalk, "%d dBm", info.noise_level);
+ } else {
+ *(outwalk++) = '?';
+ }
+ walk += strlen("noise");
+ }
- if (BEGINS_WITH(walk+1, "essid")) {
- if (info.flags & WIRELESS_INFO_FLAG_HAS_ESSID)
- outwalk += sprintf(outwalk, "%s", info.essid);
- else
- *(outwalk++) = '?';
- walk += strlen("essid");
- }
+ if (BEGINS_WITH(walk + 1, "essid")) {
+ if (info.flags & WIRELESS_INFO_FLAG_HAS_ESSID)
+ outwalk += sprintf(outwalk, "%s", info.essid);
+ else
+ *(outwalk++) = '?';
+ walk += strlen("essid");
+ }
- if (BEGINS_WITH(walk+1, "frequency")) {
- if (info.flags & WIRELESS_INFO_FLAG_HAS_FREQUENCY)
- outwalk += sprintf(outwalk, "%1.1f GHz", info.frequency / 1e9);
- else
- *(outwalk++) = '?';
- walk += strlen("frequency");
- }
+ if (BEGINS_WITH(walk + 1, "frequency")) {
+ if (info.flags & WIRELESS_INFO_FLAG_HAS_FREQUENCY)
+ outwalk += sprintf(outwalk, "%1.1f GHz", info.frequency / 1e9);
+ else
+ *(outwalk++) = '?';
+ walk += strlen("frequency");
+ }
- if (BEGINS_WITH(walk+1, "ip")) {
- outwalk += sprintf(outwalk, "%s", ip_address);
- walk += strlen("ip");
- }
+ if (BEGINS_WITH(walk + 1, "ip")) {
+ outwalk += sprintf(outwalk, "%s", ip_address);
+ walk += strlen("ip");
+ }
#ifdef LINUX
- if (BEGINS_WITH(walk+1, "bitrate")) {
- char br_buffer[128];
+ if (BEGINS_WITH(walk + 1, "bitrate")) {
+ char br_buffer[128];
- iw_print_bitrate(br_buffer, sizeof(br_buffer), info.bitrate);
+ iw_print_bitrate(br_buffer, sizeof(br_buffer), info.bitrate);
- outwalk += sprintf(outwalk, "%s", br_buffer);
- walk += strlen("bitrate");
- }
-#endif
+ outwalk += sprintf(outwalk, "%s", br_buffer);
+ walk += strlen("bitrate");
}
+#endif
+ }
out:
- END_COLOR;
- OUTPUT_FULL_TEXT(buffer);
+ END_COLOR;
+ OUTPUT_FULL_TEXT(buffer);
}
-// vim:ts=8:sw=8:expandtab
+// vim:ts=4:sw=4:expandtab
#include <stdbool.h>
#include <glob.h>
#include <string.h>
*
*/
bool process_runs(const char *path) {
- static char pidbuf[16];
- static glob_t globbuf;
- memset(pidbuf, 0, sizeof(pidbuf));
+ static char pidbuf[16];
+ static glob_t globbuf;
+ memset(pidbuf, 0, sizeof(pidbuf));
- if (glob(path, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0)
- die("glob() failed\n");
- if (globbuf.gl_pathc == 0) {
- /* No glob matches, the specified path does not contain a wildcard. */
- globfree(&globbuf);
- if (!slurp(path, pidbuf, sizeof(pidbuf)))
- return false;
- return (kill(strtol(pidbuf, NULL, 10), 0) == 0 || errno == EPERM);
+ if (glob(path, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0)
+ die("glob() failed\n");
+ if (globbuf.gl_pathc == 0) {
+ /* No glob matches, the specified path does not contain a wildcard. */
+ globfree(&globbuf);
+ if (!slurp(path, pidbuf, sizeof(pidbuf)))
+ return false;
+ return (kill(strtol(pidbuf, NULL, 10), 0) == 0 || errno == EPERM);
+ }
+ for (size_t i = 0; i < globbuf.gl_pathc; i++) {
+ if (!slurp(globbuf.gl_pathv[i], pidbuf, sizeof(pidbuf))) {
+ globfree(&globbuf);
+ return false;
}
- for (size_t i = 0; i < globbuf.gl_pathc; i++) {
- if (!slurp(globbuf.gl_pathv[i], pidbuf, sizeof(pidbuf))) {
- globfree(&globbuf);
- return false;
- }
- if (kill(strtol(pidbuf, NULL, 10), 0) == 0 || errno == EPERM) {
- globfree(&globbuf);
- return true;
- }
+ if (kill(strtol(pidbuf, NULL, 10), 0) == 0 || errno == EPERM) {
+ globfree(&globbuf);
+ return true;
}
- globfree(&globbuf);
+ }
+ globfree(&globbuf);
- return false;
+ return false;
}