]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/auth.c
cope with different kernel versions at run time not compile time
[ppp.git] / pppd / auth.c
index 5bc3943ec50ad862183ebaf4d82ad5a0c8fbf68b..f3f770b3f64c5a8a3b232e9babbb41da037f6559 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: auth.c,v 1.30 1997/03/04 03:37:21 paulus Exp $";
+static char rcsid[] = "$Id: auth.c,v 1.33 1997/11/27 06:07:29 paulus Exp $";
 #endif
 
 #include <stdio.h>
@@ -46,19 +46,13 @@ static char rcsid[] = "$Id: auth.c,v 1.30 1997/03/04 03:37:21 paulus Exp $";
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/socket.h>
+#include <utmp.h>
+#include <fcntl.h>
 
 #include <netdb.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
-#if defined(SVR4) || defined(_linux_)
-#include <crypt.h>
-#else
-#if defined(SUNOS4) || defined(ULTRIX)
-extern char *crypt();
-#endif
-#endif
-
 #ifdef USE_PAM
 #include <security/pam_appl.h>
 #include <security/pam_modules.h>
@@ -66,7 +60,9 @@ extern char *crypt();
 
 #ifdef HAS_SHADOW
 #include <shadow.h>
+#ifndef SVR4
 #include <shadow/pwauth.h>
+#endif
 #ifndef PW_PPP
 #define PW_PPP PW_LOGIN
 #endif
@@ -128,11 +124,13 @@ static int passwd_from_file;
 #define CHAP_WITHPEER  4
 #define CHAP_PEER      8
 
+extern char *crypt __P((const char *, const char *));
+
 /* Prototypes for procedures local to this file. */
 
 static void network_phase __P((int));
-static void check_idle __P((caddr_t));
-static void connect_time_expired __P((caddr_t));
+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  null_login __P((int));
@@ -145,9 +143,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.
@@ -308,6 +303,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");
 }
 
 /*
@@ -419,8 +418,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
@@ -463,7 +468,7 @@ np_finished(unit, proto)
  */
 static void
 check_idle(arg)
-    caddr_t arg;
+     void *arg;
 {
     struct ppp_idle idle;
     time_t itime;
@@ -474,7 +479,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);
@@ -486,7 +490,7 @@ check_idle(arg)
  */
 static void
 connect_time_expired(arg)
-    caddr_t arg;
+    void *arg;
 {
     syslog(LOG_INFO, "Connect time expired");
     lcp_close(0, "Connect time expired");      /* Close connection */
@@ -544,9 +548,9 @@ auth_check_options()
            option_error("can't override device name when noauth option used");
            exit(1);
        }
-       if (connector != NULL && connector_info.priv == 0
-           || disconnector != NULL && disconnector_info.priv == 0
-           || welcomer != NULL && welcomer_info.priv == 0) {
+       if ((connector != NULL && connector_info.priv == 0)
+           || (disconnector != NULL && disconnector_info.priv == 0)
+           || (welcomer != NULL && welcomer_info.priv == 0)) {
            option_error("can't override connect, disconnect or welcome");
            option_error("option values when noauth option used");
            exit(1);
@@ -762,7 +766,6 @@ login(user, passwd, msg, msglen)
 #else /* #ifdef USE_PAM */
 
     struct passwd *pw;
-    char *epasswd;
 
 #ifdef HAS_SHADOW
     struct spwd *spwd;
@@ -806,6 +809,22 @@ 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);
@@ -878,6 +897,7 @@ get_pap_passwd(passwd)
 {
     char *filename;
     FILE *f;
+    int ret;
     struct wordlist *addrs;
     char secret[MAXWORDLEN];
 
@@ -887,9 +907,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);
@@ -1135,7 +1157,7 @@ ip_addr_check(addr, addrs)
        if (ptr_mask != NULL)
            *ptr_mask = '/';
 
-       if (a == -1L)
+       if (a == (u_int32_t)-1L)
            syslog (LOG_WARNING,
                    "unknown host %s in auth. address list",
                    addrs->word);