From 7e2d5fa480c6c7cdf0e0b64f789865863c6beb8e Mon Sep 17 00:00:00 2001 From: mouring Date: Tue, 8 May 2001 20:33:05 +0000 Subject: [PATCH] - (bal) UseLogin patch for Solaris/UNICOS. Patch by Wayne Davison --- ChangeLog | 2 ++ acconfig.h | 6 ++++++ configure.in | 2 ++ loginrec.c | 21 +++++++++++++++++++++ loginrec.h | 3 +++ session.c | 38 ++++++++++++++++++++++++++++++++++++++ sshlogin.c | 14 ++++++++++++++ sshlogin.h | 9 +++++++++ 8 files changed, 95 insertions(+) diff --git a/ChangeLog b/ChangeLog index a901a829..acbfa129 100644 --- 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 + 20010508 - (bal) Fixed configure test for USE_SIA. diff --git a/acconfig.h b/acconfig.h index 52154fa5..3b275187 100644 --- a/acconfig.h +++ b/acconfig.h @@ -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 diff --git a/configure.in b/configure.in index a4d28032..9606045a 100644 --- a/configure.in +++ b/configure.in @@ -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) diff --git a/loginrec.c b/loginrec.c index 2aff6d2b..7790d9c6 100644 --- a/loginrec.c +++ b/loginrec.c @@ -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. diff --git a/loginrec.h b/loginrec.h index 961a605c..a741205e 100644 --- a/loginrec.h +++ b/loginrec.h @@ -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 */ diff --git a/session.c b/session.c index 440b517b..62026c67 100644 --- 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. */ diff --git a/sshlogin.c b/sshlogin.c index 1d9c031c..b7558b9e 100644 --- a/sshlogin.c +++ b/sshlogin.c @@ -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 diff --git a/sshlogin.h b/sshlogin.h index 7285bc23..f0d500ee 100644 --- a/sshlogin.h +++ b/sshlogin.h @@ -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. -- 2.45.2