defs.c revision 59084
131921Sbrian/*- 231921Sbrian * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 331921Sbrian * All rights reserved. 431921Sbrian * 531921Sbrian * Redistribution and use in source and binary forms, with or without 631921Sbrian * modification, are permitted provided that the following conditions 731921Sbrian * are met: 831921Sbrian * 1. Redistributions of source code must retain the above copyright 931921Sbrian * notice, this list of conditions and the following disclaimer. 1031921Sbrian * 2. Redistributions in binary form must reproduce the above copyright 1131921Sbrian * notice, this list of conditions and the following disclaimer in the 1231921Sbrian * documentation and/or other materials provided with the distribution. 1331921Sbrian * 1431921Sbrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1531921Sbrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1631921Sbrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1731921Sbrian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1831921Sbrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1931921Sbrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2031921Sbrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2131921Sbrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2231921Sbrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2331921Sbrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2431921Sbrian * SUCH DAMAGE. 2531921Sbrian * 2650479Speter * $FreeBSD: head/usr.sbin/ppp/defs.c 59084 2000-04-07 23:46:14Z brian $ 2730715Sbrian */ 2830715Sbrian 2931196Sbrian 3044279Sbrian#include <sys/types.h> 3144279Sbrian#include <netdb.h> 3244279Sbrian#include <netinet/in.h> 3344279Sbrian#include <arpa/inet.h> 3444279Sbrian#include <sys/socket.h> 3544279Sbrian 3644279Sbrian#include <ctype.h> 3746085Sbrian#include <errno.h> 3858034Sbrian#include <stdio.h> 3930715Sbrian#include <stdlib.h> 4031121Sbrian#include <string.h> 4146686Sbrian#include <termios.h> 4237192Sbrian#if !defined(__FreeBSD__) || __FreeBSD__ < 3 4334539Sbrian#include <time.h> 4437192Sbrian#endif 4531196Sbrian#include <unistd.h> 4630715Sbrian 4730715Sbrian#include "defs.h" 4830715Sbrian 4946686Sbrian#define issep(c) ((c) == '\t' || (c) == ' ') 5046686Sbrian 5130715Sbrianvoid 5230715Sbrianrandinit() 5330715Sbrian{ 5436453Sbrian#if __FreeBSD__ >= 3 5537010Sbrian static int initdone; /* srandomdev() call is only required once */ 5630715Sbrian 5730715Sbrian if (!initdone) { 5830715Sbrian initdone = 1; 5930715Sbrian srandomdev(); 6030715Sbrian } 6131343Sbrian#else 6236285Sbrian srandom((time(NULL)^getpid())+random()); 6331343Sbrian#endif 6430715Sbrian} 6531196Sbrian 6636285Sbrianssize_t 6736285Sbrianfullread(int fd, void *v, size_t n) 6836285Sbrian{ 6936285Sbrian size_t got, total; 7031196Sbrian 7136285Sbrian for (total = 0; total < n; total += got) 7236285Sbrian switch ((got = read(fd, (char *)v + total, n - total))) { 7336285Sbrian case 0: 7436285Sbrian return total; 7536285Sbrian case -1: 7636285Sbrian if (errno == EINTR) 7736285Sbrian got = 0; 7836285Sbrian else 7936285Sbrian return -1; 8036285Sbrian } 8136285Sbrian return total; 8236285Sbrian} 8336285Sbrian 8436285Sbrianstatic struct { 8536285Sbrian int mode; 8636285Sbrian const char *name; 8736285Sbrian} modes[] = { 8836465Sbrian { PHYS_INTERACTIVE, "interactive" }, 8936465Sbrian { PHYS_AUTO, "auto" }, 9036285Sbrian { PHYS_DIRECT, "direct" }, 9136285Sbrian { PHYS_DEDICATED, "dedicated" }, 9236465Sbrian { PHYS_DDIAL, "ddial" }, 9336465Sbrian { PHYS_BACKGROUND, "background" }, 9453830Sbrian { PHYS_FOREGROUND, "foreground" }, 9536285Sbrian { PHYS_ALL, "*" }, 9636285Sbrian { 0, 0 } 9736285Sbrian}; 9836285Sbrian 9936285Sbrianconst char * 10036285Sbrianmode2Nam(int mode) 10131196Sbrian{ 10236285Sbrian int m; 10331196Sbrian 10436285Sbrian for (m = 0; modes[m].mode; m++) 10536285Sbrian if (modes[m].mode == mode) 10636285Sbrian return modes[m].name; 10731196Sbrian 10836285Sbrian return "unknown"; 10931196Sbrian} 11031203Sbrian 11136285Sbrianint 11236285SbrianNam2mode(const char *name) 11331203Sbrian{ 11436285Sbrian int m, got, len; 11531203Sbrian 11636285Sbrian len = strlen(name); 11736285Sbrian got = -1; 11836285Sbrian for (m = 0; modes[m].mode; m++) 11936285Sbrian if (!strncasecmp(name, modes[m].name, len)) { 12036285Sbrian if (modes[m].name[len] == '\0') 12136285Sbrian return modes[m].mode; 12236285Sbrian if (got != -1) 12336285Sbrian return 0; 12436285Sbrian got = m; 12536285Sbrian } 12636285Sbrian 12736285Sbrian return got == -1 ? 0 : modes[got].mode; 12831203Sbrian} 12944279Sbrian 13044279Sbrianstruct in_addr 13144279SbrianGetIpAddr(const char *cp) 13244279Sbrian{ 13344279Sbrian struct in_addr ipaddr; 13444279Sbrian 13544279Sbrian if (!strcasecmp(cp, "default")) 13644279Sbrian ipaddr.s_addr = INADDR_ANY; 13744279Sbrian else if (inet_aton(cp, &ipaddr) == 0) { 13844279Sbrian const char *ptr; 13944279Sbrian 14044279Sbrian /* Any illegal characters ? */ 14144279Sbrian for (ptr = cp; *ptr != '\0'; ptr++) 14244279Sbrian if (!isalnum(*ptr) && strchr("-.", *ptr) == NULL) 14344279Sbrian break; 14444279Sbrian 14544279Sbrian if (*ptr == '\0') { 14644279Sbrian struct hostent *hp; 14744279Sbrian 14844279Sbrian hp = gethostbyname(cp); 14944279Sbrian if (hp && hp->h_addrtype == AF_INET) 15044279Sbrian memcpy(&ipaddr, hp->h_addr, hp->h_length); 15144279Sbrian else 15244279Sbrian ipaddr.s_addr = INADDR_NONE; 15344279Sbrian } else 15444279Sbrian ipaddr.s_addr = INADDR_NONE; 15544279Sbrian } 15644279Sbrian 15744279Sbrian return ipaddr; 15844279Sbrian} 15946686Sbrian 16046686Sbrianstatic const struct speeds { 16146686Sbrian int nspeed; 16246686Sbrian speed_t speed; 16346686Sbrian} speeds[] = { 16446686Sbrian#ifdef B50 16546686Sbrian { 50, B50, }, 16646686Sbrian#endif 16746686Sbrian#ifdef B75 16846686Sbrian { 75, B75, }, 16946686Sbrian#endif 17046686Sbrian#ifdef B110 17146686Sbrian { 110, B110, }, 17246686Sbrian#endif 17346686Sbrian#ifdef B134 17446686Sbrian { 134, B134, }, 17546686Sbrian#endif 17646686Sbrian#ifdef B150 17746686Sbrian { 150, B150, }, 17846686Sbrian#endif 17946686Sbrian#ifdef B200 18046686Sbrian { 200, B200, }, 18146686Sbrian#endif 18246686Sbrian#ifdef B300 18346686Sbrian { 300, B300, }, 18446686Sbrian#endif 18546686Sbrian#ifdef B600 18646686Sbrian { 600, B600, }, 18746686Sbrian#endif 18846686Sbrian#ifdef B1200 18946686Sbrian { 1200, B1200, }, 19046686Sbrian#endif 19146686Sbrian#ifdef B1800 19246686Sbrian { 1800, B1800, }, 19346686Sbrian#endif 19446686Sbrian#ifdef B2400 19546686Sbrian { 2400, B2400, }, 19646686Sbrian#endif 19746686Sbrian#ifdef B4800 19846686Sbrian { 4800, B4800, }, 19946686Sbrian#endif 20046686Sbrian#ifdef B9600 20146686Sbrian { 9600, B9600, }, 20246686Sbrian#endif 20346686Sbrian#ifdef B19200 20446686Sbrian { 19200, B19200, }, 20546686Sbrian#endif 20646686Sbrian#ifdef B38400 20746686Sbrian { 38400, B38400, }, 20846686Sbrian#endif 20946686Sbrian#ifndef _POSIX_SOURCE 21046686Sbrian#ifdef B7200 21146686Sbrian { 7200, B7200, }, 21246686Sbrian#endif 21346686Sbrian#ifdef B14400 21446686Sbrian { 14400, B14400, }, 21546686Sbrian#endif 21646686Sbrian#ifdef B28800 21746686Sbrian { 28800, B28800, }, 21846686Sbrian#endif 21946686Sbrian#ifdef B57600 22046686Sbrian { 57600, B57600, }, 22146686Sbrian#endif 22246686Sbrian#ifdef B76800 22346686Sbrian { 76800, B76800, }, 22446686Sbrian#endif 22546686Sbrian#ifdef B115200 22646686Sbrian { 115200, B115200, }, 22746686Sbrian#endif 22846686Sbrian#ifdef B230400 22946686Sbrian { 230400, B230400, }, 23046686Sbrian#endif 23146686Sbrian#ifdef EXTA 23246686Sbrian { 19200, EXTA, }, 23346686Sbrian#endif 23446686Sbrian#ifdef EXTB 23546686Sbrian { 38400, EXTB, }, 23646686Sbrian#endif 23746686Sbrian#endif /* _POSIX_SOURCE */ 23846686Sbrian { 0, 0 } 23946686Sbrian}; 24046686Sbrian 24146686Sbrianint 24246686SbrianSpeedToInt(speed_t speed) 24346686Sbrian{ 24446686Sbrian const struct speeds *sp; 24546686Sbrian 24646686Sbrian for (sp = speeds; sp->nspeed; sp++) { 24746686Sbrian if (sp->speed == speed) { 24846686Sbrian return sp->nspeed; 24946686Sbrian } 25046686Sbrian } 25146686Sbrian return 0; 25246686Sbrian} 25346686Sbrian 25446686Sbrianspeed_t 25546686SbrianIntToSpeed(int nspeed) 25646686Sbrian{ 25746686Sbrian const struct speeds *sp; 25846686Sbrian 25946686Sbrian for (sp = speeds; sp->nspeed; sp++) { 26046686Sbrian if (sp->nspeed == nspeed) { 26146686Sbrian return sp->speed; 26246686Sbrian } 26346686Sbrian } 26446686Sbrian return B0; 26546686Sbrian} 26646686Sbrian 26754915Sbrianchar * 26855145Sbrianfindblank(char *p, int flags) 26946686Sbrian{ 27055065Sbrian int instring; 27155065Sbrian 27255065Sbrian instring = 0; 27354915Sbrian while (*p) { 27454915Sbrian if (*p == '\\') { 27555145Sbrian if (flags & PARSE_REDUCE) { 27655013Sbrian memmove(p, p + 1, strlen(p)); 27755013Sbrian if (!*p) 27855013Sbrian break; 27955013Sbrian } else 28055013Sbrian p++; 28155065Sbrian } else if (*p == '"') { 28255065Sbrian memmove(p, p + 1, strlen(p)); 28355065Sbrian instring = !instring; 28455065Sbrian continue; 28555145Sbrian } else if (!instring && (issep(*p) || 28655145Sbrian (*p == '#' && !(flags & PARSE_NOHASH)))) 28754915Sbrian return p; 28854915Sbrian p++; 28946686Sbrian } 29046686Sbrian 29154915Sbrian return instring ? NULL : p; 29246686Sbrian} 29346686Sbrian 29446686Sbrianint 29555145SbrianMakeArgs(char *script, char **pvect, int maxargs, int flags) 29646686Sbrian{ 29755065Sbrian int nargs; 29846686Sbrian 29946686Sbrian nargs = 0; 30058745Sbrian while (*script && (*script != '#' || (flags & PARSE_NOHASH))) { 30155065Sbrian script += strspn(script, " \t"); 30246686Sbrian if (*script) { 30346686Sbrian if (nargs >= maxargs - 1) 30446686Sbrian break; 30546686Sbrian *pvect++ = script; 30646686Sbrian nargs++; 30755145Sbrian script = findblank(script, flags); 30854914Sbrian if (script == NULL) 30954914Sbrian return -1; 31058745Sbrian else if (!(flags & PARSE_NOHASH) && *script == '#') 31154915Sbrian *script = '\0'; 31254914Sbrian else if (*script) 31346686Sbrian *script++ = '\0'; 31446686Sbrian } 31546686Sbrian } 31646686Sbrian *pvect = NULL; 31746686Sbrian return nargs; 31846686Sbrian} 31958034Sbrian 32058034Sbrianconst char * 32158034SbrianNumStr(long val, char *buf, size_t sz) 32258034Sbrian{ 32358034Sbrian static char result[23]; /* handles 64 bit numbers */ 32458034Sbrian 32558034Sbrian if (buf == NULL || sz == 0) { 32658034Sbrian buf = result; 32758034Sbrian sz = sizeof result; 32858034Sbrian } 32958034Sbrian snprintf(buf, sz, "<%ld>", val); 33058034Sbrian return buf; 33158034Sbrian} 33258034Sbrian 33358034Sbrianconst char * 33458034SbrianHexStr(long val, char *buf, size_t sz) 33558034Sbrian{ 33658034Sbrian static char result[21]; /* handles 64 bit numbers */ 33758034Sbrian 33858034Sbrian if (buf == NULL || sz == 0) { 33958034Sbrian buf = result; 34058034Sbrian sz = sizeof result; 34158034Sbrian } 34258034Sbrian snprintf(buf, sz, "<0x%lx>", val); 34358034Sbrian return buf; 34458034Sbrian} 34559084Sbrian 34659084Sbrianconst char * 34759084Sbrianex_desc(int ex) 34859084Sbrian{ 34959084Sbrian static char num[12]; /* Used immediately if returned */ 35059084Sbrian static const char * const desc[] = { 35159084Sbrian "normal", "start", "sock", "modem", "dial", "dead", "done", 35259084Sbrian "reboot", "errdead", "hangup", "term", "nodial", "nologin", 35359084Sbrian "redial", "reconnect" 35459084Sbrian }; 35559084Sbrian 35659084Sbrian if (ex >= 0 && ex < sizeof desc / sizeof *desc) 35759084Sbrian return desc[ex]; 35859084Sbrian snprintf(num, sizeof num, "%d", ex); 35959084Sbrian return num; 36059084Sbrian} 361