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