X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fmain.c;h=4acc217d1661a9868da3a966c21ff380c6c71287;hb=050b89c40f0441d4445563043aae5ea1bd94bcc3;hp=7eee19215e5439dc6aea01d3cb5cb01d92c728e3;hpb=10d17d19d3f7fe61e3b1f46a97198c521b535589;p=ppp.git diff --git a/pppd/main.c b/pppd/main.c index 7eee192..4acc217 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -18,7 +18,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: main.c,v 1.79 1999/05/13 00:35:23 paulus Exp $"; +static const char rcsid[] = "$Id: main.c,v 1.81 1999/08/12 04:17:07 paulus Exp $"; #endif #include @@ -85,7 +85,9 @@ int need_holdoff; /* need holdoff period before restarting */ 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 */ +int unsuccess; /* # unsuccessful connection attempts */ static int fd_ppp = -1; /* fd for talking PPP */ static int fd_loop; /* fd for getting demand-dial packets */ @@ -287,24 +289,13 @@ main(argc, argv) * 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); @@ -508,6 +499,7 @@ main(argc, argv) ttyfd = -1; real_ttyfd = -1; status = EXIT_OK; + ++unsuccess; if (demand) { /* @@ -551,6 +543,8 @@ main(argc, argv) info("Starting link"); } + phase = PHASE_SERIALCONN; + /* * Get a pty master/slave pair if the pty, notty, or record * options were specified. @@ -622,7 +616,7 @@ main(argc, argv) /* * 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 @@ -630,7 +624,8 @@ main(argc, argv) * 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; } @@ -669,9 +664,7 @@ main(argc, argv) } /* 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 */ @@ -680,15 +673,29 @@ main(argc, argv) } } - 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 */ @@ -851,7 +858,7 @@ main(argc, argv) pidfilename[0] = 0; } - if (!persist) + if (!persist || (maxfail > 0 && unsuccess >= maxfail)) break; kill_link = 0; @@ -886,6 +893,7 @@ main(argc, argv) } /* Wait for scripts to finish */ + /* XXX should have a timeout here */ while (n_children > 0) { if (debug) { struct subprocess *chp;