utmpx_login.c revision 55682
1198893Srdivacky/* Author: Wietse Venema <wietse@wzv.win.tue.nl> */ 2198893Srdivacky 3198893Srdivacky#include "login_locl.h" 4198893Srdivacky 5198893SrdivackyRCSID("$Id: utmpx_login.c,v 1.24 1999/08/04 17:03:15 assar Exp $"); 6198893Srdivacky 7198893Srdivacky/* utmpx_login - update utmp and wtmp after login */ 8198893Srdivacky 9198893Srdivacky#ifndef HAVE_UTMPX_H 10198893Srdivackyint utmpx_login(char *line, const char *user, const char *host) { return 0; } 11198893Srdivacky#else 12198893Srdivacky 13198893Srdivackystatic void 14198893Srdivackyutmpx_update(struct utmpx *ut, char *line, const char *user, const char *host) 15198893Srdivacky{ 16218893Sdim struct timeval tmp; 17198893Srdivacky char *clean_tty = clean_ttyname(line); 18199990Srdivacky 19198893Srdivacky strncpy(ut->ut_line, clean_tty, sizeof(ut->ut_line)); 20218893Sdim#ifdef HAVE_STRUCT_UTMPX_UT_ID 21218893Sdim strncpy(ut->ut_id, make_id(clean_tty), sizeof(ut->ut_id)); 22198893Srdivacky#endif 23208600Srdivacky strncpy(ut->ut_user, user, sizeof(ut->ut_user)); 24218893Sdim strncpy(ut->ut_host, host, sizeof(ut->ut_host)); 25234353Sdim#ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN 26249423Sdim ut->ut_syslen = strlen(host) + 1; 27218893Sdim if (ut->ut_syslen > sizeof(ut->ut_host)) 28198893Srdivacky ut->ut_syslen = sizeof(ut->ut_host); 29198893Srdivacky#endif 30198893Srdivacky ut->ut_type = USER_PROCESS; 31218893Sdim gettimeofday (&tmp, 0); 32218893Sdim ut->ut_tv.tv_sec = tmp.tv_sec; 33218893Sdim ut->ut_tv.tv_usec = tmp.tv_usec; 34218893Sdim pututxline(ut); 35218893Sdim#ifdef WTMPX_FILE 36218893Sdim updwtmpx(WTMPX_FILE, ut); 37226633Sdim#elif defined(WTMP_FILE) 38218893Sdim { 39239462Sdim struct utmp utmp; 40218893Sdim int fd; 41218893Sdim 42239462Sdim prepare_utmp (&utmp, line, user, host); 43218893Sdim if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) { 44239462Sdim write(fd, &utmp, sizeof(struct utmp)); 45219077Sdim close(fd); 46234353Sdim } 47219077Sdim } 48218893Sdim#endif 49239462Sdim} 50218893Sdim 51218893Sdimint 52218893Sdimutmpx_login(char *line, const char *user, const char *host) 53198893Srdivacky{ 54198893Srdivacky struct utmpx *ut, save_ut; 55198893Srdivacky pid_t mypid = getpid(); 56198893Srdivacky int ret = (-1); 57239462Sdim 58239462Sdim /* 59239462Sdim * SYSV4 ttymon and login use tty port names with the "/dev/" prefix 60239462Sdim * stripped off. Rlogind and telnetd, on the other hand, make utmpx 61239462Sdim * entries with device names like /dev/pts/nnn. We therefore cannot use 62239462Sdim * getutxline(). Return nonzero if no utmp entry was found with our own 63239462Sdim * process ID for a login or user process. 64239462Sdim */ 65239462Sdim 66239462Sdim while ((ut = getutxent())) { 67239462Sdim /* Try to find a reusable entry */ 68239462Sdim if (ut->ut_pid == mypid 69239462Sdim && ( ut->ut_type == INIT_PROCESS 70239462Sdim || ut->ut_type == LOGIN_PROCESS 71239462Sdim || ut->ut_type == USER_PROCESS)) { 72239462Sdim save_ut = *ut; 73239462Sdim utmpx_update(&save_ut, line, user, host); 74239462Sdim ret = 0; 75239462Sdim break; 76218893Sdim } 77218893Sdim } 78218893Sdim if (ret == -1) { 79218893Sdim /* Grow utmpx file by one record. */ 80243830Sdim struct utmpx newut; 81218893Sdim memset(&newut, 0, sizeof(newut)); 82218893Sdim newut.ut_pid = mypid; 83218893Sdim utmpx_update(&newut, line, user, host); 84218893Sdim ret = 0; 85218893Sdim } 86198893Srdivacky endutxent(); 87218893Sdim return (ret); 88218893Sdim} 89218893Sdim#endif /* HAVE_UTMPX_H */ 90226633Sdim