* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
+ * 2. The name(s) of the authors of this software must not be used to
* endorse or promote products derived from this software without
* prior written permission.
*
- * 4. Redistributions of any form whatsoever must retain the following
+ * 3. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by Paul Mackerras
* <paulus@samba.org>".
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#define RCSID "$Id: utils.c,v 1.23 2004/01/13 04:13:08 paulus Exp $"
+#define RCSID "$Id: utils.c,v 1.25 2008/06/03 12:06:37 paulus Exp $"
#include <stdio.h>
#include <ctype.h>
#include "fsm.h"
#include "lcp.h"
-static const char rcsid[] = RCSID;
#if defined(SUNOS4)
extern char *strerror();
static void logit __P((int, char *, va_list));
static void log_write __P((int, char *));
static void vslp_printer __P((void *, char *, ...));
-static void format_packet __P((u_char *, int, void (*) (void *, char *, ...),
- void *));
+static void format_packet __P((u_char *, int, printer_func, void *));
struct buffer_info {
char *ptr;
u_int32_t ip;
static char hexchars[] = "0123456789abcdef";
struct buffer_info bufinfo;
+ int termch;
buf0 = buf;
--buflen;
base = 10;
break;
default:
- *buf++ = '%'; --buflen;
- *buf++ = 'l'; --buflen;
+ OUTCHAR('%');
+ OUTCHAR('l');
--fmt; /* so %lz outputs %lz etc. */
continue;
}
(ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
str = num;
break;
-#if 0 /* not used, and breaks on S/390, apparently */
- case 'r':
- f = va_arg(args, char *);
-#ifndef __powerpc__
- n = vslprintf(buf, buflen + 1, f, va_arg(args, va_list));
-#else
- /* On the powerpc, a va_list is an array of 1 structure */
- n = vslprintf(buf, buflen + 1, f, va_arg(args, void *));
-#endif
- buf += n;
- buflen -= n;
- continue;
-#endif
case 't':
time(&t);
str = ctime(&t);
case 'q': /* quoted string */
quoted = c == 'q';
p = va_arg(args, unsigned char *);
+ if (p == NULL)
+ p = (unsigned char *)"<NULL>";
if (fillch == '0' && prec >= 0) {
n = prec;
+ termch = -1; /* matches no unsigned char value */
} else {
- n = strlen((char *)p);
- if (prec >= 0 && n > prec)
+ n = buflen;
+ if (prec != -1 && n > prec)
n = prec;
+ termch = 0; /* stop on null byte */
}
while (n > 0 && buflen > 0) {
c = *p++;
+ if (c == termch)
+ break;
--n;
if (!quoted && c >= 0x80) {
OUTCHAR('M');
}
len = num + sizeof(num) - 1 - str;
} else {
- len = strlen(str);
- if (prec >= 0 && len > prec)
- len = prec;
+ for (len = 0; len < buflen && (prec == -1 || len < prec); ++len)
+ if (str[len] == 0)
+ break;
}
if (width > 0) {
if (width > buflen)
format_packet(p, len, printer, arg)
u_char *p;
int len;
- void (*printer) __P((void *, char *, ...));
+ printer_func printer;
void *arg;
{
int i, n;
void
init_pr_log(prefix, level)
- char *prefix;
+ const char *prefix;
int level;
{
linep = line;
print_string(p, len, printer, arg)
char *p;
int len;
- void (*printer) __P((void *, char *, ...));
+ printer_func printer;
void *arg;
{
int c;
printer(arg, "\\t");
break;
default:
- printer(arg, "\\%.3o", c);
+ printer(arg, "\\%.3o", (unsigned char) c);
}
}
}
char *fmt;
va_list args;
{
- int n;
char buf[1024];
- n = vslprintf(buf, sizeof(buf), fmt, args);
+ vslprintf(buf, sizeof(buf), fmt, args);
log_write(level, buf);
}
for (done = 0; done < count; ) {
nb = read(fd, ptr, count - done);
if (nb < 0) {
- if (errno == EINTR)
+ if (errno == EINTR && !got_sigterm)
continue;
return -1;
}