From 9d962a59cc82c7f0136db23fa3f748e98789fbe5 Mon Sep 17 00:00:00 2001 From: Unknown User d91-jda Date: Mon, 25 Mar 1996 23:10:25 +0000 Subject: [PATCH] Fixed (hopefully) double utmp-entries in Solaris. Only put entries in one of utmp/utmpx, since they both get updated by putut*ent() anyway. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@337 ec53bebd-3082-4978-b11e-865c3cabbd6b --- appl/login/utmp_login.c | 79 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 appl/login/utmp_login.c diff --git a/appl/login/utmp_login.c b/appl/login/utmp_login.c new file mode 100644 index 000000000..c8ac10c87 --- /dev/null +++ b/appl/login/utmp_login.c @@ -0,0 +1,79 @@ +#include "bsd_locl.h" + +RCSID("$Id$"); + +/* update utmp and wtmp - the BSD way */ + +void utmp_login(char *tty, char *username, char *hostname) +{ +#ifndef HAVE_UTMPX_H + struct utmp utmp; + struct hostent *he; + int fd; + int ttyno; + + char *ttyx; /* tty w/o /dev/* */ + + ttyx = tty; + + if(strncmp(tty, "/dev/", 5) == 0) + ttyx = tty + 5; + + memset(&utmp, 0, sizeof(utmp)); + utmp.ut_time = time(NULL); + strncpy(utmp.ut_line, ttyx, sizeof(utmp.ut_line)); + strncpy(utmp.ut_name, username, sizeof(utmp.ut_name)); + +# ifdef HAVE_UT_USER + strncpy(utmp.ut_user, username, sizeof(utmp.ut_user)); +# endif + +# ifdef HAVE_UT_ADDR + if (hostname[0]) { + if ((he = gethostbyname(hostname))) + memcpy(&utmp.ut_addr, he->h_addr_list[0], + sizeof(utmp.ut_addr)); + } +# endif + +# ifdef HAVE_UT_HOST + strncpy(utmp.ut_host, hostname, sizeof(utmp.ut_host)); +# endif + +# ifdef HAVE_UT_TYPE + utmp.ut_type = USER_PROCESS; +# endif + +# ifdef HAVE_UT_PID + utmp.ut_pid = getpid(); +# endif + +# ifdef HAVE_UT_ID + /* any particular reason to not include "tty" ? */ + strncpy(utmp.ut_id, ttyx, sizeof(utmp.ut_id)); +# endif + + +#ifdef HAVE_SETUTENT + utmpname(_PATH_UTMP); + setutent(); + pututline(&utmp); + endutent(); +#else + +#ifdef HAVE_TTYSLOT + ttyno = ttyslot(); + if (ttyno > 0 && (fd = open(_PATH_UTMP, O_WRONLY, 0)) >= 0) { + lseek(fd, (long)(ttyno * sizeof(struct utmp)), SEEK_SET); + write(fd, (char *)&utmp, sizeof(struct utmp)); + close(fd); + } +#endif /* HAVE_TTYSLOT */ +#endif /* HAVE_SETUTENT */ + + if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) { + write(fd, (char *)&utmp, sizeof(struct utmp)); + close(fd); + } +#endif /* HAVE_UTMPX_H */ +}