ソースを参照

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.
master
Laslo Hunhold 6年前
committed by Aaron Marcher
コミット
422cadfd5f
6個のファイルの変更72行の追加23行の削除
  1. +30
    -11
      components/battery.c
  2. +10
    -4
      components/netspeeds.c
  3. +9
    -3
      components/wifi.c
  4. +1
    -5
      slstatus.c
  5. +21
    -0
      util.c
  6. +1
    -0
      util.h

+ 30
- 11
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", &current_now) != 1) {
return NULL;
}


+ 10
- 4
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;
}


+ 9
- 3
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':");


+ 1
- 5
slstatus.c ファイルの表示

@@ -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;


+ 21
- 0
util.c ファイルの表示

@@ -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, ...)
{


+ 1
- 0
util.h ファイルの表示

@@ -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, ...);

読み込み中…
キャンセル
保存