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

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: paths.c,v 1.6 1999/09/23 04:47:54 wuftpd Exp $  
  24.    
  25. ****************************************************************************/
  26. /*
  27.  * paths.c - setting up the correct pathing to support files/directories
  28.  *
  29.  * INITAL AUTHOR - Kent Landfield  <kent@landfield.com>
  30.  */
  31. #include "config.h"
  32. #include <stdio.h>
  33. #include <unistd.h>
  34. #include <string.h>
  35. #include <syslog.h>
  36. #include <sys/param.h>
  37. #include "pathnames.h"
  38. #ifdef  VIRTUAL
  39. #include <sys/types.h>
  40. #include <sys/stat.h>
  41. #include <sys/socket.h>
  42. #include <netinet/in.h>
  43. #include <arpa/inet.h>
  44. #include <netdb.h>
  45. int virtual_mode = 0;
  46. int virtual_ftpaccess = 0;
  47. #endif
  48. #ifndef MAXHOSTNAMELEN
  49. #define MAXHOSTNAMELEN 64
  50. #endif
  51. /*
  52.    ** Pathing storage
  53.  */
  54. #define _PATHS_DEFINED_ 1
  55. char _path_ftpaccess[MAXPATHLEN];
  56. char _path_ftpusers[MAXPATHLEN];
  57. char _path_ftphosts[MAXPATHLEN];
  58. char _path_private[MAXPATHLEN];
  59. char _path_cvt[MAXPATHLEN];
  60. extern char logfile[];
  61. extern char hostname[];
  62. void setup_paths(void);
  63. extern int read_servers_line(FILE *, char *, char *);
  64. /* 
  65.    ** Virtual hosting has to support many different types of needs. There
  66.    ** must be complete support for the various ftpd system files and their
  67.    ** functionality. 
  68.    **
  69.    ** Full support on a virtual host basis:
  70.    ** -------------------------------------
  71.    **  _PATH_FTPACCESS  
  72.    **  _PATH_FTPUSERS   
  73.    **  _PATH_PRIVATE    
  74.    **  _PATH_FTPHOSTS   
  75.    **  _PATH_CVT        
  76.    **
  77.    ** Set in a site's ftpaccess file
  78.    **  _PATH_XFERLOG   
  79.    **
  80.    ** Supported on a site basis:
  81.    ** --------------------------
  82.    **  _PATH_FTPSERVERS 
  83.    **  _PATH_EXECPATH   
  84.    **  _PATH_PIDNAMES  
  85.    **  _PATH_UTMP     
  86.    **  _PATH_WTMP    
  87.    **  _PATH_LASTLOG  
  88.    **  _PATH_BSHELL   
  89.    **  _PATH_DEVNULL  
  90.  */
  91. /* ------------------------------------------------------------------------ */
  92. /* FUNCTION  : setup_paths                                                  */
  93. /* PURPOSE   : Determine appropriate paths to various configuration files.  */
  94. /* ARGUMENTS : None                                                         */
  95. /* RETURNS   : None                                                         */
  96. /* ------------------------------------------------------------------------ */
  97. void setup_paths(void)
  98. {
  99. #ifdef VIRTUAL
  100.     char *sp;
  101.     char configdir[MAXPATHLEN];
  102.     char filepath[MAXPATHLEN];
  103.     char hostaddress[32];
  104.     char linebuf[BUFSIZ];
  105.     FILE *svrfp;
  106.     struct hostent *shp;
  107.     struct stat st;
  108. #if defined(UNIXWARE) || defined(AIX)
  109.     size_t virtual_len;
  110. #else
  111.     int virtual_len;
  112. #endif
  113.     struct sockaddr_in virtual_addr;
  114.     struct sockaddr_in *virtual_ptr;
  115. #endif
  116.     strcpy(_path_ftpaccess, _PATH_FTPACCESS);
  117.     strcpy(_path_ftpusers, _PATH_FTPUSERS);
  118.     strcpy(_path_private, _PATH_PRIVATE);
  119.     strcpy(_path_cvt, _PATH_CVT);
  120.     strcpy(logfile, _PATH_XFERLOG);
  121. #ifdef  HOST_ACCESS
  122.     strcpy(_path_ftphosts, _PATH_FTPHOSTS);
  123. #endif
  124. #ifdef VIRTUAL
  125.     /*
  126.        ** Open PATH_FTPSERVERS config file.  If the file does not 
  127.        ** exist then revert to using the standard _PATH_* path defines.
  128.      */
  129.     if ((svrfp = fopen(_PATH_FTPSERVERS, "r")) != NULL) {
  130. /*
  131.    ** OK.  The ftpservers file exists and is open.
  132.    ** 
  133.    ** Format of the file is:
  134.    **    ipaddr/hostname   directory-containing-configuration-files
  135.    **
  136.    **    208.196.145.10   /etc/ftpd/ftpaccess.somedomain/
  137.    **    208.196.145.200  /etc/ftpd/ftpaccess.someotherdomain/
  138.    **    some.domain      INTERNAL
  139.    ** 
  140.    ** Parse the file and try to match the IP address to one found 
  141.    ** in the file.  If a match is found then return the path to
  142.    ** the specified directory that contains the configuration files
  143.    ** for that specific domain.  If a match is not found, or an invalid
  144.    ** directory path is encountered like above, return standard paths.
  145.    **
  146.    ** As usual, comments and blanklines are ignored.
  147.  */
  148. /* get our address */
  149. virtual_len = sizeof(virtual_addr);
  150. if (getsockname(0, (struct sockaddr *) &virtual_addr, &virtual_len) == 0) {
  151.     virtual_ptr = (struct sockaddr_in *) &virtual_addr;
  152.     while (read_servers_line(svrfp, hostaddress, configdir) == 1) {
  153. if (!strcmp(hostaddress, inet_ntoa(virtual_ptr->sin_addr))) {
  154.     sprintf(linebuf, "VirtualFTP Connect to: %s",
  155.     inet_ntoa(virtual_ptr->sin_addr));
  156.     syslog(LOG_NOTICE, "%s", linebuf);
  157.     if (hostname != NULL) {
  158. /* reset hostname to this virtual name */
  159. shp = gethostbyaddr((char *) &virtual_ptr->sin_addr, sizeof(struct in_addr), AF_INET);
  160. if (shp != NULL)
  161.     strncpy(hostname, shp->h_name, MAXHOSTNAMELEN);
  162.     }
  163.     /* get rid of trailing slash */
  164.     sp = configdir + (strlen(configdir) - 1);
  165.     if (*sp == '/')
  166. *sp = '';
  167.     /* 
  168.        ** check to see that a valid directory value was
  169.        ** supplied and not something such as "INTERNAL"
  170.      */
  171.     if ((stat(configdir, &st) == 0) &&
  172. ((st.st_mode & S_IFMT) == S_IFDIR)) {
  173. sprintf(filepath, "%s/ftpaccess", configdir);
  174. if (access(filepath, R_OK) == 0) {
  175.     strcpy(_path_ftpaccess, filepath);
  176.     virtual_mode = 1;
  177.     virtual_ftpaccess = 1;
  178. }
  179. sprintf(filepath, "%s/ftpusers", configdir);
  180. if (access(filepath, R_OK) == 0)
  181.     strcpy(_path_ftpusers, filepath);
  182. sprintf(filepath, "%s/ftpgroups", configdir);
  183. if (access(filepath, R_OK) == 0)
  184.     strcpy(_path_private, filepath);
  185. sprintf(filepath, "%s/ftphosts", configdir);
  186. if (access(filepath, R_OK) == 0)
  187.     strcpy(_path_ftphosts, filepath);
  188. sprintf(filepath, "%s/ftpconversions", configdir);
  189. if (access(filepath, R_OK) == 0)
  190.     strcpy(_path_cvt, filepath);
  191.     }
  192.     return;
  193. }
  194.     }
  195. }
  196.     }
  197. #endif /* VIRTUAL */
  198.     return;
  199. }