1706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh/*- 2706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * All rights reserved. 4706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 5706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Redistribution and use in source and binary forms, with or without 6706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * modification, are permitted provided that the following conditions 7706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * are met: 8706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 1. Redistributions of source code must retain the above copyright 9706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * notice, this list of conditions and the following disclaimer. 10706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 2. Redistributions in binary form must reproduce the above copyright 11706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * notice, this list of conditions and the following disclaimer in the 12706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * documentation and/or other materials provided with the distribution. 13706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 14706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * SUCH DAMAGE. 25706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 26706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * $FreeBSD: src/usr.sbin/ppp/defs.c,v 1.48.26.1 2010/12/21 17:10:29 kensmith Exp $ 27706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh */ 28706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 29706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 30706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/param.h> 31706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <netdb.h> 32706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <netinet/in.h> 33706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <arpa/inet.h> 34706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/socket.h> 35706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 36706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <ctype.h> 37706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <errno.h> 38706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <stdarg.h> 39706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <stdio.h> 40706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <stdlib.h> 41706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <string.h> 42706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#if defined(__FreeBSD__) && !defined(NOKLDLOAD) 43706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/module.h> 44706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 45706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <termios.h> 46706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#if !defined(__FreeBSD__) || __FreeBSD__ < 3 47706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <time.h> 48706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 49706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <unistd.h> 50706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 51706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#if defined(__FreeBSD__) && !defined(NOKLDLOAD) 52706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "id.h" 53706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "log.h" 54706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 55706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "defs.h" 56706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 57706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define issep(c) ((c) == '\t' || (c) == ' ') 58706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 59706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#if defined(__NetBSD__) || __FreeBSD__ < 3 60706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid 61706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehrandinit() 62706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 63706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#if defined(__FreeBSD__) 64706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh static int initdone; /* srandomdev() call is only required once */ 65706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 66706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!initdone) { 67706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh initdone = 1; 68706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh srandomdev(); 69706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 70706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#else 71706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh srandom((time(NULL)^getpid())+random()); 72706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 73706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 74706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 75706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 76706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehssize_t 77706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehfullread(int fd, void *v, size_t n) 78706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 79706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh size_t got, total; 80706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 81706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (total = 0; total < n; total += got) 82706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh switch ((got = read(fd, (char *)v + total, n - total))) { 83706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh case 0: 84706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return total; 85706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh case -1: 86706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (errno == EINTR) 87706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh got = 0; 88706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else 89706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return -1; 90706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 91706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return total; 92706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 93706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 94706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic struct { 95706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int mode; 96706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh const char *name; 97706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} modes[] = { 98706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { PHYS_INTERACTIVE, "interactive" }, 99706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { PHYS_AUTO, "auto" }, 100706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { PHYS_DIRECT, "direct" }, 101706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { PHYS_DEDICATED, "dedicated" }, 102706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { PHYS_DDIAL, "ddial" }, 103706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { PHYS_BACKGROUND, "background" }, 104706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { PHYS_FOREGROUND, "foreground" }, 105706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { PHYS_ALL, "*" }, 106706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 0, 0 } 107706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}; 108706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 109706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehconst char * 110706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehmode2Nam(int mode) 111706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 112706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int m; 113706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 114706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (m = 0; modes[m].mode; m++) 115706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (modes[m].mode == mode) 116706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return modes[m].name; 117706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 118706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return "unknown"; 119706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 120706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 121706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint 122706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehNam2mode(const char *name) 123706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 124706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int m, got, len; 125706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 126706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh len = strlen(name); 127706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh got = -1; 128706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (m = 0; modes[m].mode; m++) 129706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!strncasecmp(name, modes[m].name, len)) { 130706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (modes[m].name[len] == '\0') 131706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return modes[m].mode; 132706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (got != -1) 133706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 134706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh got = m; 135706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 136706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 137706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return got == -1 ? 0 : modes[got].mode; 138706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 139706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 140706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct in_addr 141706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehGetIpAddr(const char *cp) 142706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 143706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct in_addr ipaddr; 144706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 145706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!strcasecmp(cp, "default")) 146706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ipaddr.s_addr = INADDR_ANY; 147706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else if (inet_aton(cp, &ipaddr) == 0) { 148706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh const char *ptr; 149706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 150706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh /* Any illegal characters ? */ 151706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (ptr = cp; *ptr != '\0'; ptr++) 152706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!isalnum(*ptr) && strchr("-.", *ptr) == NULL) 153706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 154706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 155706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (*ptr == '\0') { 156706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct hostent *hp; 157706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 158706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh hp = gethostbyname(cp); 159706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (hp && hp->h_addrtype == AF_INET) 160706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh memcpy(&ipaddr, hp->h_addr, hp->h_length); 161706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else 162706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ipaddr.s_addr = INADDR_NONE; 163706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else 164706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ipaddr.s_addr = INADDR_NONE; 165706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 166706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 167706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return ipaddr; 168706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 169706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 170706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic const struct speeds { 171706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unsigned nspeed; 172706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh speed_t speed; 173706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} speeds[] = { 174706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B50 175706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 50, B50, }, 176706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 177706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B75 178706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 75, B75, }, 179706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 180706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B110 181706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 110, B110, }, 182706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 183706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B134 184706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 134, B134, }, 185706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 186706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B150 187706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 150, B150, }, 188706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 189706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B200 190706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 200, B200, }, 191706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 192706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B300 193706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 300, B300, }, 194706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 195706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B600 196706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 600, B600, }, 197706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 198706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B1200 199706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 1200, B1200, }, 200706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 201706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B1800 202706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 1800, B1800, }, 203706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 204706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B2400 205706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 2400, B2400, }, 206706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 207706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B4800 208706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 4800, B4800, }, 209706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 210706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B9600 211706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 9600, B9600, }, 212706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 213706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B19200 214706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 19200, B19200, }, 215706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 216706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B38400 217706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 38400, B38400, }, 218706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 219706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifndef _POSIX_SOURCE 220706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B7200 221706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 7200, B7200, }, 222706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 223706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B14400 224706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 14400, B14400, }, 225706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 226706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B28800 227706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 28800, B28800, }, 228706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 229706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B57600 230706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 57600, B57600, }, 231706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 232706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B76800 233706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 76800, B76800, }, 234706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 235706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B115200 236706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 115200, B115200, }, 237706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 238706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B230400 239706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 230400, B230400, }, 240706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 241706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B460800 242706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 460800, B460800, }, 243706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 244706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef B921600 245706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 921600, B921600, }, 246706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 247706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef EXTA 248706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 19200, EXTA, }, 249706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 250706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef EXTB 251706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 38400, EXTB, }, 252706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 253706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif /* _POSIX_SOURCE */ 254706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 0, 0 } 255706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}; 256706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 257706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehunsigned 258706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehSpeedToUnsigned(speed_t speed) 259706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 260706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh const struct speeds *sp; 261706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 262706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (sp = speeds; sp->nspeed; sp++) { 263706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (sp->speed == speed) { 264706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return sp->nspeed; 265706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 266706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 267706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 268706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 269706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 270706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehspeed_t 271706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehUnsignedToSpeed(unsigned nspeed) 272706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 273706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh const struct speeds *sp; 274706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 275706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (sp = speeds; sp->nspeed; sp++) { 276706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (sp->nspeed == nspeed) { 277706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return sp->speed; 278706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 279706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 280706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return B0; 281706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 282706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 283706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehchar * 284706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehfindblank(char *p, int flags) 285706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 286706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int instring; 287706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 288706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh instring = 0; 289706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh while (*p) { 290706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (*p == '\\') { 291706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (flags & PARSE_REDUCE) { 292706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh memmove(p, p + 1, strlen(p)); 293706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!*p) 294706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 295706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else 296706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh p++; 297706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else if (*p == '"') { 298706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh memmove(p, p + 1, strlen(p)); 299706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh instring = !instring; 300706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh continue; 301706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else if (!instring && (issep(*p) || 302706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh (*p == '#' && !(flags & PARSE_NOHASH)))) 303706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return p; 304706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh p++; 305706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 306706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 307706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return instring ? NULL : p; 308706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 309706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 310706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint 311706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehMakeArgs(char *script, char **pvect, int maxargs, int flags) 312706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 313706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int nargs; 314706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 315706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh nargs = 0; 316706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh while (*script) { 317706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh script += strspn(script, " \t"); 318706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (*script == '#' && !(flags & PARSE_NOHASH)) { 319706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *script = '\0'; 320706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 321706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 322706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (*script) { 323706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (nargs >= maxargs - 1) 324706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 325706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *pvect++ = script; 326706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh nargs++; 327706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh script = findblank(script, flags); 328706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (script == NULL) 329706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return -1; 330706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else if (!(flags & PARSE_NOHASH) && *script == '#') 331706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *script = '\0'; 332706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else if (*script) 333706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *script++ = '\0'; 334706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 335706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 336706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *pvect = NULL; 337706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return nargs; 338706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 339706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 340706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehconst char * 341706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehNumStr(long val, char *buf, size_t sz) 342706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 343706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh static char result[23]; /* handles 64 bit numbers */ 344706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 345706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (buf == NULL || sz == 0) { 346706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh buf = result; 347706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sz = sizeof result; 348706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 349706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh snprintf(buf, sz, "<%ld>", val); 350706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return buf; 351706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 352706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 353706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehconst char * 354706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehHexStr(long val, char *buf, size_t sz) 355706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 356706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh static char result[21]; /* handles 64 bit numbers */ 357706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 358706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (buf == NULL || sz == 0) { 359706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh buf = result; 360706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sz = sizeof result; 361706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 362706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh snprintf(buf, sz, "<0x%lx>", val); 363706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return buf; 364706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 365706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 366706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehconst char * 367706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehex_desc(int ex) 368706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 369706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh static char num[12]; /* Used immediately if returned */ 370706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh static const char * const desc[] = { 371706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh "normal", "start", "sock", "modem", "dial", "dead", "done", 372706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh "reboot", "errdead", "hangup", "term", "nodial", "nologin", 373706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh "redial", "reconnect" 374706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh }; 375706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 376706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (ex >= 0 && ex < (int)(sizeof desc / sizeof *desc)) 377706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return desc[ex]; 378706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh snprintf(num, sizeof num, "%d", ex); 379706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return num; 380706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 381706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 382706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid 383706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehSetTitle(const char *title) 384706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 385706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (title == NULL) 386706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh setproctitle(NULL); 387706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else if (title[0] == '-' && title[1] != '\0') 388706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh setproctitle("-%s", title + 1); 389706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else 390706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh setproctitle("%s", title); 391706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 392706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 393706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehfd_set * 394706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehmkfdset() 395706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 396706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return (fd_set *)malloc(howmany(getdtablesize(), NFDBITS) * sizeof (fd_mask)); 397706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 398706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 399706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid 400706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehzerofdset(fd_set *s) 401706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 402706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh memset(s, '\0', howmany(getdtablesize(), NFDBITS) * sizeof (fd_mask)); 403706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 404706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 405706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid 406706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehConcatinate(char *buf, size_t sz, int argc, const char *const *argv) 407706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 408706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int i, n; 409706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unsigned pos; 410706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 411706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *buf = '\0'; 412706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (pos = i = 0; i < argc; i++) { 413706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh n = snprintf(buf + pos, sz - pos, "%s%s", i ? " " : "", argv[i]); 414706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (n < 0) { 415706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh buf[pos] = '\0'; 416706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 417706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 418706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if ((pos += n) >= sz) 419706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 420706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 421706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 422706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 423706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#if defined(__FreeBSD__) && !defined(NOKLDLOAD) 424706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint 425706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehloadmodules(int how, const char *module, ...) 426706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 427706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int loaded = 0; 428706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh va_list ap; 429706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 430706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh va_start(ap, module); 431706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh while (module != NULL) { 432706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (modfind(module) == -1) { 433706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (ID0kldload(module) == -1) { 434706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (how == LOAD_VERBOSLY) 435706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogWARN, "%s: Cannot load module\n", module); 436706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else 437706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh loaded++; 438706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 439706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh module = va_arg(ap, const char *); 440706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 441706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh va_end(ap); 442706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return loaded; 443706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 444706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#else 445706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint 446706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehloadmodules(int how __unused, const char *module __unused, ...) 447706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 448706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 449706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 450706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 451