X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fmain.c;h=954fc2b6b977df84133bee29ffa5125095af7011;hp=e5d2977fc2363d99bccf9b98d5cf01dc804d2d15;hb=baf120b604ced444e816f4b362ccca4b123b0fcf;hpb=07de73a331240b97d915c1851431a743449dd0f4 diff --git a/pppd/main.c b/pppd/main.c index e5d2977..954fc2b 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.86 1999/09/11 12:08:57 paulus Exp $" +#define RCSID "$Id: main.c,v 1.89 2000/01/18 19:49:52 masputra Exp $" #include #include @@ -92,6 +92,10 @@ 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 */ +int do_callback; /* != 0 if we should do callback next */ +int doing_callback; /* != 0 if we are doing callback */ +char *callback_script; /* script for doing callback */ + int (*holdoff_hook) __P((void)) = NULL; int (*new_phase_hook) __P((int)) = NULL; @@ -219,7 +223,7 @@ main(argc, argv) { int i, fdflags, t; struct sigaction sa; - char *p; + char *p, *connector; struct passwd *pw; struct timeval timo; sigset_t mask; @@ -252,6 +256,9 @@ main(argc, argv) } hostname[MAXNAMELEN-1] = 0; + /* make sure we don't create world or group writable files. */ + umask(umask(0777) | 022); + uid = getuid(); privileged = uid == 0; slprintf(numbuf, sizeof(numbuf), "%d", uid); @@ -338,12 +345,12 @@ main(argc, argv) for (i = 0; (protp = protocols[i]) != NULL; ++i) if (protp->check_options != NULL) (*protp->check_options)(); - if (demand && connector == 0) { + 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 (connector == 0 && !holdoff_specified) + if (connect_script == 0 && !holdoff_specified) holdoff = 0; if (using_pty) { @@ -513,6 +520,7 @@ main(argc, argv) demand_conf(); } + do_callback = 0; for (;;) { need_holdoff = 1; @@ -520,8 +528,10 @@ main(argc, argv) real_ttyfd = -1; status = EXIT_OK; ++unsuccess; + doing_callback = do_callback; + do_callback = 0; - if (demand) { + if (demand && !doing_callback) { /* * Don't do anything until we see some activity. */ @@ -600,6 +610,7 @@ main(argc, argv) */ hungup = 0; kill_link = 0; + connector = doing_callback? callback_script: connect_script; if (devnam[0] != 0) { for (;;) { /* If the user specified the device name, become the @@ -686,6 +697,7 @@ main(argc, argv) /* run connection script */ if ((connector && connector[0]) || initializer) { if (real_ttyfd != -1) { + /* XXX do this if doing_callback == CALLBACK_DIALIN? */ if (!default_device && modem) { setdtr(real_ttyfd, 0); /* in case modem is off hook */ sleep(1); @@ -721,6 +733,9 @@ main(argc, argv) clear CLOCAL if modem option */ if (real_ttyfd != -1) set_up_tty(real_ttyfd, 0); + + if (doing_callback == CALLBACK_DIALIN) + connector = NULL; } /* reopen tty if necessary to wait for carrier */ @@ -780,16 +795,16 @@ main(argc, argv) * time for something from the peer. This can avoid bouncing * our packets off his tty before he has it set up. */ - if (connector != NULL || ptycommand != NULL) { + add_fd(fd_ppp); + if (connect_delay != 0 && (connector != NULL || ptycommand != NULL)) { struct timeval t; - t.tv_sec = 1; - t.tv_usec = 0; + t.tv_sec = connect_delay / 1000; + t.tv_usec = connect_delay % 1000; wait_input(&t); } lcp_open(0); /* Start protocol */ open_ccp_flag = 0; - add_fd(fd_ppp); status = EXIT_NEGOTIATION_FAILED; new_phase(PHASE_ESTABLISH); while (phase != PHASE_DEAD) { @@ -862,11 +877,11 @@ main(argc, argv) * XXX we may not be able to do this if the line has hung up! */ disconnect: - if (disconnector && !hungup) { + if (disconnect_script && !hungup) { new_phase(PHASE_DISCONNECT); if (real_ttyfd >= 0) set_up_tty(real_ttyfd, 1); - if (device_script(disconnector, ttyfd, ttyfd, 0) < 0) { + if (device_script(disconnect_script, ttyfd, ttyfd, 0) < 0) { warn("disconnect script failed"); } else { info("Serial link disconnected."); @@ -1049,6 +1064,90 @@ holdoff_end(arg) new_phase(PHASE_DORMANT); } +/* List of protocol names, to make our messages a little more informative. */ +struct protocol_list { + u_short proto; + const char *name; +} protocol_list[] = { + { 0x21, "IP" }, + { 0x23, "OSI Network Layer" }, + { 0x25, "Xerox NS IDP" }, + { 0x27, "DECnet Phase IV" }, + { 0x29, "Appletalk" }, + { 0x2b, "Novell IPX" }, + { 0x2d, "VJ compressed TCP/IP" }, + { 0x2f, "VJ uncompressed TCP/IP" }, + { 0x31, "Bridging PDU" }, + { 0x33, "Stream Protocol ST-II" }, + { 0x35, "Banyan Vines" }, + { 0x39, "AppleTalk EDDP" }, + { 0x3b, "AppleTalk SmartBuffered" }, + { 0x3d, "Multi-Link" }, + { 0x3f, "NETBIOS Framing" }, + { 0x41, "Cisco Systems" }, + { 0x43, "Ascom Timeplex" }, + { 0x45, "Fujitsu Link Backup and Load Balancing (LBLB)" }, + { 0x47, "DCA Remote Lan" }, + { 0x49, "Serial Data Transport Protocol (PPP-SDTP)" }, + { 0x4b, "SNA over 802.2" }, + { 0x4d, "SNA" }, + { 0x4f, "IP6 Header Compression" }, + { 0x6f, "Stampede Bridging" }, + { 0xfb, "single-link compression" }, + { 0xfd, "1st choice compression" }, + { 0x0201, "802.1d Hello Packets" }, + { 0x0203, "IBM Source Routing BPDU" }, + { 0x0205, "DEC LANBridge100 Spanning Tree" }, + { 0x0231, "Luxcom" }, + { 0x0233, "Sigma Network Systems" }, + { 0x8021, "Internet Protocol Control Protocol" }, + { 0x8023, "OSI Network Layer Control Protocol" }, + { 0x8025, "Xerox NS IDP Control Protocol" }, + { 0x8027, "DECnet Phase IV Control Protocol" }, + { 0x8029, "Appletalk Control Protocol" }, + { 0x802b, "Novell IPX Control Protocol" }, + { 0x8031, "Bridging NCP" }, + { 0x8033, "Stream Protocol Control Protocol" }, + { 0x8035, "Banyan Vines Control Protocol" }, + { 0x803d, "Multi-Link Control Protocol" }, + { 0x803f, "NETBIOS Framing Control Protocol" }, + { 0x8041, "Cisco Systems Control Protocol" }, + { 0x8043, "Ascom Timeplex" }, + { 0x8045, "Fujitsu LBLB Control Protocol" }, + { 0x8047, "DCA Remote Lan Network Control Protocol (RLNCP)" }, + { 0x8049, "Serial Data Control Protocol (PPP-SDCP)" }, + { 0x804b, "SNA over 802.2 Control Protocol" }, + { 0x804d, "SNA Control Protocol" }, + { 0x804f, "IP6 Header Compression Control Protocol" }, + { 0x006f, "Stampede Bridging Control Protocol" }, + { 0x80fb, "Single Link Compression Control Protocol" }, + { 0x80fd, "Compression Control Protocol" }, + { 0xc021, "Link Control Protocol" }, + { 0xc023, "Password Authentication Protocol" }, + { 0xc025, "Link Quality Report" }, + { 0xc027, "Shiva Password Authentication Protocol" }, + { 0xc029, "CallBack Control Protocol (CBCP)" }, + { 0xc081, "Container Control Protocol" }, + { 0xc223, "Challenge Handshake Authentication Protocol" }, + { 0xc281, "Proprietary Authentication Protocol" }, + { 0, NULL }, +}; + +/* + * protocol_name - find a name for a PPP protocol. + */ +const char * +protocol_name(proto) + int proto; +{ + struct protocol_list *lp; + + for (lp = protocol_list; lp->proto != 0; ++lp) + if (proto == lp->proto) + return lp->name; + return NULL; +} + /* * get_input - called when incoming data is available. */ @@ -1122,8 +1221,13 @@ get_input() } } - if (debug) - warn("Unsupported protocol (0x%x) received", protocol); + if (debug) { + const char *pname = protocol_name(protocol); + if (pname != NULL) + warn("Unsupported protocol '%s' (0x%x) received", pname, protocol); + else + warn("Unsupported protocol 0x%x received", protocol); + } lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN); }