5 #define RCSID "$Id: utils.c,v 1.24 2004/11/04 10:02:26 paulus Exp $"
11 @@ -67,15 +68,10 @@ extern char *strerror();
13 static void logit __P((int, char *, va_list));
14 static void log_write __P((int, char *));
15 -static void vslp_printer __P((void *, char *, ...));
16 static void format_packet __P((u_char *, int, void (*) (void *, char *, ...),
26 * strlcpy - like strcpy/strncpy, doesn't overflow destination buffer,
27 * always leaves destination null-terminated (for len > 0).
28 @@ -113,6 +109,7 @@ strlcat(dest, src, len)
30 return dlen + strlcpy(dest + dlen, src, (len > dlen? len - dlen: 0));
36 @@ -129,17 +126,7 @@ slprintf __V((char *buf, int buflen, cha
40 -#if defined(__STDC__)
47 - buf = va_arg(args, char *);
48 - buflen = va_arg(args, int);
49 - fmt = va_arg(args, char *);
51 n = vslprintf(buf, buflen, fmt, args);
54 @@ -148,7 +135,6 @@ slprintf __V((char *buf, int buflen, cha
56 * vslprintf - like slprintf, takes a va_list instead of a list of args.
58 -#define OUTCHAR(c) (buflen > 0? (--buflen, *buf++ = (c)): 0)
61 vslprintf(buf, buflen, fmt, args)
62 @@ -157,298 +143,14 @@ vslprintf(buf, buflen, fmt, args)
67 - int width, prec, fillch;
68 - int base, len, neg, quoted;
69 - unsigned long val = 0;
70 - char *str, *f, *buf0;
75 - static char hexchars[] = "0123456789abcdef";
76 - struct buffer_info bufinfo;
80 - while (buflen > 0) {
81 - for (f = fmt; *f != '%' && *f != 0; ++f)
87 - memcpy(buf, fmt, len);
103 - width = va_arg(args, int);
106 - while (isdigit(c)) {
107 - width = width * 10 + c - '0';
114 - prec = va_arg(args, int);
118 - while (isdigit(c)) {
119 - prec = prec * 10 + c - '0';
133 - val = va_arg(args, long);
141 - val = va_arg(args, unsigned long);
145 - *buf++ = '%'; --buflen;
146 - *buf++ = 'l'; --buflen;
147 - --fmt; /* so %lz outputs %lz etc. */
152 - i = va_arg(args, int);
161 - val = va_arg(args, unsigned int);
165 - val = va_arg(args, unsigned int);
170 - val = va_arg(args, unsigned int);
174 - val = (unsigned long) va_arg(args, void *);
179 - str = va_arg(args, char *);
182 - num[0] = va_arg(args, int);
187 - str = strerror(errno);
190 - ip = va_arg(args, u_int32_t);
192 - slprintf(num, sizeof(num), "%d.%d.%d.%d", (ip >> 24) & 0xff,
193 - (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
196 -#if 0 /* not used, and breaks on S/390, apparently */
198 - f = va_arg(args, char *);
200 - n = vslprintf(buf, buflen + 1, f, va_arg(args, va_list));
202 - /* On the powerpc, a va_list is an array of 1 structure */
203 - n = vslprintf(buf, buflen + 1, f, va_arg(args, void *));
212 - str += 4; /* chop off the day name */
213 - str[15] = 0; /* chop off year and newline */
215 - case 'v': /* "visible" string */
216 - case 'q': /* quoted string */
218 - p = va_arg(args, unsigned char *);
219 - if (fillch == '0' && prec >= 0) {
222 - n = strlen((char *)p);
223 - if (prec >= 0 && n > prec)
226 - while (n > 0 && buflen > 0) {
229 - if (!quoted && c >= 0x80) {
234 - if (quoted && (c == '"' || c == '\\'))
236 - if (c < 0x20 || (0x7f <= c && c < 0xa0)) {
240 - case '\t': OUTCHAR('t'); break;
241 - case '\n': OUTCHAR('n'); break;
242 - case '\b': OUTCHAR('b'); break;
243 - case '\f': OUTCHAR('f'); break;
246 - OUTCHAR(hexchars[c >> 4]);
247 - OUTCHAR(hexchars[c & 0xf]);
261 - case 'P': /* print PPP packet */
263 - bufinfo.len = buflen + 1;
264 - p = va_arg(args, unsigned char *);
265 - n = va_arg(args, int);
266 - format_packet(p, n, vslp_printer, &bufinfo);
268 - buflen = bufinfo.len - 1;
271 - p = va_arg(args, unsigned char *);
272 - for (n = prec; n > 0; --n) {
276 - OUTCHAR(hexchars[(c >> 4) & 0xf]);
277 - OUTCHAR(hexchars[c & 0xf]);
283 - --fmt; /* so %z outputs %z etc. */
288 - str = num + sizeof(num);
290 - while (str > num + neg) {
291 - *--str = hexchars[val % base];
293 - if (--prec <= 0 && val == 0)
305 - len = num + sizeof(num) - 1 - str;
308 - if (prec >= 0 && len > prec)
312 - if (width > buflen)
314 - if ((n = width - len) > 0) {
322 - memcpy(buf, str, len);
332 - * vslp_printer - used in processing a %P format
335 -vslp_printer __V((void *arg, char *fmt, ...))
339 - struct buffer_info *bi;
341 -#if defined(__STDC__)
342 - va_start(pvar, fmt);
347 - arg = va_arg(pvar, void *);
348 - fmt = va_arg(pvar, char *);
351 - bi = (struct buffer_info *) arg;
352 - n = vslprintf(bi->ptr, bi->len, fmt, pvar);
357 + ret = vsnprintf(buf, buflen, fmt, args);
358 + buf[buflen - 1] = 0;
365 * log_packet - format a packet and log it.