14137ff4cSJacques Vidrine /************************************************************************
24137ff4cSJacques Vidrine * Copyright 1995 by Wietse Venema.  All rights reserved.  Some individual
34137ff4cSJacques Vidrine * files may be covered by other copyrights.
44137ff4cSJacques Vidrine *
54137ff4cSJacques Vidrine * This material was originally written and compiled by Wietse Venema at
64137ff4cSJacques Vidrine * Eindhoven University of Technology, The Netherlands, in 1990, 1991,
74137ff4cSJacques Vidrine * 1992, 1993, 1994 and 1995.
84137ff4cSJacques Vidrine *
94137ff4cSJacques Vidrine * Redistribution and use in source and binary forms, with or without
104137ff4cSJacques Vidrine * modification, are permitted provided that this entire copyright notice
114137ff4cSJacques Vidrine * is duplicated in all such copies.
124137ff4cSJacques Vidrine *
134137ff4cSJacques Vidrine * This software is provided "as is" and without any expressed or implied
144137ff4cSJacques Vidrine * warranties, including, without limitation, the implied warranties of
154137ff4cSJacques Vidrine * merchantibility and fitness for any particular purpose.
164137ff4cSJacques Vidrine ************************************************************************/
17b528cefcSMark Murray /* Author: Wietse Venema <wietse@wzv.win.tue.nl> */
18b528cefcSMark Murray 
19b528cefcSMark Murray #include "login_locl.h"
20b528cefcSMark Murray 
21c19800e8SDoug Rabson RCSID("$Id$");
22b528cefcSMark Murray 
23b528cefcSMark Murray /* utmpx_login - update utmp and wtmp after login */
24b528cefcSMark Murray 
25b528cefcSMark Murray #ifndef HAVE_UTMPX_H
utmpx_login(char * line,const char * user,const char * host)26b528cefcSMark Murray int utmpx_login(char *line, const char *user, const char *host) { return 0; }
27b528cefcSMark Murray #else
28b528cefcSMark Murray 
29b528cefcSMark Murray static void
utmpx_update(struct utmpx * ut,char * line,const char * user,const char * host)30b528cefcSMark Murray utmpx_update(struct utmpx *ut, char *line, const char *user, const char *host)
31b528cefcSMark Murray {
32b528cefcSMark Murray     struct timeval tmp;
33b528cefcSMark Murray     char *clean_tty = clean_ttyname(line);
34b528cefcSMark Murray 
35b528cefcSMark Murray     strncpy(ut->ut_line, clean_tty, sizeof(ut->ut_line));
36b528cefcSMark Murray #ifdef HAVE_STRUCT_UTMPX_UT_ID
37b528cefcSMark Murray     strncpy(ut->ut_id, make_id(clean_tty), sizeof(ut->ut_id));
38b528cefcSMark Murray #endif
39b528cefcSMark Murray     strncpy(ut->ut_user, user, sizeof(ut->ut_user));
40adb0ddaeSAssar Westerlund     shrink_hostname (host, ut->ut_host, sizeof(ut->ut_host));
41b528cefcSMark Murray #ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN
42b528cefcSMark Murray     ut->ut_syslen = strlen(host) + 1;
43b528cefcSMark Murray     if (ut->ut_syslen > sizeof(ut->ut_host))
44b528cefcSMark Murray         ut->ut_syslen = sizeof(ut->ut_host);
45b528cefcSMark Murray #endif
46b528cefcSMark Murray     ut->ut_type = USER_PROCESS;
47b528cefcSMark Murray     gettimeofday (&tmp, 0);
48b528cefcSMark Murray     ut->ut_tv.tv_sec = tmp.tv_sec;
49b528cefcSMark Murray     ut->ut_tv.tv_usec = tmp.tv_usec;
50b528cefcSMark Murray     pututxline(ut);
51b528cefcSMark Murray #ifdef WTMPX_FILE
52b528cefcSMark Murray     updwtmpx(WTMPX_FILE, ut);
53b528cefcSMark Murray #elif defined(WTMP_FILE)
54b528cefcSMark Murray     { /* XXX should be removed, just drop wtmp support */
55b528cefcSMark Murray 	struct utmp utmp;
56b528cefcSMark Murray 	int fd;
57b528cefcSMark Murray 
58b528cefcSMark Murray 	prepare_utmp (&utmp, line, user, host);
59b528cefcSMark Murray 	if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) {
60b528cefcSMark Murray 	    write(fd, &utmp, sizeof(struct utmp));
61b528cefcSMark Murray 	    close(fd);
62b528cefcSMark Murray 	}
63b528cefcSMark Murray     }
64b528cefcSMark Murray #endif
65b528cefcSMark Murray }
66b528cefcSMark Murray 
67b528cefcSMark Murray int
utmpx_login(char * line,const char * user,const char * host)68b528cefcSMark Murray utmpx_login(char *line, const char *user, const char *host)
69b528cefcSMark Murray {
70b528cefcSMark Murray     struct utmpx *ut, save_ut;
71b528cefcSMark Murray     pid_t   mypid = getpid();
72b528cefcSMark Murray     int     ret = (-1);
73b528cefcSMark Murray 
74b528cefcSMark Murray     /*
75b528cefcSMark Murray      * SYSV4 ttymon and login use tty port names with the "/dev/" prefix
76b528cefcSMark Murray      * stripped off. Rlogind and telnetd, on the other hand, make utmpx
77b528cefcSMark Murray      * entries with device names like /dev/pts/nnn. We therefore cannot use
78b528cefcSMark Murray      * getutxline(). Return nonzero if no utmp entry was found with our own
79b528cefcSMark Murray      * process ID for a login or user process.
80b528cefcSMark Murray      */
81b528cefcSMark Murray 
82b528cefcSMark Murray     while ((ut = getutxent())) {
83b528cefcSMark Murray         /* Try to find a reusable entry */
84b528cefcSMark Murray 	if (ut->ut_pid == mypid
85b528cefcSMark Murray 	    && (   ut->ut_type == INIT_PROCESS
86b528cefcSMark Murray 		|| ut->ut_type == LOGIN_PROCESS
87b528cefcSMark Murray 		|| ut->ut_type == USER_PROCESS)) {
88b528cefcSMark Murray 	    save_ut = *ut;
89b528cefcSMark Murray 	    utmpx_update(&save_ut, line, user, host);
90b528cefcSMark Murray 	    ret = 0;
91b528cefcSMark Murray 	    break;
92b528cefcSMark Murray 	}
93b528cefcSMark Murray     }
94b528cefcSMark Murray     if (ret == -1) {
95b528cefcSMark Murray         /* Grow utmpx file by one record. */
96b528cefcSMark Murray         struct utmpx newut;
97b528cefcSMark Murray 	memset(&newut, 0, sizeof(newut));
98b528cefcSMark Murray 	newut.ut_pid = mypid;
99b528cefcSMark Murray         utmpx_update(&newut, line, user, host);
100b528cefcSMark Murray 	ret = 0;
101b528cefcSMark Murray     }
102b528cefcSMark Murray     endutxent();
103b528cefcSMark Murray     return (ret);
104b528cefcSMark Murray }
105b528cefcSMark Murray #endif /* HAVE_UTMPX_H */
106