Wayne Davison
2001-Apr-29 20:05 UTC
PATCH: UseLogin fix for 2.9p1 (w/improved last-login time)
Attached is the latest version of my UseLogin patch that makes "UseLogin true" work on Solaris and UNICOS. As usual, I have provided configure.in changes that set the appropriate defines for Solaris, but I have not provided the configure.in changes for UNICOS (since they would be incomplete, and Wendy is working on this). This version fixes a problem with the last-login time always being reported as the current time (I had to add a new record_*() function since record_login() was changing other things than the {u,w}tmp{x,} data). This version also changes less existing code, to hopefully make it easier to maintain against the BSD source. The patch is relative to the 2.9p1 source I just grabbed out of CVS. ..wayne.. -------------- next part -------------- Index: acconfig.h --- acconfig.h 2001/04/05 17:15:08 1.110 +++ acconfig.h 2001/04/29 18:12:31 @@ -154,6 +154,12 @@ /* 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: configure.in --- configure.in 2001/04/26 04:40:28 1.282 +++ configure.in 2001/04/29 18:12:36 @@ -153,6 +153,8 @@ 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: loginrec.c --- loginrec.c 2001/02/22 21:23:21 1.32 +++ loginrec.c 2001/04/29 18:12:40 @@ -443,6 +443,27 @@ 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: loginrec.h --- loginrec.h 2001/02/05 12:42:18 1.5 +++ loginrec.h 2001/04/29 18:12:41 @@ -110,6 +110,9 @@ /* 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: session.c --- session.c 2001/04/18 15:29:34 1.111 +++ session.c 2001/04/29 18:12:41 @@ -127,6 +127,9 @@ 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 @@ #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 @@ } } +#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 @@ /* 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: sshlogin.c --- sshlogin.c 2001/03/26 05:32:17 1.3 +++ sshlogin.c 2001/04/29 18:12:41 @@ -77,6 +77,20 @@ 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: sshlogin.h --- sshlogin.h 2001/03/05 03:53:03 1.2 +++ sshlogin.h 2001/04/29 18:12:41 @@ -31,6 +31,15 @@ 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.
mouring at etoh.eviladmin.org
2001-May-03 23:36 UTC
PATCH: UseLogin fix for 2.9p1 (w/improved last-login time)
Does anyone have any objections? I've not seen anyone common on this yet. - Ben On Sun, 29 Apr 2001, Wayne Davison wrote:> Attached is the latest version of my UseLogin patch that makes > "UseLogin true" work on Solaris and UNICOS. As usual, I have provided > configure.in changes that set the appropriate defines for Solaris, but > I have not provided the configure.in changes for UNICOS (since they > would be incomplete, and Wendy is working on this). > > This version fixes a problem with the last-login time always being > reported as the current time (I had to add a new record_*() function > since record_login() was changing other things than the {u,w}tmp{x,} > data). This version also changes less existing code, to hopefully > make it easier to maintain against the BSD source. > > The patch is relative to the 2.9p1 source I just grabbed out of CVS. > > ..wayne.. >
mouring at etoh.eviladmin.org
2001-May-08 20:24 UTC
PATCH: UseLogin fix for 2.9p1 (w/improved last-login time)
Applied. Thanks. - Ben On Sun, 29 Apr 2001, Wayne Davison wrote:> Attached is the latest version of my UseLogin patch that makes > "UseLogin true" work on Solaris and UNICOS. As usual, I have provided > configure.in changes that set the appropriate defines for Solaris, but > I have not provided the configure.in changes for UNICOS (since they > would be incomplete, and Wendy is working on this). > > This version fixes a problem with the last-login time always being > reported as the current time (I had to add a new record_*() function > since record_login() was changing other things than the {u,w}tmp{x,} > data). This version also changes less existing code, to hopefully > make it easier to maintain against the BSD source. > > The patch is relative to the 2.9p1 source I just grabbed out of CVS. > > ..wayne.. >