* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#define RCSID "$Id: utils.c,v 1.25 2008/06/03 12:06:37 paulus Exp $"
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <stdarg.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <sys/mkdev.h>
#endif
-#include "pppd.h"
+#include "pppd-private.h"
#include "fsm.h"
#include "lcp.h"
+#include "pathnames.h"
-static const char rcsid[] = RCSID;
#if defined(SUNOS4)
extern char *strerror();
#endif
-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, printer_func, void *));
+static void logit(int, char *, va_list);
+static void log_write(int, char *);
+static void vslp_printer(void *, char *, ...);
+static void format_packet(u_char *, int, printer_func, void *);
struct buffer_info {
char *ptr;
* always leaves destination null-terminated (for len > 0).
*/
size_t
-strlcpy(dest, src, len)
- char *dest;
- const char *src;
- size_t len;
+strlcpy(char *dest, const char *src, size_t len)
{
size_t ret = strlen(src);
* always leaves destination null-terminated (for len > 0).
*/
size_t
-strlcat(dest, src, len)
- char *dest;
- const char *src;
- size_t len;
+strlcat(char *dest, const char *src, size_t len)
{
size_t dlen = strlen(dest);
* Returns the number of chars put into buf.
*/
int
-slprintf __V((char *buf, int buflen, char *fmt, ...))
+slprintf(char *buf, int buflen, char *fmt, ...)
{
va_list args;
int n;
-#if defined(__STDC__)
va_start(args, fmt);
-#else
- char *buf;
- int buflen;
- char *fmt;
- va_start(args);
- buf = va_arg(args, char *);
- buflen = va_arg(args, int);
- fmt = va_arg(args, char *);
-#endif
n = vslprintf(buf, buflen, fmt, args);
va_end(args);
return n;
#define OUTCHAR(c) (buflen > 0? (--buflen, *buf++ = (c)): 0)
int
-vslprintf(buf, buflen, fmt, args)
- char *buf;
- int buflen;
- char *fmt;
- va_list args;
+vslprintf(char *buf, int buflen, char *fmt, va_list args)
{
int c, i, n;
int width, prec, fillch;
int base, len, neg, quoted;
+ long lval = 0;
unsigned long val = 0;
char *str, *f, *buf0;
unsigned char *p;
u_int32_t ip;
static char hexchars[] = "0123456789abcdef";
struct buffer_info bufinfo;
+ int termch;
buf0 = buf;
--buflen;
c = *fmt++;
switch (c) {
case 'd':
- val = va_arg(args, long);
- if (val < 0) {
+ lval = va_arg(args, long);
+ if (lval < 0) {
neg = 1;
- val = -val;
- }
+ val = -lval;
+ } else
+ val = lval;
base = 10;
break;
case 'u':
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');
OUTCHAR(c);
}
continue;
+#ifndef UNIT_TEST
case 'P': /* print PPP packet */
bufinfo.ptr = buf;
bufinfo.len = buflen + 1;
buf = bufinfo.ptr;
buflen = bufinfo.len - 1;
continue;
+#endif
case 'B':
p = va_arg(args, unsigned char *);
for (n = prec; n > 0; --n) {
}
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)
* vslp_printer - used in processing a %P format
*/
static void
-vslp_printer __V((void *arg, char *fmt, ...))
+vslp_printer(void *arg, char *fmt, ...)
{
int n;
va_list pvar;
struct buffer_info *bi;
-#if defined(__STDC__)
va_start(pvar, fmt);
-#else
- void *arg;
- char *fmt;
- va_start(pvar);
- arg = va_arg(pvar, void *);
- fmt = va_arg(pvar, char *);
-#endif
bi = (struct buffer_info *) arg;
n = vslprintf(bi->ptr, bi->len, fmt, pvar);
*/
void
-log_packet(p, len, prefix, level)
- u_char *p;
- int len;
- char *prefix;
- int level;
+log_packet(u_char *p, int len, char *prefix, int level)
{
init_pr_log(prefix, level);
format_packet(p, len, pr_log, &level);
}
#endif /* unused */
+#ifndef UNIT_TEST
/*
* format_packet - make a readable representation of a packet,
* calling `printer(arg, format, ...)' to output it.
*/
static void
-format_packet(p, len, printer, arg)
- u_char *p;
- int len;
- printer_func printer;
- void *arg;
+format_packet(u_char *p, int len, printer_func printer, void *arg)
{
int i, n;
u_short proto;
else
printer(arg, "%.*B", len, p);
}
+#endif /* UNIT_TEST */
/*
* init_pr_log, end_pr_log - initialize and finish use of pr_log.
static int llevel; /* level for logging */
void
-init_pr_log(prefix, level)
- const char *prefix;
- int level;
+init_pr_log(const char *prefix, int level)
{
linep = line;
if (prefix != NULL) {
}
void
-end_pr_log()
+end_pr_log(void)
{
if (linep != line) {
*linep = 0;
* pr_log - printer routine for outputting to syslog
*/
void
-pr_log __V((void *arg, char *fmt, ...))
+pr_log(void *arg, char *fmt, ...)
{
int l, n;
va_list pvar;
char *p, *eol;
char buf[256];
-#if defined(__STDC__)
va_start(pvar, fmt);
-#else
- void *arg;
- char *fmt;
- va_start(pvar);
- arg = va_arg(pvar, void *);
- fmt = va_arg(pvar, char *);
-#endif
n = vslprintf(buf, sizeof(buf), fmt, pvar);
va_end(pvar);
* printer.
*/
void
-print_string(p, len, printer, arg)
- char *p;
- int len;
- printer_func printer;
- void *arg;
+print_string(char *p, int len, printer_func printer, void *arg)
{
int c;
* logit - does the hard work for fatal et al.
*/
static void
-logit(level, fmt, args)
- int level;
- char *fmt;
- va_list args;
+logit(int level, char *fmt, va_list args)
{
char buf[1024];
log_write(level, buf);
}
+#ifndef UNIT_TEST
static void
-log_write(level, buf)
- int level;
- char *buf;
+log_write(int level, char *buf)
{
syslog(level, "%s", buf);
if (log_to_fd >= 0 && (level != LOG_DEBUG || debug)) {
log_to_fd = -1;
}
}
+#else
+static void
+log_write(int level, char *buf)
+{
+ printf("<%d>: %s\n", level, buf);
+}
+#endif
/*
* fatal - log an error message and die horribly.
*/
void
-fatal __V((char *fmt, ...))
+fatal(char *fmt, ...)
{
va_list pvar;
-#if defined(__STDC__)
va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
logit(LOG_ERR, fmt, pvar);
va_end(pvar);
+#ifndef UNIT_TEST
die(1); /* as promised */
+#else
+ exit(-1);
+#endif
}
/*
* error - log an error message.
*/
void
-error __V((char *fmt, ...))
+error(char *fmt, ...)
{
va_list pvar;
-#if defined(__STDC__)
va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
logit(LOG_ERR, fmt, pvar);
va_end(pvar);
* warn - log a warning message.
*/
void
-warn __V((char *fmt, ...))
+warn(char *fmt, ...)
{
va_list pvar;
-#if defined(__STDC__)
va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
logit(LOG_WARNING, fmt, pvar);
va_end(pvar);
* notice - log a notice-level message.
*/
void
-notice __V((char *fmt, ...))
+notice(char *fmt, ...)
{
va_list pvar;
-#if defined(__STDC__)
va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
logit(LOG_NOTICE, fmt, pvar);
va_end(pvar);
* info - log an informational message.
*/
void
-info __V((char *fmt, ...))
+info(char *fmt, ...)
{
va_list pvar;
-#if defined(__STDC__)
va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
logit(LOG_INFO, fmt, pvar);
va_end(pvar);
* dbglog - log a debug message.
*/
void
-dbglog __V((char *fmt, ...))
+dbglog(char *fmt, ...)
{
va_list pvar;
-#if defined(__STDC__)
va_start(pvar, fmt);
-#else
- char *fmt;
- va_start(pvar);
- fmt = va_arg(pvar, char *);
-#endif
logit(LOG_DEBUG, fmt, pvar);
va_end(pvar);
dbglog("%s %P", tag, p, len);
}
+
+#ifndef UNIT_TEST
/*
* complete_read - read a full `count' bytes from fd,
* unless end-of-file or an error other than EINTR is encountered.
for (done = 0; done < count; ) {
nb = read(fd, ptr, count - done);
if (nb < 0) {
- if (errno == EINTR)
+ if (errno == EINTR && !ppp_signaled(SIGTERM))
continue;
return -1;
}
}
return done;
}
-
-/* Procedures for locking the serial device using a lock file. */
-#ifndef LOCK_DIR
-#ifdef __linux__
-#define LOCK_DIR "/var/lock"
-#else
-#ifdef SVR4
-#define LOCK_DIR "/var/spool/locks"
-#else
-#define LOCK_DIR "/var/spool/lock"
-#endif
#endif
-#endif /* LOCK_DIR */
+/* Procedures for locking the serial device using a lock file. */
static char lock_file[MAXPATHLEN];
/*
* lock - create a lock file for the named device
*/
int
-lock(dev)
- char *dev;
+lock(char *dev)
{
#ifdef LOCKLIB
int result;
#else /* LOCKLIB */
char lock_buffer[12];
- int fd, pid, n;
+ int fd, pid, n, siz;
#ifdef SVR4
struct stat sbuf;
return -1;
}
slprintf(lock_file, sizeof(lock_file), "%s/LK.%03d.%03d.%03d",
- LOCK_DIR, major(sbuf.st_dev),
+ PPP_PATH_LOCKDIR, major(sbuf.st_dev),
major(sbuf.st_rdev), minor(sbuf.st_rdev));
#else
char *p;
if ((p = strrchr(dev, '/')) != NULL)
dev = p + 1;
- slprintf(lock_file, sizeof(lock_file), "%s/LCK..%s", LOCK_DIR, dev);
+ slprintf(lock_file, sizeof(lock_file), "%s/LCK..%s", PPP_PATH_LOCKDIR, dev);
#endif
while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0) {
pid = getpid();
#ifndef LOCK_BINARY
+ siz = 11;
slprintf(lock_buffer, sizeof(lock_buffer), "%10d\n", pid);
- write (fd, lock_buffer, 11);
+ n = write (fd, lock_buffer, siz);
#else
- write(fd, &pid, sizeof (pid));
+ siz = sizeof (pid);
+ n = write(fd, &pid, siz);
#endif
+ if (n != siz) {
+ error("Could not write pid to lock file when locking");
+ }
close(fd);
return 0;
* between when the parent died and the child rewrote the lockfile).
*/
int
-relock(pid)
- int pid;
+relock(int pid)
{
#ifdef LOCKLIB
/* XXX is there a way to do this? */
return -1;
#else /* LOCKLIB */
- int fd;
+ int fd, n, siz;
char lock_buffer[12];
if (lock_file[0] == 0)
}
#ifndef LOCK_BINARY
+ siz = 11;
slprintf(lock_buffer, sizeof(lock_buffer), "%10d\n", pid);
- write (fd, lock_buffer, 11);
+ n = write (fd, lock_buffer, siz);
#else
- write(fd, &pid, sizeof(pid));
+ siz = sizeof(pid);
+ n = write(fd, &pid, siz);
#endif /* LOCK_BINARY */
+ if (n != siz) {
+ error("Could not write pid to lock file when locking");
+ }
close(fd);
return 0;
* unlock - remove our lockfile
*/
void
-unlock()
+unlock(void)
{
if (lock_file[0]) {
#ifdef LOCKLIB