xref: /freebsd/usr.sbin/ppp/defs.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1c39934eaSBrian Somers /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
31de7b4b8SPedro F. Giffuni  *
4c39934eaSBrian Somers  * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
5c39934eaSBrian Somers  * All rights reserved.
6c39934eaSBrian Somers  *
7c39934eaSBrian Somers  * Redistribution and use in source and binary forms, with or without
8c39934eaSBrian Somers  * modification, are permitted provided that the following conditions
9c39934eaSBrian Somers  * are met:
10c39934eaSBrian Somers  * 1. Redistributions of source code must retain the above copyright
11c39934eaSBrian Somers  *    notice, this list of conditions and the following disclaimer.
12c39934eaSBrian Somers  * 2. Redistributions in binary form must reproduce the above copyright
13c39934eaSBrian Somers  *    notice, this list of conditions and the following disclaimer in the
14c39934eaSBrian Somers  *    documentation and/or other materials provided with the distribution.
15c39934eaSBrian Somers  *
16c39934eaSBrian Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17c39934eaSBrian Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18c39934eaSBrian Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19c39934eaSBrian Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20c39934eaSBrian Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21c39934eaSBrian Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22c39934eaSBrian Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23c39934eaSBrian Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24c39934eaSBrian Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25c39934eaSBrian Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26c39934eaSBrian Somers  * SUCH DAMAGE.
2775240ed1SBrian Somers  */
2875240ed1SBrian Somers 
29c7d4711fSBrian Somers 
30fb11a9c2SBrian Somers #include <sys/param.h>
3126baedc5SBrian Somers #include <netdb.h>
3226baedc5SBrian Somers #include <netinet/in.h>
3326baedc5SBrian Somers #include <arpa/inet.h>
3426baedc5SBrian Somers #include <sys/socket.h>
3526baedc5SBrian Somers 
3626baedc5SBrian Somers #include <ctype.h>
37119386a3SBrian Somers #include <errno.h>
38fb11a9c2SBrian Somers #include <stdarg.h>
39d6d3eeabSBrian Somers #include <stdio.h>
4075240ed1SBrian Somers #include <stdlib.h>
4112ef29a8SBrian Somers #include <string.h>
42fb11a9c2SBrian Somers #if defined(__FreeBSD__) && !defined(NOKLDLOAD)
43fb11a9c2SBrian Somers #include <sys/module.h>
44fb11a9c2SBrian Somers #endif
455d9e6103SBrian Somers #include <termios.h>
46fe24bdd4SRobert Millan #ifndef __FreeBSD__
471baf8750SBrian Somers #include <time.h>
4810a9be1eSBrian Somers #endif
49c7d4711fSBrian Somers #include <unistd.h>
5075240ed1SBrian Somers 
51fb11a9c2SBrian Somers #if defined(__FreeBSD__) && !defined(NOKLDLOAD)
52fb11a9c2SBrian Somers #include "id.h"
53fb11a9c2SBrian Somers #include "log.h"
54fb11a9c2SBrian Somers #endif
5575240ed1SBrian Somers #include "defs.h"
5675240ed1SBrian Somers 
575d9e6103SBrian Somers #define	issep(c)	((c) == '\t' || (c) == ' ')
585d9e6103SBrian Somers 
59fe24bdd4SRobert Millan #ifdef __NetBSD__
6075240ed1SBrian Somers void
randinit()6175240ed1SBrian Somers randinit()
6275240ed1SBrian Somers {
631bc9b5baSBrian Somers   srandom((time(NULL)^getpid())+random());
6475240ed1SBrian Somers }
658507c35eSBrian Somers #endif
66c7d4711fSBrian Somers 
676f384573SBrian Somers ssize_t
fullread(int fd,void * v,size_t n)686f384573SBrian Somers fullread(int fd, void *v, size_t n)
696f384573SBrian Somers {
706f384573SBrian Somers   size_t got, total;
716f384573SBrian Somers 
726f384573SBrian Somers   for (total = 0; total < n; total += got)
736f384573SBrian Somers     switch ((got = read(fd, (char *)v + total, n - total))) {
746f384573SBrian Somers       case 0:
756f384573SBrian Somers         return total;
766f384573SBrian Somers       case -1:
776f384573SBrian Somers         if (errno == EINTR)
786f384573SBrian Somers           got = 0;
796f384573SBrian Somers         else
806f384573SBrian Somers           return -1;
816f384573SBrian Somers     }
826f384573SBrian Somers   return total;
836f384573SBrian Somers }
84dd0645c5SBrian Somers 
85dd0645c5SBrian Somers static struct {
86dd0645c5SBrian Somers   int mode;
87dd0645c5SBrian Somers   const char *name;
88dd0645c5SBrian Somers } modes[] = {
8981358fa3SBrian Somers   { PHYS_INTERACTIVE, "interactive" },
9081358fa3SBrian Somers   { PHYS_AUTO, "auto" },
91dd0645c5SBrian Somers   { PHYS_DIRECT, "direct" },
92dd0645c5SBrian Somers   { PHYS_DEDICATED, "dedicated" },
9381358fa3SBrian Somers   { PHYS_DDIAL, "ddial" },
9481358fa3SBrian Somers   { PHYS_BACKGROUND, "background" },
95f6a4e748SBrian Somers   { PHYS_FOREGROUND, "foreground" },
96dd0645c5SBrian Somers   { PHYS_ALL, "*" },
97dd0645c5SBrian Somers   { 0, 0 }
98dd0645c5SBrian Somers };
99dd0645c5SBrian Somers 
100dd0645c5SBrian Somers const char *
mode2Nam(int mode)101dd0645c5SBrian Somers mode2Nam(int mode)
102dd0645c5SBrian Somers {
103dd0645c5SBrian Somers   int m;
104dd0645c5SBrian Somers 
105dd0645c5SBrian Somers   for (m = 0; modes[m].mode; m++)
106dd0645c5SBrian Somers     if (modes[m].mode == mode)
107dd0645c5SBrian Somers       return modes[m].name;
108dd0645c5SBrian Somers 
109dd0645c5SBrian Somers   return "unknown";
110dd0645c5SBrian Somers }
111c7d4711fSBrian Somers 
112c7d4711fSBrian Somers int
Nam2mode(const char * name)113dd0645c5SBrian Somers Nam2mode(const char *name)
114c7d4711fSBrian Somers {
115dd0645c5SBrian Somers   int m, got, len;
116c7d4711fSBrian Somers 
117dd0645c5SBrian Somers   len = strlen(name);
118dd0645c5SBrian Somers   got = -1;
119dd0645c5SBrian Somers   for (m = 0; modes[m].mode; m++)
120dd0645c5SBrian Somers     if (!strncasecmp(name, modes[m].name, len)) {
121dd0645c5SBrian Somers       if (modes[m].name[len] == '\0')
122dd0645c5SBrian Somers 	return modes[m].mode;
123dd0645c5SBrian Somers       if (got != -1)
124c7d4711fSBrian Somers         return 0;
125dd0645c5SBrian Somers       got = m;
126c7d4711fSBrian Somers     }
127c7d4711fSBrian Somers 
128dd0645c5SBrian Somers   return got == -1 ? 0 : modes[got].mode;
1293b7eb4fbSBrian Somers }
13026baedc5SBrian Somers 
13126baedc5SBrian Somers struct in_addr
GetIpAddr(const char * cp)13226baedc5SBrian Somers GetIpAddr(const char *cp)
13326baedc5SBrian Somers {
13426baedc5SBrian Somers   struct in_addr ipaddr;
13526baedc5SBrian Somers 
13626baedc5SBrian Somers   if (!strcasecmp(cp, "default"))
13726baedc5SBrian Somers     ipaddr.s_addr = INADDR_ANY;
13826baedc5SBrian Somers   else if (inet_aton(cp, &ipaddr) == 0) {
13926baedc5SBrian Somers     const char *ptr;
14026baedc5SBrian Somers 
14126baedc5SBrian Somers     /* Any illegal characters ? */
14226baedc5SBrian Somers     for (ptr = cp; *ptr != '\0'; ptr++)
14326baedc5SBrian Somers       if (!isalnum(*ptr) && strchr("-.", *ptr) == NULL)
14426baedc5SBrian Somers         break;
14526baedc5SBrian Somers 
14626baedc5SBrian Somers     if (*ptr == '\0') {
14726baedc5SBrian Somers       struct hostent *hp;
14826baedc5SBrian Somers 
14926baedc5SBrian Somers       hp = gethostbyname(cp);
15026baedc5SBrian Somers       if (hp && hp->h_addrtype == AF_INET)
15126baedc5SBrian Somers         memcpy(&ipaddr, hp->h_addr, hp->h_length);
15226baedc5SBrian Somers       else
15326baedc5SBrian Somers         ipaddr.s_addr = INADDR_NONE;
15426baedc5SBrian Somers     } else
15526baedc5SBrian Somers       ipaddr.s_addr = INADDR_NONE;
15626baedc5SBrian Somers   }
15726baedc5SBrian Somers 
15826baedc5SBrian Somers   return ipaddr;
15926baedc5SBrian Somers }
1605d9e6103SBrian Somers 
1615d9e6103SBrian Somers static const struct speeds {
162057f1760SBrian Somers   unsigned nspeed;
1635d9e6103SBrian Somers   speed_t speed;
1645d9e6103SBrian Somers } speeds[] = {
1655d9e6103SBrian Somers #ifdef B50
1665d9e6103SBrian Somers   { 50, B50, },
1675d9e6103SBrian Somers #endif
1685d9e6103SBrian Somers #ifdef B75
1695d9e6103SBrian Somers   { 75, B75, },
1705d9e6103SBrian Somers #endif
1715d9e6103SBrian Somers #ifdef B110
1725d9e6103SBrian Somers   { 110, B110, },
1735d9e6103SBrian Somers #endif
1745d9e6103SBrian Somers #ifdef B134
1755d9e6103SBrian Somers   { 134, B134, },
1765d9e6103SBrian Somers #endif
1775d9e6103SBrian Somers #ifdef B150
1785d9e6103SBrian Somers   { 150, B150, },
1795d9e6103SBrian Somers #endif
1805d9e6103SBrian Somers #ifdef B200
1815d9e6103SBrian Somers   { 200, B200, },
1825d9e6103SBrian Somers #endif
1835d9e6103SBrian Somers #ifdef B300
1845d9e6103SBrian Somers   { 300, B300, },
1855d9e6103SBrian Somers #endif
1865d9e6103SBrian Somers #ifdef B600
1875d9e6103SBrian Somers   { 600, B600, },
1885d9e6103SBrian Somers #endif
1895d9e6103SBrian Somers #ifdef B1200
1905d9e6103SBrian Somers   { 1200, B1200, },
1915d9e6103SBrian Somers #endif
1925d9e6103SBrian Somers #ifdef B1800
1935d9e6103SBrian Somers   { 1800, B1800, },
1945d9e6103SBrian Somers #endif
1955d9e6103SBrian Somers #ifdef B2400
1965d9e6103SBrian Somers   { 2400, B2400, },
1975d9e6103SBrian Somers #endif
1985d9e6103SBrian Somers #ifdef B4800
1995d9e6103SBrian Somers   { 4800, B4800, },
2005d9e6103SBrian Somers #endif
2015d9e6103SBrian Somers #ifdef B9600
2025d9e6103SBrian Somers   { 9600, B9600, },
2035d9e6103SBrian Somers #endif
2045d9e6103SBrian Somers #ifdef B19200
2055d9e6103SBrian Somers   { 19200, B19200, },
2065d9e6103SBrian Somers #endif
2075d9e6103SBrian Somers #ifdef B38400
2085d9e6103SBrian Somers   { 38400, B38400, },
2095d9e6103SBrian Somers #endif
2105d9e6103SBrian Somers #ifndef _POSIX_SOURCE
2115d9e6103SBrian Somers #ifdef B7200
2125d9e6103SBrian Somers   { 7200, B7200, },
2135d9e6103SBrian Somers #endif
2145d9e6103SBrian Somers #ifdef B14400
2155d9e6103SBrian Somers   { 14400, B14400, },
2165d9e6103SBrian Somers #endif
2175d9e6103SBrian Somers #ifdef B28800
2185d9e6103SBrian Somers   { 28800, B28800, },
2195d9e6103SBrian Somers #endif
2205d9e6103SBrian Somers #ifdef B57600
2215d9e6103SBrian Somers   { 57600, B57600, },
2225d9e6103SBrian Somers #endif
2235d9e6103SBrian Somers #ifdef B76800
2245d9e6103SBrian Somers   { 76800, B76800, },
2255d9e6103SBrian Somers #endif
2265d9e6103SBrian Somers #ifdef B115200
2275d9e6103SBrian Somers   { 115200, B115200, },
2285d9e6103SBrian Somers #endif
2295d9e6103SBrian Somers #ifdef B230400
2305d9e6103SBrian Somers   { 230400, B230400, },
2315d9e6103SBrian Somers #endif
232dc656426SBrian Somers #ifdef B460800
233dc656426SBrian Somers   { 460800, B460800, },
234dc656426SBrian Somers #endif
235dc656426SBrian Somers #ifdef B921600
236dc656426SBrian Somers   { 921600, B921600, },
237dc656426SBrian Somers #endif
2385d9e6103SBrian Somers #ifdef EXTA
2395d9e6103SBrian Somers   { 19200, EXTA, },
2405d9e6103SBrian Somers #endif
2415d9e6103SBrian Somers #ifdef EXTB
2425d9e6103SBrian Somers   { 38400, EXTB, },
2435d9e6103SBrian Somers #endif
2445d9e6103SBrian Somers #endif				/* _POSIX_SOURCE */
2455d9e6103SBrian Somers   { 0, 0 }
2465d9e6103SBrian Somers };
2475d9e6103SBrian Somers 
248057f1760SBrian Somers unsigned
SpeedToUnsigned(speed_t speed)249057f1760SBrian Somers SpeedToUnsigned(speed_t speed)
2505d9e6103SBrian Somers {
2515d9e6103SBrian Somers   const struct speeds *sp;
2525d9e6103SBrian Somers 
2535d9e6103SBrian Somers   for (sp = speeds; sp->nspeed; sp++) {
2545d9e6103SBrian Somers     if (sp->speed == speed) {
2555d9e6103SBrian Somers       return sp->nspeed;
2565d9e6103SBrian Somers     }
2575d9e6103SBrian Somers   }
2585d9e6103SBrian Somers   return 0;
2595d9e6103SBrian Somers }
2605d9e6103SBrian Somers 
2615d9e6103SBrian Somers speed_t
UnsignedToSpeed(unsigned nspeed)262057f1760SBrian Somers UnsignedToSpeed(unsigned nspeed)
2635d9e6103SBrian Somers {
2645d9e6103SBrian Somers   const struct speeds *sp;
2655d9e6103SBrian Somers 
2665d9e6103SBrian Somers   for (sp = speeds; sp->nspeed; sp++) {
2675d9e6103SBrian Somers     if (sp->nspeed == nspeed) {
2685d9e6103SBrian Somers       return sp->speed;
2695d9e6103SBrian Somers     }
2705d9e6103SBrian Somers   }
2715d9e6103SBrian Somers   return B0;
2725d9e6103SBrian Somers }
2735d9e6103SBrian Somers 
2749409953dSBrian Somers char *
findblank(char * p,int flags)2755b78bdf8SBrian Somers findblank(char *p, int flags)
2765d9e6103SBrian Somers {
2771bbd8362SBrian Somers   int instring;
2781bbd8362SBrian Somers 
2791bbd8362SBrian Somers   instring = 0;
2805d9e6103SBrian Somers   while (*p) {
2815d9e6103SBrian Somers     if (*p == '\\') {
2825b78bdf8SBrian Somers       if (flags & PARSE_REDUCE) {
2832b14671aSBrian Somers         memmove(p, p + 1, strlen(p));
2845d9e6103SBrian Somers         if (!*p)
2855d9e6103SBrian Somers           break;
286abab7303SBrian Somers       } else
287abab7303SBrian Somers         p++;
2881bbd8362SBrian Somers     } else if (*p == '"') {
2891bbd8362SBrian Somers       memmove(p, p + 1, strlen(p));
2901bbd8362SBrian Somers       instring = !instring;
2911bbd8362SBrian Somers       continue;
2925b78bdf8SBrian Somers     } else if (!instring && (issep(*p) ||
2935b78bdf8SBrian Somers                              (*p == '#' && !(flags & PARSE_NOHASH))))
2949409953dSBrian Somers       return p;
2955d9e6103SBrian Somers     p++;
2965d9e6103SBrian Somers   }
2975d9e6103SBrian Somers 
2989409953dSBrian Somers   return instring ? NULL : p;
2995d9e6103SBrian Somers }
3005d9e6103SBrian Somers 
3015d9e6103SBrian Somers int
MakeArgs(char * script,char ** pvect,int maxargs,int flags)3025b78bdf8SBrian Somers MakeArgs(char *script, char **pvect, int maxargs, int flags)
3035d9e6103SBrian Somers {
3041bbd8362SBrian Somers   int nargs;
3055d9e6103SBrian Somers 
3065d9e6103SBrian Somers   nargs = 0;
3074c066cf9SBrian Somers   while (*script) {
3081bbd8362SBrian Somers     script += strspn(script, " \t");
3092661ef38SBrian Somers     if (*script == '#' && !(flags & PARSE_NOHASH)) {
3104c066cf9SBrian Somers       *script = '\0';
3114c066cf9SBrian Somers       break;
3124c066cf9SBrian Somers     }
3135d9e6103SBrian Somers     if (*script) {
3145d9e6103SBrian Somers       if (nargs >= maxargs - 1)
3155d9e6103SBrian Somers         break;
3165d9e6103SBrian Somers       *pvect++ = script;
3175d9e6103SBrian Somers       nargs++;
3185b78bdf8SBrian Somers       script = findblank(script, flags);
319c39aa54eSBrian Somers       if (script == NULL)
320c39aa54eSBrian Somers         return -1;
321797c04a7SBrian Somers       else if (!(flags & PARSE_NOHASH) && *script == '#')
3229409953dSBrian Somers         *script = '\0';
323797c04a7SBrian Somers       else if (*script)
3245d9e6103SBrian Somers         *script++ = '\0';
3255d9e6103SBrian Somers     }
3265d9e6103SBrian Somers   }
3275d9e6103SBrian Somers   *pvect = NULL;
3285d9e6103SBrian Somers   return nargs;
3295d9e6103SBrian Somers }
330d6d3eeabSBrian Somers 
331d6d3eeabSBrian Somers const char *
NumStr(long val,char * buf,size_t sz)332d6d3eeabSBrian Somers NumStr(long val, char *buf, size_t sz)
333d6d3eeabSBrian Somers {
334d6d3eeabSBrian Somers   static char result[23];		/* handles 64 bit numbers */
335d6d3eeabSBrian Somers 
336d6d3eeabSBrian Somers   if (buf == NULL || sz == 0) {
337d6d3eeabSBrian Somers     buf = result;
338d6d3eeabSBrian Somers     sz = sizeof result;
339d6d3eeabSBrian Somers   }
340d6d3eeabSBrian Somers   snprintf(buf, sz, "<%ld>", val);
341d6d3eeabSBrian Somers   return buf;
342d6d3eeabSBrian Somers }
343d6d3eeabSBrian Somers 
344d6d3eeabSBrian Somers const char *
HexStr(long val,char * buf,size_t sz)345d6d3eeabSBrian Somers HexStr(long val, char *buf, size_t sz)
346d6d3eeabSBrian Somers {
347d6d3eeabSBrian Somers   static char result[21];		/* handles 64 bit numbers */
348d6d3eeabSBrian Somers 
349d6d3eeabSBrian Somers   if (buf == NULL || sz == 0) {
350d6d3eeabSBrian Somers     buf = result;
351d6d3eeabSBrian Somers     sz = sizeof result;
352d6d3eeabSBrian Somers   }
353d6d3eeabSBrian Somers   snprintf(buf, sz, "<0x%lx>", val);
354d6d3eeabSBrian Somers   return buf;
355d6d3eeabSBrian Somers }
356b42135deSBrian Somers 
357b42135deSBrian Somers const char *
ex_desc(int ex)358b42135deSBrian Somers ex_desc(int ex)
359b42135deSBrian Somers {
360b42135deSBrian Somers   static char num[12];		/* Used immediately if returned */
361b42135deSBrian Somers   static const char * const desc[] = {
362b42135deSBrian Somers     "normal", "start", "sock", "modem", "dial", "dead", "done",
363b42135deSBrian Somers     "reboot", "errdead", "hangup", "term", "nodial", "nologin",
364b42135deSBrian Somers     "redial", "reconnect"
365b42135deSBrian Somers   };
366b42135deSBrian Somers 
367057f1760SBrian Somers   if (ex >= 0 && ex < (int)(sizeof desc / sizeof *desc))
368b42135deSBrian Somers     return desc[ex];
369b42135deSBrian Somers   snprintf(num, sizeof num, "%d", ex);
370b42135deSBrian Somers   return num;
371b42135deSBrian Somers }
372ebe96675SBrian Somers 
373ebe96675SBrian Somers void
SetTitle(const char * title)374ebe96675SBrian Somers SetTitle(const char *title)
375ebe96675SBrian Somers {
376ebe96675SBrian Somers   if (title == NULL)
377ebe96675SBrian Somers     setproctitle(NULL);
378ebe96675SBrian Somers   else if (title[0] == '-' && title[1] != '\0')
379ebe96675SBrian Somers     setproctitle("-%s", title + 1);
380ebe96675SBrian Somers   else
381ebe96675SBrian Somers     setproctitle("%s", title);
382ebe96675SBrian Somers }
3838a52f3ecSBrian Somers 
3848a52f3ecSBrian Somers fd_set *
mkfdset(void)385672eba24SJohn Baldwin mkfdset(void)
3868a52f3ecSBrian Somers {
3878a52f3ecSBrian Somers   return (fd_set *)malloc(howmany(getdtablesize(), NFDBITS) * sizeof (fd_mask));
3888a52f3ecSBrian Somers }
3898a52f3ecSBrian Somers 
3908a52f3ecSBrian Somers void
zerofdset(fd_set * s)3918a52f3ecSBrian Somers zerofdset(fd_set *s)
3928a52f3ecSBrian Somers {
3938a52f3ecSBrian Somers   memset(s, '\0', howmany(getdtablesize(), NFDBITS) * sizeof (fd_mask));
3948a52f3ecSBrian Somers }
39546df5aa7SBrian Somers 
39646df5aa7SBrian Somers void
Concatinate(char * buf,size_t sz,int argc,const char * const * argv)39746df5aa7SBrian Somers Concatinate(char *buf, size_t sz, int argc, const char *const *argv)
39846df5aa7SBrian Somers {
399057f1760SBrian Somers   int i, n;
400057f1760SBrian Somers   unsigned pos;
40146df5aa7SBrian Somers 
40246df5aa7SBrian Somers   *buf = '\0';
40346df5aa7SBrian Somers   for (pos = i = 0; i < argc; i++) {
40446df5aa7SBrian Somers     n = snprintf(buf + pos, sz - pos, "%s%s", i ? " " : "", argv[i]);
40546df5aa7SBrian Somers     if (n < 0) {
40646df5aa7SBrian Somers       buf[pos] = '\0';
40746df5aa7SBrian Somers       break;
40846df5aa7SBrian Somers     }
40946df5aa7SBrian Somers     if ((pos += n) >= sz)
41046df5aa7SBrian Somers       break;
41146df5aa7SBrian Somers   }
41246df5aa7SBrian Somers }
413fb11a9c2SBrian Somers 
414057f1760SBrian Somers #if defined(__FreeBSD__) && !defined(NOKLDLOAD)
4155476d2e5SBrian Somers int
loadmodules(int how,const char * module,...)416fb11a9c2SBrian Somers loadmodules(int how, const char *module, ...)
417fb11a9c2SBrian Somers {
4185476d2e5SBrian Somers   int loaded = 0;
419fb11a9c2SBrian Somers   va_list ap;
420fb11a9c2SBrian Somers 
421fb11a9c2SBrian Somers   va_start(ap, module);
422fb11a9c2SBrian Somers   while (module != NULL) {
4235476d2e5SBrian Somers     if (modfind(module) == -1) {
4245476d2e5SBrian Somers       if (ID0kldload(module) == -1) {
4255476d2e5SBrian Somers         if (how == LOAD_VERBOSLY)
426fb11a9c2SBrian Somers           log_Printf(LogWARN, "%s: Cannot load module\n", module);
4275476d2e5SBrian Somers       } else
4285476d2e5SBrian Somers         loaded++;
4295476d2e5SBrian Somers     }
430fb11a9c2SBrian Somers     module = va_arg(ap, const char *);
431fb11a9c2SBrian Somers   }
432fb11a9c2SBrian Somers   va_end(ap);
4335476d2e5SBrian Somers   return loaded;
434fb11a9c2SBrian Somers }
435057f1760SBrian Somers #else
436057f1760SBrian Somers int
loadmodules(int how __unused,const char * module __unused,...)437057f1760SBrian Somers loadmodules(int how __unused, const char *module __unused, ...)
438057f1760SBrian Somers {
439057f1760SBrian Somers   return 0;
440057f1760SBrian Somers }
441057f1760SBrian Somers #endif
442