X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fauth.c;h=2e00b41916a5626a236d1c73baef1a60d14d20a8;hp=1532a74762491db5185519515e61eac8cd7c7246;hb=262600f5df1461ecbd29ef3a2579e477bb397769;hpb=2305ca29c0b59dae6edf23b1d69823013999883a diff --git a/pppd/auth.c b/pppd/auth.c index 1532a74..2e00b41 100644 --- a/pppd/auth.c +++ b/pppd/auth.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: auth.c,v 1.31 1997/04/30 05:50:16 paulus Exp $"; +static char rcsid[] = "$Id: auth.c,v 1.35 1997/11/27 06:49:15 paulus Exp $"; #endif #include @@ -46,6 +46,11 @@ static char rcsid[] = "$Id: auth.c,v 1.31 1997/04/30 05:50:16 paulus Exp $"; #include #include #include +#include +#include +#if defined(_PATH_LASTLOG) && defined(_linux_) +#include +#endif #include #include @@ -98,7 +103,7 @@ char peer_authname[MAXNAMELEN]; /* Records which authentication operations haven't completed yet. */ static int auth_pending[NUM_PPP]; -/* Set if we have successfully called login() */ +/* Set if we have successfully called plogin() */ static int logged_in; /* Set if we have run the /etc/ppp/auth-up script. */ @@ -129,8 +134,8 @@ extern char *crypt __P((const char *, const char *)); static void network_phase __P((int)); static void check_idle __P((void *)); static void connect_time_expired __P((void *)); -static int login __P((char *, char *, char **, int *)); -static void logout __P((void)); +static int plogin __P((char *, char *, char **, int *)); +static void plogout __P((void)); static int null_login __P((int)); static int get_pap_passwd __P((char *)); static int have_pap_secret __P((void)); @@ -141,9 +146,6 @@ static int scan_authfile __P((FILE *, char *, char *, u_int32_t, char *, static void free_wordlist __P((struct wordlist *)); static void auth_script __P((char *)); static void set_allowed_addrs __P((int, struct wordlist *)); -#ifdef CBCP_SUPPORT -static void callback_phase __P((int)); -#endif /* * An Open on LCP has requested a change from Dead to Establish phase. @@ -166,7 +168,7 @@ link_terminated(unit) if (phase == PHASE_DEAD) return; if (logged_in) - logout(); + plogout(); phase = PHASE_DEAD; syslog(LOG_NOTICE, "Connection terminated."); } @@ -304,6 +306,10 @@ network_phase(unit) if (protp->protocol != PPP_CCP) ++num_np_open; } + + if (num_np_open == 0) + /* nothing to do */ + lcp_close(0, "No network protocols running"); } /* @@ -415,8 +421,14 @@ void np_up(unit, proto) int unit, proto; { - if (num_np_up == 0 && idle_time_limit > 0) { - TIMEOUT(check_idle, NULL, idle_time_limit); + if (num_np_up == 0) { + /* + * At this point we consider that the link has come up successfully. + */ + need_holdoff = 0; + + if (idle_time_limit > 0) + TIMEOUT(check_idle, NULL, idle_time_limit); /* * Set a timeout to close the connection once the maximum @@ -470,7 +482,6 @@ check_idle(arg) if (itime >= idle_time_limit) { /* link is idle: shut it down. */ syslog(LOG_INFO, "Terminating connection due to lack of activity."); - need_holdoff = 0; lcp_close(0, "Link inactive"); } else { TIMEOUT(check_idle, NULL, idle_time_limit - itime); @@ -644,7 +655,7 @@ check_passwd(unit, auser, userlen, apasswd, passwdlen, msg, msglen) } if (uselogin && ret == UPAP_AUTHACK) { - ret = login(user, passwd, msg, msglen); + ret = plogin(user, passwd, msg, msglen); if (ret == UPAP_AUTHNAK) { syslog(LOG_WARNING, "PAP login failure for %s", user); } @@ -697,7 +708,7 @@ static int pam_conv(int num_msg, const struct pam_message **msg, #endif /* - * login - Check the user name and password against the system + * plogin - Check the user name and password against the system * password database, and login the user if OK. * * returns: @@ -707,7 +718,7 @@ static int pam_conv(int num_msg, const struct pam_message **msg, */ static int -login(user, passwd, msg, msglen) +plogin(user, passwd, msg, msglen) char *user; char *passwd; char **msg; @@ -801,16 +812,32 @@ login(user, passwd, msg, msglen) if (strncmp(tty, "/dev/", 5) == 0) tty += 5; logwtmp(tty, user, remote_name); /* Add wtmp login entry */ + +#ifdef _PATH_LASTLOG + { + struct lastlog ll; + int fd; + + if ((fd = open(_PATH_LASTLOG, O_RDWR, 0)) >= 0) { + (void)lseek(fd, (off_t)(pw->pw_uid * sizeof(ll)), SEEK_SET); + memset((void *)&ll, 0, sizeof(ll)); + (void)time(&ll.ll_time); + (void)strncpy(ll.ll_line, tty, sizeof(ll.ll_line)); + (void)write(fd, (char *)&ll, sizeof(ll)); + (void)close(fd); + } + } +#endif logged_in = TRUE; return (UPAP_AUTHACK); } /* - * logout - Logout the user. + * plogout - Logout the user. */ static void -logout() +plogout() { char *tty; @@ -873,6 +900,7 @@ get_pap_passwd(passwd) { char *filename; FILE *f; + int ret; struct wordlist *addrs; char secret[MAXWORDLEN]; @@ -882,9 +910,11 @@ get_pap_passwd(passwd) if (f == NULL) return 0; check_access(f, filename); - if (scan_authfile(f, user, - remote_name[0]? remote_name: NULL, - (u_int32_t)0, secret, NULL, filename) < 0) + ret = scan_authfile(f, user, + remote_name[0]? remote_name: NULL, + (u_int32_t)0, secret, NULL, filename); + fclose(f); + if (ret < 0) return 0; if (passwd != NULL) { strncpy(passwd, secret, MAXSECRETLEN);