]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/opie/libopie/logwtmp.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / opie / libopie / logwtmp.c
1 /* logwtmp.c: Put an entry in the wtmp file.
2
3 %%% portions-copyright-cmetz-96
4 Portions of this software are Copyright 1996-1999 by Craig Metz, All Rights
5 Reserved. The Inner Net License Version 2 applies to these portions of
6 the software.
7 You should have received a copy of the license with this software. If
8 you didn't get a copy, you may request one from <license@inner.net>.
9
10 Portions of this software are Copyright 1995 by Randall Atkinson and Dan
11 McDonald, All Rights Reserved. All Rights under this copyright are assigned
12 to the U.S. Naval Research Laboratory (NRL). The NRL Copyright Notice and
13 License Agreement applies to this software.
14
15         History:
16
17         Modified by cmetz for OPIE 2.4. Set process to dead if name is null.
18                 Added support for ut_id and ut_syslen.
19         Modified by cmetz for OPIE 2.32. Don't leave line=NULL, skip
20                 past /dev/ in line. Fill in ut_host on systems with UTMPX and
21                 ut_host.
22         Modified by cmetz for OPIE 2.31. Move wtmp log functions here, to
23                 improve portability. Added DISABLE_WTMP.
24         Modified by cmetz for OPIE 2.22. Call gettimeofday() properly.
25         Modified by cmetz for OPIE 2.2. Use FUNCTION declaration et al.
26                 Ifdef around some headers. Added file close hook.
27         Modified at NRL for OPIE 2.1. Set process type for HPUX.
28         Modified at NRL for OPIE 2.0.
29         Originally from BSD.
30 */
31 /*
32  * Copyright (c) 1988 The Regents of the University of California.
33  * All rights reserved.
34  *
35  * Redistribution and use in source and binary forms, with or without
36  * modification, are permitted provided that the following conditions
37  * are met:
38  * 1. Redistributions of source code must retain the above copyright
39  *    notice, this list of conditions and the following disclaimer.
40  * 2. Redistributions in binary form must reproduce the above copyright
41  *    notice, this list of conditions and the following disclaimer in the
42  *    documentation and/or other materials provided with the distribution.
43  * 3. All advertising materials mentioning features or use of this software
44  *    must display the following acknowledgement:
45  *      This product includes software developed by the University of
46  *      California, Berkeley and its contributors.
47  * 4. Neither the name of the University nor the names of its contributors
48  *    may be used to endorse or promote products derived from this software
49  *    without specific prior written permission.
50  *
51  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
52  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
53  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
54  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
55  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
57  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
58  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
59  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
60  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
61  * SUCH DAMAGE.
62  *
63  */
64
65 #include "opie_cfg.h"
66
67 #include <sys/types.h>
68 #if HAVE_SYS_TIME_H
69 #include <sys/time.h>
70 #endif /* HAVE_SYS_TIME_H */
71 #include <sys/stat.h>
72 #include <fcntl.h>
73 #include <utmp.h>
74 #if HAVE_UNISTD_H
75 #include <unistd.h>
76 #endif /* HAVE_UNISTD_H */
77 #if HAVE_STRING_H
78 #include <string.h>
79 #endif /* HAVE_STRING_H */
80
81 #include "opie.h"
82
83 static int fd = -1;
84
85 #if DOUTMPX
86 static int fdx = -1;
87 #include <utmpx.h>
88 #endif  /* DOUTMPX */
89
90 #ifndef _PATH_WTMP
91 #ifdef WTMP_FILE
92 #define _PATH_WTMP WTMP_FILE
93 #else /* WTMP_FILE */
94 #ifdef PATH_WTMP_AC
95 #define _PATH_WTMP PATH_WTMP_AC
96 #endif /* PATH_WTMP_AC */
97 #endif /* WTMP_FILE */
98 #endif /* _PATH_WTMP */
99
100 #ifndef _PATH_WTMPX
101 #ifdef WTMPX_FILE
102 #define _PATH_WTMPX WTMPX_FILE
103 #else /* WTMPX_FILE */
104 #ifdef PATH_WTMPX_AC
105 #define _PATH_WTMPX PATH_WTMPX_AC
106 #endif /* PATH_WTMPX_AC */
107 #endif /* WTMPX_FILE */
108 #endif /* _PATH_WTMPX */
109
110 /*
111  * Modified version of logwtmp that holds wtmp file open
112  * after first call, for use with ftp (which may chroot
113  * after login, but before logout).
114  */
115 VOIDRET opielogwtmp FUNCTION((line, name, host), char *line AND char *name AND char *host AND char *id)
116 {
117 #if !DISABLE_WTMP
118   struct utmp ut;
119
120 #if DOUTMPX && defined(_PATH_WTMPX)
121   struct utmpx utx;
122 #endif /* DOUTMPX && defined(_PATH_WTMPX) */
123   struct stat buf;
124
125   memset(&ut, 0, sizeof(struct utmp));
126
127   if (!line) {
128     close(fd);
129 #if DOUTMPX && defined(_PATH_WTMPX)
130     close(fdx);
131 #endif /* DOUTMPX && defined(_PATH_WTMPX) */
132     line = "";
133   } else
134     if (!strncmp(line, "/dev/", 5))
135       line += 5;
136
137   if (fd < 0 && (fd = open(_PATH_WTMP, O_WRONLY | O_APPEND, 0)) < 0)
138     return;
139   if (fstat(fd, &buf) == 0) {
140 #if HAVE_UT_TYPE && defined(USER_PROCESS)
141     if (name && *name)
142       ut.ut_type = USER_PROCESS;
143     else
144       ut.ut_type = DEAD_PROCESS;
145 #endif /* HAVE_UT_TYPE && defined(USER_PROCESS) */
146 #if HAVE_UT_ID
147     if (id)
148       strncpy(ut.ut_id, id, sizeof(ut.ut_id));
149 #endif /* HAVE_UT_ID */
150 #if HAVE_UT_PID
151     ut.ut_pid = getpid();
152 #endif /* HAVE_UT_PID */
153     strncpy(ut.ut_line, line, sizeof(ut.ut_line));
154     strncpy(ut.ut_name, name, sizeof(ut.ut_name));
155 #if HAVE_UT_HOST
156     strncpy(ut.ut_host, host, sizeof(ut.ut_host));
157 #endif /* HAVE_UT_HOST */
158     time(&ut.ut_time);
159     if (write(fd, (char *) &ut, sizeof(struct utmp)) !=
160         sizeof(struct utmp))
161     ftruncate(fd, buf.st_size);
162   }
163
164 #if DOUTMPX && defined(_PATH_WTMPX)
165   memset(&utx, 0, sizeof(struct utmpx));
166
167   if (fdx < 0 && (fdx = open(_PATH_WTMPX, O_WRONLY | O_APPEND, 0)) < 0)
168     return;
169   if (fstat(fdx, &buf) == 0) {
170     strncpy(utx.ut_line, line, sizeof(utx.ut_line));
171     strncpy(utx.ut_name, name, sizeof(utx.ut_name));
172     strncpy(utx.ut_host, host, sizeof(utx.ut_host));
173 #ifdef USER_PROCESS
174     if (name && *name)
175       utx.ut_type = USER_PROCESS;
176     else
177       utx.ut_type = DEAD_PROCESS;
178 #endif /* USER_PROCESS */
179     if (id)
180       strncpy(utx.ut_id, id, sizeof(utx.ut_id));
181     utx.ut_pid = getpid();
182 #if HAVE_UTX_SYSLEN
183     utx.ut_syslen = strlen(utx.ut_host) + 1;
184 #endif /* HAVE_UTX_SYSLEN */
185 #if HAVE_GETTIMEOFDAY
186 #if HAVE_ONE_ARG_GETTIMEOFDAY
187     gettimeofday(&utx.ut_tv);
188 #else /* HAVE_ONE_ARG_GETTIMEOFDAY */
189     gettimeofday(&utx.ut_tv, NULL);
190 #endif /* HAVE_ONE_ARG_GETTIMEOFDAY */
191 #endif /* HAVE_GETTIMEOFDAY */
192     if (write(fdx, (char *) &utx, sizeof(struct utmpx)) != sizeof(struct utmpx))
193     ftruncate(fdx, buf.st_size);
194   }
195 #endif /* DOUTMPX && defined(_PATH_WTMPX) */
196 #endif /* !DISABLE_WTMP */
197 }