From: Paul Mackerras Date: Thu, 6 Jul 2000 11:17:03 +0000 (+0000) Subject: move more stuff from main.c into tty.c, for 2.4.0b4 X-Git-Tag: ppp-2.4.7~530 X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=commitdiff_plain;h=00c0882b073af34555603c46a12b48e5d08df135 move more stuff from main.c into tty.c, for 2.4.0b4 --- diff --git a/pppd/main.c b/pppd/main.c index 3d4c16a..389a1c9 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -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 #include @@ -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; diff --git a/pppd/patchlevel.h b/pppd/patchlevel.h index 22fe03c..0fc28cb 100644 --- a/pppd/patchlevel.h +++ b/pppd/patchlevel.h @@ -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" diff --git a/pppd/pppd.h b/pppd/pppd.h index 6baaebc..7b15c39 100644 --- a/pppd/pppd.h +++ b/pppd/pppd.h @@ -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)); diff --git a/pppd/tty.c b/pppd/tty.c index 3e02e27..751bfad 100644 --- a/pppd/tty.c +++ b/pppd/tty.c @@ -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 #include @@ -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; }