X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fauth.c;h=b9c28fcafb6abc38ca789436c308831fb9d02799;hp=9a04ecf53793edc646520e59b8038dae0aa43164;hb=1b9f7635dd45d643b2fb7cf496f67789892897c5;hpb=ca831b6745bc15245654acac88b0f428f060cdcc diff --git a/pppd/auth.c b/pppd/auth.c index 9a04ecf..b9c28fc 100644 --- a/pppd/auth.c +++ b/pppd/auth.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: auth.c,v 1.5 1994/05/24 11:20:26 paulus Exp $"; +static char rcsid[] = "$Id: auth.c,v 1.9 1994/09/01 00:12:52 paulus Exp $"; #endif #include @@ -55,14 +55,11 @@ static char rcsid[] = "$Id: auth.c,v 1.5 1994/05/24 11:20:26 paulus Exp $"; #include "upap.h" #include "chap.h" #include "ipcp.h" +#include "ccp.h" #include "pathnames.h" #ifdef sparc #include -#ifndef __GNUC__ -/* why alloca.h doesn't define what alloca() returns is a mystery */ -/* char *alloca __ARGS((int)); */ -#endif /*__GNUC__*/ #endif /*sparc*/ /* Used for storing a sequence of words. Usually malloced. */ @@ -80,16 +77,6 @@ struct wordlist { #define FALSE 0 #define TRUE 1 -extern char user[]; -extern char passwd[]; -extern char devname[]; -extern char our_name[]; -extern char remote_name[]; -extern char hostname[]; -extern int uselogin; -extern int usehostname; -extern int auth_required; - /* Records which authentication operations haven't completed yet. */ static int auth_pending[NPPP]; static int logged_in; @@ -104,6 +91,7 @@ static struct wordlist *addresses[NPPP]; /* Prototypes */ void check_access __ARGS((FILE *, char *)); +static void network_phase __ARGS((int)); static int login __ARGS((char *, char *, char **, int *)); static void logout __ARGS((void)); static int null_login __ARGS((int)); @@ -134,6 +122,8 @@ void link_terminated(unit) int unit; { + if (phase == PHASE_DEAD) + return; if (logged_in) logout(); phase = PHASE_DEAD; @@ -147,6 +137,8 @@ void link_down(unit) int unit; { + ipcp_close(0); + ccp_close(0); phase = PHASE_TERMINATE; } @@ -195,10 +187,20 @@ link_established(unit) } auth_pending[unit] = auth; - if (!auth) { - phase = PHASE_NETWORK; - ipcp_open(unit); - } + if (!auth) + network_phase(unit); +} + +/* + * Proceed to the network phase. + */ +static void +network_phase(unit) + int unit; +{ + phase = PHASE_NETWORK; + ipcp_open(unit); + ccp_open(unit); } /* @@ -244,6 +246,7 @@ auth_peer_success(unit, protocol) if ((auth_pending[unit] &= ~bit) == 0) { phase = PHASE_NETWORK; ipcp_open(unit); + ccp_open(unit); } } @@ -287,10 +290,8 @@ auth_withpeer_success(unit, protocol) * If there is no more authentication still being done, * proceed to the network phase. */ - if ((auth_pending[unit] &= ~bit) == 0) { - phase = PHASE_NETWORK; - ipcp_open(unit); - } + if ((auth_pending[unit] &= ~bit) == 0) + network_phase(unit); } @@ -415,7 +416,7 @@ check_passwd(unit, auser, userlen, apasswd, passwdlen, msg, msglen) */ if (attempts++ >= 10) { syslog(LOG_WARNING, "%d LOGIN FAILURES ON %s, %s", - attempts, devname, user); + attempts, devnam, user); quit(); } if (attempts > 3) @@ -477,9 +478,9 @@ login(user, passwd, msg, msglen) /* * Write a wtmp entry for this user. */ - tty = strrchr(devname, '/'); + tty = strrchr(devnam, '/'); if (tty == NULL) - tty = devname; + tty = devnam; else tty++; logwtmp(tty, user, ""); /* Add wtmp login entry */ @@ -496,9 +497,9 @@ logout() { char *tty; - tty = strrchr(devname, '/'); + tty = strrchr(devnam, '/'); if (tty == NULL) - tty = devname; + tty = devnam; else tty++; logwtmp(tty, "", ""); /* Wipe out wtmp logout entry */ @@ -692,9 +693,9 @@ get_secret(unit, client, server, secret, secret_len, save_addrs) int auth_ip_addr(unit, addr) int unit; - u_long addr; + uint32 addr; { - u_long a; + uint32 a; struct hostent *hp; struct wordlist *addrs; @@ -715,7 +716,7 @@ auth_ip_addr(unit, addr) addrs->word); continue; } else - a = *(u_long *)hp->h_addr; + a = *(uint32 *)hp->h_addr; } if (addr == a) return 1; @@ -730,7 +731,7 @@ auth_ip_addr(unit, addr) */ int bad_ip_adrs(addr) - u_long addr; + uint32 addr; { addr = ntohl(addr); return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET