*/
#ifndef lint
-static char rcsid[] = "$Id: main.c,v 1.78 1999/05/12 06:19:47 paulus Exp $";
+static char rcsid[] = "$Id: main.c,v 1.80 1999/07/21 00:24:31 paulus Exp $";
#endif
#include <stdio.h>
int detached; /* have detached from terminal */
struct stat devstat; /* result of stat() on devnam */
int prepass = 0; /* doing prepass to find device name */
+int devnam_fixed; /* set while in options.ttyxx file */
volatile int status; /* exit status for pppd */
static int fd_ppp = -1; /* fd for talking PPP */
static struct timeval start_time; /* Time when link was started. */
struct pppd_stats link_stats;
+int link_connect_time;
int link_stats_valid;
static int charshunt_pid; /* Process ID for charshunt */
struct protent *protp;
struct stat statbuf;
char numbuf[16];
- struct timeval now;
phase = PHASE_INITIALIZE;
* The per-tty options file should not change
* ptycommand, notty or devnam.
*/
+ devnam_fixed = 1;
if (!using_pty) {
- int save_defdev = default_device;
-
- default_device = 1;
if (!options_for_tty())
exit(EXIT_OPTION_ERROR);
- if (notty || ptycommand != NULL) {
- option_error("%s option may not be used in per-tty options file",
- notty? "notty": "pty");
- exit(EXIT_OPTION_ERROR);
- }
- if (!default_device) {
- option_error("per-tty options file may not specify device name");
- exit(EXIT_OPTION_ERROR);
- }
- default_device = save_defdev;
}
+ devnam_fixed = 0;
if (!parse_args(argc-1, argv+1))
exit(EXIT_OPTION_ERROR);
info("Starting link");
}
+ phase = PHASE_SERIALCONN;
+
/*
* Get a pty master/slave pair if the pty, notty, or record
* options were specified.
/*
* Set line speed, flow control, etc.
- * If we have a non-null connection script,
+ * If we have a non-null connection or initializer script,
* on most systems we set CLOCAL for now so that we can talk
* to the modem before carrier comes up. But this has the
* side effect that we might miss it if CD drops before we
* successfully to the modem with CLOCAL clear and CD down,
* we could clear CLOCAL at this point.
*/
- set_up_tty(ttyfd, (connector != NULL && connector[0] != 0));
+ set_up_tty(ttyfd, ((connector != NULL && connector[0] != 0)
+ || initializer != NULL));
real_ttyfd = ttyfd;
}
}
/* run connection script */
- if (connector && connector[0]) {
- MAINDEBUG(("Connecting with <%s>", connector));
-
+ if ((connector && connector[0]) || initializer) {
if (real_ttyfd != -1) {
if (!default_device && modem) {
setdtr(real_ttyfd, 0); /* in case modem is off hook */
}
}
- if (device_script(connector, ttyfd, ttyfd, 0) < 0) {
- error("Connect script failed");
- status = EXIT_CONNECT_FAILED;
- goto fail;
+ if (initializer && initializer[0]) {
+ if (device_script(initializer, ttyfd, ttyfd, 0) < 0) {
+ error("Initializer script failed");
+ status = EXIT_INIT_FAILED;
+ goto fail;
+ }
+ if (kill_link)
+ goto disconnect;
+
+ info("Serial port initialized.");
}
- if (kill_link)
- goto disconnect;
- info("Serial connection established.");
+ if (connector && connector[0]) {
+ if (device_script(connector, ttyfd, ttyfd, 0) < 0) {
+ error("Connect script failed");
+ status = EXIT_CONNECT_FAILED;
+ goto fail;
+ }
+ if (kill_link)
+ goto disconnect;
+
+ info("Serial connection established.");
+ }
/* set line speed, flow control, etc.;
clear CLOCAL if modem option */
*/
notice("Connect: %s <--> %s", ifname, ppp_devnam);
gettimeofday(&start_time, NULL);
+ link_stats_valid = 0;
+ script_unsetenv("CONNECT_TIME");
+ script_unsetenv("BYTES_SENT");
+ script_unsetenv("BYTES_RCVD");
lcp_lowerup(0);
/*
/*
* Print connect time and statistics.
*/
- if (gettimeofday(&now, NULL) >= 0) {
- int t = now.tv_sec - start_time.tv_sec;
- t = (t + 5) / 6; /* now in 1/10ths of minutes */
- info("Connect time %d.%d minutes.", t/10, t%10);
- }
if (link_stats_valid) {
+ int t = (link_connect_time + 5) / 6; /* 1/10ths of minutes */
+ info("Connect time %d.%d minutes.", t/10, t%10);
info("Sent %d bytes, received %d bytes.",
link_stats.bytes_out, link_stats.bytes_in);
}
}
/* Wait for scripts to finish */
+ /* XXX should have a timeout here */
while (n_children > 0) {
if (debug) {
struct subprocess *chp;
real_ttyfd = -1;
}
+/*
+ * update_link_stats - get stats at link termination.
+ */
+void
+update_link_stats(u)
+ int u;
+{
+ struct timeval now;
+ char numbuf[32];
+
+ if (!get_ppp_stats(u, &link_stats)
+ || gettimeofday(&now, NULL) < 0)
+ return;
+ link_connect_time = now.tv_sec - start_time.tv_sec;
+ link_stats_valid = 1;
+
+ slprintf(numbuf, sizeof(numbuf), "%d", link_connect_time);
+ script_setenv("CONNECT_TIME", numbuf);
+ slprintf(numbuf, sizeof(numbuf), "%d", link_stats.bytes_out);
+ script_setenv("BYTES_SENT", numbuf);
+ slprintf(numbuf, sizeof(numbuf), "%d", link_stats.bytes_in);
+ script_setenv("BYTES_RCVD", numbuf);
+}
+
struct callout {
struct timeval c_time; /* time at which to call routine */