Xinqi Bao's Git

Properly handle *snprintf() errors
[slstatus.git] / util.c
1 /* See LICENSE file for copyright and license details. */
2 #include <errno.h>
3 #include <stdarg.h>
4 #include <stdio.h>
5 #include <string.h>
6
7 #include "util.h"
8
9 const char *
10 bprintf(const char *fmt, ...)
11 {
12 va_list ap;
13 int ret;
14
15 va_start(ap, fmt);
16 if ((ret = vsnprintf(buf, sizeof(buf), fmt, ap)) < 0) {
17 fprintf(stderr, "vsnprintf: %s\n", strerror(errno));
18 } else if ((size_t)ret >= sizeof(buf)) {
19 fprintf(stderr, "vsnprintf: Output truncated\n");
20 }
21 va_end(ap);
22
23 return buf;
24 }
25
26 int
27 pscanf(const char *path, const char *fmt, ...)
28 {
29 FILE *fp;
30 va_list ap;
31 int n;
32
33 if (!(fp = fopen(path, "r"))) {
34 fprintf(stderr, "fopen '%s': %s\n", path, strerror(errno));
35 return -1;
36 }
37 va_start(ap, fmt);
38 n = vfscanf(fp, fmt, ap);
39 va_end(ap);
40 fclose(fp);
41
42 return (n == EOF) ? -1 : n;
43 }