options.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:36k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* options.c - handles option processing for PPP */
  2. /* Copyright 1995 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * Copyright (c) 1989 Carnegie Mellon University.
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms are permitted
  9.  * provided that the above copyright notice and this paragraph are
  10.  * duplicated in all such forms and that any documentation,
  11.  * advertising materials, and other materials related to such
  12.  * distribution and use acknowledge that the software was developed
  13.  * by Carnegie Mellon University.  The name of the
  14.  * University may not be used to endorse or promote products derived
  15.  * from this software without specific prior written permission.
  16.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  17.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  18.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  19.  */
  20. /*
  21. modification history
  22. --------------------
  23. 01m,29nov95,vin  added code to accept hostnames for local_adrs & remote_adrs
  24. 01l,05jul95,dzb  close fd's in setupapfile() and setchapfile().
  25. 01k,23jun95,dzb  fixed setipcpfails() to access ipcp, not lcp.
  26.                  removed usehostname option.
  27. 01j,16jun95,dzb  header file consolidation.  removed perror() references.
  28. 01i,22may95,dzb  Changed pap/chap_require_file to just pap/chap_require.
  29.                  Changed to no params for reqpap() and reqchap().
  30. 01h,05may95,dzb  removed parsing code in setupapfile() (original +ua file).
  31.  fixed getword() for "/n", then EOF exit condition.
  32.  added setpasswd() for setting passwd[].
  33.                  re-activated "login" option.
  34. 01g,16feb95,dab  added stringdup() call for pap_file in setupapfile().
  35. 01f,13feb95,dab  added call out to setchapfile() in parse_args() (SPR #4072).
  36. 01e,09feb95,dab  removed "login" option.
  37. 01d,07feb95,dab  only parse options struct if one is specified.
  38. 01c,18jan95,dzb  ifdef'ed out usage().
  39. 01b,16jan95,dab  ifdef'ed out options_from_user(), options_for_tty().
  40. 01a,21dec94,dab  VxWorks port - first WRS version.
  41.    +dzb  added: path for ppp header files, WRS copyright.
  42. */
  43. #include <vxWorks.h>
  44. #include <stdlib.h>
  45. #include <stdio.h>
  46. #include <errno.h>
  47. #include <hostLib.h>
  48. #include <ioLib.h>
  49. #include <inetLib.h>
  50. #include <string.h>
  51. #include <sys/types.h>
  52. #include <sys/stat.h>
  53. #include <netinet/in.h>
  54. #include <ctype.h>
  55. #include "pppLib.h"
  56. #ifndef GIDSET_TYPE
  57. #define GIDSET_TYPE     int
  58. #endif
  59. /*
  60.  * Prototypes
  61.  */
  62. static int setdebug __ARGS((void));
  63. static int setkdebug __ARGS((void));
  64. static int setpassive __ARGS((void));
  65. static int setsilent __ARGS((void));
  66. static int noopt __ARGS((void));
  67. static int setnovj __ARGS((void));
  68. static int setnovjccomp __ARGS((void));
  69. static int setvjslots __ARGS((char *));
  70. static int nopap __ARGS((void));
  71. static int nochap __ARGS((void));
  72. static int reqpap __ARGS((void));
  73. static int reqchap __ARGS((void));
  74. static int setchapfile __ARGS((char *));
  75. static int setupapfile __ARGS((char *));
  76. static int setspeed __ARGS((int, int));
  77. static int noaccomp __ARGS((void));
  78. static int noasyncmap __ARGS((void));
  79. static int noipaddr __ARGS((void));
  80. static int nomagicnumber __ARGS((void));
  81. static int setasyncmap __ARGS((char *));
  82. static int setescape __ARGS((char *));
  83. static int setmru __ARGS((char *));
  84. static int setmtu __ARGS((char *));
  85. static int nomru __ARGS((void));
  86. static int nopcomp __ARGS((void));
  87. static int setnetmask __ARGS((char *));
  88. static int setname __ARGS((char *));
  89. static int setuser __ARGS((char *));
  90. static int setpasswd __ARGS((char *));
  91. static int setremote __ARGS((char *));
  92. static int readfile __ARGS((char *));
  93. static int setdefaultroute __ARGS((void));
  94. static int setproxyarp __ARGS((void));
  95. static int setdologin __ARGS((void));
  96. static int setlcptimeout __ARGS((char *));
  97. static int setlcpterm __ARGS((char *));
  98. static int setlcpconf __ARGS((char *));
  99. static int setlcpfails __ARGS((char *));
  100. static int setipcptimeout __ARGS((char *));
  101. static int setipcpterm __ARGS((char *));
  102. static int setipcpconf __ARGS((char *));
  103. static int setipcpfails __ARGS((char *));
  104. static int setpaptimeout __ARGS((char *));
  105. static int setpapreqs __ARGS((char *));
  106. static int setchaptimeout __ARGS((char *));
  107. static int setchapchal __ARGS((char *));
  108. static int setchapintv __ARGS((char *));
  109. static int setipcpaccl __ARGS((void));
  110. static int setipcpaccr __ARGS((void));
  111. static int setlcpechointv __ARGS((char *));
  112. static int setlcpechofails __ARGS((char *));
  113. static int number_option __ARGS((char *, long *, int));
  114. static int readable __ARGS((int fd));
  115. /*
  116.  * Valid arguments.
  117.  */
  118. static struct cmd {
  119.     char *cmd_name;
  120.     int num_args;
  121.     int (*cmd_func)();
  122. } cmds[] = {
  123.     {"no_all", 0, noopt}, /* Don't request/allow any options */
  124.     {"no_acc", 0, noaccomp}, /* Disable Address/Control compress */
  125.     {"no_asyncmap", 0, noasyncmap}, /* Disable asyncmap negotiation */
  126.     {"debug", 0, setdebug}, /* Enable the daemon debug mode */
  127.     {"driver_debug", 1, setkdebug}, /* Enable driver-level debugging */
  128.     {"no_ip", 0, noipaddr}, /* Disable IP address negotiation */
  129.     {"no_mn", 0, nomagicnumber}, /* Disable magic number negotiation */
  130.     {"no_mru", 0, nomru}, /* Disable mru negotiation */
  131.     {"passive_mode", 0, setpassive}, /* Set passive mode */
  132.     {"no_pc", 0, nopcomp}, /* Disable protocol field compress */
  133.     {"no_pap", 0, nopap}, /* Don't allow UPAP authentication with peer */
  134.     {"no_chap", 0, nochap}, /* Don't allow CHAP authentication with peer */
  135.     {"require_pap", 0, reqpap}, /* Require PAP auth from peer */
  136.     {"require_chap", 0, reqchap}, /* Require CHAP auth from peer */
  137.     {"no_vj", 0, setnovj}, /* disable VJ compression */
  138.     {"no_vjccomp", 0, setnovjccomp}, /* disable VJ connection-ID compression */
  139.     {"silent_mode", 0, setsilent}, /* Set silent mode */
  140.     {"defaultroute", 0, setdefaultroute}, /* Add default route */
  141.     {"proxyarp", 0, setproxyarp}, /* Add proxy ARP entry */
  142.     {"login", 0, setdologin}, /* Use system password database for UPAP */
  143.     {"ipcp_accept_local", 0, setipcpaccl}, /* Accept peer's address for us */
  144.     {"ipcp_accept_remote", 0, setipcpaccr}, /* Accept peer's address for it */
  145.     {"asyncmap", 1, setasyncmap}, /* set the desired async map */
  146.     {"vj_max_slots", 1, setvjslots}, /* Set maximum VJ header slots */
  147.     {"escape_chars", 1, setescape}, /* set chars to escape on transmission */
  148.     {"pap_file", 1, setupapfile}, /* Get PAP user and password from file */
  149.     {"chap_file", 1, setchapfile}, /* Get CHAP info */
  150.     {"mru", 1, setmru}, /* Set MRU value for negotiation */
  151.     {"mtu", 1, setmtu}, /* Set our MTU */
  152.     {"netmask", 1, setnetmask}, /* Set netmask */
  153.     {"local_auth_name", 1, setname}, /* Set local name for authentication */
  154.     {"pap_user_name", 1, setuser}, /* Set username for PAP auth with peer */
  155.     {"pap_passwd", 1, setpasswd}, /* Set password for PAP auth with peer */
  156.     {"remote_auth_name", 1, setremote}, /* Set remote name for authentication */
  157.     {"lcp_echo_failure", 1, setlcpechofails}, /* consecutive echo failures */
  158.     {"lcp_echo_interval", 1, setlcpechointv}, /* time for lcp echo events */
  159.     {"lcp_restart", 1, setlcptimeout}, /* Set timeout for LCP */
  160.     {"lcp_max_terminate", 1, setlcpterm}, /* Set max #xmits for term-reqs */
  161.     {"lcp_max_configure", 1, setlcpconf}, /* Set max #xmits for conf-reqs */
  162.     {"lcp_max_failure", 1, setlcpfails}, /* Set max #conf-naks for LCP */
  163.     {"ipcp_restart", 1, setipcptimeout}, /* Set timeout for IPCP */
  164.     {"ipcp_max_terminate", 1, setipcpterm}, /* Set max #xmits for term-reqs */
  165.     {"ipcp_max_configure", 1, setipcpconf}, /* Set max #xmits for conf-reqs */
  166.     {"ipcp_max_failure", 1, setipcpfails}, /* Set max #conf-naks for IPCP */
  167.     {"pap_restart", 1, setpaptimeout}, /* Set timeout for UPAP */
  168.     {"pap_max_authreq", 1, setpapreqs}, /* Set max #xmits for auth-reqs */
  169.     {"chap_restart", 1, setchaptimeout}, /* Set timeout for CHAP */
  170.     {"chap_max_challenge", 1, setchapchal}, /* Set max #xmits for challenge */
  171.     {"chap_interval", 1, setchapintv}, /* Set interval for rechallenge */
  172.     {NULL, 0, NULL}
  173. };
  174. #ifdef notyet
  175. #ifndef IMPLEMENTATION
  176. #define IMPLEMENTATION ""
  177. #endif
  178. static char *usage_string = "
  179. pppd version %s patch level %d%sn
  180. Usage: %s [ arguments ], where arguments are:n
  181.         <device>        Communicate over the named devicen
  182.         <speed>         Set the baud rate to <speed>n
  183.         <loc>:<rem>     Set the local and/or remote interface IPn
  184.                         addresses.  Either one may be omitted.n
  185.         asyncmap <n>    Set the desired async map to hex <n>n
  186.         auth            Require authentication from peern
  187.         connect <p>     Invoke shell command <p> to set up the serial linen
  188.         defaultroute    Add default route through interfacen
  189.         file <f>        Take options from file <f>n
  190.         modem           Use modem control linesn
  191.         mru <n>         Set MRU value to <n> for negotiationn
  192.         netmask <n>     Set interface netmask to <n>n
  193. See pppd(8) for more options.n
  194. ";
  195. #endif /* notyet */
  196. /*
  197.  * parse_args - parse a string of arguments, from the command
  198.  * line or from a file.
  199.  */
  200. int
  201. parse_args(unit, devname, local_addr, remote_addr, baud, options, fileName)
  202.     int unit;
  203.     char *devname;
  204.     char *local_addr;
  205.     char *remote_addr;
  206.     int baud;
  207.     PPP_OPTIONS *options;
  208.     char *fileName;
  209. {
  210.     if (options) {
  211.         if (options->flags & OPT_NO_ALL)
  212.             noopt();
  213.         if (options->flags & OPT_NO_ACC)
  214.             noaccomp();
  215.         if (options->flags & OPT_NO_ASYNCMAP)
  216.             noasyncmap();
  217.         if (options->flags & OPT_DEBUG)
  218.             setdebug();
  219.         if (options->flags & OPT_DRIVER_DEBUG)
  220.             setkdebug();
  221.         if (options->flags & OPT_NO_IP)
  222.             noipaddr();
  223.         if (options->flags & OPT_NO_MN)
  224.             nomagicnumber();
  225.         if (options->flags & OPT_NO_MRU)
  226.             nomru();
  227.         if (options->flags & OPT_PASSIVE_MODE)
  228.             setpassive();
  229.         if (options->flags & OPT_NO_PC)
  230.             nopcomp();
  231.         if (options->flags & OPT_NO_PAP)
  232.             nopap();
  233.         if (options->flags & OPT_NO_CHAP)
  234.             nochap();
  235.         if (options->flags & OPT_REQUIRE_PAP)
  236.             reqpap();
  237.         if (options->flags & OPT_REQUIRE_CHAP)
  238.             reqchap();
  239.         if (options->flags & OPT_NO_VJ)
  240.             setnovj();
  241.         if (options->flags & OPT_NO_VJCCOMP)
  242.             setnovjccomp();
  243.         if (options->flags & OPT_SILENT_MODE)
  244.             setsilent();
  245.         if (options->flags & OPT_DEFAULTROUTE)
  246.             setdefaultroute();
  247.         if (options->flags & OPT_PROXYARP)
  248.             setproxyarp();
  249.         if (options->flags & OPT_LOGIN)
  250.             setdologin();
  251.         if (options->flags & OPT_IPCP_ACCEPT_LOCAL)
  252.             setipcpaccl();
  253.         if (options->flags & OPT_IPCP_ACCEPT_REMOTE)
  254.             setipcpaccr();
  255.         if (options->asyncmap)
  256.             if (!setasyncmap(options->asyncmap)) {
  257.         syslog(LOG_ERR, "asyncmap error");
  258.         return 0;
  259.             }
  260.         if (options->vj_max_slots)
  261.             if (!setvjslots(options->vj_max_slots)) {
  262.         syslog(LOG_ERR, "vj_max_slots error");
  263.         return 0;
  264.             }
  265.         if (options->escape_chars)
  266.             if (!setescape(options->escape_chars)) {
  267.         syslog(LOG_ERR, "escape chars error");
  268.         return 0;
  269.             }
  270.         if (options->pap_file)
  271.             if (!setupapfile(options->pap_file)) {
  272.         syslog(LOG_ERR, "pap file error");
  273.         return 0;
  274.             }
  275.         if (options->chap_file)
  276.             if (!setchapfile(options->chap_file)) {
  277.                 syslog(LOG_ERR, "chap file error");
  278.                 return 0;
  279.             }
  280.         if (options->mru)
  281.             if (!setmru(options->mru)) {
  282.         syslog(LOG_ERR, "mru error");
  283.         return 0;
  284.             }
  285.         if (options->mtu)
  286.             if (!setmtu(options->mtu)) {
  287.         syslog(LOG_ERR, "mtu error");
  288.         return 0;
  289.             }
  290.         if (options->netmask)
  291.             if (!setnetmask(options->netmask)) {
  292.         syslog(LOG_ERR, "netmask error");
  293.         return 0;
  294.             }
  295.         if (options->local_auth_name)
  296.             if (!setname(options->local_auth_name)) {
  297.         syslog(LOG_ERR, "local auth name error");
  298.         return 0;
  299.             }
  300.         if (options->pap_user_name)
  301.             if (!setuser(options->pap_user_name)) {
  302.         syslog(LOG_ERR, "pap auth name error");
  303.         return 0;
  304.             }
  305.         if (options->pap_passwd)
  306.             if (!setpasswd(options->pap_passwd)) {
  307.         syslog(LOG_ERR, "pap auth password error");
  308.         return 0;
  309.             }
  310.         if (options->remote_auth_name)
  311.             if (!setremote(options->remote_auth_name)) {
  312.         syslog(LOG_ERR, "remote auth name error");
  313.         return 0;
  314.             }
  315.         if (options->lcp_echo_failure)
  316.             if (!setlcpechofails(options->lcp_echo_failure)) {
  317.         syslog(LOG_ERR, "lcp echo failure error");
  318.         return 0;
  319.             }
  320.         if (options->lcp_echo_interval)
  321.             if (!setlcpechointv(options->lcp_echo_interval)) {
  322.         syslog(LOG_ERR, "lcp echo interval error");
  323.         return 0;
  324.             }
  325.         if (options->lcp_restart)
  326.             if (!setlcptimeout(options->lcp_restart)) {
  327.         syslog(LOG_ERR, "lcp timeout error");
  328.         return 0;
  329.             }
  330.         if (options->lcp_max_terminate)
  331.             if (!setlcpterm(options->lcp_max_terminate)) {
  332.         syslog(LOG_ERR, "lcp max terminate error");
  333.         return 0;
  334.             }
  335.         if (options->lcp_max_configure)
  336.             if (!setlcpconf(options->lcp_max_configure)) {
  337.         syslog(LOG_ERR, "lcp max configure error");
  338.         return 0;
  339.             }
  340.         if (options->lcp_max_failure)
  341.             if (!setlcpfails(options->lcp_max_failure)) {
  342.         syslog(LOG_ERR, "lcp max failure error");
  343.         return 0;
  344.             }
  345.         if (options->ipcp_restart)
  346.             if (!setipcptimeout(options->ipcp_restart)) {
  347.         syslog(LOG_ERR, "ipcp restart error");
  348.         return 0;
  349.             }
  350.         if (options->ipcp_max_terminate)
  351.             if (!setipcpterm(options->ipcp_max_terminate)) {
  352.         syslog(LOG_ERR, "ipcp max terminate error");
  353.         return 0;
  354.             }
  355.         if (options->ipcp_max_configure)
  356.             if (!setipcpconf(options->ipcp_max_configure)) {
  357.         syslog(LOG_ERR, "ipcp max configure error");
  358.         return 0;
  359.             }
  360.         if (options->ipcp_max_failure)
  361.             if (!setipcpfails(options->ipcp_max_failure)) {
  362.         syslog(LOG_ERR, "ipcp max failure error");
  363.         return 0;
  364.             }
  365.         if (options->pap_restart)
  366.             if (!setpaptimeout(options->pap_restart)) {
  367.         syslog(LOG_ERR, "pap restart error");
  368.         return 0;
  369.             }
  370.         if (options->pap_max_authreq)
  371.             if (!setpapreqs(options->pap_max_authreq)) {
  372.         syslog(LOG_ERR, "pap max reqs error");
  373.         return 0;
  374.             }
  375.         if (options->chap_restart)
  376.             if (!setchaptimeout(options->chap_restart)) {
  377.         syslog(LOG_ERR, "chap restart error");
  378.         return 0;
  379.             }
  380.         if (options->chap_max_challenge)
  381.             if (!setchapchal(options->chap_max_challenge)) {
  382.         syslog(LOG_ERR, "chap max challenge error");
  383.         return 0;
  384.             }
  385.         if (options->chap_interval)
  386.             if (!setchapintv(options->chap_interval)) {
  387.         syslog(LOG_ERR, "chap interval error");
  388.         return 0;
  389.             }
  390.     }
  391.     if (fileName)
  392.         if (!readfile(fileName)) {
  393.     syslog(LOG_ERR, "options file error");
  394.     return 0;
  395.         }
  396.     if (!setdevname(devname)) {
  397. syslog(LOG_ERR, "error setting device name");
  398. return 0;
  399.     }
  400.     if (!setspeed(baud, 0)) {
  401. syslog(LOG_ERR, "error setting baud rate");
  402. return 0;
  403.     }
  404.     if (!setipaddr(local_addr, remote_addr)) {
  405. syslog(LOG_ERR, "error setting address");
  406. return 0;
  407.     }
  408.     return 1;
  409. }
  410. /*
  411.  * usage - print out a message telling how to use the program.
  412.  */
  413. #ifdef notyet
  414. static void
  415. usage()
  416. {
  417.     logMsg(usage_string, VERSION, PATCHLEVEL, IMPLEMENTATION,
  418.            "pppInit");
  419. }
  420. #endif /* notyet */
  421. /*
  422.  * options_from_file - Read a string of options from a file,
  423.  * and interpret them.
  424.  */
  425. int
  426. options_from_file(fileName, must_exist, check_prot)
  427.     char *fileName;
  428.     int must_exist;
  429.     int check_prot;
  430. {
  431.     FILE *f;
  432.     int i, newline;
  433.     struct cmd *cmdp;
  434.     char *argv[MAXARGS];
  435.     char args[MAXARGS][MAXWORDLEN];
  436.     char cmd[MAXWORDLEN];
  437.     if ((f = fopen(fileName, "r")) == NULL) {
  438. if (!must_exist)
  439.     return 1;
  440.         syslog(LOG_ERR, "%s: could not openn", fileName);
  441. return 0;
  442.     }
  443.     if (check_prot && !readable(fileno(f))) {
  444.         syslog(LOG_ERR, "%s: access deniedn", fileName);
  445.         fclose(f);
  446.         return 0;
  447.     }
  448.     while (getword(f, cmd, &newline, fileName)) {
  449. /*
  450.  * First see if it's a command.
  451.  */
  452. for (cmdp = cmds; cmdp->cmd_name; cmdp++)
  453.     if (!strcmp(cmd, cmdp->cmd_name))
  454. break;
  455. if (cmdp->cmd_name != NULL) {
  456.     for (i = 0; i < cmdp->num_args; ++i) {
  457. if (!getword(f, args[i], &newline, fileName)) {
  458.     syslog(LOG_ERR,
  459.     "In file %s: too few parameters for command %sn",
  460.     fileName, cmd);
  461.     fclose(f);
  462.     return 0;
  463. }
  464. argv[i] = args[i];
  465.     }
  466.     if (!(*cmdp->cmd_func)(argv[0])) {
  467. fclose(f);
  468. return 0;
  469.     }
  470. } else {
  471.     syslog(LOG_ERR, "In file %s: unrecognized command %sn",
  472.                    fileName, cmd);
  473.             fclose(f);
  474.             return 0;
  475. }
  476.     }
  477.     fclose(f);
  478.     return 1;
  479. }
  480. #ifdef notyet
  481. /*
  482.  * options_from_user - See if the use has a ~/.ppprc file,
  483.  * and if so, interpret options from it.
  484.  */
  485. int
  486. options_from_user()
  487. {
  488.     char *user, *path, *file;
  489.     int ret;
  490.     if (user[0] == 0)
  491.         return 1;
  492.     file = _PATH_USEROPT;
  493.     path = (char *)malloc(strlen(user) + strlen(file) + 2);
  494.     if (path == NULL)
  495.         novm("init file name");
  496.     strcpy(path, user);
  497.     strcat(path, "/");
  498.     strcat(path, file);
  499.     ret = options_from_file(path, 0, 1);
  500.     free(path);
  501.     return ret;
  502. }
  503. /*
  504.  * options_for_tty - See if an options file exists for the serial
  505.  * device, and if so, interpret options from it.
  506.  */
  507. int
  508. options_for_tty(devname)
  509.     char *devname;
  510. {
  511.     char *dev, *path;
  512.     int ret;
  513.     dev = strrchr(devname, '/');
  514.     if (dev == NULL)
  515.         dev = devname;
  516.     else
  517.         ++dev;
  518.     if (strcmp(dev, "tty") == 0)
  519.         return 1;               /* don't look for /etc/ppp/options.tty */
  520.     path = (char *)malloc(strlen(_PATH_TTYOPT) + strlen(dev) + 1);
  521.     if (path == NULL)
  522.         novm("tty init file name");
  523.     strcpy(path, _PATH_TTYOPT);
  524.     strcat(path, dev);
  525.     ret = options_from_file(path, 0, 0);
  526.     free(path);
  527.     return ret;
  528. }
  529. #endif /* notyet */
  530. /*
  531.  * readable - check if a file is readable by the real user.
  532.  */
  533. static int
  534. readable(fd)
  535.     int fd;
  536. {
  537. #ifdef notyet
  538.     uid_t uid;
  539.     int ngroups, i;
  540.     struct stat sbuf;
  541.     GIDSET_TYPE groups[NGROUPS_MAX];
  542.     uid = getuid();
  543.     if (uid == 0)
  544.         return 1;
  545.     if (fstat(fd, &sbuf) != 0)
  546.         return 0;
  547.     if (sbuf.st_uid == uid)
  548.         return sbuf.st_mode & S_IRUSR;
  549.     if (sbuf.st_gid == getgid())
  550.         return sbuf.st_mode & S_IRGRP;
  551.     ngroups = getgroups(NGROUPS_MAX, groups);
  552.     for (i = 0; i < ngroups; ++i)
  553.         if (sbuf.st_gid == groups[i])
  554.             return sbuf.st_mode & S_IRGRP;
  555.     return sbuf.st_mode & S_IROTH;
  556. #else /* notyet */
  557.     return 1;
  558. #endif /* notyet */
  559. }
  560. /*
  561.  * Read a word from a file.
  562.  * Words are delimited by white-space or by quotes (").
  563.  * Quotes, white-space and  may be escaped with .
  564.  * <newline> is ignored.
  565.  */
  566. int
  567. getword(f, word, newlinep, fileName)
  568.     FILE *f;
  569.     char *word;
  570.     int *newlinep;
  571.     char *fileName;
  572. {
  573.     int c, len, escape;
  574.     int quoted;
  575.     *newlinep = 0;
  576.     len = 0;
  577.     escape = 0;
  578.     quoted = 0;
  579.     /*
  580.      * First skip white-space and comments
  581.      */
  582.     while ((c = getc(f)) != EOF) {
  583. if (c == '\') {
  584.     /*
  585.      * <newline> is ignored;  followed by anything else
  586.      * starts a word.
  587.      */
  588.     if ((c = getc(f)) == 'n')
  589. continue;
  590.     word[len++] = '\';
  591.     escape = 1;
  592.     break;
  593. }
  594. if (c == 'n')
  595.     *newlinep = 1; /* next word starts a line */
  596. else if (c == '#') {
  597.     /* comment - ignore until EOF or n */
  598.     while ((c = getc(f)) != EOF && c != 'n')
  599. ;
  600.     if (c == EOF)
  601. break;
  602.     *newlinep = 1;
  603. } else if (!isspace(c))
  604.     break;
  605.     }
  606.     /*
  607.      * End of file or error - fail
  608.      */
  609.     if (c == EOF) {
  610. if (ferror(f)) {
  611.             syslog(LOG_ERR, "%s: EOFn", fileName);
  612.     die(ppp_unit, 1);
  613. }
  614.         *newlinep = 0; /* added to make sure scan_authfile() exits -dzb */
  615. return 0;
  616.     }
  617.     for (;;) {
  618. /*
  619.  * Is this character escaped by  ?
  620.  */
  621. if (escape) {
  622.     if (c == 'n')
  623. --len; /* ignore <newline> */
  624.     else if (c == '"' || isspace(c) || c == '\')
  625. word[len-1] = c; /* put special char in word */
  626.     else {
  627. if (len < MAXWORDLEN-1)
  628.     word[len] = c;
  629. ++len;
  630.     }
  631.     escape = 0;
  632. } else if (c == '"') {
  633.     quoted = !quoted;
  634. } else if (!quoted && (isspace(c) || c == '#')) {
  635.     ungetc(c, f);
  636.     break;
  637. } else {
  638.     if (len < MAXWORDLEN-1)
  639. word[len] = c;
  640.     ++len;
  641.     if (c == '\')
  642. escape = 1;
  643. }
  644. if ((c = getc(f)) == EOF)
  645.     break;
  646.     }
  647.     if (ferror(f)) {
  648.         syslog(LOG_ERR, "%s: errorn", fileName);
  649. die(ppp_unit, 1);
  650.     }
  651.     if (len >= MAXWORDLEN) {
  652. word[MAXWORDLEN-1] = 0;
  653. syslog(LOG_WARNING, "warning: word in file %s too long (%.20s...)n",
  654. fileName, word);
  655.     } else
  656. word[len] = 0;
  657.     return 1;
  658. }
  659. /*
  660.  * number_option - parse a numeric parameter for an option
  661.  */
  662. static int
  663. number_option(str, valp, base)
  664.     char *str;
  665.     long *valp;
  666.     int base;
  667. {
  668.     char *ptr;
  669.     *valp = strtoul(str, &ptr, base);
  670.     if (errno == ERANGE) {
  671.         syslog(LOG_ERR, "invalid number: %s", str);
  672. return 0;
  673.     }
  674.     return 1;
  675. }
  676. /*
  677.  * int_option - like number_option, but valp is int *,
  678.  * the base is assumed to be 0, and *valp is not changed
  679.  * if there is an error.
  680.  */
  681. static int
  682. int_option(str, valp)
  683.     char *str;
  684.     int *valp;
  685. {
  686.     long v;
  687.     if (!number_option(str, &v, 0))
  688. return 0;
  689.     *valp = (int) v;
  690.     return 1;
  691. }
  692. /*
  693.  * The following procedures execute commands.
  694.  */
  695. /*
  696.  * readfile - take commands from a file.
  697.  */
  698. static int
  699. readfile(argv)
  700.     char *argv;
  701. {
  702.     return options_from_file(argv, 1, 1);
  703. }
  704. /*
  705.  * setdebug - Set debug (command line argument).
  706.  */
  707. static int
  708. setdebug()
  709. {
  710.     ppp_if[ppp_unit]->debug = 1;
  711.     return (1);
  712. }
  713. /*
  714.  * setkdebug - Set kernel debugging level.
  715.  */
  716. static int
  717. setkdebug()
  718. {
  719.     ppp_if[ppp_unit]->kdebugflag = 1;
  720.     return (1);
  721. }
  722. /*
  723.  * noopt - Disable all options.
  724.  */
  725. static int
  726. noopt()
  727. {
  728.     BZERO((char *) &ppp_if[ppp_unit]->lcp_wantoptions,
  729.           sizeof (struct lcp_options));
  730.     BZERO((char *) &ppp_if[ppp_unit]->lcp_allowoptions,
  731.           sizeof (struct lcp_options));
  732.     BZERO((char *) &ppp_if[ppp_unit]->ipcp_wantoptions,
  733.           sizeof (struct ipcp_options));
  734.     BZERO((char *) &ppp_if[ppp_unit]->ipcp_allowoptions,
  735.           sizeof (struct ipcp_options));
  736.     return (1);
  737. }
  738. /*
  739.  * noaccomp - Disable Address/Control field compression negotiation.
  740.  */
  741. static int
  742. noaccomp()
  743. {
  744.     ppp_if[ppp_unit]->lcp_wantoptions.neg_accompression = 0;
  745.     ppp_if[ppp_unit]->lcp_allowoptions.neg_accompression = 0;
  746.     return (1);
  747. }
  748. /*
  749.  * noasyncmap - Disable async map negotiation.
  750.  */
  751. static int
  752. noasyncmap()
  753. {
  754.     ppp_if[ppp_unit]->lcp_wantoptions.neg_asyncmap = 0;
  755.     ppp_if[ppp_unit]->lcp_allowoptions.neg_asyncmap = 0;
  756.     return (1);
  757. }
  758. /*
  759.  * noipaddr - Disable IP address negotiation.
  760.  */
  761. static int
  762. noipaddr()
  763. {
  764.     ppp_if[ppp_unit]->ipcp_wantoptions.neg_addr = 0;
  765.     ppp_if[ppp_unit]->ipcp_allowoptions.neg_addr = 0;
  766.     return (1);
  767. }
  768. /*
  769.  * nomagicnumber - Disable magic number negotiation.
  770.  */
  771. static int
  772. nomagicnumber()
  773. {
  774.     ppp_if[ppp_unit]->lcp_wantoptions.neg_magicnumber = 0;
  775.     ppp_if[ppp_unit]->lcp_allowoptions.neg_magicnumber = 0;
  776.     return (1);
  777. }
  778. /*
  779.  * nomru - Disable mru negotiation.
  780.  */
  781. static int
  782. nomru()
  783. {
  784.     ppp_if[ppp_unit]->lcp_wantoptions.neg_mru = 0;
  785.     ppp_if[ppp_unit]->lcp_allowoptions.neg_mru = 0;
  786.     return (1);
  787. }
  788. /*
  789.  * setmru - Set MRU for negotiation.
  790.  */
  791. static int
  792. setmru(argv)
  793.     char *argv;
  794. {
  795.     long mru;
  796.     if (!number_option(argv, &mru, 0))
  797.         return 0;
  798.     ppp_if[ppp_unit]->lcp_wantoptions.mru = mru;
  799.     ppp_if[ppp_unit]->lcp_wantoptions.neg_mru = 1;
  800.     return (1);
  801. }
  802. /*
  803.  * setmtu - Set the largest MTU we'll use.
  804.  */
  805. static int
  806. setmtu(argv)
  807.     char *argv;
  808. {
  809.     long mtu;
  810.     if (!number_option(argv, &mtu, 0))
  811.         return 0;
  812.     if (mtu < MINMRU || mtu > MAXMRU) {
  813.         syslog(LOG_ERR, "mtu option value of %d is too %sn", mtu,
  814.                 (mtu < MINMRU? "small": "large"));
  815.         return 0;
  816.     }
  817.     ppp_if[ppp_unit]->lcp_allowoptions.mru = mtu;
  818.     return (1);
  819. }
  820. /*
  821.  * nopcomp - Disable Protocol field compression negotiation.
  822.  */
  823. static int
  824. nopcomp()
  825. {
  826.     ppp_if[ppp_unit]->lcp_wantoptions.neg_pcompression = 0;
  827.     ppp_if[ppp_unit]->lcp_allowoptions.neg_pcompression = 0;
  828.     return (1);
  829. }
  830. /*
  831.  * setpassive - Set passive mode (don't give up if we time out sending
  832.  * LCP configure-requests).
  833.  */
  834. static int
  835. setpassive()
  836. {
  837.     ppp_if[ppp_unit]->lcp_wantoptions.passive = 1;
  838.     return (1);
  839. }
  840. /*
  841.  * setsilent - Set silent mode (don't start sending LCP configure-requests
  842.  * until we get one from the peer).
  843.  */
  844. static int
  845. setsilent()
  846. {
  847.     ppp_if[ppp_unit]->lcp_wantoptions.silent = 1;
  848.     return (1);
  849. }
  850. /*
  851.  * nopap - Disable PAP authentication with peer.
  852.  */
  853. static int
  854. nopap()
  855. {
  856.     ppp_if[ppp_unit]->lcp_allowoptions.neg_upap = 0;
  857.     return (1);
  858. }
  859. /*
  860.  * reqpap - Require PAP authentication from peer.
  861.  */
  862. static int
  863. reqpap()
  864. {
  865.     ppp_if[ppp_unit]->lcp_wantoptions.neg_upap = 1;
  866.     ppp_if[ppp_unit]->auth_required = 1;
  867.     return (1);
  868. }
  869. /*
  870.  * setupapfile - specifies UPAP info for authenticating with peer.
  871.  */
  872. static int
  873. setupapfile(argv)
  874.     char *argv;
  875. {
  876.     FILE * ufile;
  877.     ppp_if[ppp_unit]->lcp_allowoptions.neg_upap = 1;
  878.     ppp_if[ppp_unit]->options->pap_file = (char *)stringdup(argv);
  879.     /* open user info file */
  880.     if ((ufile = fopen(argv, "r")) == NULL) {
  881. syslog(LOG_ERR, "unable to open PAP secrets file %s", argv);
  882. return 0;
  883.     }
  884.     if (!readable(fileno(ufile))) {
  885.         syslog(LOG_ERR, "%s: access denied", argv);
  886.         fclose(ufile);
  887.         return 0;
  888.     }
  889.     check_access(ufile, argv);
  890.     fclose(ufile);
  891.     return (1);
  892. }
  893. /*
  894.  * nochap - Disable CHAP authentication with peer.
  895.  */
  896. static int
  897. nochap()
  898. {
  899.     ppp_if[ppp_unit]->lcp_allowoptions.neg_chap = 0;
  900.     return (1);
  901. }
  902. /*
  903.  * reqchap - Require CHAP authentication from peer.
  904.  */
  905. static int
  906. reqchap()
  907. {
  908.     ppp_if[ppp_unit]->lcp_wantoptions.neg_chap = 1;
  909.     ppp_if[ppp_unit]->auth_required = 1;
  910.     return (1);
  911. }
  912. /*
  913.  * setchapfile - specifies CHAP info for authenticating with peer.
  914.  */
  915. static int
  916. setchapfile(argv)
  917. char *argv;
  918. {
  919.     FILE * ufile;
  920.     ppp_if[ppp_unit]->lcp_allowoptions.neg_chap = 1;
  921.     ppp_if[ppp_unit]->options->chap_file = (char *)stringdup(argv);
  922.     /* open user info file */
  923.     if ((ufile = fopen(argv, "r")) == NULL) {
  924. syslog(LOG_ERR, "unable to open CHAP secrets file %s", argv);
  925. return 0;
  926.     }
  927.     if (!readable(fileno(ufile))) {
  928.         syslog(LOG_ERR, "%s: access denied", argv);
  929.         fclose(ufile);
  930.         return 0;
  931.     }
  932.     check_access(ufile, argv);
  933.     fclose(ufile);
  934.     return (1);
  935. }
  936. /*
  937.  * setnovj - disable vj compression
  938.  */
  939. static int
  940. setnovj()
  941. {
  942.     ppp_if[ppp_unit]->ipcp_wantoptions.neg_vj = 0;
  943.     ppp_if[ppp_unit]->ipcp_allowoptions.neg_vj = 0;
  944.     return (1);
  945. }
  946. /*
  947.  * setnovjccomp - disable VJ connection-ID compression
  948.  */
  949. static int
  950. setnovjccomp()
  951. {
  952.     ppp_if[ppp_unit]->ipcp_wantoptions.cflag = 0;
  953.     ppp_if[ppp_unit]->ipcp_allowoptions.cflag = 0;
  954.     return (1);
  955. }
  956. /*
  957.  * setvjslots - set maximum number of connection slots for VJ compression
  958.  */
  959. static int
  960. setvjslots(argv)
  961.     char *argv;
  962. {
  963.     int value;
  964.     if (!int_option(argv, &value))
  965.         return 0;
  966.     if (value < 2 || value > 16) {
  967.         syslog(LOG_ERR, "pppd: vj-max-slots value must be between 2 and 16");
  968.         return 0;
  969.     }
  970.     ppp_if[ppp_unit]->ipcp_wantoptions.maxslotindex =
  971.         ppp_if[ppp_unit]->ipcp_allowoptions.maxslotindex = value - 1;
  972.     return 1;
  973. }
  974. #ifdef notyet
  975. /*
  976.  * setconnector - Set a program to connect to a serial line
  977.  */
  978. static int
  979. setconnector(argv)
  980.     char *argv;
  981. {
  982.     ppp_if[ppp_unit]->connector = (char *)stringdup(argv);
  983.     if (ppp_if[ppp_unit]->connector == NULL)
  984. novm("connector string");
  985.     return (1);
  986. }
  987. #endif /* notyet */
  988. #ifdef notyet
  989. /*
  990.  * setdisconnector - Set a program to disconnect from the serial line
  991.  */
  992. static int
  993. setdisconnector(argv)
  994.     char *argv;
  995. {
  996.     ppp_if[ppp_unit]->disconnector = (char *)stringdup(argv);
  997.     if (ppp_if[ppp_unit]->disconnector == NULL)
  998.         novm("disconnector string");
  999.     return (1);
  1000. }
  1001. #endif /* notyet */
  1002. #ifdef notyet
  1003. /*
  1004.  * setdomain - Set domain name to append to hostname 
  1005.  */
  1006. static int
  1007. setdomain(argv)
  1008.     char *argv;
  1009. {
  1010.     strncat(ppp_if[ppp_unit]->hostname, argv,
  1011.     MAXNAMELEN - strlen(ppp_if[ppp_unit]->hostname));
  1012.     ppp_if[ppp_unit]->hostname[MAXNAMELEN-1] = 0;
  1013.     return (1);
  1014. }
  1015. #endif /* notyet */
  1016. /*
  1017.  * setasyncmap - add bits to asyncmap (what we request peer to escape).
  1018.  */
  1019. static int
  1020. setasyncmap(argv)
  1021.     char *argv;
  1022. {
  1023.     long asyncmap;
  1024.     if (!number_option(argv, &asyncmap, 16))
  1025. return 0;
  1026.     ppp_if[ppp_unit]->lcp_wantoptions.asyncmap |= asyncmap;
  1027.     ppp_if[ppp_unit]->lcp_wantoptions.neg_asyncmap = 1;
  1028.     return (1);
  1029. }
  1030. /*
  1031.  * setescape - add chars to the set we escape on transmission.
  1032.  */
  1033. static int
  1034. setescape(argv)
  1035.     char *argv;
  1036. {
  1037.     int n, ret;
  1038.     char *p, *endp;
  1039.     p = argv;
  1040.     ret = 1;
  1041.     while (*p) {
  1042.         n = strtoul(p, &endp, 16);
  1043.         if (p == endp) {
  1044.             syslog(LOG_ERR, "invalid hex number: %s", p);
  1045.             return 0;
  1046.         }
  1047.         p = endp;
  1048.         if (n < 0 || (0x20 <= n && n <= 0x3F) || n == 0x5E || n > 0xFF) {
  1049.             syslog(LOG_ERR, "can't escape character 0x%x", n);
  1050.             ret = 0;
  1051.         } else
  1052.             ppp_if[ppp_unit]->xmit_accm[n >> 5] |= 1 << (n & 0x1F);
  1053.         while (*p == ',' || *p == ' ')
  1054.             ++p;
  1055.     }
  1056.     return ret;
  1057. }
  1058. /*
  1059.  * setspeed - Set the speed.
  1060.  */
  1061. static int
  1062. setspeed(arg, is_string)
  1063.     int arg;
  1064.     int is_string;
  1065. {
  1066.     char *ptr;
  1067.     int spd;
  1068.     if (is_string) {
  1069.         spd = strtol((char *)arg, &ptr, 0);
  1070.         if (ptr == (char *)arg || *ptr != 0 || spd == 0)
  1071.     return 0;
  1072.         ppp_if[ppp_unit]->inspeed = spd;
  1073.     }
  1074.     else 
  1075. ppp_if[ppp_unit]->inspeed = arg;
  1076.     
  1077.     return 1;
  1078. }
  1079. /*
  1080.  * setdevname - Set the device name.
  1081.  */
  1082. int
  1083. setdevname(cp)
  1084.     char *cp;
  1085. {
  1086.     (void) strncpy(ppp_if[ppp_unit]->devname, cp, MAXPATHLEN);
  1087.     ppp_if[ppp_unit]->devname[MAXPATHLEN-1] = 0;
  1088.   
  1089.     return 1;
  1090. }
  1091. /*
  1092.  * setipaddr - Set the IP address
  1093.  *
  1094.  * This function also accepts hostnames apart from ip address strings.
  1095.  * If hostnames are passed to this function, the hostnames should be
  1096.  * added to the system by making calls to hostAdd() prior to calling this
  1097.  * function. This requires the hostTblInit be called before hostGetByName
  1098.  * is called.
  1099.  */
  1100. int
  1101. setipaddr(local_addr, remote_addr)
  1102.     char *local_addr;
  1103.     char *remote_addr;
  1104. {
  1105.     u_long local, remote;
  1106.     ipcp_options *wo = &ppp_if[ppp_unit]->ipcp_wantoptions;
  1107.     if ((local = hostGetByName (local_addr)) == ERROR)
  1108. {
  1109. if ((((local = inet_addr(local_addr)) == ERROR)) || 
  1110.     (bad_ip_adrs(local)))
  1111.     {
  1112.     syslog(LOG_ERR, "bad local IP address: %s", ip_ntoa(local));
  1113.     return 0;
  1114.     }
  1115. }
  1116.     else
  1117. {
  1118. strncpy(ppp_if[ppp_unit]->our_name, local_addr, MAXNAMELEN);
  1119. ppp_if[ppp_unit]->our_name[MAXNAMELEN-1] = 0;
  1120. }
  1121.     if (local != 0)
  1122.         wo->ouraddr = local;
  1123.     if ((remote = hostGetByName (remote_addr)) == ERROR)
  1124. {
  1125. if ((((remote = inet_addr(remote_addr)) == ERROR)) || 
  1126.     (bad_ip_adrs(remote)))
  1127.     {
  1128.     syslog(LOG_ERR, "bad remote IP address: %s", ip_ntoa(remote));
  1129.     return 0;
  1130.     }
  1131. }
  1132.     else
  1133. {
  1134. strncpy(ppp_if[ppp_unit]->remote_name, remote_addr, MAXNAMELEN);
  1135. ppp_if[ppp_unit]->remote_name[MAXNAMELEN-1] = 0;
  1136. }
  1137.     if (remote != 0)
  1138.         wo->hisaddr = remote;
  1139.     return 1;
  1140. }
  1141. #ifdef notyet
  1142. /*
  1143.  * setnoipdflt - disable setipdefault()
  1144.  */
  1145. static int
  1146. setnoipdflt()
  1147. {
  1148.     ppp_if[ppp_unit]->disable_defaultip = 1;
  1149.     return 1;
  1150. }
  1151. #endif /* notyet */
  1152. /*
  1153.  * setipcpaccl - accept peer's idea of our address
  1154.  */
  1155. static int
  1156. setipcpaccl()
  1157. {
  1158.     ppp_if[ppp_unit]->ipcp_wantoptions.accept_local = 1;
  1159.     return 1;
  1160. }
  1161. /*
  1162.  * setipcpaccr - accept peer's idea of its address
  1163.  */
  1164. static int
  1165. setipcpaccr()
  1166. {
  1167.     ppp_if[ppp_unit]->ipcp_wantoptions.accept_remote = 1;
  1168.     return 1;
  1169. }
  1170. /*
  1171.  * setipdefault - default our local IP address based on our hostname.
  1172.  */
  1173. void
  1174. setipdefault()
  1175. {
  1176.     u_long local;
  1177.     ipcp_options *wo = &ppp_if[ppp_unit]->ipcp_wantoptions;
  1178.     /*
  1179.      * If local IP address already given, don't bother.
  1180.      */
  1181.     if (wo->ouraddr != 0 || ppp_if[ppp_unit]->disable_defaultip)
  1182. return;
  1183.     /*
  1184.      * Look up our hostname (possibly with domain name appended)
  1185.      * and take the first IP address as our local IP address.
  1186.      * If there isn't an IP address for our hostname, too bad.
  1187.      */
  1188.     wo->accept_local = 1;       /* don't insist on this default value */
  1189.     if ((local = hostGetByName(ppp_if[ppp_unit]->hostname)) == ERROR)
  1190. return;
  1191.     if (local != 0 && !bad_ip_adrs(local))
  1192. wo->ouraddr = local;
  1193. }
  1194. /*
  1195.  * setnetmask - set the netmask to be used on the interface.
  1196.  */
  1197. static int
  1198. setnetmask(argv)
  1199.     char *argv;
  1200. {
  1201.     u_long mask;
  1202.     if ((mask = inet_addr(argv)) == ERROR || (ppp_if[ppp_unit]->netmask & ~mask) != 0) {
  1203. syslog(LOG_ERR, "Invalid netmask %sn", argv);
  1204. return 0;
  1205.     }
  1206.     ppp_if[ppp_unit]->netmask = mask;
  1207.     return (1);
  1208. }
  1209. /*
  1210.  * Return user specified netmask. A value of zero means no netmask has
  1211.  * been set.
  1212.  */
  1213. /* ARGSUSED */
  1214. u_long
  1215. GetMask(addr)
  1216.     u_long addr;
  1217. {
  1218.     return(ppp_if[ppp_unit]->netmask);
  1219. }
  1220. static int
  1221. setname(argv)
  1222.     char *argv;
  1223. {
  1224.     if (ppp_if[ppp_unit]->our_name[0] == 0) {
  1225. strncpy(ppp_if[ppp_unit]->our_name, argv, MAXNAMELEN);
  1226. ppp_if[ppp_unit]->our_name[MAXNAMELEN-1] = 0;
  1227.     }
  1228.     return 1;
  1229. }
  1230. static int
  1231. setuser(argv)
  1232.     char *argv;
  1233. {
  1234.     strncpy(ppp_if[ppp_unit]->user, argv, MAXNAMELEN);
  1235.     ppp_if[ppp_unit]->user[MAXNAMELEN-1] = 0;
  1236.     return 1;
  1237. }
  1238. static int
  1239. setpasswd(argv)
  1240.     char *argv;
  1241. {
  1242.     strncpy(ppp_if[ppp_unit]->passwd, argv, MAXSECRETLEN);
  1243.     ppp_if[ppp_unit]->passwd[MAXSECRETLEN-1] = 0;
  1244.     return 1;
  1245. }
  1246. static int
  1247. setremote(argv)
  1248.     char *argv;
  1249. {
  1250.     strncpy(ppp_if[ppp_unit]->remote_name, argv, MAXNAMELEN);
  1251.     ppp_if[ppp_unit]->remote_name[MAXNAMELEN-1] = 0;
  1252.     return 1;
  1253. }
  1254. #ifdef notyet
  1255. static int
  1256. setauth()
  1257. {
  1258.     ppp_if[ppp_unit]->auth_required = 1;
  1259.     return 1;
  1260. }
  1261. #endif /* notyet */
  1262. static int
  1263. setdefaultroute()
  1264. {
  1265.     ppp_if[ppp_unit]->ipcp_wantoptions.default_route = 1;
  1266.     return 1;
  1267. }
  1268. static int
  1269. setproxyarp()
  1270. {
  1271.     ppp_if[ppp_unit]->ipcp_wantoptions.proxy_arp = 1;
  1272.     return 1;
  1273. }
  1274. static int
  1275. setdologin()
  1276. {
  1277.     ppp_if[ppp_unit]->uselogin = 1;
  1278.     return 1;
  1279. }
  1280. /*
  1281.  * Functions to set the echo interval for modem-less monitors
  1282.  */
  1283. static int
  1284. setlcpechointv(argv)
  1285.     char *argv;
  1286. {
  1287.     return int_option(argv, &ppp_if[ppp_unit]->lcp_echo_interval);
  1288. }
  1289. static int
  1290. setlcpechofails(argv)
  1291.     char *argv;
  1292. {
  1293.     return int_option(argv, &ppp_if[ppp_unit]->lcp_echo_fails);
  1294. }
  1295. /*
  1296.  * Functions to set timeouts, max transmits, etc.
  1297.  */
  1298. static int
  1299. setlcptimeout(argv)
  1300.     char *argv;
  1301. {
  1302.     return int_option(argv, &ppp_if[ppp_unit]->lcp_fsm.timeouttime);
  1303. }
  1304. static int setlcpterm(argv)
  1305.     char *argv;
  1306. {
  1307.     return int_option(argv, &ppp_if[ppp_unit]->lcp_fsm.maxtermtransmits);
  1308. }
  1309. static int setlcpconf(argv)
  1310.     char *argv;
  1311. {
  1312.     return int_option(argv, &ppp_if[ppp_unit]->lcp_fsm.maxconfreqtransmits);
  1313. }
  1314. static int setlcpfails(argv)
  1315.     char *argv;
  1316. {
  1317.     return int_option(argv, &ppp_if[ppp_unit]->lcp_fsm.maxnakloops);
  1318. }
  1319. static int setipcptimeout(argv)
  1320.     char *argv;
  1321. {
  1322.     return int_option(argv, &ppp_if[ppp_unit]->ipcp_fsm.timeouttime);
  1323. }
  1324. static int setipcpterm(argv)
  1325.     char *argv;
  1326. {
  1327.     return int_option(argv, &ppp_if[ppp_unit]->ipcp_fsm.maxtermtransmits);
  1328. }
  1329. static int setipcpconf(argv)
  1330.     char *argv;
  1331. {
  1332.     return int_option(argv, &ppp_if[ppp_unit]->ipcp_fsm.maxconfreqtransmits);
  1333. }
  1334. static int setipcpfails(argv)
  1335.     char *argv;
  1336. {
  1337.     return int_option(argv, &ppp_if[ppp_unit]->ipcp_fsm.maxnakloops);
  1338. }
  1339. static int setpaptimeout(argv)
  1340.     char *argv;
  1341. {
  1342.     return int_option(argv, &ppp_if[ppp_unit]->upap.us_timeouttime);
  1343. }
  1344. static int setpapreqs(argv)
  1345.     char *argv;
  1346. {
  1347.     return int_option(argv, &ppp_if[ppp_unit]->upap.us_maxtransmits);
  1348. }
  1349. static int setchaptimeout(argv)
  1350.     char *argv;
  1351. {
  1352.     return int_option(argv, &ppp_if[ppp_unit]->chap.timeouttime);
  1353. }
  1354. static int setchapchal(argv)
  1355.     char *argv;
  1356. {
  1357.     return int_option(argv, &ppp_if[ppp_unit]->chap.max_transmits);
  1358. }
  1359. static int setchapintv(argv)
  1360.     char *argv;
  1361. {
  1362.     return int_option(argv, &ppp_if[ppp_unit]->chap.chal_interval);
  1363. }