- 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
|
||||
Gary E. Miller <gem@rellim.com> - SCO support
|
||||
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
|
||||
Hideaki YOSHIFUJI <yoshfuji@ecei.tohoku.ac.jp> - IPv6 fixes
|
||||
Hiroshi Takekawa <takekawa@sr3.t.u-tokyo.ac.jp> - Configure fixes
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
<karn@ka9q.ampr.org>
|
||||
- Fixed __progname symbol collisions reported by Andre Lucas
|
||||
<andre.lucas@dial.pipex.com>
|
||||
- Merged bsd-login ttyslot and AIX utmp patch from Gert Doering
|
||||
<gd@hilb1.medat.de>
|
||||
|
||||
20000430
|
||||
- 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 $ */
|
||||
/*
|
||||
* Copyright (c) 1988, 1993
|
||||
|
@ -35,6 +39,8 @@
|
|||
#include "config.h"
|
||||
#ifndef HAVE_LOGIN
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
/* 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 $";
|
||||
|
@ -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 <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)
|
||||
void
|
||||
login(utp,utx)
|
||||
|
@ -74,9 +114,32 @@ login(utp)
|
|||
register int fd;
|
||||
int tty;
|
||||
|
||||
tty = ttyslot();
|
||||
if (tty > 0 && (fd = open(_PATH_UTMP, O_RDWR|O_CREAT, 0644)) >= 0) {
|
||||
/* can't use ttyslot here, as that will not work for logout
|
||||
* (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)
|
||||
# ifndef UT_LINESIZE
|
||||
# define UT_LINESIZE (sizeof(old_ut.ut_line))
|
||||
|
@ -100,6 +163,8 @@ login(utp)
|
|||
(void)write(fd, utp, sizeof(struct utmp));
|
||||
(void)close(fd);
|
||||
}
|
||||
}
|
||||
|
||||
if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) {
|
||||
(void)write(fd, utp, sizeof(struct utmp));
|
||||
(void)close(fd);
|
||||
|
|
6
login.c
6
login.c
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
#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)
|
||||
# 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));
|
||||
strncpy(u.ut_line, ttyname + 5, sizeof(u.ut_line));
|
||||
#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));
|
||||
#endif
|
||||
#endif /* defined(HAVE_ID_IN_UTMP) */
|
||||
strncpy(u.ut_name, user, sizeof(u.ut_name));
|
||||
#if defined(HAVE_TV_IN_UTMP)
|
||||
|
|
Loading…
Reference in New Issue