From 422cadfd5ffd78ae1b8fdf15734e03bd0333b26e Mon Sep 17 00:00:00 2001 From: Laslo Hunhold Date: Sat, 19 May 2018 19:33:04 +0200 Subject: Implement esnprintf() and make formatted calls more efficient Within the components, snprintf() was unchecked and had inefficient calls in some places. We implement esnprintf() that does all the dirty laundry for us and use it exclusively now. --- components/battery.c | 41 ++++++++++++++++++++++++++++++----------- components/netspeeds.c | 14 ++++++++++---- components/wifi.c | 12 +++++++++--- 3 files changed, 49 insertions(+), 18 deletions(-) (limited to 'components') diff --git a/components/battery.c b/components/battery.c index 90e8590..bcd42cd 100644 --- a/components/battery.c +++ b/components/battery.c @@ -14,9 +14,16 @@ int perc; char path[PATH_MAX]; - snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", - bat, "/capacity"); - return (pscanf(path, "%d", &perc) == 1) ? bprintf("%d", perc) : NULL; + if (esnprintf(path, sizeof(path), + "/sys/class/power_supply/%s/capacity", + bat) < 0) { + return NULL; + } + if (pscanf(path, "%d", &perc) != 1) { + return NULL; + } + + return bprintf("%d", perc); } const char * @@ -32,8 +39,11 @@ size_t i; char path[PATH_MAX], state[12]; - snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", - bat, "/status"); + if (esnprintf(path, sizeof(path), + "/sys/class/power_supply/%s/status", + bat) < 0) { + return NULL; + } if (pscanf(path, "%12s", state) != 1) { return NULL; } @@ -53,20 +63,29 @@ float timeleft; char path[PATH_MAX], state[12]; - snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", - bat, "/status"); + if (esnprintf(path, sizeof(path), + "/sys/class/power_supply/%s/status", + bat) < 0) { + return NULL; + } if (pscanf(path, "%12s", state) != 1) { return NULL; } if (!strcmp(state, "Discharging")) { - snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", - bat, "/charge_now"); + if (esnprintf(path, sizeof(path), + "/sys/class/power_supply/%s/charge_now", + bat) < 0) { + return NULL; + } if (pscanf(path, "%d", &charge_now) != 1) { return NULL; } - snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", - bat, "/current_now"); + if (esnprintf(path, sizeof(path), + "/sys/class/power_supply/%s/current_now", + bat) < 0) { + return NULL; + } if (pscanf(path, "%d", ¤t_now) != 1) { return NULL; } diff --git a/components/netspeeds.c b/components/netspeeds.c index b4e6972..6adc3ea 100644 --- a/components/netspeeds.c +++ b/components/netspeeds.c @@ -17,8 +17,11 @@ oldrxbytes = rxbytes; - snprintf(path, sizeof(path), - "/sys/class/net/%s/statistics/rx_bytes", interface); + if (esnprintf(path, sizeof(path), + "/sys/class/net/%s/statistics/rx_bytes", + interface) < 0) { + return NULL; + } if (pscanf(path, "%llu", &rxbytes) != 1) { return NULL; } @@ -37,8 +40,11 @@ oldtxbytes = txbytes; - snprintf(path, sizeof(path), - "/sys/class/net/%s/statistics/tx_bytes", interface); + if (esnprintf(path, sizeof(path), + "/sys/class/net/%s/statistics/tx_bytes", + interface) < 0) { + return NULL; + } if (pscanf(path, "%llu", &txbytes) != 1) { return NULL; } diff --git a/components/wifi.c b/components/wifi.c index 591f6ad..b3e1723 100644 --- a/components/wifi.c +++ b/components/wifi.c @@ -23,8 +23,11 @@ char status[5]; FILE *fp; - snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, - "/operstate"); + if (esnprintf(path, sizeof(path), + "/sys/class/net/%s/operstate", + iface) < 0) { + return NULL; + } if (!(fp = fopen(path, "r"))) { warn("fopen '%s':", path); return NULL; @@ -69,7 +72,10 @@ memset(&wreq, 0, sizeof(struct iwreq)); wreq.u.essid.length = IW_ESSID_MAX_SIZE+1; - snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface); + if (esnprintf(wreq.ifr_name, sizeof(wreq.ifr_name), + "%s", iface) < 0) { + return NULL; + } if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { warn("socket 'AF_INET':"); -- cgit v1.2.3