]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/options.c
Update DFS's legal name and email address to correct values. (#381)
[ppp.git] / pppd / options.c
index 108e2b8c1197968f770bb3bb40bc560f9a53c19a..cea09e39f05a4ef28032fffe1394f8818aa96b96 100644 (file)
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <ctype.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <syslog.h>
 #include <string.h>
 #include <pwd.h>
-#ifdef PLUGIN
+#include <sys/param.h>
+#include <net/if.h>
+#ifdef PPP_WITH_PLUGINS
 #include <dlfcn.h>
 #endif
 
-#ifdef PPP_FILTER
+#ifdef PPP_WITH_FILTER
 #include <pcap.h>
 /*
  * There have been 3 or 4 different names for this in libpcap CVS, but
@@ -69,7 +75,7 @@
 #define DLT_PPP_PPPD   DLT_PPP
 #endif
 #endif
-#endif /* PPP_FILTER */
+#endif /* PPP_WITH_FILTER */
 
 #include "pppd.h"
 #include "pathnames.h"
@@ -117,27 +123,31 @@ int       connect_delay = 1000;   /* wait this many ms after connect script */
 int    req_unit = -1;          /* requested interface unit */
 char   path_ipup[MAXPATHLEN];  /* pathname of ip-up script */
 char   path_ipdown[MAXPATHLEN];/* pathname of ip-down script */
-char   req_ifname[MAXIFNAMELEN];       /* requested interface name */
+char   req_ifname[IFNAMSIZ];   /* requested interface name */
 bool   multilink = 0;          /* Enable multilink operation */
 char   *bundle_name = NULL;    /* bundle name for multilink */
 bool   dump_options;           /* print out option values */
+bool   show_options;           /* print all supported options and exit */
 bool   dryrun;                 /* print out option values and exit */
 char   *domain;                /* domain name set by domain option */
 int    child_wait = 5;         /* # seconds to wait for children at exit */
 struct userenv *userenv_list;  /* user environment variables */
 int    dfl_route_metric = -1;  /* metric of the default route to set over the PPP link */
 
-#ifdef MAXOCTETS
+#ifdef PPP_WITH_IPV6CP
+char   path_ipv6up[MAXPATHLEN];   /* pathname of ipv6-up script */
+char   path_ipv6down[MAXPATHLEN]; /* pathname of ipv6-down script */
+#endif
+
 unsigned int  maxoctets = 0;    /* default - no limit */
 int maxoctets_dir = 0;       /* default - sum of traffic */
 int maxoctets_timeout = 1;   /* default 1 second */ 
-#endif
 
 
 extern option_t auth_options[];
 extern struct stat devstat;
 
-#ifdef PPP_FILTER
+#ifdef PPP_WITH_FILTER
 struct bpf_program pass_filter;/* Filter program for packets to pass */
 struct bpf_program active_filter; /* Filter program for link-active pkts */
 #endif
@@ -152,6 +162,8 @@ bool devnam_fixed;          /* can no longer change device name */
 static int logfile_fd = -1;    /* fd opened for log file */
 static char logfile_name[MAXPATHLEN];  /* name of log file */
 
+static bool noipx_opt;         /* dummy for noipx option */
+
 /*
  * Prototypes
  */
@@ -162,18 +174,16 @@ static int showversion(char **);
 static int showhelp(char **);
 static void usage(void);
 static int setlogfile(char **);
-#ifdef PLUGIN
+#ifdef PPP_WITH_PLUGINS
 static int loadplugin(char **);
 #endif
 
-#ifdef PPP_FILTER
+#ifdef PPP_WITH_FILTER
 static int setpassfilter(char **);
 static int setactivefilter(char **);
 #endif
 
-#ifdef MAXOCTETS
 static int setmodir(char **);
-#endif
 
 static int user_setenv(char **);
 static void user_setprint(option_t *, printer_func, void *);
