diff options
| -rw-r--r-- | .clang-format | 10 | ||||
| -rw-r--r-- | i3status.c | 1117 | ||||
| -rw-r--r-- | include/i3status.h | 199 | ||||
| -rw-r--r-- | include/queue.h | 745 | ||||
| -rw-r--r-- | src/first_network_device.c | 53 | ||||
| -rw-r--r-- | src/general.c | 50 | ||||
| -rw-r--r-- | src/output.c | 79 | ||||
| -rw-r--r-- | src/print_battery_info.c | 1064 | ||||
| -rw-r--r-- | src/print_cpu_temperature.c | 325 | ||||
| -rw-r--r-- | src/print_cpu_usage.c | 110 | ||||
| -rw-r--r-- | src/print_ddate.c | 363 | ||||
| -rw-r--r-- | src/print_disk_info.c | 270 | ||||
| -rw-r--r-- | src/print_eth_info.c | 175 | ||||
| -rw-r--r-- | src/print_ip_addr.c | 73 | ||||
| -rw-r--r-- | src/print_ipv6_addr.c | 218 | ||||
| -rw-r--r-- | src/print_load.c | 82 | ||||
| -rw-r--r-- | src/print_path_exists.c | 41 | ||||
| -rw-r--r-- | src/print_run_watch.c | 39 | ||||
| -rw-r--r-- | src/print_time.c | 52 | ||||
| -rw-r--r-- | src/print_volume.c | 287 | ||||
| -rw-r--r-- | src/print_wireless_info.c | 659 | ||||
| -rw-r--r-- | src/process_runs.c | 46 | 
22 files changed, 3030 insertions, 3027 deletions
| diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..1d84013 --- /dev/null +++ b/.clang-format @@ -0,0 +1,10 @@ +BasedOnStyle: google +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortBlocksOnASingleLine: false +AlwaysBreakBeforeMultilineStrings: false +IndentWidth: 4 +PointerBindsToType: false +ColumnLimit: 0 +SpaceBeforeParens: ControlStatements @@ -1,5 +1,5 @@  /* - * vim:ts=8:expandtab + * vim:ts=4:sw=4:expandtab   *   * i3status – Generates a status line for dzen2 or xmobar   * @@ -34,15 +34,19 @@  #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) @@ -66,7 +70,7 @@ void **cur_instance;   *   */  void fatalsig(int signum) { -        exit_upon_signal = true; +    exit_upon_signal = true;  }  /* @@ -82,86 +86,94 @@ void sigusr1(int signum) {   *   */  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;  }  /* @@ -171,531 +183,512 @@ static int valid_color(const char *value)   *   */  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); +    }  } diff --git a/include/i3status.h b/include/i3status.h index 6e20af3..0985180 100644 --- a/include/i3status.h +++ b/include/i3status.h @@ -1,7 +1,11 @@  #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> @@ -45,105 +49,104 @@ enum { O_DZEN2, O_XMOBAR, O_I3BAR, O_TERM, O_NONE } output_format;  /* 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. @@ -161,7 +164,7 @@ bool slurp(const char *filename, char *destination, int size);  /* 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 */ @@ -172,8 +175,8 @@ void set_timezone(const char *tz);  /* 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); diff --git a/include/queue.h b/include/queue.h index 75bb957..3092aad 100644 --- a/include/queue.h +++ b/include/queue.h @@ -32,8 +32,8 @@   *	@(#)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, @@ -91,437 +91,456 @@  /*   * 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_ */ diff --git a/src/first_network_device.c b/src/first_network_device.c index c160027..35cd4ff 100644 --- a/src/first_network_device.c +++ b/src/first_network_device.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <sys/stat.h>  #include <stdlib.h>  #include <ifaddrs.h> @@ -6,34 +6,33 @@  #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;  } - diff --git a/src/general.c b/src/general.c index c5b33b4..f299a2b 100644 --- a/src/general.c +++ b/src/general.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <sys/types.h>  #include <string.h>  #include <stdarg.h> @@ -15,18 +15,18 @@   *   */  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;  }  /* @@ -35,15 +35,15 @@ bool slurp(const char *filename, char *destination, int size) {   *   */  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);  }  /* @@ -51,12 +51,12 @@ char *skip_character(char *input, char character, int amount) {   *   */  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);  } diff --git a/src/output.c b/src/output.c index 3a43d58..b2fb1dd 100644 --- a/src/output.c +++ b/src/output.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <stdbool.h>  #include <string.h>  #include <stdio.h> @@ -15,29 +15,29 @@   *   */  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;  }  /* @@ -45,30 +45,31 @@ char *color(const char *colorstr) {   *   */  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");  } diff --git a/src/print_battery_info.c b/src/print_battery_info.c index 0df9b72..1126f57 100644 --- a/src/print_battery_info.c +++ b/src/print_battery_info.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <ctype.h>  #include <time.h>  #include <string.h> @@ -34,599 +34,583 @@   *   */  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);  } diff --git a/src/print_cpu_temperature.c b/src/print_cpu_temperature.c index c687474..f60a5f6 100644 --- a/src/print_cpu_temperature.c +++ b/src/print_cpu_temperature.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <stdlib.h>  #include <limits.h>  #include <stdio.h> @@ -13,8 +13,8 @@  #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__) @@ -43,171 +43,170 @@  #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) { @@ -223,48 +222,48 @@ void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const                  /* 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);  } diff --git a/src/print_cpu_usage.c b/src/print_cpu_usage.c index 26a9d4f..68437b3 100644 --- a/src/print_cpu_usage.c +++ b/src/print_cpu_usage.c @@ -1,4 +1,4 @@ -// vim:sw=8:sts=8:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <stdlib.h>  #include <limits.h>  #include <stdio.h> @@ -30,7 +30,7 @@  #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 @@ -38,74 +38,74 @@ static int prev_idle  = 0;   *   */  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);  } diff --git a/src/print_ddate.c b/src/print_ddate.c index de9a7be..1c368b5 100644 --- a/src/print_ddate.c +++ b/src/print_ddate.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <time.h>  #include <stdio.h>  #include <stdlib.h> @@ -10,213 +10,208 @@  /* 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);  } diff --git a/src/print_disk_info.c b/src/print_disk_info.c index e225923..b9047e5 100644 --- a/src/print_disk_info.c +++ b/src/print_disk_info.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <stdio.h>  #include <stdlib.h>  #include <string.h> @@ -22,22 +22,22 @@  #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]);  }  /* @@ -45,13 +45,13 @@ static int format_bytes(char *outwalk, uint64_t bytes, uint64_t base, const char   *   */  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); +    }  }  /* @@ -63,44 +63,44 @@ static bool below_threshold(struct statfs buf, const char *prefix_type, const ch  #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;  }  /* @@ -109,97 +109,97 @@ static bool below_threshold(struct statvfs buf, const char *prefix_type, const c   *   */  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);  } diff --git a/src/print_eth_info.c b/src/print_eth_info.c index c446da4..af5a757 100644 --- a/src/print_eth_info.c +++ b/src/print_eth_info.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <string.h>  #include <limits.h>  #include <stdio.h> @@ -16,15 +16,15 @@  #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__) @@ -34,75 +34,76 @@  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  } @@ -111,36 +112,36 @@ static int print_eth_speed(char *outwalk, const char *interface) {   *   */  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);  } diff --git a/src/print_ip_addr.c b/src/print_ip_addr.c index 909a8b2..09b0992 100644 --- a/src/print_ip_addr.c +++ b/src/print_ip_addr.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <sys/types.h>  #include <sys/socket.h>  #include <netinet/in.h> @@ -18,50 +18,49 @@   *   */  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; +} diff --git a/src/print_ipv6_addr.c b/src/print_ipv6_addr.c index 7ff9c97..a24119f 100644 --- a/src/print_ipv6_addr.c +++ b/src/print_ipv6_addr.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <sys/types.h>  #include <sys/socket.h>  #include <netinet/in.h> @@ -16,48 +16,48 @@  #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;  }  /* @@ -65,82 +65,82 @@ static char *get_sockname(struct addrinfo *addr) {   * 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);  } diff --git a/src/print_load.c b/src/print_load.c index 6e61ae6..7ba4ae1 100644 --- a/src/print_load.c +++ b/src/print_load.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include "i3status.h"  #include <stdlib.h>  #include <stdio.h> @@ -7,51 +7,51 @@  #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);  } diff --git a/src/print_path_exists.c b/src/print_path_exists.c index a2fcb14..1b231e6 100644 --- a/src/print_path_exists.c +++ b/src/print_path_exists.c @@ -1,3 +1,4 @@ +// vim:ts=4:sw=4:expandtab  #include <stdio.h>  #include <string.h>  #include <yajl/yajl_gen.h> @@ -6,30 +7,30 @@  #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);  } diff --git a/src/print_run_watch.c b/src/print_run_watch.c index bc0d6dc..3d1ec3f 100644 --- a/src/print_run_watch.c +++ b/src/print_run_watch.c @@ -1,3 +1,4 @@ +// vim:ts=4:sw=4:expandtab  #include <stdio.h>  #include <string.h>  #include <yajl/yajl_gen.h> @@ -5,29 +6,29 @@  #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);  } diff --git a/src/print_time.c b/src/print_time.c index d19d08b..edbc828 100644 --- a/src/print_time.c +++ b/src/print_time.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <time.h>  #include <stdio.h>  #include <stdlib.h> @@ -13,34 +13,34 @@ static const char *local_timezone = NULL;  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);  } diff --git a/src/print_volume.c b/src/print_volume.c index 93868e3..ef1c913 100644 --- a/src/print_volume.c +++ b/src/print_volume.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <time.h>  #include <string.h>  #include <stdlib.h> @@ -27,154 +27,155 @@  #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);  } diff --git a/src/print_wireless_info.c b/src/print_wireless_info.c index 7f7c52e..eae942b 100644 --- a/src/print_wireless_info.c +++ b/src/print_wireless_info.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <stdio.h>  #include <string.h>  #include <yajl/yajl_gen.h> @@ -51,383 +51,380 @@  #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);  } diff --git a/src/process_runs.c b/src/process_runs.c index 1836507..b5e8f11 100644 --- a/src/process_runs.c +++ b/src/process_runs.c @@ -1,4 +1,4 @@ -// vim:ts=8:sw=8:expandtab +// vim:ts=4:sw=4:expandtab  #include <stdbool.h>  #include <glob.h>  #include <string.h> @@ -20,30 +20,30 @@   *   */  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;  } | 
