* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-#define RCSID "$Id: main.c,v 1.85 1999/08/24 05:59:15 paulus Exp $"
+#define RCSID "$Id: main.c,v 1.86 1999/09/11 12:08:57 paulus Exp $"
#include <stdio.h>
#include <ctype.h>
int devnam_fixed; /* set while in options.ttyxx file */
volatile int status; /* exit status for pppd */
int unsuccess; /* # unsuccessful connection attempts */
+int (*holdoff_hook) __P((void)) = NULL;
+int (*new_phase_hook) __P((int)) = NULL;
static int fd_ppp = -1; /* fd for talking PPP */
static int fd_loop; /* fd for getting demand-dial packets */
int argc;
char *argv[];
{
- int i, fdflags;
+ int i, fdflags, t;
struct sigaction sa;
char *p;
struct passwd *pw;
struct stat statbuf;
char numbuf[16];
- phase = PHASE_INITIALIZE;
+ new_phase(PHASE_INITIALIZE);
/*
* Ensure that fds 0, 1, 2 are open, to /dev/null if nowhere else.
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 (connector == 0 && !holdoff_specified)
+ holdoff = 0;
if (using_pty) {
if (!default_device) {
* Don't do anything until we see some activity.
*/
kill_link = 0;
- phase = PHASE_DORMANT;
+ new_phase(PHASE_DORMANT);
demand_unblock();
add_fd(fd_loop);
for (;;) {
info("Starting link");
}
- phase = PHASE_SERIALCONN;
+ new_phase(PHASE_SERIALCONN);
/*
* Get a pty master/slave pair if the pty, notty, or record
open_ccp_flag = 0;
add_fd(fd_ppp);
status = EXIT_NEGOTIATION_FAILED;
- for (phase = PHASE_ESTABLISH; phase != PHASE_DEAD; ) {
+ new_phase(PHASE_ESTABLISH);
+ while (phase != PHASE_DEAD) {
if (sigsetjmp(sigjmp, 1) == 0) {
sigprocmask(SIG_BLOCK, &mask, NULL);
if (kill_link || open_ccp_flag || got_sigchld) {
kill_link = 0;
}
if (open_ccp_flag) {
- if (phase == PHASE_NETWORK) {
+ if (phase == PHASE_NETWORK || phase == PHASE_RUNNING) {
ccp_fsm[0].flags = OPT_RESTART; /* clears OPT_SILENT */
(*ccp_protent.open)(0);
}
*/
disconnect:
if (disconnector && !hungup) {
+ new_phase(PHASE_DISCONNECT);
if (real_ttyfd >= 0)
set_up_tty(real_ttyfd, 1);
if (device_script(disconnector, ttyfd, ttyfd, 0) < 0) {
kill_link = 0;
if (demand)
demand_discard();
- if (holdoff > 0 && need_holdoff) {
- phase = PHASE_HOLDOFF;
- TIMEOUT(holdoff_end, NULL, holdoff);
+ t = need_holdoff? holdoff: 0;
+ if (holdoff_hook)
+ t = (*holdoff_hook)();
+ if (t > 0) {
+ new_phase(PHASE_HOLDOFF);
+ TIMEOUT(holdoff_end, NULL, t);
do {
if (sigsetjmp(sigjmp, 1) == 0) {
sigprocmask(SIG_BLOCK, &mask, NULL);
calltimeout();
if (kill_link) {
kill_link = 0;
- phase = PHASE_DORMANT; /* allow signal to end holdoff */
+ new_phase(PHASE_DORMANT); /* allow signal to end holdoff */
}
if (got_sigchld)
reap_kids(0);
holdoff_end(arg)
void *arg;
{
- phase = PHASE_DORMANT;
+ new_phase(PHASE_DORMANT);
}
/*
lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN);
}
+/*
+ * new_phase - signal the start of a new phase of pppd's operation.
+ */
+void
+new_phase(p)
+ int p;
+{
+ phase = p;
+ if (new_phase_hook)
+ (*new_phase_hook)(p);
+}
/*
* die - clean up state and exit with the specified status.
for (copp = &callout; (freep = *copp); copp = &freep->c_next)
if (freep->c_func == func && freep->c_arg == arg) {
*copp = freep->c_next;
- (void) free((char *) freep);
+ free((char *) freep);
break;
}
}
}
}
} else {
+ /* no space allocated for script env. ptrs. yet */
i = 0;
script_env = (char **) malloc(16 * sizeof(char *));
if (script_env == 0)