X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fmain.c;h=409628c4b0a03383d7647d32be1993851f7cce63;hp=e0352f02d462726e7ab9e54f75aed64268e58db7;hb=690865e93221a67d2ee33f4d184a8be79c3fc7ec;hpb=392a4f54cb25e48eed9cf5443febeeba7eaf7cbc;ds=sidebyside diff --git a/pppd/main.c b/pppd/main.c index e0352f0..409628c 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.105 2001/03/12 22:58:59 paulus Exp $" +#define RCSID "$Id: main.c,v 1.117 2002/10/27 12:04:07 fcusack Exp $" #include #include @@ -53,8 +53,12 @@ #include "upap.h" #include "chap.h" #include "ccp.h" +#include "ecp.h" #include "pathnames.h" + +#ifdef USE_TDB #include "tdb.h" +#endif #ifdef CBCP_SUPPORT #include "cbcp.h" @@ -94,11 +98,18 @@ volatile int status; /* exit status for pppd */ int unsuccess; /* # unsuccessful connection attempts */ int do_callback; /* != 0 if we should do callback next */ int doing_callback; /* != 0 if we are doing callback */ +int ppp_session_number; /* Session number, for channels with such a + concept (eg PPPoE) */ +#ifdef USE_TDB TDB_CONTEXT *pppdb; /* database for storing status etc. */ +#endif + char db_key[32]; int (*holdoff_hook) __P((void)) = NULL; int (*new_phase_hook) __P((int)) = NULL; +void (*snoop_recv_hook) __P((unsigned char *p, int len)) = NULL; +void (*snoop_send_hook) __P((unsigned char *p, int len)) = NULL; static int conn_running; /* we have a [dis]connector running */ static int devfd; /* fd of underlying device */ @@ -170,11 +181,16 @@ static void open_ccp __P((int)); static void bad_signal __P((int)); static void holdoff_end __P((void *)); static int reap_kids __P((int waitfor)); + +#ifdef USE_TDB static void update_db_entry __P((void)); static void add_db_key __P((const char *)); static void delete_db_key __P((const char *)); static void cleanup_db __P((void)); +#endif + static void handle_events __P((void)); +static void print_link_stats __P((void)); extern char *ttyname __P((int)); extern char *getlogin __P((void)); @@ -206,6 +222,7 @@ struct protent *protocols[] = { &ipv6cp_protent, #endif &ccp_protent, + &ecp_protent, #ifdef IPX_CHANGE &ipxcp_protent, #endif @@ -233,6 +250,7 @@ main(argc, argv) struct protent *protp; char numbuf[16]; + link_stats_valid = 0; new_phase(PHASE_INITIALIZE); /* @@ -342,15 +360,25 @@ main(argc, argv) init_pr_log(NULL, LOG_INFO); print_options(pr_log, NULL); end_pr_log(); - if (dryrun) - die(0); } + /* + * Early check for remote number authorization. + */ + if (!auth_number()) { + warn("calling number %q is not authorized", remote_number); + exit(EXIT_CNID_AUTH_FAILED); + } + + if (dryrun) + die(0); + /* * Initialize system-dependent stuff. */ sys_init(); +#ifdef USE_TDB pppdb = tdb_open(_PATH_PPPDB, 0, 0, O_RDWR|O_CREAT, 0644); if (pppdb != NULL) { slprintf(db_key, sizeof(db_key), "pppd%d", getpid()); @@ -362,6 +390,7 @@ main(argc, argv) multilink = 0; } } +#endif /* * Detach ourselves from the terminal, if required, @@ -398,11 +427,14 @@ main(argc, argv) /* * Open the loopback channel and set it up to be the ppp interface. */ +#ifdef USE_TDB tdb_writelock(pppdb); +#endif fd_loop = open_ppp_loopback(); set_ifunit(1); +#ifdef USE_TDB tdb_writeunlock(pppdb); - +#endif /* * Configure the interface and mark it up, etc. */ @@ -452,25 +484,33 @@ main(argc, argv) goto fail; /* set up the serial device as a ppp interface */ +#ifdef USE_TDB tdb_writelock(pppdb); +#endif fd_ppp = the_channel->establish_ppp(devfd); if (fd_ppp < 0) { +#ifdef USE_TDB tdb_writeunlock(pppdb); +#endif status = EXIT_FATAL_ERROR; goto disconnect; } if (!demand && ifunit >= 0) set_ifunit(1); +#ifdef USE_TDB tdb_writeunlock(pppdb); +#endif /* * Start opening the connection and wait for * incoming events (reply, timeout, etc.). */ - notice("Connect: %s <--> %s", ifname, ppp_devnam); + if (ifunit >= 0) + notice("Connect: %s <--> %s", ifname, ppp_devnam); + else + notice("Starting negotiation on %s", ppp_devnam); gettimeofday(&start_time, NULL); - link_stats_valid = 0; script_unsetenv("CONNECT_TIME"); script_unsetenv("BYTES_SENT"); script_unsetenv("BYTES_RCVD"); @@ -493,15 +533,7 @@ main(argc, argv) } } - /* - * Print connect time and statistics. - */ - 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 %u bytes, received %u bytes.", - link_stats.bytes_out, link_stats.bytes_in); - } + print_link_stats(); /* * Delete pid file before disestablishing ppp. Otherwise it @@ -510,7 +542,7 @@ main(argc, argv) */ if (!demand) { if (pidfilename[0] != 0 - && unlink(pidfilename) < 0 && errno != ENOENT) + && unlink(pidfilename) < 0 && errno != ENOENT) warn("unable to delete pid file %s: %m", pidfilename); pidfilename[0] = 0; } @@ -543,7 +575,7 @@ main(argc, argv) if (!demand) { if (pidfilename[0] != 0 - && unlink(pidfilename) < 0 && errno != ENOENT) + && unlink(pidfilename) < 0 && errno != ENOENT) warn("unable to delete pid file %s: %m", pidfilename); pidfilename[0] = 0; } @@ -942,14 +974,14 @@ get_input() return; } - if (debug /*&& (debugflags & DBG_INPACKET)*/) - dbglog("rcvd %P", p, len); - if (len < PPP_HDRLEN) { - MAINDEBUG(("io(): Received short packet.")); + dbglog("received short packet:%.*B", len, p); return; } + dump_packet("rcvd", p, len); + if (snoop_recv_hook) snoop_recv_hook(p, len); + p += 2; /* Skip address and control */ GETSHORT(protocol, p); len -= PPP_HDRLEN; @@ -1019,6 +1051,7 @@ void die(status) int status; { + print_link_stats(); cleanup(); notify(exitnotify, status); syslog(LOG_INFO, "Exit."); @@ -1039,15 +1072,32 @@ cleanup() if (the_channel->cleanup) (*the_channel->cleanup)(); - if (pidfilename[0] != 0 && unlink(pidfilename) < 0 && errno != ENOENT) + if (pidfilename[0] != 0 && unlink(pidfilename) < 0 && errno != ENOENT) warn("unable to delete pid file %s: %m", pidfilename); pidfilename[0] = 0; - if (linkpidfile[0] != 0 && unlink(linkpidfile) < 0 && errno != ENOENT) + if (linkpidfile[0] != 0 && unlink(linkpidfile) < 0 && errno != ENOENT) warn("unable to delete pid file %s: %m", linkpidfile); linkpidfile[0] = 0; +#ifdef USE_TDB if (pppdb != NULL) cleanup_db(); +#endif + +} + +void +print_link_stats() +{ + /* + * Print connect time and statistics. + */ + 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 %u bytes, received %u bytes.", + link_stats.bytes_out, link_stats.bytes_in); + } } /* @@ -1066,11 +1116,11 @@ update_link_stats(u) link_connect_time = now.tv_sec - start_time.tv_sec; link_stats_valid = 1; - slprintf(numbuf, sizeof(numbuf), "%d", link_connect_time); + slprintf(numbuf, sizeof(numbuf), "%u", link_connect_time); script_setenv("CONNECT_TIME", numbuf, 0); - slprintf(numbuf, sizeof(numbuf), "%d", link_stats.bytes_out); + slprintf(numbuf, sizeof(numbuf), "%u", link_stats.bytes_out); script_setenv("BYTES_SENT", numbuf, 0); - slprintf(numbuf, sizeof(numbuf), "%d", link_stats.bytes_in); + slprintf(numbuf, sizeof(numbuf), "%u", link_stats.bytes_in); script_setenv("BYTES_RCVD", numbuf, 0); } @@ -1087,9 +1137,6 @@ static struct timeval timenow; /* Current time */ /* * timeout - Schedule a timeout. - * - * Note that this timeout takes the number of milliseconds, NOT hz (as in - * the kernel). */ void timeout(func, arg, secs, usecs) @@ -1098,10 +1145,10 @@ timeout(func, arg, secs, usecs) int secs, usecs; { struct callout *newp, *p, **pp; - + MAINDEBUG(("Timeout %p:%p in %d.%03d seconds.", func, arg, - time / 1000, time % 1000)); - + secs, usecs/1000)); + /* * Allocate timeout. */ @@ -1139,9 +1186,9 @@ untimeout(func, arg) void *arg; { struct callout **copp, *freep; - + MAINDEBUG(("Untimeout %p:%p.", func, arg)); - + /* * Find first matching timeout and remove it from the list. */ @@ -1495,7 +1542,7 @@ run_program(prog, args, must_exist, done, arg) #ifdef BSD /* Force the priority back to zero if pppd is running higher. */ if (setpriority (PRIO_PROCESS, 0, 0) < 0) - warn("can't reset priority to 0: %m"); + warn("can't reset priority to 0: %m"); #endif /* SysV recommends a second fork at this point. */ @@ -1576,7 +1623,8 @@ reap_kids(waitfor) (chp? chp->prog: "??"), pid, WTERMSIG(status)); } else if (debug) dbglog("Script %s finished (pid %d), status = 0x%x", - (chp? chp->prog: "??"), pid, status); + (chp? chp->prog: "??"), pid, + WIFEXITED(status) ? WEXITSTATUS(status) : status); if (chp && chp->done) (*chp->done)(chp->arg); if (chp) @@ -1633,7 +1681,7 @@ remove_notifier(notif, func, arg) } /* - * notify - call a set of functions registered with add_notify. + * notify - call a set of functions registered with add_notifier. */ void notify(notif, val) @@ -1682,13 +1730,17 @@ script_setenv(var, value, iskey) if (script_env != 0) { for (i = 0; (p = script_env[i]) != 0; ++i) { if (strncmp(p, var, varl) == 0 && p[varl] == '=') { +#ifdef USE_TDB if (p[-1] && pppdb != NULL) delete_db_key(p); +#endif free(p-1); script_env[i] = newstring; +#ifdef USE_TDB if (iskey && pppdb != NULL) add_db_key(newstring); update_db_entry(); +#endif return; } } @@ -1715,11 +1767,13 @@ script_setenv(var, value, iskey) script_env[i] = newstring; script_env[i+1] = 0; +#ifdef USE_TDB if (pppdb != NULL) { if (iskey) add_db_key(newstring); update_db_entry(); } +#endif } /* @@ -1738,18 +1792,23 @@ script_unsetenv(var) return; for (i = 0; (p = script_env[i]) != 0; ++i) { if (strncmp(p, var, vl) == 0 && p[vl] == '=') { +#ifdef USE_TDB if (p[-1] && pppdb != NULL) delete_db_key(p); +#endif free(p-1); while ((script_env[i] = script_env[i+1]) != 0) ++i; break; } } +#ifdef USE_TDB if (pppdb != NULL) update_db_entry(); +#endif } +#ifdef USE_TDB /* * update_db_entry - update our entry in the database. */ @@ -1779,6 +1838,9 @@ update_db_entry() if (tdb_store(pppdb, key, dbuf, TDB_REPLACE)) error("tdb_store failed: %s", tdb_error(pppdb)); + if (vbuf) + free(vbuf); + } /* @@ -1829,3 +1891,4 @@ cleanup_db() if (p[-1]) delete_db_key(p); } +#endif /* USE_TDB */