48 #include <sys/param.h> 49 #include <sys/types.h> 52 #include <sys/resource.h> 55 #include <netinet/in.h> 57 #include <sys/mkdev.h> 69 extern char *strerror();
72 static void ppp_logit(
int level,
const char *fmt, va_list args);
73 static void ppp_log_write(
int level,
char *buf);
75 static void ppp_vslp_printer(
void *arg,
const char *fmt, ...);
76 static void ppp_format_packet(
const u_char *p,
int len,
77 void (*printer) (
void *,
const char *, ...),
void *arg);
89 size_t ppp_strlcpy(
char *dest,
const char *src,
size_t len) {
90 size_t ret = strlen(src);
96 strncpy(dest, src, len - 1);
107 size_t ppp_strlcat(
char *dest,
const char *src,
size_t len) {
108 size_t dlen = strlen(dest);
110 return dlen + ppp_strlcpy(dest + dlen, src, (len > dlen? len - dlen: 0));
122 int ppp_slprintf(
char *buf,
int buflen,
const char *fmt, ...) {
127 n = ppp_vslprintf(buf, buflen, fmt, args);
135 #define OUTCHAR(c) (buflen > 0? (--buflen, *buf++ = (c)): 0) 137 int ppp_vslprintf(
char *buf,
int buflen,
const char *fmt, va_list args) {
139 int width, prec, fillch;
140 int base, len, neg, quoted;
141 unsigned long val = 0;
144 const unsigned char *p;
150 static char hexchars[] =
"0123456789abcdef";
152 struct buffer_info bufinfo;
158 for (f = fmt; *f !=
'%' && *f != 0; ++f)
164 memcpy(buf, fmt, len);
180 width = va_arg(args,
int);
184 width = width * 10 + c -
'0';
191 prec = va_arg(args,
int);
196 prec = prec * 10 + c -
'0';
210 val = va_arg(args,
long);
213 val = (
unsigned long)-(
long)val;
218 val = va_arg(args,
unsigned long);
229 i = va_arg(args,
int);
238 val = va_arg(args,
unsigned int);
242 val = va_arg(args,
unsigned int);
247 val = va_arg(args,
unsigned int);
251 val = (
unsigned long) va_arg(args,
void *);
256 str = va_arg(args,
char *);
259 num[0] = va_arg(args,
int);
265 str = strerror(
errno);
269 ip = va_arg(args,
u32_t);
271 ppp_slprintf(num,
sizeof(num),
"%d.%d.%d.%d", (ip >> 24) & 0xff,
272 (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
286 p = va_arg(args,
unsigned char *);
288 p = (
const unsigned char *)
"<NULL>";
289 if (fillch ==
'0' && prec >= 0) {
292 n = strlen((
const char *)p);
293 if (prec >= 0 && n > prec)
296 while (n > 0 && buflen > 0) {
299 if (!quoted && c >= 0x80) {
304 if (quoted && (c ==
'"' || c ==
'\\'))
306 if (c < 0x20 || (0x7f <= c && c < 0xa0)) {
310 case '\t': OUTCHAR(
't');
break;
311 case '\n': OUTCHAR(
'n');
break;
312 case '\b': OUTCHAR(
'b');
break;
313 case '\f': OUTCHAR(
'f');
break;
316 OUTCHAR(hexchars[c >> 4]);
317 OUTCHAR(hexchars[c & 0xf]);
334 bufinfo.len = buflen + 1;
335 p = va_arg(args,
unsigned char *);
336 n = va_arg(args,
int);
337 ppp_format_packet(p, n, ppp_vslp_printer, &bufinfo);
339 buflen = bufinfo.len - 1;
343 p = va_arg(args,
unsigned char *);
344 for (n = prec; n > 0; --n) {
348 OUTCHAR(hexchars[(c >> 4) & 0xf]);
349 OUTCHAR(hexchars[c & 0xf]);
360 str = num +
sizeof(num);
362 while (str > num + neg) {
363 *--str = hexchars[val % base];
365 if (--prec <= 0 && val == 0)
379 len = num +
sizeof(num) - 1 - str;
382 if (prec >= 0 && len > prec)
388 if ((n = width - len) > 0) {
396 memcpy(buf, str, len);
408 static void ppp_vslp_printer(
void *arg,
const char *fmt, ...) {
411 struct buffer_info *bi;
414 bi = (
struct buffer_info *) arg;
415 n = ppp_vslprintf(bi->ptr, bi->len, fmt, pvar);
429 log_packet(p, len, prefix, level)
435 init_pr_log(prefix, level);
436 ppp_format_packet(p, len, pr_log, &level);
446 static void ppp_format_packet(
const u_char *p,
int len,
447 void (*printer) (
void *,
const char *, ...),
void *arg) {
450 const struct protent *protp;
455 for (i = 0; (protp = protocols[i]) !=
NULL; ++i)
456 if (proto == protp->protocol)
459 printer(arg,
"[%s", protp->name);
460 n = (*protp->printpkt)(p, len, printer, arg);
465 for (i = 0; (protp = protocols[i]) !=
NULL; ++i)
466 if (proto == (protp->protocol & ~0x8000))
468 if (protp != 0 && protp->data_name != 0) {
469 printer(arg,
"[%s data]", protp->data_name);
471 printer(arg,
"%.8B ...", p);
473 printer(arg,
"%.*B", len, p);
476 printer(arg,
"[proto=0x%x]", proto);
481 printer(arg,
"%.32B ...", p);
483 printer(arg,
"%.*B", len, p);
492 static char line[256];
497 init_pr_log(prefix, level)
502 if (prefix !=
NULL) {
503 ppp_strlcpy(line, prefix,
sizeof(line));
504 linep = line + strlen(line);
514 ppp_log_write(llevel, line);
522 pr_log (
void *arg,
const char *fmt, ...)
530 n = ppp_vslprintf(buf,
sizeof(buf), fmt, pvar);
534 eol = strchr(buf,
'\n');
536 l = (eol ==
NULL)? n: eol - buf;
537 if (linep + l < line +
sizeof(line)) {
539 memcpy(linep, buf, l);
545 eol = strchr(p,
'\n');
548 ppp_log_write(llevel, line);
552 while (eol !=
NULL) {
554 ppp_log_write(llevel, p);
556 eol = strchr(p,
'\n');
572 void ppp_print_string(
const u_char *p,
int len,
void (*printer) (
void *,
const char *, ...),
void *arg) {
576 for (; len > 0; --len) {
578 if (
' ' <= c && c <=
'~') {
579 if (c ==
'\\' || c ==
'"')
581 printer(arg,
"%c", c);
594 printer(arg,
"\\%.3o", c);
605 static void ppp_logit(
int level,
const char *fmt, va_list args) {
608 ppp_vslprintf(buf,
sizeof(buf), fmt, args);
609 ppp_log_write(level, buf);
612 static void ppp_log_write(
int level,
char *buf) {
615 PPPDEBUG(level, (
"%s\n", buf) );
617 if (log_to_fd >= 0 && (level != LOG_DEBUG || debug)) {
620 if (n > 0 && buf[n-1] ==
'\n')
622 if (write(log_to_fd, buf, n) != n
623 || write(log_to_fd,
"\n", 1) != 1)
632 void ppp_fatal(
const char *fmt, ...) {
636 ppp_logit(LOG_ERR, fmt, pvar);
645 void ppp_error(
const char *fmt, ...) {
649 ppp_logit(LOG_ERR, fmt, pvar);
659 void ppp_warn(
const char *fmt, ...) {
663 ppp_logit(LOG_WARNING, fmt, pvar);
670 void ppp_notice(
const char *fmt, ...) {
674 ppp_logit(LOG_NOTICE, fmt, pvar);
681 void ppp_info(
const char *fmt, ...) {
685 ppp_logit(LOG_INFO, fmt, pvar);
692 void ppp_dbglog(
const char *fmt, ...) {
696 ppp_logit(LOG_DEBUG, fmt, pvar);
705 void ppp_dump_packet(
const char *tag,
unsigned char *p,
int len) {
711 proto = (p[0] << 8) + p[1];
715 if (proto == PPP_IPV6)
722 if (proto == PPP_LCP && len >= 2 + HEADERLEN) {
723 unsigned char *lcp = p + 2;
724 int l = (lcp[2] << 8) + lcp[3];
726 if ((lcp[0] == ECHOREQ || lcp[0] == ECHOREP)
727 && l >= HEADERLEN && l <= len - 2)
731 ppp_dbglog(
"%s %P", tag, p, len);
742 complete_read(
int fd,
void *buf,
size_t count)
748 for (done = 0; done < count; ) {
749 nb = read(fd, ptr, count - done);
766 #define LOCK_DIR "/var/lock" 769 #define LOCK_DIR "/var/spool/locks" 771 #define LOCK_DIR "/var/spool/lock" 776 static char lock_file[MAXPATHLEN];
788 result = mklock (dev, (
void *) 0);
790 ppp_strlcpy(lock_file, dev,
sizeof(lock_file));
795 ppp_notice(
"Device %s is locked by pid %d", dev, result);
797 ppp_error(
"Can't create lock file %s", lock_file);
802 char lock_buffer[12];
808 if (stat(dev, &sbuf) < 0) {
809 ppp_error(
"Can't get device number for %s: %m", dev);
812 if ((sbuf.st_mode & S_IFMT) != S_IFCHR) {
813 ppp_error(
"Can't lock %s: not a character device", dev);
816 ppp_slprintf(lock_file,
sizeof(lock_file),
"%s/LK.%03d.%03d.%03d",
817 LOCK_DIR, major(sbuf.st_dev),
818 major(sbuf.st_rdev), minor(sbuf.st_rdev));
821 char lockdev[MAXPATHLEN];
823 if ((p = strstr(dev,
"dev/")) !=
NULL) {
825 strncpy(lockdev, dev, MAXPATHLEN-1);
826 lockdev[MAXPATHLEN-1] = 0;
827 while ((p = strrchr(lockdev,
'/')) !=
NULL) {
832 if ((p = strrchr(dev,
'/')) !=
NULL)
835 ppp_slprintf(lock_file,
sizeof(lock_file),
"%s/LCK..%s", LOCK_DIR, dev);
838 while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0) {
839 if (
errno != EEXIST) {
840 ppp_error(
"Can't create lock file %s: %m", lock_file);
845 fd = open(lock_file, O_RDONLY, 0);
849 ppp_error(
"Can't open existing lock file %s: %m", lock_file);
853 n = read(fd, lock_buffer, 11);
855 n = read(fd, &pid,
sizeof(pid));
860 ppp_error(
"Can't read pid from lock file %s", lock_file);
867 pid = atoi(lock_buffer);
872 || (kill(pid, 0) == -1 &&
errno == ESRCH)) {
873 if (unlink (lock_file) == 0) {
874 ppp_notice(
"Removed stale lock on %s (pid %d)", dev, pid);
877 ppp_warn(
"Couldn't remove stale lock on %s", dev);
879 ppp_notice(
"Device %s is locked by pid %d", dev, pid);
890 ppp_slprintf(lock_buffer,
sizeof(lock_buffer),
"%10d\n", pid);
891 write (fd, lock_buffer, 11);
893 write(fd, &pid,
sizeof (pid));
920 char lock_buffer[12];
922 if (lock_file[0] == 0)
924 fd = open(lock_file, O_WRONLY, 0);
926 ppp_error(
"Couldn't reopen lock file %s: %m", lock_file);
932 ppp_slprintf(lock_buffer,
sizeof(lock_buffer),
"%10d\n", pid);
933 write (fd, lock_buffer, 11);
935 write(fd, &pid,
sizeof(pid));
951 (void) rmlock(lock_file, (
void *) 0);
#define LWIP_ASSERT(message, assertion)
#define LWIP_UNUSED_ARG(x)