[hackers] [slstatus] Implement esnprintf() and make formatted calls more efficient || Laslo Hunhold

From: <git_AT_suckless.org>
Date: Sat, 19 May 2018 19:46:10 +0200 (CEST)

commit 422cadfd5ffd78ae1b8fdf15734e03bd0333b26e
Author: Laslo Hunhold <dev_AT_frign.de>
AuthorDate: Sat May 19 19:33:04 2018 +0200
Commit: Aaron Marcher <me_AT_drkhsh.at>
CommitDate: Sat May 19 19:44:02 2018 +0200

    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.

diff --git a/components/battery.c b/components/battery.c
index 90e8590..bcd42cd 100644
--- a/components/battery.c
+++ b/components/battery.c
_AT_@ -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 *
_AT_@ -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;
                 }
_AT_@ -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", &current_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
_AT_@ -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;
                 }
_AT_@ -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
_AT_@ -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;
_AT_@ -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':");
diff --git a/slstatus.c b/slstatus.c
index 0c4605f..3222b02 100644
--- a/slstatus.c
+++ b/slstatus.c
_AT_@ -91,12 +91,8 @@ main(int argc, char *argv[])
                         if (!(res = args[i].func(args[i].args))) {
                                 res = unknown_str;
                         }
- if ((ret = snprintf(status + len, sizeof(status) - len,
+ if ((ret = esnprintf(status + len, sizeof(status) - len,
                                             args[i].fmt, res)) < 0) {
- warn("snprintf:");
- break;
- } else if ((size_t)ret >= sizeof(status) - len) {
- warn("snprintf: Output truncated");
                                 break;
                         }
                         len += ret;
diff --git a/util.c b/util.c
index a7576b4..923d4df 100644
--- a/util.c
+++ b/util.c
_AT_@ -48,6 +48,27 @@ die(const char *fmt, ...)
         exit(1);
 }
 
+int
+esnprintf(char *str, size_t size, const char *fmt, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap, fmt);
+ ret = vsnprintf(str, size, fmt, ap);
+ va_end(ap);
+
+ if (ret < 0) {
+ warn("snprintf:");
+ return -1;
+ } else if ((size_t)ret >= size) {
+ warn("snprintf: Output truncated");
+ return -1;
+ }
+
+ return ret;
+}
+
 const char *
 bprintf(const char *fmt, ...)
 {
diff --git a/util.h b/util.h
index bd05574..5111b37 100644
--- a/util.h
+++ b/util.h
_AT_@ -8,6 +8,7 @@ extern char *argv0;
 void warn(const char *, ...);
 void die(const char *, ...);
 
+int esnprintf(char *str, size_t size, const char *fmt, ...);
 const char *bprintf(const char *fmt, ...);
 const char *fmt_scaled(size_t);
 int pscanf(const char *path, const char *fmt, ...);
Received on Sat May 19 2018 - 19:46:10 CEST

This archive was generated by hypermail 2.3.0 : Sat May 19 2018 - 19:48:24 CEST