- Merged bsd-login ttyslot and AIX utmp patch from Gert Doering
<gd@hilb1.medat.de>
This commit is contained in:
parent
35dabd0398
commit
0e489dc5ae
1
CREDITS
1
CREDITS
|
@ -22,6 +22,7 @@ David Hesprich <darkgrue@gue-tech.org> - Configure fixes
|
||||||
David Rankin <drankin@bohemians.lexington.ky.us> - libwrap, AIX, NetBSD fixes
|
David Rankin <drankin@bohemians.lexington.ky.us> - libwrap, AIX, NetBSD fixes
|
||||||
Gary E. Miller <gem@rellim.com> - SCO support
|
Gary E. Miller <gem@rellim.com> - SCO support
|
||||||
Ged Lodder <lodder@yacc.com.au> - HPUX fixes and enhancements
|
Ged Lodder <lodder@yacc.com.au> - HPUX fixes and enhancements
|
||||||
|
Gert Doering <gd@hilb1.medat.de> - bug and portability fixes
|
||||||
HARUYAMA Seigo <haruyama@nt.phys.s.u-tokyo.ac.jp> - Translations & doc fixes
|
HARUYAMA Seigo <haruyama@nt.phys.s.u-tokyo.ac.jp> - Translations & doc fixes
|
||||||
Hideaki YOSHIFUJI <yoshfuji@ecei.tohoku.ac.jp> - IPv6 fixes
|
Hideaki YOSHIFUJI <yoshfuji@ecei.tohoku.ac.jp> - IPv6 fixes
|
||||||
Hiroshi Takekawa <takekawa@sr3.t.u-tokyo.ac.jp> - Configure fixes
|
Hiroshi Takekawa <takekawa@sr3.t.u-tokyo.ac.jp> - Configure fixes
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
<karn@ka9q.ampr.org>
|
<karn@ka9q.ampr.org>
|
||||||
- Fixed __progname symbol collisions reported by Andre Lucas
|
- Fixed __progname symbol collisions reported by Andre Lucas
|
||||||
<andre.lucas@dial.pipex.com>
|
<andre.lucas@dial.pipex.com>
|
||||||
|
- Merged bsd-login ttyslot and AIX utmp patch from Gert Doering
|
||||||
|
<gd@hilb1.medat.de>
|
||||||
|
|
||||||
20000430
|
20000430
|
||||||
- Merge HP-UX fixes and TCB support from Ged Lodder <lodder@yacc.com.au>
|
- Merge HP-UX fixes and TCB support from Ged Lodder <lodder@yacc.com.au>
|
||||||
|
|
69
bsd-login.c
69
bsd-login.c
|
@ -1,3 +1,7 @@
|
||||||
|
/*
|
||||||
|
* This file has been modified from the original OpenBSD version
|
||||||
|
*/
|
||||||
|
|
||||||
/* $OpenBSD: login.c,v 1.5 1998/07/13 02:11:12 millert Exp $ */
|
/* $OpenBSD: login.c,v 1.5 1998/07/13 02:11:12 millert Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1993
|
* Copyright (c) 1988, 1993
|
||||||
|
@ -35,6 +39,8 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#ifndef HAVE_LOGIN
|
#ifndef HAVE_LOGIN
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#if defined(LIBC_SCCS) && !defined(lint)
|
#if defined(LIBC_SCCS) && !defined(lint)
|
||||||
/* from: static char sccsid[] = "@(#)login.c 8.1 (Berkeley) 6/4/93"; */
|
/* from: static char sccsid[] = "@(#)login.c 8.1 (Berkeley) 6/4/93"; */
|
||||||
static char *rcsid = "$OpenBSD: login.c,v 1.5 1998/07/13 02:11:12 millert Exp $";
|
static char *rcsid = "$OpenBSD: login.c,v 1.5 1998/07/13 02:11:12 millert Exp $";
|
||||||
|
@ -54,6 +60,40 @@ static char *rcsid = "$OpenBSD: login.c,v 1.5 1998/07/13 02:11:12 millert Exp $"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* find first matching slot in utmp, or "-1" for none
|
||||||
|
*
|
||||||
|
* algorithm: for USER_PROCESS, check tty name
|
||||||
|
* for DEAD_PROCESS, check PID and tty name
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int find_tty_slot( utp )
|
||||||
|
struct utmp * utp;
|
||||||
|
{
|
||||||
|
int t = 0;
|
||||||
|
struct utmp * u;
|
||||||
|
|
||||||
|
setutent();
|
||||||
|
|
||||||
|
while((u = getutent()) != NULL) {
|
||||||
|
if (utp->ut_type == USER_PROCESS &&
|
||||||
|
(strncmp(utp->ut_line, u->ut_line, sizeof(utp->ut_line)) == 0)) {
|
||||||
|
endutent();
|
||||||
|
return(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((utp->ut_type == DEAD_PROCESS) && (utp->ut_pid == u->ut_pid) &&
|
||||||
|
(strncmp(utp->ut_line, u->ut_line, sizeof(utp->ut_line)) == 0 )) {
|
||||||
|
endutent();
|
||||||
|
return(t);
|
||||||
|
}
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
|
||||||
|
endutent();
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(HAVE_UTMPX_H) && defined(USE_UTMPX)
|
#if defined(HAVE_UTMPX_H) && defined(USE_UTMPX)
|
||||||
void
|
void
|
||||||
login(utp,utx)
|
login(utp,utx)
|
||||||
|
@ -74,9 +114,32 @@ login(utp)
|
||||||
register int fd;
|
register int fd;
|
||||||
int tty;
|
int tty;
|
||||||
|
|
||||||
tty = ttyslot();
|
/* can't use ttyslot here, as that will not work for logout
|
||||||
if (tty > 0 && (fd = open(_PATH_UTMP, O_RDWR|O_CREAT, 0644)) >= 0) {
|
* (record_logout() is called from the master sshd, which does
|
||||||
|
* not have the correct tty on stdin/out, so ttyslot will return
|
||||||
|
* "-1" or (worse) a wrong number
|
||||||
|
*/
|
||||||
|
tty = find_tty_slot(utp);
|
||||||
|
|
||||||
|
fd = open(_PATH_UTMP, O_RDWR|O_CREAT, 0644);
|
||||||
|
if (fd == -1) {
|
||||||
|
log("Couldn't open %s: %s", _PATH_UTMP, strerror(errno));
|
||||||
|
} else {
|
||||||
|
/* If no tty was found... */
|
||||||
|
if (tty == -1) {
|
||||||
|
/* ... append it to utmp on login */
|
||||||
|
if (utp->ut_type == USER_PROCESS) {
|
||||||
|
if ((fd = open(_PATH_UTMP, O_WRONLY|O_APPEND, 0)) >= 0) {
|
||||||
|
(void)write(fd, utp, sizeof(struct utmp));
|
||||||
|
(void)close(fd);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Shouldn't get to here unless somthing happened to utmp */
|
||||||
|
/* Between login and logout */
|
||||||
|
log("No tty slot found at logout");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Otherwise, tty was found - update at its location */
|
||||||
#if defined(HAVE_HOST_IN_UTMP)
|
#if defined(HAVE_HOST_IN_UTMP)
|
||||||
# ifndef UT_LINESIZE
|
# ifndef UT_LINESIZE
|
||||||
# define UT_LINESIZE (sizeof(old_ut.ut_line))
|
# define UT_LINESIZE (sizeof(old_ut.ut_line))
|
||||||
|
@ -100,6 +163,8 @@ login(utp)
|
||||||
(void)write(fd, utp, sizeof(struct utmp));
|
(void)write(fd, utp, sizeof(struct utmp));
|
||||||
(void)close(fd);
|
(void)close(fd);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) {
|
if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) {
|
||||||
(void)write(fd, utp, sizeof(struct utmp));
|
(void)write(fd, utp, sizeof(struct utmp));
|
||||||
(void)close(fd);
|
(void)close(fd);
|
||||||
|
|
6
login.c
6
login.c
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
RCSID("$Id: login.c,v 1.24 2000/04/19 21:42:22 damien Exp $");
|
RCSID("$Id: login.c,v 1.25 2000/05/01 12:53:53 damien Exp $");
|
||||||
|
|
||||||
#if defined(HAVE_UTMPX_H) && defined(USE_UTMPX)
|
#if defined(HAVE_UTMPX_H) && defined(USE_UTMPX)
|
||||||
# include <utmpx.h>
|
# include <utmpx.h>
|
||||||
|
@ -155,7 +155,11 @@ record_login(pid_t pid, const char *ttyname, const char *user, uid_t uid,
|
||||||
memset(&u, 0, sizeof(u));
|
memset(&u, 0, sizeof(u));
|
||||||
strncpy(u.ut_line, ttyname + 5, sizeof(u.ut_line));
|
strncpy(u.ut_line, ttyname + 5, sizeof(u.ut_line));
|
||||||
#if defined(HAVE_ID_IN_UTMP)
|
#if defined(HAVE_ID_IN_UTMP)
|
||||||
|
#ifdef _AIX
|
||||||
|
strncpy(u.ut_id, ttyname + 5, sizeof(u.ut_id));
|
||||||
|
#else /* !AIX */
|
||||||
strncpy(u.ut_id, ttyname + 8, sizeof(u.ut_id));
|
strncpy(u.ut_id, ttyname + 8, sizeof(u.ut_id));
|
||||||
|
#endif
|
||||||
#endif /* defined(HAVE_ID_IN_UTMP) */
|
#endif /* defined(HAVE_ID_IN_UTMP) */
|
||||||
strncpy(u.ut_name, user, sizeof(u.ut_name));
|
strncpy(u.ut_name, user, sizeof(u.ut_name));
|
||||||
#if defined(HAVE_TV_IN_UTMP)
|
#if defined(HAVE_TV_IN_UTMP)
|
||||||
|
|
Loading…
Reference in New Issue