]> andersk Git - openssh.git/commitdiff
- (bal) UseLogin patch for Solaris/UNICOS. Patch by Wayne Davison
authormouring <mouring>
Tue, 8 May 2001 20:33:05 +0000 (20:33 +0000)
committermouring <mouring>
Tue, 8 May 2001 20:33:05 +0000 (20:33 +0000)
   <wayne@blorf.net>

ChangeLog
acconfig.h
configure.in
loginrec.c
loginrec.h
session.c
sshlogin.c
sshlogin.h

index a901a8290f9ba60d975fa0ebee4688563f2f4fad..acbfa1299a9c4fc725aea16147e21cc8e1b51d7b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,8 @@
    - mouring@cvs.openbsd.org 2001/05/08 19:45:25
      [misc.c misc.h scp.c sftp.c]
      Use addargs() in sftp plus some clean up of addargs().  OK Markus
+ - (bal) UseLogin patch for Solaris/UNICOS.  Patch by Wayne Davison 
+   <wayne@blorf.net>
 
 20010508
  - (bal) Fixed configure test for USE_SIA.  
index 52154fa54ef958e776b22504e5a1e39ce11d8316..3b275187d98773a3bc35ebc632581285a87e6d7e 100644 (file)
 /* Define if you don't want to use wtmpx */
 #undef DISABLE_WTMPX
 
+/* Some systems need a utmpx entry for /bin/login to work */
+#undef LOGIN_NEEDS_UTMPX
+
+/* Some versions of /bin/login need the TERM supplied on the commandline */
+#undef LOGIN_NEEDS_TERM
+
 /* Define if you want to specify the path to your lastlog file */
 #undef CONF_LASTLOG_FILE
 
index a4d2803211657b94655a473545b8ecdb4f01083c..9606045a517dd014f17c9a659bb369ae3330e09a 100644 (file)
@@ -153,6 +153,8 @@ mips-sony-bsd|mips-sony-newsos4)
        LDFLAGS="$LDFLAGS -L/usr/local/lib -R/usr/local/lib" 
        need_dash_r=1
        AC_DEFINE(PAM_SUN_CODEBASE)
+       AC_DEFINE(LOGIN_NEEDS_UTMPX)
+       AC_DEFINE(LOGIN_NEEDS_TERM)
        # hardwire lastlog location (can't detect it on some versions)
        conf_lastlog_location="/var/adm/lastlog"
        AC_MSG_CHECKING(for obsolete utmp and wtmp in solaris2.x)
index 2aff6d2b53cd90f17052d7196c16777db7dcd5bc..7790d9c6207dc8792e97ef3f0f4745f6fb84098f 100644 (file)
@@ -443,6 +443,27 @@ login_write (struct logininfo *li)
        return 0;
 }
 
+#ifdef LOGIN_NEEDS_UTMPX
+int
+login_utmp_only(struct logininfo *li)
+{
+       li->type = LTYPE_LOGIN; 
+# ifdef USE_UTMP
+       utmp_write_entry(li);
+# endif
+# ifdef USE_WTMP
+       wtmp_write_entry(li);
+# endif
+# ifdef USE_UTMPX
+       utmpx_write_entry(li);
+# endif
+# ifdef USE_WTMPX
+       wtmpx_write_entry(li);
+# endif
+       return 0;
+}
+#endif
+
 /**
  ** getlast_entry: Call low-level functions to retrieve the last login
  **                time.
index 961a605c41a239dc5cfaa9532979d07c343012ce..a741205eddb2979799398c1dd07d46a4626ee9fd 100644 (file)
@@ -110,6 +110,9 @@ void login_set_current_time(struct logininfo *li);
 /* record the entry */
 int login_login (struct logininfo *li);
 int login_logout(struct logininfo *li);
+#ifdef LOGIN_NEEDS_UTMPX
+int login_utmp_only(struct logininfo *li);
+#endif
 
 /** End of public functions */
 
