move more stuff from main.c into tty.c, for 2.4.0b4
authorPaul Mackerras <paulus@samba.org>
Thu, 6 Jul 2000 11:17:03 +0000 (11:17 +0000)
committerPaul Mackerras <paulus@samba.org>
Thu, 6 Jul 2000 11:17:03 +0000 (11:17 +0000)
pppd/main.c
pppd/patchlevel.h
pppd/pppd.h
pppd/tty.c

index 3d4c16acbad4db134f3ed5ea76eee7174327454d..389a1c9ff90134960d9392effae496e35e6819e1 100644 (file)
@@ -17,7 +17,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define RCSID  "$Id: main.c,v 1.99 2000/06/30 04:54:20 paulus Exp $"
+#define RCSID  "$Id: main.c,v 1.100 2000/07/06 11:17:02 paulus Exp $"
 
 #include <stdio.h>
 #include <ctype.h>
@@ -89,7 +89,6 @@ int hungup;                   /* terminal has been hung up */
 int privileged;                        /* we're running as real uid root */
 int need_holdoff;              /* need holdoff period before restarting */
 int detached;                  /* have detached from terminal */
-struct stat devstat;           /* result of stat() on devnam */
 volatile int status;           /* exit status for pppd */
 int unsuccess;                 /* # unsuccessful connection attempts */
 int do_callback;               /* != 0 if we should do callback next */
@@ -108,6 +107,7 @@ static int fd_loop;         /* fd for getting demand-dial packets */
 int phase;                     /* where the link is at */
 int kill_link;
 int open_ccp_flag;
+int listen_time;
 
 static int waiting;
 static sigjmp_buf sigjmp;
