utils.c revision 6c569d212164aa9334e27abac8884a3d13999420
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