18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * utils.c - various utility functions used in pppd.
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (c) 1999-2002 Paul Mackerras. All rights reserved.
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Redistribution and use in source and binary forms, with or without
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * modification, are permitted provided that the following conditions
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * are met:
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 2. The name(s) of the authors of this software must not be used to
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    endorse or promote products derived from this software without
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    prior written permission.
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3. Redistributions of any form whatsoever must retain the following
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    acknowledgment:
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    "This product includes software developed by Paul Mackerras
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *     <paulus@samba.org>".
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define RCSID	"$Id: utils.c,v 1.24 2004/11/04 10:02:26 paulus Exp $"
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define LOG_TAG "pppd"
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdio.h>
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <ctype.h>
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdlib.h>
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <string.h>
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <unistd.h>
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <signal.h>
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <errno.h>
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <fcntl.h>
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <syslog.h>
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <netdb.h>
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <time.h>
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <utmp.h>
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <pwd.h>
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/param.h>
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/types.h>
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/wait.h>
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/time.h>
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/resource.h>
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/stat.h>
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/socket.h>
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <netinet/in.h>
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef SVR4
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/mkdev.h>
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd.h"
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "fsm.h"
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "lcp.h"
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef ANDROID_CHANGES
646c569d212164aa9334e27abac8884a3d13999420Colin Cross#include <android/log.h>
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic const char rcsid[] = RCSID;
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(SUNOS4)
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern char *strerror();
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void logit __P((int, char *, va_list));
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void log_write __P((int, char *));
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void vslp_printer __P((void *, char *, ...));
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void format_packet __P((u_char *, int, void (*) (void *, char *, ...),
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			       void *));
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct buffer_info {
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *ptr;
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int len;
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project};
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
848527dca81baa73fba64d6724bd498195ed1abbf2Nick Kralevich#if !defined(ANDROID_CHANGES)
858527dca81baa73fba64d6724bd498195ed1abbf2Nick Kralevich
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * strlcpy - like strcpy/strncpy, doesn't overflow destination buffer,
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * always leaves destination null-terminated (for len > 0).
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectsize_t
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstrlcpy(dest, src, len)
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *dest;
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    const char *src;
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    size_t len;
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    size_t ret = strlen(src);
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (len != 0) {
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (ret < len)
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    strcpy(dest, src);
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	else {
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    strncpy(dest, src, len - 1);
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    dest[len-1] = 0;
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return ret;
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * strlcat - like strcat/strncat, doesn't overflow destination buffer,
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * always leaves destination null-terminated (for len > 0).
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectsize_t
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstrlcat(dest, src, len)
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *dest;
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    const char *src;
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    size_t len;
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    size_t dlen = strlen(dest);
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return dlen + strlcpy(dest + dlen, src, (len > dlen? len - dlen: 0));
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1238527dca81baa73fba64d6724bd498195ed1abbf2Nick Kralevich#endif
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * slprintf - format a message into a buffer.  Like sprintf except we
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * also specify the length of the output buffer, and we handle
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %m (error message), %v (visible string),
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %q (quoted string), %t (current time) and %I (IP address) formats.
1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Doesn't do floating-point formats.
1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns the number of chars put into buf.
1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint
1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectslprintf __V((char *buf, int buflen, char *fmt, ...))
1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list args;
1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int n;
1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__)
1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(args, fmt);
1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *buf;
1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int buflen;
1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *fmt;
1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(args);
1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    buf = va_arg(args, char *);
1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    buflen = va_arg(args, int);
1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fmt = va_arg(args, char *);
1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    n = vslprintf(buf, buflen, fmt, args);
1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_end(args);
1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return n;
1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * vslprintf - like slprintf, takes a va_list instead of a list of args.
1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define OUTCHAR(c)	(buflen > 0? (--buflen, *buf++ = (c)): 0)
1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint
1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvslprintf(buf, buflen, fmt, args)
1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *buf;
1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int buflen;
1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *fmt;
1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list args;
1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int c, i, n;
1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int width, prec, fillch;
1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int base, len, neg, quoted;
1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    unsigned long val = 0;
1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *str, *f, *buf0;
1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    unsigned char *p;
1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char num[32];
1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    time_t t;
1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    u_int32_t ip;
1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    static char hexchars[] = "0123456789abcdef";
1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    struct buffer_info bufinfo;
1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    buf0 = buf;
1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    --buflen;
1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    while (buflen > 0) {
1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for (f = fmt; *f != '%' && *f != 0; ++f)
1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    ;
1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (f > fmt) {
1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    len = f - fmt;
1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (len > buflen)
1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		len = buflen;
1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    memcpy(buf, fmt, len);
1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    buf += len;
1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    buflen -= len;
1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    fmt = f;
1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (*fmt == 0)
1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	c = *++fmt;
1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	width = 0;
1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	prec = -1;
1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fillch = ' ';
2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (c == '0') {
2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    fillch = '0';
2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    c = *++fmt;
2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (c == '*') {
2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    width = va_arg(args, int);
2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    c = *++fmt;
2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	} else {
2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    while (isdigit(c)) {
2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		width = width * 10 + c - '0';
2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		c = *++fmt;
2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (c == '.') {
2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    c = *++fmt;
2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (c == '*') {
2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		prec = va_arg(args, int);
2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		c = *++fmt;
2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    } else {
2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		prec = 0;
2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		while (isdigit(c)) {
2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    prec = prec * 10 + c - '0';
2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    c = *++fmt;
2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	str = 0;
2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	base = 0;
2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	neg = 0;
2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	++fmt;
2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	switch (c) {
2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'l':
2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    c = *fmt++;
2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    switch (c) {
2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case 'd':
2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		val = va_arg(args, long);
2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                if ((long)val < 0) {
2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    neg = 1;
2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                    val = (unsigned long)(-(long)val);
2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		base = 10;
2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case 'u':
2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		val = va_arg(args, unsigned long);
2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		base = 10;
2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    default:
2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*buf++ = '%'; --buflen;
2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*buf++ = 'l'; --buflen;
2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		--fmt;		/* so %lz outputs %lz etc. */
2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		continue;
2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'd':
2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    i = va_arg(args, int);
2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (i < 0) {
2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		neg = 1;
2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		val = -i;
2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    } else
2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		val = i;
2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    base = 10;
2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'u':
2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    val = va_arg(args, unsigned int);
2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    base = 10;
2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'o':
2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    val = va_arg(args, unsigned int);
2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    base = 8;
2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'x':
2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'X':
2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    val = va_arg(args, unsigned int);
2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    base = 16;
2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'p':
2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    val = (unsigned long) va_arg(args, void *);
2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    base = 16;
2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    neg = 2;
2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 's':
2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    str = va_arg(args, char *);
2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'c':
2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    num[0] = va_arg(args, int);
2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    num[1] = 0;
2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    str = num;
2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'm':
2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    str = strerror(errno);
2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'I':
2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    ip = va_arg(args, u_int32_t);
2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    ip = ntohl(ip);
2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    slprintf(num, sizeof(num), "%d.%d.%d.%d", (ip >> 24) & 0xff,
2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		     (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    str = num;
2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if 0	/* not used, and breaks on S/390, apparently */
2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'r':
3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    f = va_arg(args, char *);
3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef __powerpc__
3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    n = vslprintf(buf, buflen + 1, f, va_arg(args, va_list));
3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    /* On the powerpc, a va_list is an array of 1 structure */
3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    n = vslprintf(buf, buflen + 1, f, va_arg(args, void *));
3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    buf += n;
3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    buflen -= n;
3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    continue;
3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 't':
3128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    time(&t);
3138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    str = ctime(&t);
3148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    str += 4;		/* chop off the day name */
3158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    str[15] = 0;	/* chop off year and newline */
3168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'v':		/* "visible" string */
3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'q':		/* quoted string */
3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    quoted = c == 'q';
3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    p = va_arg(args, unsigned char *);
3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (fillch == '0' && prec >= 0) {
3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		n = prec;
3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    } else {
3248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		n = strlen((char *)p);
3258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (prec >= 0 && n > prec)
3268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    n = prec;
3278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
3288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    while (n > 0 && buflen > 0) {
3298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		c = *p++;
3308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		--n;
3318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (!quoted && c >= 0x80) {
3328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    OUTCHAR('M');
3338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    OUTCHAR('-');
3348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    c -= 0x80;
3358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (quoted && (c == '"' || c == '\\'))
3378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    OUTCHAR('\\');
3388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (c < 0x20 || (0x7f <= c && c < 0xa0)) {
3398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    if (quoted) {
3408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			OUTCHAR('\\');
3418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			switch (c) {
3428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			case '\t':	OUTCHAR('t');	break;
3438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			case '\n':	OUTCHAR('n');	break;
3448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			case '\b':	OUTCHAR('b');	break;
3458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			case '\f':	OUTCHAR('f');	break;
3468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			default:
3478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    OUTCHAR('x');
3488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    OUTCHAR(hexchars[c >> 4]);
3498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    OUTCHAR(hexchars[c & 0xf]);
3508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
3518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    } else {
3528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (c == '\t')
3538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    OUTCHAR(c);
3548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			else {
3558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    OUTCHAR('^');
3568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    OUTCHAR(c ^ 0x40);
3578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
3588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    }
3598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		} else
3608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    OUTCHAR(c);
3618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
3628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    continue;
3638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'P':		/* print PPP packet */
3648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    bufinfo.ptr = buf;
3658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    bufinfo.len = buflen + 1;
3668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    p = va_arg(args, unsigned char *);
3678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    n = va_arg(args, int);
3688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    format_packet(p, n, vslp_printer, &bufinfo);
3698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    buf = bufinfo.ptr;
3708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    buflen = bufinfo.len - 1;
3718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    continue;
3728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'B':
3738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    p = va_arg(args, unsigned char *);
3748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    for (n = prec; n > 0; --n) {
3758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		c = *p++;
3768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (fillch == ' ')
3778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    OUTCHAR(' ');
3788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		OUTCHAR(hexchars[(c >> 4) & 0xf]);
3798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		OUTCHAR(hexchars[c & 0xf]);
3808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
3818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    continue;
3828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	default:
3838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    *buf++ = '%';
3848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (c != '%')
3858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		--fmt;		/* so %z outputs %z etc. */
3868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    --buflen;
3878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    continue;
3888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (base != 0) {
3908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    str = num + sizeof(num);
3918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    *--str = 0;
3928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    while (str > num + neg) {
3938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*--str = hexchars[val % base];
3948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		val = val / base;
3958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (--prec <= 0 && val == 0)
3968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    break;
3978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
3988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    switch (neg) {
3998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case 1:
4008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*--str = '-';
4018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
4028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case 2:
4038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*--str = 'x';
4048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*--str = '0';
4058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
4068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
4078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    len = num + sizeof(num) - 1 - str;
4088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	} else {
4098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    len = strlen(str);
4108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (prec >= 0 && len > prec)
4118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		len = prec;
4128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (width > 0) {
4148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (width > buflen)
4158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		width = buflen;
4168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if ((n = width - len) > 0) {
4178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		buflen -= n;
4188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		for (; n > 0; --n)
4198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    *buf++ = fillch;
4208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
4218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (len > buflen)
4238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    len = buflen;
4248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	memcpy(buf, str, len);
4258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	buf += len;
4268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	buflen -= len;
4278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
4288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    *buf = 0;
4298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return buf - buf0;
4308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
4318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
4338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * vslp_printer - used in processing a %P format
4348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
4358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void
4368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvslp_printer __V((void *arg, char *fmt, ...))
4378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
4388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int n;
4398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list pvar;
4408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    struct buffer_info *bi;
4418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__)
4438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar, fmt);
4448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
4458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    void *arg;
4468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *fmt;
4478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar);
4488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    arg = va_arg(pvar, void *);
4498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fmt = va_arg(pvar, char *);
4508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
4518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    bi = (struct buffer_info *) arg;
4538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    n = vslprintf(bi->ptr, bi->len, fmt, pvar);
4548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_end(pvar);
4558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    bi->ptr += n;
4578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    bi->len -= n;
4588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
4598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef unused
4618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
4628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * log_packet - format a packet and log it.
4638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
4648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
4668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectlog_packet(p, len, prefix, level)
4678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    u_char *p;
4688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int len;
4698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *prefix;
4708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int level;
4718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
4728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	init_pr_log(prefix, level);
4738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	format_packet(p, len, pr_log, &level);
4748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	end_pr_log();
4758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
4768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* unused */
4778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
4798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * format_packet - make a readable representation of a packet,
4808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * calling `printer(arg, format, ...)' to output it.
4818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
4828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void
4838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectformat_packet(p, len, printer, arg)
4848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    u_char *p;
4858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int len;
4868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    void (*printer) __P((void *, char *, ...));
4878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    void *arg;
4888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
4898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int i, n;
4908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    u_short proto;
4918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    struct protent *protp;
4928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (len >= PPP_HDRLEN && p[0] == PPP_ALLSTATIONS && p[1] == PPP_UI) {
4948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	p += 2;
4958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	GETSHORT(proto, p);
4968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	len -= PPP_HDRLEN;
4978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for (i = 0; (protp = protocols[i]) != NULL; ++i)
4988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (proto == protp->protocol)
4998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
5008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (protp != NULL) {
5018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    printer(arg, "[%s", protp->name);
5028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    n = (*protp->printpkt)(p, len, printer, arg);
5038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    printer(arg, "]");
5048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    p += n;
5058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    len -= n;
5068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	} else {
5078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    for (i = 0; (protp = protocols[i]) != NULL; ++i)
5088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (proto == (protp->protocol & ~0x8000))
5098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    break;
5108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (protp != 0 && protp->data_name != 0) {
5118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		printer(arg, "[%s data]", protp->data_name);
5128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (len > 8)
5138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    printer(arg, "%.8B ...", p);
5148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else
5158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    printer(arg, "%.*B", len, p);
5168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		len = 0;
5178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    } else
5188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		printer(arg, "[proto=0x%x]", proto);
5198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
5208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
5218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (len > 32)
5238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	printer(arg, "%.32B ...", p);
5248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    else
5258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	printer(arg, "%.*B", len, p);
5268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
5278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
5298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * init_pr_log, end_pr_log - initialize and finish use of pr_log.
5308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
5318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char line[256];		/* line to be logged accumulated here */
5338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char *linep;		/* current pointer within line */
5348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int llevel;		/* level for logging */
5358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
5378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectinit_pr_log(prefix, level)
5388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project     char *prefix;
5398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project     int level;
5408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
5418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	linep = line;
5428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (prefix != NULL) {
5438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		strlcpy(line, prefix, sizeof(line));
5448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		linep = line + strlen(line);
5458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
5468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	llevel = level;
5478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
5488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
5508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectend_pr_log()
5518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
5528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (linep != line) {
5538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*linep = 0;
5548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		log_write(llevel, line);
5558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
5568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
5578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
5598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * pr_log - printer routine for outputting to syslog
5608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
5618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
5628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectpr_log __V((void *arg, char *fmt, ...))
5638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
5648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int l, n;
5658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	va_list pvar;
5668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char *p, *eol;
5678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char buf[256];
5688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__)
5708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	va_start(pvar, fmt);
5718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
5728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	void *arg;
5738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char *fmt;
5748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	va_start(pvar);
5758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	arg = va_arg(pvar, void *);
5768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fmt = va_arg(pvar, char *);
5778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
5788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	n = vslprintf(buf, sizeof(buf), fmt, pvar);
5808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	va_end(pvar);
5818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	p = buf;
5838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	eol = strchr(buf, '\n');
5848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (linep != line) {
5858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		l = (eol == NULL)? n: eol - buf;
5868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (linep + l < line + sizeof(line)) {
5878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (l > 0) {
5888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				memcpy(linep, buf, l);
5898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				linep += l;
5908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
5918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (eol == NULL)
5928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				return;
5938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			p = eol + 1;
5948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			eol = strchr(p, '\n');
5958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
5968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*linep = 0;
5978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		log_write(llevel, line);
5988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		linep = line;
5998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
6008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (eol != NULL) {
6028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*eol = 0;
6038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		log_write(llevel, p);
6048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		p = eol + 1;
6058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		eol = strchr(p, '\n');
6068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
6078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* assumes sizeof(buf) <= sizeof(line) */
6098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	l = buf + n - p;
6108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (l > 0) {
6118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		memcpy(line, p, n);
6128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		linep = line + l;
6138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
6148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
6158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
6178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * print_string - print a readable representation of a string using
6188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * printer.
6198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
6208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
6218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectprint_string(p, len, printer, arg)
6228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *p;
6238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int len;
6248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    void (*printer) __P((void *, char *, ...));
6258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    void *arg;
6268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
6278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int c;
6288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    printer(arg, "\"");
6308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    for (; len > 0; --len) {
6318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	c = *p++;
6328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (' ' <= c && c <= '~') {
6338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (c == '\\' || c == '"')
6348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		printer(arg, "\\");
6358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    printer(arg, "%c", c);
6368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	} else {
6378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    switch (c) {
6388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case '\n':
6398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		printer(arg, "\\n");
6408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
6418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case '\r':
6428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		printer(arg, "\\r");
6438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
6448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case '\t':
6458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		printer(arg, "\\t");
6468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
6478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    default:
6488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		printer(arg, "\\%.3o", c);
6498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
6508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
6518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
6528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    printer(arg, "\"");
6538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
6548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
655821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh/*
656821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh * logit - does the hard work for fatal et al.
657821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh */
658821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yehstatic void
659821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yehlogit(level, fmt, args)
660821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh    int level;
661821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh    char *fmt;
662821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh    va_list args;
663821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh{
664821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh    int n;
665821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh    char buf[1024];
666821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh
667821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh    n = vslprintf(buf, sizeof(buf), fmt, args);
668821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh    log_write(level, buf);
669821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh}
670673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh
671673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh#ifdef ANDROID_CHANGES
672673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh
673673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh#if LOG_PRIMASK != 7
674673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh#error Syslog.h has been changed! Please fix this table!
675673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh#endif
676673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh
677673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yehstatic int syslog_to_android[] = {
678673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh    [LOG_EMERG] = ANDROID_LOG_FATAL,
679673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh    [LOG_ALERT] = ANDROID_LOG_FATAL,
680673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh    [LOG_CRIT] = ANDROID_LOG_FATAL,
681673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh    [LOG_ERR] = ANDROID_LOG_ERROR,
682673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh    [LOG_WARNING] = ANDROID_LOG_WARN,
683673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh    [LOG_NOTICE] = ANDROID_LOG_INFO,
684673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh    [LOG_INFO] = ANDROID_LOG_INFO,
685673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh    [LOG_DEBUG] = ANDROID_LOG_DEBUG,
686673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh};
687673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh
688673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh#endif
689673ef9b9aa0a5ccf3041dae720d3a9175e8c5137Chia-chi Yeh
6908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void
6918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectlog_write(level, buf)
6928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int level;
6938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *buf;
6948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
695821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh#ifndef ANDROID_CHANGES
6968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    syslog(level, "%s", buf);
6978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fprintf(stderr, buf);
6998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (log_to_fd >= 0 && (level != LOG_DEBUG || debug)) {
7018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int n = strlen(buf);
7028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (n > 0 && buf[n-1] == '\n')
7048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    --n;
7058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (write(log_to_fd, buf, n) != n
7068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    || write(log_to_fd, "\n", 1) != 1)
7078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    log_to_fd = -1;
7088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
709821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh#else
710821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh    __android_log_write(syslog_to_android[level], LOG_TAG, buf);
711821c6079634ae728eda7a19e947a2c8f0dd1fdaaChia-chi Yeh#endif
7128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
7138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
7158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * fatal - log an error message and die horribly.
7168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
7178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
7188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectfatal __V((char *fmt, ...))
7198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
7208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list pvar;
7218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__)
7238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar, fmt);
7248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
7258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *fmt;
7268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar);
7278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fmt = va_arg(pvar, char *);
7288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
7298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    logit(LOG_ERR, fmt, pvar);
7318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_end(pvar);
7328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    die(1);			/* as promised */
7348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
7358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
7378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * error - log an error message.
7388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
7398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
7408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecterror __V((char *fmt, ...))
7418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
7428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list pvar;
7438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__)
7458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar, fmt);
7468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
7478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *fmt;
7488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar);
7498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fmt = va_arg(pvar, char *);
7508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
7518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    logit(LOG_ERR, fmt, pvar);
7538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_end(pvar);
7548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ++error_count;
7558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
7568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
7588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * warn - log a warning message.
7598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
7608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
7618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectwarn __V((char *fmt, ...))
7628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
7638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list pvar;
7648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__)
7668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar, fmt);
7678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
7688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *fmt;
7698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar);
7708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fmt = va_arg(pvar, char *);
7718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
7728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    logit(LOG_WARNING, fmt, pvar);
7748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_end(pvar);
7758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
7768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
7788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * notice - log a notice-level message.
7798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
7808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
7818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectnotice __V((char *fmt, ...))
7828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
7838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list pvar;
7848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__)
7868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar, fmt);
7878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
7888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *fmt;
7898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar);
7908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fmt = va_arg(pvar, char *);
7918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
7928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    logit(LOG_NOTICE, fmt, pvar);
7948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_end(pvar);
7958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
7968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
7988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * info - log an informational message.
7998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
8008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
8018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectinfo __V((char *fmt, ...))
8028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
8038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list pvar;
8048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__)
8068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar, fmt);
8078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
8088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *fmt;
8098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar);
8108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fmt = va_arg(pvar, char *);
8118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
8128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    logit(LOG_INFO, fmt, pvar);
8148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_end(pvar);
8158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
8168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
8188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * dbglog - log a debug message.
8198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
8208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
8218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdbglog __V((char *fmt, ...))
8228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
8238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list pvar;
8248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__)
8268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar, fmt);
8278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
8288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *fmt;
8298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(pvar);
8308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fmt = va_arg(pvar, char *);
8318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
8328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    logit(LOG_DEBUG, fmt, pvar);
8348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_end(pvar);
8358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
8368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
8388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * dump_packet - print out a packet in readable form if it is interesting.
8398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Assumes len >= PPP_HDRLEN.
8408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
8418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
8428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdump_packet(const char *tag, unsigned char *p, int len)
8438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
8448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int proto;
8458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (!debug)
8478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return;
8488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /*
8508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project     * don't print LCP echo request/reply packets if debug <= 1
8518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project     * and the link is up.
8528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project     */
8538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    proto = (p[2] << 8) + p[3];
8548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (debug <= 1 && unsuccess == 0 && proto == PPP_LCP
8558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	&& len >= PPP_HDRLEN + HEADERLEN) {
8568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	unsigned char *lcp = p + PPP_HDRLEN;
8578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int l = (lcp[2] << 8) + lcp[3];
8588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ((lcp[0] == ECHOREQ || lcp[0] == ECHOREP)
8608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    && l >= HEADERLEN && l <= len - PPP_HDRLEN)
8618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    return;
8628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
8638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    dbglog("%s %P", tag, p, len);
8658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
8668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
8688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * complete_read - read a full `count' bytes from fd,
8698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * unless end-of-file or an error other than EINTR is encountered.
8708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
8718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectssize_t
8728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectcomplete_read(int fd, void *buf, size_t count)
8738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
8748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	size_t done;
8758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	ssize_t nb;
8768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char *ptr = buf;
8778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for (done = 0; done < count; ) {
8798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		nb = read(fd, ptr, count - done);
8808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (nb < 0) {
8818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (errno == EINTR)
8828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				continue;
8838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			return -1;
8848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
8858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (nb == 0)
8868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
8878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		done += nb;
8888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		ptr += nb;
8898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
8908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return done;
8918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
8928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
8938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Procedures for locking the serial device using a lock file. */
8948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef LOCK_DIR
8958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef __linux__
8968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define LOCK_DIR	"/var/lock"
8978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
8988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef SVR4
8998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define LOCK_DIR	"/var/spool/locks"
9008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
9018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define LOCK_DIR	"/var/spool/lock"
9028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
9038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
9048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* LOCK_DIR */
9058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char lock_file[MAXPATHLEN];
9078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
9098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * lock - create a lock file for the named device
9108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
9118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint
9128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectlock(dev)
9138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *dev;
9148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
9158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef LOCKLIB
9168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int result;
9178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    result = mklock (dev, (void *) 0);
9198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (result == 0) {
9208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	strlcpy(lock_file, dev, sizeof(lock_file));
9218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return 0;
9228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
9238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (result > 0)
9258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project        notice("Device %s is locked by pid %d", dev, result);
9268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    else
9278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	error("Can't create lock file %s", lock_file);
9288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return -1;
9298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else /* LOCKLIB */
9318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char lock_buffer[12];
9338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int fd, pid, n;
9348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef SVR4
9368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    struct stat sbuf;
9378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (stat(dev, &sbuf) < 0) {
9398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	error("Can't get device number for %s: %m", dev);
9408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return -1;
9418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
9428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if ((sbuf.st_mode & S_IFMT) != S_IFCHR) {
9438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	error("Can't lock %s: not a character device", dev);
9448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return -1;
9458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
9468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    slprintf(lock_file, sizeof(lock_file), "%s/LK.%03d.%03d.%03d",
9478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	     LOCK_DIR, major(sbuf.st_dev),
9488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	     major(sbuf.st_rdev), minor(sbuf.st_rdev));
9498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
9508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char *p;
9518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char lockdev[MAXPATHLEN];
9528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if ((p = strstr(dev, "dev/")) != NULL) {
9548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	dev = p + 4;
9558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	strncpy(lockdev, dev, MAXPATHLEN-1);
9568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	lockdev[MAXPATHLEN-1] = 0;
9578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while ((p = strrchr(lockdev, '/')) != NULL) {
9588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    *p = '_';
9598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
9608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	dev = lockdev;
9618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    } else
9628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ((p = strrchr(dev, '/')) != NULL)
9638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    dev = p + 1;
9648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    slprintf(lock_file, sizeof(lock_file), "%s/LCK..%s", LOCK_DIR, dev);
9668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
9678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0) {
9698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (errno != EEXIST) {
9708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    error("Can't create lock file %s: %m", lock_file);
9718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
9728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
9738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* Read the lock file to find out who has the device locked. */
9758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fd = open(lock_file, O_RDONLY, 0);
9768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (fd < 0) {
9778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (errno == ENOENT) /* This is just a timing problem. */
9788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		continue;
9798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    error("Can't open existing lock file %s: %m", lock_file);
9808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
9818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
9828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef LOCK_BINARY
9838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	n = read(fd, lock_buffer, 11);
9848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
9858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	n = read(fd, &pid, sizeof(pid));
9868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* LOCK_BINARY */
9878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	close(fd);
9888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fd = -1;
9898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (n <= 0) {
9908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    error("Can't read pid from lock file %s", lock_file);
9918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
9928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
9938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
9948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* See if the process still exists. */
9958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef LOCK_BINARY
9968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	lock_buffer[n] = 0;
9978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pid = atoi(lock_buffer);
9988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* LOCK_BINARY */
9998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (pid == getpid())
10008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    return 1;		/* somebody else locked it for us */
10018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (pid == 0
10028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    || (kill(pid, 0) == -1 && errno == ESRCH)) {
10038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (unlink (lock_file) == 0) {
10048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		notice("Removed stale lock on %s (pid %d)", dev, pid);
10058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		continue;
10068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
10078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    warn("Couldn't remove stale lock on %s", dev);
10088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	} else
10098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    notice("Device %s is locked by pid %d", dev, pid);
10108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	break;
10118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
10128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
10138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (fd < 0) {
10148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	lock_file[0] = 0;
10158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return -1;
10168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
10178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
10188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    pid = getpid();
10198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef LOCK_BINARY
10208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    slprintf(lock_buffer, sizeof(lock_buffer), "%10d\n", pid);
10218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    write (fd, lock_buffer, 11);
10228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
10238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    write(fd, &pid, sizeof (pid));
10248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
10258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    close(fd);
10268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return 0;
10278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
10288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
10298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
10308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
10318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
10328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * relock - called to update our lockfile when we are about to detach,
10338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * thus changing our pid (we fork, the child carries on, and the parent dies).
10348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Note that this is called by the parent, with pid equal to the pid
10358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * of the child.  This avoids a potential race which would exist if
10368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * we had the child rewrite the lockfile (the parent might die first,
10378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and another process could think the lock was stale if it checked
10388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * between when the parent died and the child rewrote the lockfile).
10398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
10408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint
10418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectrelock(pid)
10428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int pid;
10438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
10448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef LOCKLIB
10458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* XXX is there a way to do this? */
10468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return -1;
10478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else /* LOCKLIB */
10488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
10498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int fd;
10508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char lock_buffer[12];
10518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
10528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (lock_file[0] == 0)
10538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return -1;
10548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fd = open(lock_file, O_WRONLY, 0);
10558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (fd < 0) {
10568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	error("Couldn't reopen lock file %s: %m", lock_file);
10578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	lock_file[0] = 0;
10588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return -1;
10598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
10608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
10618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef LOCK_BINARY
10628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    slprintf(lock_buffer, sizeof(lock_buffer), "%10d\n", pid);
10638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    write (fd, lock_buffer, 11);
10648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
10658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    write(fd, &pid, sizeof(pid));
10668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* LOCK_BINARY */
10678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    close(fd);
10688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return 0;
10698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
10708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* LOCKLIB */
10718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
10728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
10738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
10748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * unlock - remove our lockfile
10758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
10768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
10778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunlock()
10788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
10798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (lock_file[0]) {
10808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef LOCKLIB
10818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	(void) rmlock(lock_file, (void *) 0);
10828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
10838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	unlink(lock_file);
10848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
10858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	lock_file[0] = 0;
10868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
10878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
10888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1089