1 1.27 shm /* $NetBSD: logwtmp.c,v 1.27 2015/08/09 20:34:24 shm Exp $ */ 2 1.4 cgd 3 1.1 cgd /* 4 1.3 deraadt * Copyright (c) 1988, 1993 5 1.3 deraadt * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.21 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd * 31 1.1 cgd */ 32 1.1 cgd 33 1.5 christos 34 1.5 christos #include <sys/cdefs.h> 35 1.1 cgd #ifndef lint 36 1.4 cgd #if 0 37 1.3 deraadt static char sccsid[] = "@(#)logwtmp.c 8.1 (Berkeley) 6/4/93"; 38 1.4 cgd #else 39 1.27 shm __RCSID("$NetBSD: logwtmp.c,v 1.27 2015/08/09 20:34:24 shm Exp $"); 40 1.4 cgd #endif 41 1.1 cgd #endif /* not lint */ 42 1.1 cgd 43 1.1 cgd #include <sys/types.h> 44 1.14 lukem #include <sys/param.h> 45 1.1 cgd #include <sys/time.h> 46 1.1 cgd #include <sys/stat.h> 47 1.20 tacha #include <sys/wait.h> 48 1.3 deraadt 49 1.1 cgd #include <fcntl.h> 50 1.9 kleink #include <signal.h> 51 1.3 deraadt #include <stdio.h> 52 1.1 cgd #include <string.h> 53 1.6 kleink #include <time.h> 54 1.24 christos #include <syslog.h> 55 1.8 lukem #include <unistd.h> 56 1.24 christos #ifdef SUPPORT_UTMP 57 1.8 lukem #include <utmp.h> 58 1.24 christos #endif 59 1.20 tacha #ifdef SUPPORT_UTMPX 60 1.20 tacha #include <utmpx.h> 61 1.20 tacha #endif 62 1.16 christos #include <util.h> 63 1.11 explorer 64 1.11 explorer #ifdef KERBEROS5 65 1.12 christos #include <krb5/krb5.h> 66 1.11 explorer #endif 67 1.8 lukem 68 1.3 deraadt #include "extern.h" 69 1.1 cgd 70 1.24 christos #ifdef SUPPORT_UTMP 71 1.1 cgd static int fd = -1; 72 1.24 christos 73 1.24 christos void 74 1.24 christos ftpd_initwtmp(void) 75 1.24 christos { 76 1.24 christos const char *wf = _PATH_WTMP; 77 1.24 christos if ((fd = open(wf, O_WRONLY|O_APPEND, 0)) == -1) 78 1.24 christos syslog(LOG_ERR, "Cannot open `%s' (%m)", wf); 79 1.24 christos } 80 1.1 cgd 81 1.1 cgd /* 82 1.1 cgd * Modified version of logwtmp that holds wtmp file open 83 1.1 cgd * after first call, for use with ftp (which may chroot 84 1.1 cgd * after login, but before logout). 85 1.1 cgd */ 86 1.3 deraadt void 87 1.19 lukem ftpd_logwtmp(const char *line, const char *name, const char *host) 88 1.1 cgd { 89 1.1 cgd struct utmp ut; 90 1.1 cgd struct stat buf; 91 1.1 cgd 92 1.25 xtraeme if (fd < 0) 93 1.1 cgd return; 94 1.1 cgd if (fstat(fd, &buf) == 0) { 95 1.18 itojun (void)strncpy(ut.ut_line, line, sizeof(ut.ut_line)); 96 1.18 itojun (void)strncpy(ut.ut_name, name, sizeof(ut.ut_name)); 97 1.18 itojun (void)strncpy(ut.ut_host, host, sizeof(ut.ut_host)); 98 1.1 cgd (void)time(&ut.ut_time); 99 1.1 cgd if (write(fd, (char *)&ut, sizeof(struct utmp)) != 100 1.1 cgd sizeof(struct utmp)) 101 1.1 cgd (void)ftruncate(fd, buf.st_size); 102 1.1 cgd } 103 1.1 cgd } 104 1.24 christos #endif 105 1.20 tacha 106 1.20 tacha #ifdef SUPPORT_UTMPX 107 1.24 christos static int fdx = -1; 108 1.24 christos 109 1.24 christos void 110 1.24 christos ftpd_initwtmpx(void) 111 1.24 christos { 112 1.24 christos const char *wf = _PATH_WTMPX; 113 1.25 xtraeme if ((fdx = open(wf, O_WRONLY|O_APPEND, 0)) == -1) 114 1.24 christos syslog(LOG_ERR, "Cannot open `%s' (%m)", wf); 115 1.24 christos } 116 1.24 christos 117 1.20 tacha void 118 1.23 christos ftpd_logwtmpx(const char *line, const char *name, const char *host, 119 1.23 christos struct sockinet *haddr, int status, int utx_type) 120 1.20 tacha { 121 1.20 tacha struct utmpx ut; 122 1.20 tacha struct stat buf; 123 1.20 tacha 124 1.24 christos if (fdx < 0) 125 1.20 tacha return; 126 1.20 tacha if (fstat(fdx, &buf) == 0) { 127 1.26 shm (void)memset(&ut, 0, sizeof(ut)); 128 1.20 tacha (void)strncpy(ut.ut_line, line, sizeof(ut.ut_line)); 129 1.20 tacha (void)strncpy(ut.ut_name, name, sizeof(ut.ut_name)); 130 1.20 tacha (void)strncpy(ut.ut_host, host, sizeof(ut.ut_host)); 131 1.23 christos if (haddr) 132 1.23 christos (void)memcpy(&ut.ut_ss, &haddr->si_su, haddr->su_len); 133 1.20 tacha ut.ut_type = utx_type; 134 1.20 tacha if (WIFEXITED(status)) 135 1.20 tacha ut.ut_exit.e_exit = (uint16_t)WEXITSTATUS(status); 136 1.20 tacha if (WIFSIGNALED(status)) 137 1.20 tacha ut.ut_exit.e_termination = (uint16_t)WTERMSIG(status); 138 1.20 tacha (void)gettimeofday(&ut.ut_tv, NULL); 139 1.20 tacha if(write(fdx, (char *)&ut, sizeof(struct utmpx)) != 140 1.20 tacha sizeof(struct utmpx)) 141 1.20 tacha (void)ftruncate(fdx, buf.st_size); 142 1.20 tacha } 143 1.20 tacha } 144 1.20 tacha #endif 145