@@ -222,13 +222,12 @@ main(argc, argv)
     int argc;
     char *argv[];
 {
-    int i, fdflags, t;
+    int i, t;
     char *p;
     struct passwd *pw;
     struct timeval timo;
     sigset_t mask;
     struct protent *protp;
-    struct stat statbuf;
     char numbuf[16];
 
     new_phase(PHASE_INITIALIZE);
@@ -277,12 +276,13 @@ main(argc, argv)
      */
     for (i = 0; (protp = protocols[i]) != NULL; ++i)
         (*protp->init)(0);
+    tty_init();
 
     progname = *argv;
 
     /*
      * Parse, in order, the system options file, the user's options file,
-     * the tty's options file, and the command line arguments.
+     * and the command line arguments.
      */
     if (!options_from_file(_PATH_SYSOPTIONS, !privileged, 0, 1)
        || !options_from_user()
@@ -290,27 +290,10 @@ main(argc, argv)
        exit(EXIT_OPTION_ERROR);
 
     /*
-     * Work out the device name, if it hasn't already been specified.
+     * Work out the device name, if it hasn't already been specified,
+     * and parse the tty's options file.
      */
-    using_pty = notty || ptycommand != NULL || pty_socket != NULL;
-    if (!using_pty && default_device) {
-       char *p;
-       if (!isatty(0) || (p = ttyname(0)) == NULL) {
-           option_error("no device specified and stdin is not a tty");
-           exit(EXIT_OPTION_ERROR);
-       }
-       strlcpy(devnam, p, sizeof(devnam));
-       if (stat(devnam, &devstat) < 0)
-           fatal("Couldn't stat default device %s: %m", devnam);
-    }
-
-    /*
-     * Parse the tty options file.
-     * The per-tty options file should not change
-     * ptycommand, pty_socket, notty or devnam.
-     */
-    if (!using_pty && !options_for_tty())
-       exit(EXIT_OPTION_ERROR);
+    tty_device_check();
 
     /*
      * Check that we are running as root.
@@ -338,58 +321,7 @@ main(argc, argv)
     for (i = 0; (protp = protocols[i]) != NULL; ++i)
        if (protp->check_options != NULL)
            (*protp->check_options)();
-    if (demand && connect_script == 0) {
-       option_error("connect script is required for demand-dialling\n");
-       exit(EXIT_OPTION_ERROR);
-    }
-    /* default holdoff to 0 if no connect script has been given */
-    if (connect_script == 0 && !holdoff_specified)
-       holdoff = 0;
-
-    if (using_pty) {
-       if (!default_device) {
-           option_error("%s option precludes specifying device name",
-                        notty? "notty": "pty");
-           exit(EXIT_OPTION_ERROR);
-       }
-       if (ptycommand != NULL && notty) {
-           option_error("pty option is incompatible with notty option");
-           exit(EXIT_OPTION_ERROR);
-       }
-       if (pty_socket != NULL && (ptycommand != NULL || notty)) {
-           option_error("socket option is incompatible with pty and notty");
-           exit(EXIT_OPTION_ERROR);
-       }
-       default_device = notty;
-       lockflag = 0;
-       modem = 0;
-       if (notty && log_to_fd <= 1)
-           log_to_fd = -1;
-    } else {
-       /*
-        * If the user has specified a device which is the same as
-        * the one on stdin, pretend they didn't specify any.
-        * If the device is already open read/write on stdin,
-        * we assume we don't need to lock it, and we can open it as root.
-        */
-       if (fstat(0, &statbuf) >= 0 && S_ISCHR(statbuf.st_mode)
-           && statbuf.st_rdev == devstat.st_rdev) {
-           default_device = 1;
-           fdflags = fcntl(0, F_GETFL);
-           if (fdflags != -1 && (fdflags & O_ACCMODE) == O_RDWR)
-               privopen = 1;
-       }
-    }
-    if (default_device)
-       nodetach = 1;
-
-    /*
-     * Don't send log messages to the serial port, it tends to
-     * confuse the peer. :-)
-     */
-    if (log_to_fd >= 0 && fstat(log_to_fd, &statbuf) >= 0
-       && S_ISCHR(statbuf.st_mode) && statbuf.st_rdev == devstat.st_rdev)
-       log_to_fd = -1;
+    tty_check_options();
 
     /*
      * Initialize system-dependent stuff.
@@ -460,6 +392,7 @@ main(argc, argv)
     do_callback = 0;
     for (;;) {
 
+       listen_time = 0;
        need_holdoff = 1;
        devfd = -1;
        status = EXIT_OK;
@@ -546,14 +479,12 @@ main(argc, argv)
         * our packets off his tty before he has it set up.
         */
        add_fd(fd_ppp);
-#ifdef XXX
-       if (connect_delay != 0 && (connector != NULL || ptycommand != NULL)) {
+       if (listen_time != 0) {
            struct timeval t;
-           t.tv_sec = connect_delay / 1000;
-           t.tv_usec = connect_delay % 1000;
+           t.tv_sec = listen_time / 1000;
+           t.tv_usec = listen_time % 1000;
            wait_input(&t);
        }
-#endif
 
        lcp_open(0);            /* Start protocol */
        open_ccp_flag = 0;
index 22fe03c4a08e8343480b70eaacfbff31ea1504aa..0fc28cbbb353da105ea9cdad6bdf1483b59a247c 100644 (file)
@@ -1,6 +1,6 @@
-/* $Id: patchlevel.h,v 1.47 2000/04/24 07:39:47 paulus Exp $ */
+/* $Id: patchlevel.h,v 1.48 2000/07/06 11:17:02 paulus Exp $ */
 #define        PATCHLEVEL      0
 
 #define VERSION                "2.4"
-#define IMPLEMENTATION "b3"
-#define DATE           "24 April 2000"
+#define IMPLEMENTATION "b4"
+#define DATE           "6 July 2000"
index 6baaebcbec65baf77bda958b6d5a1244dbc155d4..7b15c39577ae56e80919893173c64692ab9f90df 100644 (file)
@@ -16,7 +16,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * $Id: pppd.h,v 1.55 2000/06/30 04:54:22 paulus Exp $
+ * $Id: pppd.h,v 1.56 2000/07/06 11:17:03 paulus Exp $
  */
 
 /*
@@ -199,6 +199,7 @@ extern struct notifier *pidchange;   /* for notifications of pid changing */
 extern struct notifier *phasechange; /* for notifications of phase changes */
 extern struct notifier *exitnotify;  /* for notification that we're exiting */
 extern struct notifier *sigreceived; /* notification of received signal */
+extern int     listen_time;    /* time to listen first (ms) */
 
 /* Values for do_callback and doing_callback */
 #define CALLBACK_DIALIN                1       /* we are expecting the call back */
@@ -355,6 +356,8 @@ void notify __P((struct notifier *, int));
 
 /* Procedures exported from tty.c. */
 void tty_init __P((void));
+void tty_device_check __P((void));
+void tty_check_options __P((void));
 int  connect_tty __P((void));
 void disconnect_tty __P((void));
 void tty_close_fds __P((void));
index 3e02e27dd16ab2147b9d3a405a5902625d49b27c..751bfadb5a5261fc220f480d8cf7fa398708d07e 100644 (file)
@@ -20,7 +20,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define RCSID  "$Id: tty.c,v 1.1 2000/06/30 04:54:23 paulus Exp $"
+#define RCSID  "$Id: tty.c,v 1.2 2000/07/06 11:17:03 paulus Exp $"
 
 #include <stdio.h>
 #include <ctype.h>
@@ -70,6 +70,7 @@ int baud_rate;                        /* Actual bits/second for serial device */
 char *callback_script;         /* script for doing callback */
 int charshunt_pid;             /* Process ID for charshunt */
 int locked;                    /* lock() has succeeded */
+struct stat devstat;           /* result of stat() on devnam */
 
 /* option variables */
 int    crtscts = 0;            /* Use hardware flow control */
@@ -86,7 +87,7 @@ char  *record_file = NULL;    /* File to record chars sent/received */
 int    max_data_rate;          /* max bytes/sec through charshunt */
 bool   sync_serial = 0;        /* Device is synchronous serial device */
 char   *pty_socket = NULL;     /* Socket to connect to pty */
-int    using_pty = 0;
+int    using_pty = 0;          /* we're allocating a pty as the device */
 
 extern uid_t uid;
 extern int kill_link;
@@ -164,6 +165,102 @@ void tty_init()
     add_options(tty_options);
 }
 
+/*
+ * tty_device_check - work out which tty device we are using
+ * and read its options file.
+ */
+void tty_device_check()
+{
+       using_pty = notty || ptycommand != NULL || pty_socket != NULL;
+       if (using_pty)
+               return;
+       if (default_device) {
+               char *p;
+               if (!isatty(0) || (p = ttyname(0)) == NULL) {
+                       option_error("no device specified and stdin is not a tty");
+                       exit(EXIT_OPTION_ERROR);
+               }
+               strlcpy(devnam, p, sizeof(devnam));
+               if (stat(devnam, &devstat) < 0)
+                       fatal("Couldn't stat default device %s: %m", devnam);
+       }
+
+
+       /*
+        * Parse the tty options file.
+        * The per-tty options file should not change
+        * ptycommand, pty_socket, notty or devnam.
+        * options_for_tty doesn't override options set on the command line,
+        * except for some privileged options.
+        */
+       if (!options_for_tty())
+               exit(EXIT_OPTION_ERROR);
+}
+
+/*
+ * tty_check_options - do consistency checks on the options we were given.
+ */
+void
+tty_check_options()
+{
+       struct stat statbuf;
+       int fdflags;
+
+       if (demand && connect_script == 0) {
+               option_error("connect script is required for demand-dialling\n");
+               exit(EXIT_OPTION_ERROR);
+       }
+       /* default holdoff to 0 if no connect script has been given */
+       if (connect_script == 0 && !holdoff_specified)
+               holdoff = 0;
+
+       if (using_pty) {
+               if (!default_device) {
+                       option_error("%s option precludes specifying device name",
+                                    notty? "notty": "pty");
+                       exit(EXIT_OPTION_ERROR);
+               }
+               if (ptycommand != NULL && notty) {
+                       option_error("pty option is incompatible with notty option");
+                       exit(EXIT_OPTION_ERROR);
+               }
+               if (pty_socket != NULL && (ptycommand != NULL || notty)) {
+                       option_error("socket option is incompatible with pty and notty");
+                       exit(EXIT_OPTION_ERROR);
+               }
+               default_device = notty;
+               lockflag = 0;
+               modem = 0;
+               if (notty && log_to_fd <= 1)
+                       log_to_fd = -1;
+       } else {
+               /*
+                * If the user has specified a device which is the same as
+                * the one on stdin, pretend they didn't specify any.
+                * If the device is already open read/write on stdin,
+                * we assume we don't need to lock it, and we can open it
+                * as root.
+                */
+               if (fstat(0, &statbuf) >= 0 && S_ISCHR(statbuf.st_mode)
+                   && statbuf.st_rdev == devstat.st_rdev) {
+                       default_device = 1;
+                       fdflags = fcntl(0, F_GETFL);
+                       if (fdflags != -1 && (fdflags & O_ACCMODE) == O_RDWR)
+                               privopen = 1;
+               }
+       }
+       if (default_device)
+               nodetach = 1;
+
+       /*
+        * Don't send log messages to the serial port, it tends to
+        * confuse the peer. :-)
+        */
+       if (log_to_fd >= 0 && fstat(log_to_fd, &statbuf) >= 0
+           && S_ISCHR(statbuf.st_mode) && statbuf.st_rdev == devstat.st_rdev)
+               log_to_fd = -1;
+}
+
 /*
  * connect_tty - get the serial port ready to start doing PPP.
  * That is, open the serial port, set its speed and mode, and run
@@ -373,6 +470,9 @@ int connect_tty()
                        warn("Welcome script failed");
        }
 
+       if (connector != NULL || ptycommand != NULL)
+               listen_time = connect_delay;
+
        return ttyfd;
 }