@@ -254,6 +264,10 @@ option_t general_options[] = {
 
     { "--version", o_special_noarg, (void *)showversion,
       "Show version number" },
+    { "-v", o_special_noarg, (void *)showversion,
+      "Show version number" },
+    { "show-options", o_bool, &show_options,
+      "Show all options and exit", 1 },
     { "--help", o_special_noarg, (void *)showhelp,
       "Show brief listing of options" },
     { "-h", o_special_noarg, (void *)showhelp,
@@ -295,7 +309,7 @@ option_t general_options[] = {
 
     { "ifname", o_string, req_ifname,
       "Set PPP interface name",
-      OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXIFNAMELEN },
+      OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, IFNAMSIZ },
 
     { "dump", o_bool, &dump_options,
       "Print out option values after parsing all options", 1 },
@@ -324,7 +338,16 @@ option_t general_options[] = {
       "Set pathname of ip-down script",
       OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
 
-#ifdef HAVE_MULTILINK
+#ifdef PPP_WITH_IPV6CP
+    { "ipv6-up-script", o_string, path_ipv6up,
+      "Set pathname of ipv6-up script",
+      OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
+    { "ipv6-down-script", o_string, path_ipv6down,
+      "Set pathname of ipv6-down script",
+      OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
+#endif
+
+#ifdef PPP_WITH_MULTILINK
     { "multilink", o_bool, &multilink,
       "Enable multilink operation", OPT_PRIO | 1 },
     { "mp", o_bool, &multilink,
@@ -336,14 +359,14 @@ option_t general_options[] = {
 
     { "bundle", o_string, &bundle_name,
       "Bundle name for multilink", OPT_PRIO },
-#endif /* HAVE_MULTILINK */
+#endif /* PPP_WITH_MULTILINK */
 
-#ifdef PLUGIN
+#ifdef PPP_WITH_PLUGINS
     { "plugin", o_special, (void *)loadplugin,
       "Load a plug-in module into pppd", OPT_PRIV | OPT_A2LIST },
 #endif
 
-#ifdef PPP_FILTER
+#ifdef PPP_WITH_FILTER
     { "pass-filter", o_special, setpassfilter,
       "set filter for packets to pass", OPT_PRIO },
 
@@ -351,7 +374,6 @@ option_t general_options[] = {
       "set filter for active pkts", OPT_PRIO },
 #endif
 
-#ifdef MAXOCTETS
     { "maxoctets", o_int, &maxoctets,
       "Set connection traffic limit",
       OPT_PRIO | OPT_LLIMIT | OPT_NOINCR | OPT_ZEROINF },
@@ -362,7 +384,9 @@ option_t general_options[] = {
       "Set direction for limit traffic (sum,in,out,max)" },
     { "mo-timeout", o_int, &maxoctets_timeout,
       "Check for traffic limit every N seconds", OPT_PRIO | OPT_LLIMIT | 1 },
-#endif
+
+    /* Dummy option, does nothing */
+    { "noipx", o_bool, &noipx_opt, NULL, OPT_NOPRINT | 1 },
 
     { NULL }
 };
@@ -371,23 +395,6 @@ option_t general_options[] = {
 #define IMPLEMENTATION ""
 #endif
 
-static char *usage_string = "\
-pppd version %s\n\
-Usage: %s [ options ], where options are:\n\
-       <device>        Communicate over the named device\n\
-       <speed>         Set the baud rate to <speed>\n\
-       <loc>:<rem>     Set the local and/or remote interface IP\n\
-                       addresses.  Either one may be omitted.\n\
-       asyncmap <n>    Set the desired async map to hex <n>\n\
-       auth            Require authentication from peer\n\
-        connect <p>     Invoke shell command <p> to set up the serial line\n\
-       crtscts         Use hardware RTS/CTS flow control\n\
-       defaultroute    Add default route through interface\n\
-       file <f>        Take options from file <f>\n\
-       modem           Use modem control lines\n\
-       mru <n>         Set MRU value to <n> for negotiation\n\
-See pppd(8) for more options.\n\
-";
 
 /*
  * parse_args - parse a string of arguments from the command line.
@@ -512,7 +519,7 @@ options_from_user(void)
     pw = getpwuid(getuid());
     if (pw == NULL || (user = pw->pw_dir) == NULL || user[0] == 0)
        return 1;
-    file = _PATH_USEROPT;
+    file = PPP_PATH_USEROPT;
     pl = strlen(user) + strlen(file) + 2;
     path = malloc(pl);
     if (path == NULL)
@@ -544,13 +551,13 @@ options_for_tty(void)
        dev = p + 5;
     if (dev[0] == 0 || strcmp(dev, "tty") == 0)
        return 1;               /* don't look for /etc/ppp/options.tty */
-    pl = strlen(_PATH_TTYOPT) + strlen(dev) + 1;
+    pl = strlen(PPP_PATH_TTYOPT) + strlen(dev) + 1;
     path = malloc(pl);
     if (path == NULL)
        novm("tty init file name");
-    slprintf(path, pl, "%s%s", _PATH_TTYOPT, dev);
+    slprintf(path, pl, "%s%s", PPP_PATH_TTYOPT, dev);
     /* Turn slashes into dots, for Solaris case (e.g. /dev/term/a) */
-    for (p = path + strlen(_PATH_TTYOPT); *p != 0; ++p)
+    for (p = path + strlen(PPP_PATH_TTYOPT); *p != 0; ++p)
        if (*p == '/')
            *p = '.';
     option_priority = OPRIO_CFGFILE;
@@ -1047,8 +1054,33 @@ print_options(printer_func printer, void *arg)
 static void
 usage(void)
 {
-    if (phase == PHASE_INITIALIZE)
-       fprintf(stderr, usage_string, VERSION, progname);
+    FILE *fp = stderr;
+    if (phase == PHASE_INITIALIZE) {
+        fprintf(fp, "%s v%s\n", PACKAGE_NAME, PACKAGE_VERSION);
+        fprintf(fp, "Copyright (C) 1999-2022 Paul Mackerras, and others. All rights reserved.\n\n");
+
+
+        fprintf(fp, "License BSD: The 3 clause BSD license <https://opensource.org/licenses/BSD-3-Clause>\n");
+        fprintf(fp, "This is free software: you are free to change and redistribute it.\n");
+        fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n\n");
+
+        fprintf(fp, "Report Bugs:\n   %s\n\n", PACKAGE_BUGREPORT);
+        fprintf(fp, "Usage: %s [ options ], where options are:\n", progname);
+        fprintf(fp, "   <device>        Communicate over the named device\n");
+        fprintf(fp, "   <speed>         Set the baud rate to <speed>\n");
+        fprintf(fp, "   <loc>:<rem>     Set the local and/or remote interface IP\n");
+        fprintf(fp, "                   addresses.  Either one may be omitted.\n");
+        fprintf(fp, "   asyncmap <n>    Set the desired async map to hex <n>\n");
+        fprintf(fp, "   auth            Require authentication from peer\n");
+        fprintf(fp, "   connect <p>     Invoke shell command <p> to set up the serial line\n");
+        fprintf(fp, "   crtscts         Use hardware RTS/CTS flow control\n");
+        fprintf(fp, "   defaultroute    Add default route through interface\n");
+        fprintf(fp, "   file <f>        Take options from file <f>\n");
+        fprintf(fp, "   modem           Use modem control lines\n");
+        fprintf(fp, "   mru <n>         Set MRU value to <n> for negotiation\n");
+        fprintf(fp, "   show-options    Display an extended list of options\n");
+        fprintf(fp, "See pppd(8) for more options.\n");
+    }
 }
 
 /*
@@ -1077,6 +1109,61 @@ showversion(char **argv)
     return 0;
 }
 
+/*
+ * Print a set of options including the name of the group of options
+ */
+static void
+showopts_list(FILE *fp, const char *title, option_t *list, ...)
+{
+       option_t *opt = list;
+    va_list varg;
+
+    if (opt && opt->name) {
+        va_start(varg, list);
+        vfprintf(fp, title, varg);
+        fprintf(fp, ":\n");
+        va_end(varg);
+
+        do {
+            fprintf(fp, "    %-22s %s\n", opt->name, opt->description?:"");
+            opt++;
+        } while (opt && opt->name);
+
+        fprintf(fp, "\n");
+    }
+}
+
+/*
+ * Dumps the list of available options
+ */
+void
+showopts(void)
+{
+    struct option_list *list;
+    FILE *fp = stderr;
+    int i = 0;
+
+    showopts_list(fp, "General Options",
+            general_options);
+
+    showopts_list(fp, "Authentication Options",
+            auth_options);
+
+    for (list = extra_options; list != NULL; list = list->next)
+               showopts_list(fp, "Extra Options", list->options);
+
+    showopts_list(fp, "Channel Options",
+            the_channel->options);
+
+    for (i = 0; protocols[i] != NULL; ++i) {
+        if (protocols[i]->options != NULL) {
+            showopts_list(fp, "%s Options",
+                    protocols[i]->options,
+                    protocols[i]->name);
+        }
+    }
+}
+
 /*
  * option_error - print a message about an error in an option.
  * The message is logged, and also sent to
@@ -1447,10 +1534,11 @@ callfile(char **argv)
        return 0;
     }
 
-    l = strlen(arg) + strlen(_PATH_PEERFILES) + 1;
+    l = strlen(arg) + strlen(PPP_PATH_PEERFILES) + 1;
     if ((fname = (char *) malloc(l)) == NULL)
        novm("call file name");
-    slprintf(fname, l, "%s%s", _PATH_PEERFILES, arg);
+    slprintf(fname, l, "%s%s", PPP_PATH_PEERFILES, arg);
+    script_setenv("CALL_FILE", arg, 0);
 
     ok = options_from_file(fname, 1, 1, 1);
 
@@ -1458,7 +1546,7 @@ callfile(char **argv)
     return ok;
 }
 
-#ifdef PPP_FILTER
+#ifdef PPP_WITH_FILTER
 /*
  * setpassfilter - Set the pass filter for packets
  */
@@ -1548,7 +1636,6 @@ setlogfile(char **argv)
     return 1;
 }
 
-#ifdef MAXOCTETS
 static int
 setmodir(char **argv)
 {
@@ -1565,9 +1652,8 @@ setmodir(char **argv)
     }
     return 1;
 }
-#endif
 
-#ifdef PLUGIN
+#ifdef PPP_WITH_PLUGINS
 static int
 loadplugin(char **argv)
 {
@@ -1579,7 +1665,7 @@ loadplugin(char **argv)
     const char *vers;
 
     if (strchr(arg, '/') == 0) {
-       const char *base = _PATH_PLUGIN;
+       const char *base = PPP_PATH_PLUGIN;
        int l = strlen(base) + strlen(arg) + 2;
        path = malloc(l);
        if (path == 0)
@@ -1620,7 +1706,7 @@ loadplugin(char **argv)
        free(path);
     return 0;
 }
-#endif /* PLUGIN */
+#endif /* PPP_WITH_PLUGINS */
 
 /*
  * Set an environment variable specified by the user.