From 7bca0ca8819f03883affa5fba9e8506d8c2c5f29 Mon Sep 17 00:00:00 2001 From: su8 Date: Thu, 2 Aug 2018 17:15:16 +0200 Subject: [PATCH] Fix issues #439, #303 (#545) * Fix issues https://github.com/brndnmtthws/conky/issues/439 , https://github.com/brndnmtthws/conky/issues/303 * core.cc: Add missing header file * core.cc: Check if we build for x11 and add the locks functions * read_tcpip.cc: Fix for https://github.com/brndnmtthws/conky/issues/306 * read_tcpip.cc: Missing string format specifier for "snprintf()" * read_tcpip.cc: Wrong signed int format specifier for "snprintf()" * Missing many string format specifiers to "snprintf()" --- src/algebra.cc | 4 ++-- src/bsdapm.cc | 14 +++++++------- src/common.cc | 6 +++--- src/core.cc | 22 +++++++++++++++------ src/fs.cc | 2 +- src/hddtemp.cc | 2 +- src/i8k.cc | 6 +++--- src/linux.cc | 48 +++++++++++++++++++++++----------------------- src/llua.cc | 4 ++-- src/mboxscan.cc | 2 +- src/net_stat.cc | 8 ++++---- src/nvidia.cc | 2 +- src/openbsd.cc | 6 +++--- src/read_tcpip.cc | 6 +++--- src/tailhead.cc | 6 +++--- src/tcp-portmon.cc | 4 ++-- src/template.cc | 4 ++-- src/weather.cc | 32 +++++++++++++++---------------- src/x11.cc | 13 +++++++++++++ src/x11.h | 5 +++++ 20 files changed, 112 insertions(+), 84 deletions(-) diff --git a/src/algebra.cc b/src/algebra.cc index 31721854..66dfd2d6 100644 --- a/src/algebra.cc +++ b/src/algebra.cc @@ -147,7 +147,7 @@ enum arg_type get_arg_type(const char *arg) { p++; } while (p <= e) { - if (isdigit(*p) == 0) { + if (isdigit((unsigned char)*p) == 0) { break; } p++; @@ -158,7 +158,7 @@ enum arg_type get_arg_type(const char *arg) { if (*p == '.') { p++; while (p <= e) { - if (isdigit(*p) == 0) { + if (isdigit((unsigned char)*p) == 0) { return ARG_BAD; } p++; diff --git a/src/bsdapm.cc b/src/bsdapm.cc index 74dfee3f..fb10112e 100644 --- a/src/bsdapm.cc +++ b/src/bsdapm.cc @@ -74,13 +74,13 @@ void print_apm_adapter(struct text_object *obj, char *p, int p_max_size) { fd = open(APMDEV, O_RDONLY); if (fd < 0) { - snprintf(p, p_max_size, "ERR"); + snprintf(p, p_max_size, "%s", "ERR"); return; } if (apm_getinfo(fd, &a_info) != 0) { close(fd); - snprintf(p, p_max_size, "ERR"); + snprintf(p, p_max_size, "%s", "ERR"); return; } close(fd); @@ -123,13 +123,13 @@ void print_apm_battery_life(struct text_object *obj, char *p, int p_max_size) { fd = open(APMDEV, O_RDONLY); if (fd < 0) { - snprintf(p, p_max_size, "ERR"); + snprintf(p, p_max_size, "%s", "ERR"); return; } if (apm_getinfo(fd, &a_info) != 0) { close(fd); - snprintf(p, p_max_size, "ERR"); + snprintf(p, p_max_size, "%s", "ERR"); return; } close(fd); @@ -165,13 +165,13 @@ void print_apm_battery_time(struct text_object *obj, char *p, int p_max_size) { fd = open(APMDEV, O_RDONLY); if (fd < 0) { - snprintf(p, p_max_size, "ERR"); + snprintf(p, p_max_size, "%s", "ERR"); return; } if (apm_getinfo(fd, &a_info) != 0) { close(fd); - snprintf(p, p_max_size, "ERR"); + snprintf(p, p_max_size, "%s", "ERR"); return; } close(fd); @@ -182,7 +182,7 @@ void print_apm_battery_time(struct text_object *obj, char *p, int p_max_size) { batt_time = a_info.ai_batt_time; if (batt_time == -1) { - snprintf(p, p_max_size, "unknown"); + snprintf(p, p_max_size, "%s", "unknown"); } else #ifdef __OpenBSD__ { diff --git a/src/common.cc b/src/common.cc index 6dc51cf3..9603001c 100644 --- a/src/common.cc +++ b/src/common.cc @@ -192,9 +192,9 @@ std::string variable_substitute(std::string s) { std::string var; std::string::size_type l = 0; - if (isalpha(s[pos + 1]) != 0) { + if (isalpha((unsigned char)s[pos + 1]) != 0) { l = 1; - while (pos + l < s.size() && (isalnum(s[pos + l]) != 0)) { + while (pos + l < s.size() && (isalnum((unsigned char)s[pos + l]) != 0)) { ++l; } var = s.substr(pos + 1, l - 1); @@ -323,7 +323,7 @@ unsigned int round_to_int(float f) { void scan_loadavg_arg(struct text_object *obj, const char *arg) { obj->data.i = 0; - if ((arg != nullptr) && (arg[1] == 0) && (isdigit(arg[0]) != 0)) { + if ((arg != nullptr) && (arg[1] == 0) && (isdigit((unsigned char)arg[0]) != 0)) { obj->data.i = atoi(arg); if (obj->data.i > 3 || obj->data.i < 1) { NORM_ERR("loadavg arg needs to be in range (1,3)"); diff --git a/src/core.cc b/src/core.cc index 586f39d1..bef2e6ef 100644 --- a/src/core.cc +++ b/src/core.cc @@ -425,7 +425,7 @@ struct text_object *construct_text_object(char *s, const char *arg, long line, obj->callbacks.free = &gen_free_opaque; #endif /* !__OpenBSD__ */ END OBJ(freq, nullptr) get_cpu_count(); - if ((arg == nullptr) || (isdigit(arg[0]) == 0) || strlen(arg) >= 3 || + if ((arg == nullptr) || (isdigit((unsigned char)arg[0]) == 0) || strlen(arg) >= 3 || atoi(&arg[0]) == 0 || atoi(&arg[0]) > info.cpu_count) { obj->data.i = 1; /* NORM_ERR("freq: Invalid CPU number or you don't have that many CPUs! " @@ -435,7 +435,7 @@ struct text_object *construct_text_object(char *s, const char *arg, long line, } obj->callbacks.print = &print_freq; END OBJ(freq_g, nullptr) get_cpu_count(); - if ((arg == nullptr) || (isdigit(arg[0]) == 0) || strlen(arg) >= 3 || + if ((arg == nullptr) || (isdigit((unsigned char)arg[0]) == 0) || strlen(arg) >= 3 || atoi(&arg[0]) == 0 || atoi(&arg[0]) > info.cpu_count) { obj->data.i = 1; /* NORM_ERR("freq_g: Invalid CPU number or you don't have that many " @@ -461,7 +461,7 @@ struct text_object *construct_text_object(char *s, const char *arg, long line, obj->callbacks.free = &free_tcp_ping; #if defined(__linux__) END OBJ(voltage_mv, 0) get_cpu_count(); - if (!arg || !isdigit(arg[0]) || strlen(arg) >= 3 || atoi(&arg[0]) == 0 || + if (!arg || !isdigit((unsigned char)arg[0]) || strlen(arg) >= 3 || atoi(&arg[0]) == 0 || atoi(&arg[0]) > info.cpu_count) { obj->data.i = 1; /* NORM_ERR("voltage_mv: Invalid CPU number or you don't have that many " @@ -471,7 +471,7 @@ struct text_object *construct_text_object(char *s, const char *arg, long line, } obj->callbacks.print = &print_voltage_mv; END OBJ(voltage_v, 0) get_cpu_count(); - if (!arg || !isdigit(arg[0]) || strlen(arg) >= 3 || atoi(&arg[0]) == 0 || + if (!arg || !isdigit((unsigned char)arg[0]) || strlen(arg) >= 3 || atoi(&arg[0]) == 0 || atoi(&arg[0]) > info.cpu_count) { obj->data.i = 1; /* NORM_ERR("voltage_v: Invalid CPU number or you don't have that many " @@ -815,6 +815,16 @@ struct text_object *construct_text_object(char *s, const char *arg, long line, obj->data.s = strndup(arg ? arg : "", text_buffer_size.get(*state)); obj->callbacks.print = &print_cat; obj->callbacks.free = &gen_free_opaque; + +#ifdef BUILD_X11 + END OBJ(num_led, 0) + obj->callbacks.print = &print_num_led; + END OBJ(caps_led, 0) + obj->callbacks.print = &print_caps_led; + END OBJ(scroll_led, 0) + obj->callbacks.print = &print_scroll_led; +#endif /* BUILD_X11 */ + END OBJ(catp, 0) obj->data.s = strndup(arg ? arg : "", text_buffer_size.get(*state)); obj->callbacks.print = &print_catp; @@ -1997,7 +2007,7 @@ int extract_variable_text_internal(struct text_object *retval, s = p; if (*p == '#') { p++; } while ((*p != 0) && - ((isalnum(static_cast(*p)) != 0) || *p == '_')) { + ((isalnum((unsigned char)(*p)) != 0) || *p == '_')) { p++; } } @@ -2031,7 +2041,7 @@ int extract_variable_text_internal(struct text_object *retval, arg = strchr(buf, ' '); *arg = '\0'; arg++; - while (isspace(static_cast(*arg)) != 0) { arg++; } + while (isspace((unsigned char)(*arg)) != 0) { arg++; } if (*arg == 0) { arg = nullptr; } } diff --git a/src/fs.cc b/src/fs.cc index 98dbbdf5..8aba33b3 100644 --- a/src/fs.cc +++ b/src/fs.cc @@ -210,7 +210,7 @@ void get_fs_type(const char *path, char *result) { void init_fs_bar(struct text_object *obj, const char *arg) { arg = scan_bar(obj, arg, 1); if (arg != nullptr) { - while (isspace(*arg) != 0) { arg++; } + while (isspace((unsigned char)*arg) != 0) { arg++; } if (*arg == '\0') { arg = "/"; } } else { arg = "/"; diff --git a/src/hddtemp.cc b/src/hddtemp.cc index 1913831b..30a4e763 100644 --- a/src/hddtemp.cc +++ b/src/hddtemp.cc @@ -225,7 +225,7 @@ void print_hddtemp(struct text_object *obj, char *p, int p_max_size) { char unit; if (get_hddtemp_info(obj->data.s, &val, &unit)) { - snprintf(p, p_max_size, "N/A"); + snprintf(p, p_max_size, "%s", "N/A"); } else { temp_print(p, p_max_size, (double)val, (unit == 'C' ? TEMP_CELSIUS : TEMP_FAHRENHEIT)); diff --git a/src/i8k.cc b/src/i8k.cc index 38fa3b9d..54429f83 100644 --- a/src/i8k.cc +++ b/src/i8k.cc @@ -129,13 +129,13 @@ void print_i8k_ac_status(struct text_object *obj, char *p, int p_max_size) { sscanf(i8k.ac_status, "%d", &ac_status); if (ac_status == -1) { - snprintf(p, p_max_size, "disabled (read i8k docs)"); + snprintf(p, p_max_size, "%s", "disabled (read i8k docs)"); } if (ac_status == 0) { - snprintf(p, p_max_size, "off"); + snprintf(p, p_max_size, "%s", "off"); } if (ac_status == 1) { - snprintf(p, p_max_size, "on"); + snprintf(p, p_max_size, "%s", "on"); } } diff --git a/src/linux.cc b/src/linux.cc index 6dd51d84..51649929 100644 --- a/src/linux.cc +++ b/src/linux.cc @@ -253,7 +253,7 @@ void print_ioscheduler(struct text_object *obj, char *p, int p_max_size) { } fclose(fp); out_fail: - snprintf(p, p_max_size, "n/a"); + snprintf(p, p_max_size, "%s", "n/a"); return; } @@ -410,7 +410,7 @@ int update_net_stats(void) { p = buf; /* change char * p to first non-space character, which is the beginning * of the interface name */ - while (*p != '\0' && isspace((int)*p)) { p++; } + while (*p != '\0' && isspace((unsigned char)*p)) { p++; } s = p; @@ -573,7 +573,7 @@ int update_net_stats(void) { if (winfo->b.essid_on) { snprintf(ns->essid, 32, "%s", winfo->b.essid); } else { - snprintf(ns->essid, 32, "off/any"); + snprintf(ns->essid, 32, "%s", "off/any"); } } // get channel and freq @@ -864,7 +864,7 @@ int update_stat(void) { sscanf(buf, "%*s %hu", &info.run_threads); } else if (strncmp(buf, "cpu", 3) == 0) { double delta; - if (isdigit(buf[3])) { + if (isdigit((unsigned char)buf[3])) { idx++; // just increment here since the CPU index can skip numbers } else { idx = 0; @@ -1426,7 +1426,7 @@ void get_acpi_fan(char *p_client_buffer, size_t client_buffer_size) { /* yeah, slow... :/ */ if (!get_first_file_in_a_directory(ACPI_FAN_DIR, buf, &rep)) { - snprintf(p_client_buffer, client_buffer_size, "no fans?"); + snprintf(p_client_buffer, client_buffer_size, "%s", "no fans?"); return; } @@ -1434,7 +1434,7 @@ void get_acpi_fan(char *p_client_buffer, size_t client_buffer_size) { fp = open_file(buf2, &rep); if (!fp) { - snprintf(p_client_buffer, client_buffer_size, + snprintf(p_client_buffer, client_buffer_size, "%s", "can't open fan's state file"); return; } @@ -1504,7 +1504,7 @@ void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, } else { /* yeah, slow... :/ */ if (!get_first_file_in_a_directory(ACPI_AC_ADAPTER_DIR, buf, &rep)) { - snprintf(p_client_buffer, client_buffer_size, "no ac_adapters?"); + snprintf(p_client_buffer, client_buffer_size, "%s", "no ac_adapters?"); return; } @@ -1512,7 +1512,7 @@ void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, fp = open_file(buf2, &rep); if (!fp) { - snprintf(p_client_buffer, client_buffer_size, + snprintf(p_client_buffer, client_buffer_size, "%s", "No ac adapter found.... where is it?"); return; } @@ -1821,12 +1821,12 @@ void get_battery_stuff(char *buffer, unsigned int n, const char *bat, "charging %d%%", (int)(((float)remaining_capacity / acpi_last_full[idx]) * 100)); snprintf(last_battery_time_str[idx], - sizeof(last_battery_time_str[idx]) - 1, "unknown"); + sizeof(last_battery_time_str[idx]) - 1, "%s", "unknown"); } else { strncpy(last_battery_str[idx], "charging", sizeof(last_battery_str[idx]) - 1); snprintf(last_battery_time_str[idx], - sizeof(last_battery_time_str[idx]) - 1, "unknown"); + sizeof(last_battery_time_str[idx]) - 1, "%s", "unknown"); } } /* discharging */ @@ -1845,14 +1845,14 @@ void get_battery_stuff(char *buffer, unsigned int n, const char *bat, snprintf(last_battery_str[idx], sizeof(last_battery_str[idx]) - 1, "full"); snprintf(last_battery_time_str[idx], - sizeof(last_battery_time_str[idx]) - 1, "unknown"); + sizeof(last_battery_time_str[idx]) - 1, "%s", "unknown"); } else { snprintf( last_battery_str[idx], sizeof(last_battery_str[idx]) - 1, "discharging %d%%", (int)(((float)remaining_capacity / acpi_last_full[idx]) * 100)); snprintf(last_battery_time_str[idx], - sizeof(last_battery_time_str[idx]) - 1, "unknown"); + sizeof(last_battery_time_str[idx]) - 1, "%s", "unknown"); } } /* charged */ @@ -1951,12 +1951,12 @@ void get_battery_stuff(char *buffer, unsigned int n, const char *bat, "charging %d%%", (int)((remaining_capacity * 100) / acpi_last_full[idx])); snprintf(last_battery_time_str[idx], - sizeof(last_battery_time_str[idx]) - 1, "unknown"); + sizeof(last_battery_time_str[idx]) - 1, "%s", "unknown"); } else { strncpy(last_battery_str[idx], "charging", sizeof(last_battery_str[idx]) - 1); snprintf(last_battery_time_str[idx], - sizeof(last_battery_time_str[idx]) - 1, "unknown"); + sizeof(last_battery_time_str[idx]) - 1, "%s", "unknown"); } /* discharging */ } else if (strncmp(charging_state, "discharging", 64) == 0) { @@ -1973,13 +1973,13 @@ void get_battery_stuff(char *buffer, unsigned int n, const char *bat, snprintf(last_battery_str[idx], sizeof(last_battery_str[idx]) - 1, "charged"); snprintf(last_battery_time_str[idx], - sizeof(last_battery_time_str[idx]) - 1, "unknown"); + sizeof(last_battery_time_str[idx]) - 1, "%s", "unknown"); } else { snprintf(last_battery_str[idx], sizeof(last_battery_str[idx]) - 1, "discharging %d%%", (int)((remaining_capacity * 100) / acpi_last_full[idx])); snprintf(last_battery_time_str[idx], - sizeof(last_battery_time_str[idx]) - 1, "unknown"); + sizeof(last_battery_time_str[idx]) - 1, "%s", "unknown"); } /* charged */ } else if (strncmp(charging_state, "charged", 64) == 0) { @@ -2021,7 +2021,7 @@ void get_battery_stuff(char *buffer, unsigned int n, const char *bat, if (life == -1) { /* could check now that there is ac */ - snprintf(last_battery_str[idx], 64, "not present"); + snprintf(last_battery_str[idx], 64, "%s", "not present"); /* could check that status == 3 here? */ } else if (ac && life != 100) { @@ -2307,10 +2307,10 @@ void get_powerbook_batt_info(struct text_object *obj, char *buffer, int n) { if (timeval == 0 && ac && (flags & PMU_BATT_PRESENT) && !(flags & PMU_BATT_CHARGING)) { snprintf(pb_battery_info[PB_BATT_PERCENT], - sizeof(pb_battery_info[PB_BATT_PERCENT]), "100%%"); + sizeof(pb_battery_info[PB_BATT_PERCENT]), "%s", "100%%"); } else if (timeval == 0) { snprintf(pb_battery_info[PB_BATT_PERCENT], - sizeof(pb_battery_info[PB_BATT_PERCENT]), "unknown"); + sizeof(pb_battery_info[PB_BATT_PERCENT]), "%s", "unknown"); } else { snprintf(pb_battery_info[PB_BATT_PERCENT], sizeof(pb_battery_info[PB_BATT_PERCENT]), "%d%%", @@ -2320,7 +2320,7 @@ void get_powerbook_batt_info(struct text_object *obj, char *buffer, int n) { /* update time string */ if (timeval == 0) { /* fully charged or battery not present */ snprintf(pb_battery_info[PB_BATT_TIME], - sizeof(pb_battery_info[PB_BATT_TIME]), "unknown"); + sizeof(pb_battery_info[PB_BATT_TIME]), "%s", "unknown"); } else if (timeval < 60 * 60) { /* don't show secs */ format_seconds_short(pb_battery_info[PB_BATT_TIME], sizeof(pb_battery_info[PB_BATT_TIME]), timeval); @@ -2371,16 +2371,16 @@ void print_disk_protect_queue(struct text_object *obj, char *p, snprintf(path, 127, "/sys/block/%s/queue/protect", obj->data.s); } if ((fp = fopen(path, "r")) == nullptr) { - snprintf(p, p_max_size, "n/a "); + snprintf(p, p_max_size, "%s", "n/a "); return; } if (fscanf(fp, "%d\n", &state) != 1) { fclose(fp); - snprintf(p, p_max_size, "failed"); + snprintf(p, p_max_size, "%s", "failed"); return; } fclose(fp); - snprintf(p, p_max_size, (state > 0) ? "frozen" : "free "); + snprintf(p, p_max_size, "%s", (state > 0) ? "frozen" : "free "); } std::unordered_map dev_list; @@ -2454,7 +2454,7 @@ void print_distribution(struct text_object *obj, char *p, int p_max_size) { struct stat sb; if (stat("/etc/arch-release", &sb) == 0) { - snprintf(p, p_max_size, "Arch Linux"); + snprintf(p, p_max_size, "%s", "Arch Linux"); return; } snprintf(p, p_max_size, "Unknown"); diff --git a/src/llua.cc b/src/llua.cc index 2210cc1f..18310a6d 100644 --- a/src/llua.cc +++ b/src/llua.cc @@ -216,11 +216,11 @@ void llua_load(const char *script) { static const char *tokenize(const char *str, size_t *len) { str += *len; *len = 0; - while ((str != nullptr) && (isspace(*str) != 0)) { ++str; } + while ((str != nullptr) && (isspace((unsigned char)*str) != 0)) { ++str; } size_t level = 0; while ((str != nullptr) && (str[*len] != 0) && - (level > 0 || (isspace(str[*len]) == 0))) { + (level > 0 || (isspace((unsigned char)str[*len]) == 0))) { switch (str[*len]) { case '{': ++level; diff --git a/src/mboxscan.cc b/src/mboxscan.cc index 3ecbe20f..a7b12902 100644 --- a/src/mboxscan.cc +++ b/src/mboxscan.cc @@ -362,7 +362,7 @@ static void mbox_scan(char *args, char *output, size_t max_len) { from_width, curr->from, subject_width, curr->subject); } } else { - snprintf(buf, text_buffer_size.get(*state), "\n"); + snprintf(buf, text_buffer_size.get(*state), "%s", "\n"); } strncat(output, buf, max_len - strlen(output)); diff --git a/src/net_stat.cc b/src/net_stat.cc index 6bee5ea1..a0cc1dca 100644 --- a/src/net_stat.cc +++ b/src/net_stat.cc @@ -131,7 +131,7 @@ void parse_net_stat_arg(struct text_object *obj, const char *arg, netstat = get_net_stat(nextarg, obj, free_at_crash); } i += strlen(nextarg); // skip this arg - while (!((isspace(arg[i]) != 0) || arg[i] == 0)) { + while (!((isspace((unsigned char)arg[i]) != 0) || arg[i] == 0)) { i++; // and skip the spaces in front of it } } @@ -214,7 +214,7 @@ void print_addr(struct text_object *obj, char *p, int p_max_size) { if ((ns->addr.sa_data[2] & 255) == 0 && (ns->addr.sa_data[3] & 255) == 0 && (ns->addr.sa_data[4] & 255) == 0 && (ns->addr.sa_data[5] & 255) == 0) { - snprintf(p, p_max_size, "No Address"); + snprintf(p, p_max_size, "%s", "No Address"); } else { snprintf(p, p_max_size, "%u.%u.%u.%u", ns->addr.sa_data[2] & 255, ns->addr.sa_data[3] & 255, ns->addr.sa_data[4] & 255, @@ -244,7 +244,7 @@ void print_v6addrs(struct text_object *obj, char *p, int p_max_size) { if (p_max_size == 0) return; if (!ns->v6addrs) { - snprintf(p, p_max_size, "No Address"); + snprintf(p, p_max_size, "%s", "No Address"); return; } *p = 0; @@ -348,7 +348,7 @@ void print_wireless_channel(struct text_object *obj, char *p, int p_max_size) { if (ns->channel != 0) { snprintf(p, p_max_size, "%i", ns->channel); } else { - snprintf(p, p_max_size, "/"); + snprintf(p, p_max_size, "%s", "/"); } } void print_wireless_frequency(struct text_object *obj, char *p, diff --git a/src/nvidia.cc b/src/nvidia.cc index ed8b70a2..16e76646 100644 --- a/src/nvidia.cc +++ b/src/nvidia.cc @@ -950,7 +950,7 @@ void print_nvidia_value(struct text_object *obj, char *p, int p_max_size) { snprintf(p, p_max_size, "%s", str); free(str); } else { - snprintf(p, p_max_size, "N/A"); + snprintf(p, p_max_size, "%s", "N/A"); } } diff --git a/src/openbsd.cc b/src/openbsd.cc index a29c3db9..6b5a8f74 100644 --- a/src/openbsd.cc +++ b/src/openbsd.cc @@ -477,7 +477,7 @@ void update_obsd_sensors() { } void parse_obsd_sensor(struct text_object *obj, const char *arg) { - if (!isdigit(arg[0]) || atoi(&arg[0]) < 0 || + if (!isdigit((unsigned char)arg[0]) || atoi(&arg[0]) < 0 || atoi(&arg[0]) > OBSD_MAX_SENSORS - 1) { obj->data.l = 0; NORM_ERR("Invalid sensor number!"); @@ -520,7 +520,7 @@ void get_obsd_vendor(struct text_object *obj, char *buf, if (sysctl(mib, 2, vendor, &size, nullptr, 0) == -1) { NORM_ERR("error reading vendor"); - snprintf(buf, client_buffer_size, "unknown"); + snprintf(buf, client_buffer_size, "%s", "unknown"); } else { snprintf(buf, client_buffer_size, "%s", vendor); } @@ -540,7 +540,7 @@ void get_obsd_product(struct text_object *obj, char *buf, if (sysctl(mib, 2, product, &size, nullptr, 0) == -1) { NORM_ERR("error reading product"); - snprintf(buf, client_buffer_size, "unknown"); + snprintf(buf, client_buffer_size, "%s", "unknown"); } else { snprintf(buf, client_buffer_size, "%s", product); } diff --git a/src/read_tcpip.cc b/src/read_tcpip.cc index 44d0b131..dbfe8565 100644 --- a/src/read_tcpip.cc +++ b/src/read_tcpip.cc @@ -135,10 +135,10 @@ void print_tcp_ping(struct text_object *obj, char *p, int p_max_size) { usecdiff = ((tv2.tv_sec - tv1.tv_sec) * 1000000) + tv2.tv_usec - tv1.tv_usec; if (usecdiff <= TCP_PING_TIMEOUT * 1000000) { - snprintf(p, p_max_size, "%llu", usecdiff); + snprintf(p, p_max_size, "%llu", (usecdiff / 1000U)); } else { #define TCP_PING_FAILED "down" - snprintf(p, p_max_size, TCP_PING_FAILED); + snprintf(p, p_max_size, "%s", TCP_PING_FAILED); } } else { NORM_ERR("tcp_ping: Couldn't wait on the 'pong'"); @@ -169,7 +169,7 @@ void print_read_tcpip(struct text_object *obj, char *p, int p_max_size, hints.ai_socktype = protocol == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM; hints.ai_flags = 0; hints.ai_protocol = protocol; - snprintf(portbuf, 8, "%d", rtd->port); + snprintf(portbuf, 8, "%u", rtd->port); if (getaddrinfo(rtd->host, portbuf, &hints, &airesult) != 0) { NORM_ERR("%s: Problem with resolving the hostname", protocol == IPPROTO_TCP ? "read_tcp" : "read_udp"); diff --git a/src/tailhead.cc b/src/tailhead.cc index 900aed8c..a5c1519b 100644 --- a/src/tailhead.cc +++ b/src/tailhead.cc @@ -212,7 +212,7 @@ void print_lines(struct text_object *obj, char *p, int p_max_size) { int j, lines; if (fp == nullptr) { - snprintf(p, p_max_size, "File Unreadable"); + snprintf(p, p_max_size, "%s", "File Unreadable"); return; } @@ -236,14 +236,14 @@ void print_words(struct text_object *obj, char *p, int p_max_size) { char inword = 0; if (fp == nullptr) { - snprintf(p, p_max_size, "File Unreadable"); + snprintf(p, p_max_size, "%s", "File Unreadable"); return; } words = 0; while (fgets(buf, BUFSZ, fp) != nullptr) { for (j = 0; buf[j] != 0; j++) { - if (isspace(buf[j]) == 0) { + if (isspace((unsigned char)buf[j]) == 0) { if (inword == 0) { words++; inword = 1; diff --git a/src/tcp-portmon.cc b/src/tcp-portmon.cc index 00d1c53c..e8429d71 100644 --- a/src/tcp-portmon.cc +++ b/src/tcp-portmon.cc @@ -133,14 +133,14 @@ void tcp_portmon_action(struct text_object *obj, char *p, int p_max_size) { find_tcp_port_monitor(pmc, pmd->port_range_begin, pmd->port_range_end); if (!p_monitor) { - snprintf(p, p_max_size, "monitor not found"); + snprintf(p, p_max_size, "%s", "monitor not found"); return; } /* now grab the text of interest */ if (peek_tcp_port_monitor(p_monitor, pmd->item, pmd->connection_index, p, p_max_size) != 0) { - snprintf(p, p_max_size, "monitor peek error"); + snprintf(p, p_max_size, "%s", "monitor peek error"); } } diff --git a/src/template.cc b/src/template.cc index 44d9a434..8d3f11d4 100644 --- a/src/template.cc +++ b/src/template.cc @@ -184,7 +184,7 @@ char *find_and_replace_templates(const char *inbuf) { if (*(p + 1) == '{') { p += 2; templ = p; - while ((*p != 0) && (isspace(*p) == 0) && *p != '{' && *p != '}') { p++; } + while ((*p != 0) && (isspace((unsigned char)*p) == 0) && *p != '{' && *p != '}') { p++; } if (*p == '}') { args = nullptr; } else { @@ -211,7 +211,7 @@ char *find_and_replace_templates(const char *inbuf) { } else { templ = p + 1; p += strlen("$template"); - while ((*p != 0) && (isdigit(*p) != 0)) { p++; } + while ((*p != 0) && (isdigit((unsigned char)*p) != 0)) { p++; } args = nullptr; } tmpl_out = handle_template(templ, args); diff --git a/src/weather.cc b/src/weather.cc index 30f61e45..2b78f8e0 100644 --- a/src/weather.cc +++ b/src/weather.cc @@ -343,7 +343,7 @@ void weather::parse_token(const char *token) { // Check if token is a weather condition for (i = 0; i < 2; i++) { - if (!isalpha(token[i])) break; + if (!isalpha((unsigned char)token[i])) break; } if (i == 2) { for (i = 0; i < NUM_WC_CODES; i++) { @@ -369,7 +369,7 @@ void weather::parse_token(const char *token) { // Check if token is a modified weather condition if ((token[0] == '+') || (token[0] == '-')) { for (i = 1; i < 3; i++) { - if (!isalpha(token[i])) break; + if (!isalpha((unsigned char)token[i])) break; } if (i == 3) { for (i = 0; i < NUM_WC_CODES; i++) { @@ -425,11 +425,11 @@ void weather::parse_token(const char *token) { // Check if token is the temperature for (i = 0; i < 2; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if ((i == 2) && (token[2] == '/')) { for (i = 3; i < 5; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if (i == 5) { // First 2 digits gives the air temperature @@ -448,7 +448,7 @@ void weather::parse_token(const char *token) { // Check if token is the pressure if ((token[0] == 'Q') || (token[0] == 'A')) { for (i = 1; i < 5; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if (i == 5) { if (token[0] == 'A') { @@ -484,11 +484,11 @@ void weather::parse_token(const char *token) { // Check if token is the cloud cover for (i = 0; i < 3; i++) { - if (!isalpha(token[i])) break; + if (!isalpha((unsigned char)token[i])) break; } if (i == 3) { for (i = 3; i < 6; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if (i == 6) { // Check if first 3 digits gives the cloud cover condition @@ -504,11 +504,11 @@ void weather::parse_token(const char *token) { // Check if token is positive temp and negative dew for (i = 0; i < 2; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if ((i == 2) && (token[2] == '/') && (token[3] == 'M')) { for (i = 4; i < 6; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if (i == 6) { // 1st and 2nd digits gives the temperature @@ -531,13 +531,13 @@ void weather::parse_token(const char *token) { // Check if token is the observation time for (i = 0; i < 6; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if ((i == 6) && (token[6] == 'Z')) return; // Check if token is the wind speed/direction in knots for (i = 0; i < 5; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if ((i == 5) && (token[5] == 'K') && (token[6] == 'T')) { // First 3 digits are wind direction @@ -554,11 +554,11 @@ void weather::parse_token(const char *token) { // Check if token is negative temperature if ((token[0] == 'M') && (token[4] == 'M')) { for (i = 1; i < 3; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if ((i == 3) && (token[3] == '/')) { for (i = 5; i < 7; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if (i == 7) { // 2nd and 3rd digits gives the temperature @@ -577,11 +577,11 @@ void weather::parse_token(const char *token) { // Check if token is wind variability for (i = 0; i < 3; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if ((i == 3) && (token[3] == 'V')) { for (i = 4; i < 7; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if (i == 7) return; } @@ -593,7 +593,7 @@ void weather::parse_token(const char *token) { // Check if token is the wind speed/direction in m/s for (i = 0; i < 5; i++) { - if (!isdigit(token[i])) break; + if (!isdigit((unsigned char)token[i])) break; } if ((i == 5) && (token[5] == 'M') && (token[6] == 'P') && (token[7] == 'S')) { diff --git a/src/x11.cc b/src/x11.cc index ebce26b2..58a05e54 100644 --- a/src/x11.cc +++ b/src/x11.cc @@ -1300,3 +1300,16 @@ void xpmdb_swap_buffers(void) { } } #endif /* BUILD_XDBE */ + +#define LOCK_TEMPLATE(func, num) \ +void print_##func(struct text_object *obj, char *p, int p_max_size) { \ + (void)obj; \ + XKeyboardState x; \ + XGetKeyboardControl(display, &x); \ + snprintf(p, p_max_size, "%s", (x.led_mask & num ? "On" : "Off")); \ + return; \ +} + +LOCK_TEMPLATE(num_led, 2) +LOCK_TEMPLATE(caps_led, 1) +LOCK_TEMPLATE(scroll_led, 4) diff --git a/src/x11.h b/src/x11.h index 35b716b2..94c22da3 100644 --- a/src/x11.h +++ b/src/x11.h @@ -115,6 +115,11 @@ void print_desktop(struct text_object *, char *, int); void print_desktop_number(struct text_object *, char *, int); void print_desktop_name(struct text_object *, char *, int); +/* Num lock, Scroll lock, Caps Lock */ +void print_num_led(struct text_object *, char *, int); +void print_caps_led(struct text_object *, char *, int); +void print_scroll_led(struct text_object *, char *, int); + #ifdef BUILD_XDBE void xdbe_swap_buffers(void); #else