logwtmp.c
上传用户:zibowangxu
上传日期:2007-01-04
资源大小:331k
文件大小:6k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /****************************************************************************    
  2.   Copyright (c) 1999 WU-FTPD Development Group.  
  3.   All rights reserved.
  4.   
  5.   Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994 
  6.     The Regents of the University of California.
  7.   Portions Copyright (c) 1993, 1994 Washington University in Saint Louis. 
  8.   Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc. 
  9.   Portions Copyright (c) 1989 Massachusetts Institute of Technology. 
  10.   Portions Copyright (c) 1998 Sendmail, Inc. 
  11.   Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P.  Allman. 
  12.   Portions Copyright (c) 1997 by Stan Barber. 
  13.   Portions Copyright (c) 1997 by Kent Landfield. 
  14.   Portions Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997 
  15.     Free Software Foundation, Inc.   
  16.   
  17.   Use and distribution of this software and its source code are governed  
  18.   by the terms and conditions of the WU-FTPD Software License ("LICENSE"). 
  19.   
  20.   If you did not receive a copy of the license, it may be obtained online 
  21.   at http://www.wu-ftpd.org/license.html. 
  22.   
  23.   $Id: logwtmp.c,v 1.15 1999/10/01 02:34:59 wuftpd Exp $ 
  24.   
  25. ****************************************************************************/
  26. #include "config.h"
  27. #include <sys/types.h>
  28. #ifdef TIME_WITH_SYS_TIME
  29. #include <time.h>
  30. #include <sys/time.h>
  31. #else
  32. #ifdef HAVE_SYS_TIME_H
  33. #include <sys/time.h>
  34. #else
  35. #include <time.h>
  36. #endif
  37. #endif
  38. #include <sys/stat.h>
  39. #if defined(HAVE_FCNTL_H)
  40. #include <fcntl.h>
  41. #endif
  42. #include <utmp.h>
  43. #ifdef SVR4
  44. #ifndef NO_UTMPX
  45. #include <utmpx.h>
  46. #ifndef _SCO_DS
  47. #include <sac.h>
  48. #endif
  49. #endif
  50. #endif
  51. #ifdef BSD
  52. #include <strings.h>
  53. #else
  54. #include <string.h>
  55. #endif
  56. #ifdef HAVE_SYS_SYSLOG_H
  57. #include <sys/syslog.h>
  58. #endif
  59. #if defined(HAVE_SYSLOG_H) || (!defined(AUTOCONF) && !defined(HAVE_SYS_SYSLOG_H))
  60. #include <syslog.h>
  61. #endif
  62. #ifdef __FreeBSD__
  63. #include <netinet/in.h>
  64. #include <arpa/inet.h>
  65. #include <netdb.h>
  66. #endif
  67. #include "pathnames.h"
  68. #include "proto.h"
  69. static int fd = -1;
  70. #ifdef SVR4
  71. static int fdx = -1;
  72. #endif
  73. /* Modified version of logwtmp that holds wtmp file open after first call,
  74.  * for use with ftp (which may chroot after login, but before logout). */
  75. void wu_logwtmp(char *line, char *name, char *host, int login)
  76. {
  77.     struct stat buf;
  78.     struct utmp ut;
  79. #ifdef SVR4
  80. #ifndef NO_UTMPX
  81.     /*
  82.      * Date: Tue, 09 Mar 1999 14:59:42 -0600
  83.      * From: Chad Price <cprice@molbio.unmc.edu>
  84.      * To: wu-ftpd@wugate.wustl.edu
  85.      * Subject: Re: Problem w/ Solaris /var/adm/wtmpx and /usr/bin/last(1)
  86.      * 
  87.      * I've been running Sol 2.4 since it came out, and the 'last' command
  88.      * has never worked correctly, for ftpd or logins either one.  wtmpx
  89.      * often fails to close out sessions when the user logs out.  As a
  90.      * result, I only use last to see who logged in, not who/when the
  91.      * logout occurred.
  92.      * 
  93.      * When I first installed it, it was even worse, and they immediately
  94.      * told me to patch the system.  This fixed it to semi-compus mentis,
  95.      * but not to working order.  So I guess my conclusion is: ignore the
  96.      * wtmpx / last log stuff on Solaris 2.4 (and other releases of Solaris
  97.      * too from what I see in the comments), it's broken and always has
  98.      * been.  I do of course stand ready to be corrected (in this case,
  99.      * pointed to a patch which really does fix it.)
  100.      *
  101.      */
  102.     struct utmpx utx;
  103.     if (fdx < 0 && (fdx = open(WTMPX_FILE, O_WRONLY | O_APPEND, 0)) < 0) {
  104. syslog(LOG_ERR, "wtmpx %s %m", WTMPX_FILE);
  105. return;
  106.     }
  107.     if (fstat(fdx, &buf) == 0) {
  108. memset((void *) &utx, '', sizeof(utx));
  109. (void) strncpy(utx.ut_user, name, sizeof(utx.ut_user));
  110. (void) strncpy(utx.ut_host, host, sizeof(utx.ut_host));
  111. (void) strncpy(utx.ut_id, "ftp", sizeof(utx.ut_id));
  112. (void) strncpy(utx.ut_line, line, sizeof(utx.ut_line));
  113. utx.ut_syslen = strlen(utx.ut_host) + 1;
  114. utx.ut_pid = getpid();
  115. (void) time(&utx.ut_tv.tv_sec);
  116. if (login /* name && *name */ ) {
  117.     utx.ut_type = USER_PROCESS;
  118. }
  119. else {
  120.     utx.ut_type = DEAD_PROCESS;
  121. }
  122. utx.ut_exit.e_termination = 0;
  123. utx.ut_exit.e_exit = 0;
  124. if (write(fdx, (char *) &utx, sizeof(struct utmpx)) !=
  125.     sizeof(struct utmpx))
  126.           (void) ftruncate(fdx, buf.st_size);
  127.     }
  128. #endif
  129. #endif
  130. #ifdef __FreeBSD__
  131.     if (strlen(host) > UT_HOSTSIZE) {
  132. struct hostent *hp = gethostbyname(host);
  133. if (hp != NULL) {
  134.     struct in_addr in;
  135.     memmove(&in, hp->h_addr, sizeof(in));
  136.     host = inet_ntoa(in);
  137. }
  138. else
  139.     host = "invalid hostname";
  140.     }
  141. #endif
  142.     if (fd < 0 && (fd = open(_PATH_WTMP, O_WRONLY | O_APPEND, 0)) < 0) {
  143. syslog(LOG_ERR, "wtmp %s %m", _PATH_WTMP);
  144. return;
  145.     }
  146.     if (fstat(fd, &buf) == 0) {
  147. #ifdef UTMAXTYPE
  148. memset((void *) &ut, 0, sizeof(ut));
  149. #ifdef LINUX
  150. (void) strncpy(ut.ut_id, "", sizeof(ut.ut_id));
  151. #else
  152. (void) strncpy(ut.ut_id, "ftp", sizeof(ut.ut_id));
  153. #endif
  154. (void) strncpy(ut.ut_line, line, sizeof(ut.ut_line));
  155. ut.ut_pid = getpid();
  156. if (login /* name && *name */ ) {
  157.     (void) strncpy(ut.ut_user, name, sizeof(ut.ut_user));
  158.     ut.ut_type = USER_PROCESS;
  159. }
  160. else
  161.     ut.ut_type = DEAD_PROCESS;
  162. #if defined(HAVE_UT_UT_EXIT_E_TERMINATION) || (!defined(AUTOCONF) && !defined(LINUX))
  163. ut.ut_exit.e_termination = 0;
  164. ut.ut_exit.e_exit = 0;
  165. #endif
  166. #else
  167. (void) strncpy(ut.ut_line, line, sizeof(ut.ut_line));
  168. if (login) {
  169.     (void) strncpy(ut.ut_name, name, sizeof(ut.ut_name));
  170. }
  171. else {
  172.     (void) strncpy(ut.ut_name, "", sizeof(ut.ut_name));
  173. }
  174. #endif /* UTMAXTYPE */
  175. #ifdef HAVE_UT_UT_HOST /* does have host in utmp */
  176. if (login) {
  177.     (void) strncpy(ut.ut_host, host, sizeof(ut.ut_host));
  178. }
  179. else {
  180.     (void) strncpy(ut.ut_host, "", sizeof(ut.ut_host));
  181. }
  182. #endif
  183. (void) time(&ut.ut_time);
  184. if (write(fd, (char *) &ut, sizeof(struct utmp)) !=
  185.     sizeof(struct utmp))
  186.          (void) ftruncate(fd, buf.st_size);
  187.     }
  188. }