index 440b517be6d90adf71da481848ba68f1f80e44ad..62026c670e12b62bd68f92dd10771de48f3b70f6 100644 (file)
--- a/session.c
+++ b/session.c
@@ -127,6 +127,9 @@ void        session_proctitle(Session *s);
 void   do_exec_pty(Session *s, const char *command);
 void   do_exec_no_pty(Session *s, const char *command);
 void   do_login(Session *s, const char *command);
+#ifdef LOGIN_NEEDS_UTMPX
+void   do_pre_login(Session *s);
+#endif
 void   do_child(Session *s, const char *command);
 void   do_motd(void);
 int    check_quietlogin(Session *s, const char *command);
@@ -644,6 +647,10 @@ do_exec_pty(Session *s, const char *command)
 #ifndef HAVE_OSF_SIA
                if (!(options.use_login && command == NULL))
                        do_login(s, command);
+# ifdef LOGIN_NEEDS_UTMPX
+               else
+                       do_pre_login(s);
+# endif
 #endif
 
                /* Do common processing for the child, such as execing the command. */
@@ -687,6 +694,34 @@ do_exec_pty(Session *s, const char *command)
        }
 }
 
+#ifdef LOGIN_NEEDS_UTMPX
+void
+do_pre_login(Session *s)
+{
+       socklen_t fromlen;
+       struct sockaddr_storage from;
+       pid_t pid = getpid();
+
+       /*
+        * Get IP address of client. If the connection is not a socket, let
+        * the address be 0.0.0.0.
+        */
+       memset(&from, 0, sizeof(from));
+       if (packet_connection_is_on_socket()) {
+               fromlen = sizeof(from);
+               if (getpeername(packet_get_connection_in(),
+                    (struct sockaddr *) & from, &fromlen) < 0) {
+                       debug("getpeername: %.100s", strerror(errno));
+                       fatal_cleanup();
+               }
+       }
+
+       record_utmp_only(pid, s->tty, s->pw->pw_name,
+           get_remote_name_or_ip(utmp_len, options.reverse_mapping_check),
+           (struct sockaddr *)&from);
+}
+#endif
+
 /* administrative, login(1)-like work */
 void
 do_login(Session *s, const char *command)
@@ -1511,6 +1546,9 @@ do_child(Session *s, const char *command)
                        /* Launch login(1). */
 
                        execl(LOGIN_PROGRAM, "login", "-h", hostname,
+#ifdef LOGIN_NEEDS_TERM
+                            s->term? s->term : "unknown",
+#endif
                             "-p", "-f", "--", pw->pw_name, NULL);
 
                        /* Login couldn't be executed, die. */
index 1d9c031c40978a93d79ff25394fed76460649c2f..b7558b9e92561f5e0e7c1da79c6a9b021278263a 100644 (file)
@@ -77,6 +77,20 @@ record_login(pid_t pid, const char *ttyname, const char *user, uid_t uid,
   login_free_entry(li);
 }
 
+#ifdef LOGIN_NEEDS_UTMPX
+void
+record_utmp_only(pid_t pid, const char *ttyname, const char *user,
+                const char *host, struct sockaddr * addr)
+{
+  struct logininfo *li;
+
+  li = login_alloc_entry(pid, user, host, ttyname);
+  login_set_addr(li, addr, sizeof(struct sockaddr));
+  login_utmp_only(li);
+  login_free_entry(li);
+}
+#endif
+
 /* Records that the user has logged out. */
 
 void
index 7285bc23e60ad2146a685685bdf2b0564bd69d44..f0d500ee37b1da2f1552dea0328025e63e066d65 100644 (file)
@@ -31,6 +31,15 @@ void
 record_login(pid_t pid, const char *ttyname, const char *user, uid_t uid,
     const char *host, struct sockaddr *addr);
 
+#ifdef LOGIN_NEEDS_UTMPX
+/*
+ * Record just the utmp info for /bin/login.
+ */
+void
+record_utmp_only(pid_t pid, const char *ttyname, const char *user,
+                const char *host, struct sockaddr * addr);
+#endif
+
 /*
  * Records that the user has logged out.  This does many thigs normally done
  * by login(1) or init.
This page took 1.213155 seconds and 5 git commands to generate.