1 /* 2 * Copyright 2003 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 #pragma ident "%Z%%M% %I% %E% SMI" 7 8 /**************************************************************************** 9 Copyright (c) 1999,2000 WU-FTPD Development Group. 10 All rights reserved. 11 12 Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994 13 The Regents of the University of California. 14 Portions Copyright (c) 1993, 1994 Washington University in Saint Louis. 15 Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc. 16 Portions Copyright (c) 1989 Massachusetts Institute of Technology. 17 Portions Copyright (c) 1998 Sendmail, Inc. 18 Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P. Allman. 19 Portions Copyright (c) 1997 by Stan Barber. 20 Portions Copyright (c) 1997 by Kent Landfield. 21 Portions Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997 22 Free Software Foundation, Inc. 23 24 Use and distribution of this software and its source code are governed 25 by the terms and conditions of the WU-FTPD Software License ("LICENSE"). 26 27 If you did not receive a copy of the license, it may be obtained online 28 at http://www.wu-ftpd.org/license.html. 29 30 $Id: paths.c,v 1.7 2000/07/01 18:17:39 wuftpd Exp $ 31 32 ****************************************************************************/ 33 /* 34 * paths.c - setting up the correct pathing to support files/directories 35 * 36 * INITAL AUTHOR - Kent Landfield <kent@landfield.com> 37 */ 38 #include "config.h" 39 40 #include <stdio.h> 41 #include <unistd.h> 42 #include <string.h> 43 #include <syslog.h> 44 #include <sys/param.h> 45 46 #include "pathnames.h" 47 #include "proto.h" 48 49 #ifdef VIRTUAL 50 51 #include <sys/types.h> 52 #include <sys/stat.h> 53 #include <sys/socket.h> 54 #include <netinet/in.h> 55 #include <arpa/inet.h> 56 #include <netdb.h> 57 58 int virtual_mode = 0; 59 int virtual_ftpaccess = 0; 60 61 extern int debug; 62 extern char virtual_hostname[]; 63 extern char virtual_address[]; 64 65 #endif 66 67 #ifndef MAXHOSTNAMELEN 68 #define MAXHOSTNAMELEN 64 69 #endif 70 71 /* 72 ** Pathing storage 73 */ 74 75 #define _PATHS_DEFINED_ 1 76 char _path_ftpaccess[MAXPATHLEN]; 77 char _path_ftpusers[MAXPATHLEN]; 78 char _path_ftphosts[MAXPATHLEN]; 79 char _path_private[MAXPATHLEN]; 80 char _path_cvt[MAXPATHLEN]; 81 82 extern char logfile[]; 83 extern char hostname[]; 84 85 void setup_paths(void); 86 87 /* 88 ** Virtual hosting has to support many different types of needs. There 89 ** must be complete support for the various ftpd system files and their 90 ** functionality. 91 ** 92 ** Full support on a virtual host basis: 93 ** ------------------------------------- 94 ** _PATH_FTPACCESS 95 ** _PATH_FTPUSERS 96 ** _PATH_PRIVATE 97 ** _PATH_FTPHOSTS 98 ** _PATH_CVT 99 ** 100 ** Set in a site's ftpaccess file 101 ** _PATH_XFERLOG 102 ** 103 ** Supported on a site basis: 104 ** -------------------------- 105 ** _PATH_FTPSERVERS 106 ** _PATH_EXECPATH 107 ** _PATH_PIDNAMES 108 ** _PATH_UTMP 109 ** _PATH_WTMP 110 ** _PATH_LASTLOG 111 ** _PATH_BSHELL 112 ** _PATH_DEVNULL 113 */ 114 115 /* ------------------------------------------------------------------------ */ 116 /* FUNCTION : setup_paths */ 117 /* PURPOSE : Determine appropriate paths to various configuration files. */ 118 /* ARGUMENTS : None */ 119 /* RETURNS : None */ 120 /* ------------------------------------------------------------------------ */ 121 122 void setup_paths(void) 123 { 124 #ifdef VIRTUAL 125 char *sp; 126 char configdir[MAXPATHLEN]; 127 char filepath[MAXPATHLEN]; 128 #ifdef INET6 129 char hostaddress[INET6_ADDRSTRLEN]; 130 #else 131 char hostaddress[32]; 132 #endif 133 FILE *svrfp; 134 struct stat st; 135 #if defined(UNIXWARE) || defined(AIX) 136 size_t virtual_len; 137 #else 138 int virtual_len; 139 #endif 140 struct SOCKSTORAGE virtual_addr; 141 #endif 142 143 (void) strlcpy(_path_ftpaccess, _PATH_FTPACCESS, sizeof(_path_ftpaccess)); 144 (void) strlcpy(_path_ftpusers, _PATH_FTPUSERS, sizeof(_path_ftpusers)); 145 (void) strlcpy(_path_private, _PATH_PRIVATE, sizeof(_path_private)); 146 (void) strlcpy(_path_cvt, _PATH_CVT, sizeof(_path_cvt)); 147 (void) strlcpy(logfile, _PATH_XFERLOG, MAXPATHLEN); 148 (void) strlcpy(_path_ftphosts, _PATH_FTPHOSTS, sizeof(_path_ftphosts)); 149 150 #ifdef VIRTUAL 151 /* 152 ** Open PATH_FTPSERVERS config file. If the file does not 153 ** exist then revert to using the standard _PATH_* path defines. 154 */ 155 156 if ((svrfp = fopen(_PATH_FTPSERVERS, "r")) != NULL) { 157 /* 158 ** OK. The ftpservers file exists and is open. 159 ** 160 ** Format of the file is: 161 ** ipaddr/hostname directory-containing-configuration-files 162 ** 163 ** 208.196.145.10 /etc/ftpd/ftpaccess.somedomain/ 164 ** 208.196.145.200 /etc/ftpd/ftpaccess.someotherdomain/ 165 ** some.domain INTERNAL 166 ** 167 ** Parse the file and try to match the IP address to one found 168 ** in the file. If a match is found then return the path to 169 ** the specified directory that contains the configuration files 170 ** for that specific domain. If a match is not found, or an invalid 171 ** directory path is encountered like above, return standard paths. 172 ** 173 ** As usual, comments and blanklines are ignored. 174 */ 175 176 /* get our address */ 177 178 virtual_len = sizeof(virtual_addr); 179 if (getsockname(0, (struct sockaddr *) &virtual_addr, &virtual_len) == 0) { 180 while (read_servers_line(svrfp, hostaddress, sizeof(hostaddress), 181 configdir, sizeof(configdir)) == 1) { 182 if (!strcmp(hostaddress, inet_stop(&virtual_addr))) { 183 if (debug) 184 syslog(LOG_DEBUG, "VirtualFTP Connect to: %s", hostaddress); 185 (void) strlcpy(virtual_address, hostaddress, 186 MAXHOSTNAMELEN); 187 if (hostname != NULL) { 188 /* reset hostname to this virtual name */ 189 wu_gethostbyaddr(&virtual_addr, hostname, MAXHOSTNAMELEN); 190 (void) strlcpy(virtual_hostname, hostname, 191 MAXHOSTNAMELEN); 192 } 193 194 /* get rid of trailing slash */ 195 sp = configdir + (strlen(configdir) - 1); 196 if (*sp == '/') 197 *sp = '\0'; 198 199 /* 200 ** check to see that a valid directory value was 201 ** supplied and not something such as "INTERNAL" 202 */ 203 204 if ((stat(configdir, &st) == 0) && 205 ((st.st_mode & S_IFMT) == S_IFDIR)) { 206 207 (void) snprintf(filepath, sizeof(filepath), 208 "%s/ftpaccess", configdir); 209 if (access(filepath, R_OK) == 0) { 210 (void) strlcpy(_path_ftpaccess, filepath, 211 sizeof(_path_ftpaccess)); 212 virtual_mode = 1; 213 virtual_ftpaccess = 1; 214 } 215 216 (void) snprintf(filepath, sizeof(filepath), 217 "%s/ftpusers", configdir); 218 if (access(filepath, R_OK) == 0) 219 (void) strlcpy(_path_ftpusers, filepath, 220 sizeof(_path_ftpusers)); 221 222 (void) snprintf(filepath, sizeof(filepath), 223 "%s/ftpgroups", configdir); 224 if (access(filepath, R_OK) == 0) 225 (void) strlcpy(_path_private, filepath, 226 sizeof(_path_private)); 227 228 (void) snprintf(filepath, sizeof(filepath), 229 "%s/ftphosts", configdir); 230 if (access(filepath, R_OK) == 0) 231 (void) strlcpy(_path_ftphosts, filepath, 232 sizeof(_path_ftphosts)); 233 234 (void) snprintf(filepath, sizeof(filepath), 235 "%s/ftpconversions", configdir); 236 if (access(filepath, R_OK) == 0) 237 (void) strlcpy(_path_cvt, filepath, 238 sizeof(_path_cvt)); 239 } 240 (void) fclose(svrfp); 241 return; 242 } 243 } 244 } 245 (void) fclose(svrfp); 246 } 247 #endif /* VIRTUAL */ 248 249 return; 250 }