]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/blacklist/bin/support.c
Update to bmake-201802222
[FreeBSD/FreeBSD.git] / contrib / blacklist / bin / support.c
1 /*      $NetBSD: support.c,v 1.8 2016/04/04 15:52:56 christos Exp $     */
2
3 /*-
4  * Copyright (c) 2015 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Christos Zoulas.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 #ifdef HAVE_CONFIG_H
32 #include "config.h"
33 #endif
34
35 #include <sys/cdefs.h>
36 __RCSID("$NetBSD: support.c,v 1.8 2016/04/04 15:52:56 christos Exp $");
37
38 #include <time.h>
39 #include <string.h>
40 #include <stdio.h>
41 #include <stdarg.h>
42 #include <errno.h>
43 #include <stdlib.h>
44 #include <inttypes.h>
45
46 #include "support.h"
47
48 static __attribute__((__format_arg__(3))) const char *
49 expandm(char *buf, size_t len, const char *fmt) 
50 {
51         char *p;
52         size_t r;
53
54         if ((p = strstr(fmt, "%m")) == NULL)
55                 return fmt;
56
57         r = (size_t)(p - fmt);
58         if (r >= len)
59                 return fmt;
60
61         strlcpy(buf, fmt, r + 1);
62         strlcat(buf, strerror(errno), len);
63         strlcat(buf, fmt + r + 2, len);
64
65         return buf;
66 }
67
68 void
69 vdlog(int level __unused, const char *fmt, va_list ap)
70 {
71         char buf[BUFSIZ];
72
73 //      fprintf(stderr, "%s: ", getprogname());
74         vfprintf(stderr, expandm(buf, sizeof(buf), fmt), ap);
75         fprintf(stderr, "\n");
76 }
77
78 void
79 dlog(int level, const char *fmt, ...)
80 {
81         va_list ap;
82
83         va_start(ap, fmt);
84         vdlog(level, fmt, ap);
85         va_end(ap);
86 }
87
88 const char *
89 fmttime(char *b, size_t l, time_t t)
90 {
91         struct tm tm;
92         if (localtime_r(&t, &tm) == NULL)
93                 snprintf(b, l, "*%jd*", (intmax_t)t);
94         else
95                 strftime(b, l, "%Y/%m/%d %H:%M:%S", &tm);
96         return b;
97 }
98
99 const char *
100 fmtydhms(char *b, size_t l, time_t t)
101 {
102         time_t s, m, h, d, y;
103         int z;
104         size_t o;
105
106         s = t % 60;
107         t /= 60;
108         m = t % 60;
109         t /= 60;
110         h = t % 60;
111         t /= 24;
112         d = t % 24;
113         t /= 356;
114         y = t;
115
116         z = 0;
117         o = 0;
118 #define APPEND(a) \
119         if (a) { \
120                 z = snprintf(b + o, l - o, "%jd%s", (intmax_t)a, __STRING(a)); \
121                 if (z == -1) \
122                         return b; \
123                 o += (size_t)z; \
124                 if (o >= l) \
125                         return b; \
126         }
127         APPEND(y)
128         APPEND(d)
129         APPEND(h)
130         APPEND(m)
131         APPEND(s)
132         return b;
133 }
134
135 ssize_t
136 blhexdump(char *buf, size_t len, const char *str, const void *b, size_t l)
137 {
138         size_t z, cz;
139         int r;
140         const unsigned char *p = b;
141         const unsigned char *e = p + l;
142
143         r = snprintf(buf, len, "%s: ", str);
144         if (r == -1)
145                 return -1;
146         if ((cz = z = (size_t)r) >= len)
147                 cz = len;
148
149         while (p < e) {
150                 r = snprintf(buf + cz, len - cz, "%.2x", *p++);
151                 if (r == -1)
152                         return -1;
153                 if ((cz = (z += (size_t)r)) >= len)
154                         cz = len;
155         }
156         return (ssize_t)z;
157 }