Date: Fri, 26 May 1995 21:33:23 -0400 (EDT) From: Brian Kramer To: wu-ftpd@wugate.wustl.edu Subject: Virtual FTP Servers I'm attaching a patch for wu-ftpd 2.4 to allow virtual ftp servers to be setup. Basically so a user ftping to ftp1.domain.com gets one ftp banner and one ftp directory and a user ftping to ftp2.domain.com gets another banner and directory even though they are on the same machine and port. I was the person who originally asked how to do it, and got enough answers to write a patch that would allow it. You have to be able to setup alias IP addresses in order for this to work. I know linux and bsdi support this. (Linux with patches) and those are the only two systems this has been tested on. I do not warrant this code at all. Use it AT YOUR OWN RISK. If it causes your computer to blow up, TOUGH! If you have suggestions, improvements, bugs, etc...send me some mail. If enough people are interested in it, I can put it up on our ftp server. Please send me comments, I'm interested in improving it, and hearing how it works for people. Here's the steps. Basically setup an alias ip address for the machine. Apply the patch Add lines similar to the following for each virtual server to ftpaccess: # Virtual Servers virtual 165.254.117.200 /home/home3/ftp2 /home/home3/ftp2/etc/banner.msg where the 1st arg is the ip # of the virtual server, the second is the new root, and the third is the banner to display upon login. Note: all the other message files, etc, and permissions and other settings in the ftpaccess file apply to all virtual servers. Here's the patch CUT HERE*************************************************************** --- extensions.c +++ extensions.c Fri May 26 20:48:13 1995 @@ -278,7 +278,7 @@ /*************************************************************************/ void -show_banner(int msgcode) +show_banner(int msgcode, int virtual_mode, char *virtual_banner) { char *crptr, linebuf[1024], @@ -286,22 +286,38 @@ struct aclmember *entry = NULL; FILE *infile; - /* banner */ - while (getaclentry("banner", &entry)) { + if (virtual_mode) { + infile = fopen(virtual_banner, "r"); + if (infile) { + while (fgets(linebuf, 255, infile) != NULL) { + if ((crptr = strchr(linebuf, '\n')) != NULL) + *crptr = '\0'; + msg_massage(linebuf, outbuf); + lreply(msgcode, "%s", outbuf); + } + fclose(infile); + lreply(msgcode, ""); + } + } + else { + /* banner */ + while (getaclentry("banner", &entry)) { if (ARG0 && strlen(ARG0) > 0) { - infile = fopen(ARG0, "r"); - if (infile) { - while (fgets(linebuf, 255, infile) != NULL) { - if ((crptr = strchr(linebuf, '\n')) != NULL) - *crptr = '\0'; - msg_massage(linebuf, outbuf); - lreply(msgcode, "%s", outbuf); - } - fclose(infile); - lreply(msgcode, ""); - } - } + infile = fopen(ARG0, "r"); + if (infile) { + while (fgets(linebuf, 255, infile) != NULL) { + if ((crptr = strchr(linebuf, '\n')) != NULL) + *crptr = '\0'; + msg_massage(linebuf, outbuf); + lreply(msgcode, "%s", outbuf); + } + fclose(infile); + lreply(msgcode, ""); + } + } + } } + } /*************************************************************************/ --- ftpd.c +++ ftpd.c Fri May 26 20:53:57 1995 @@ -150,6 +150,14 @@ struct sockaddr_in his_addr; struct sockaddr_in pasv_addr; +int virtual_mode=0; +#ifdef VIRTUAL +struct sockaddr_in virtual_addr; +struct sockaddr_in *virtual_ptr; +char virtual_root[MAXPATHLEN]; +char virtual_banner[MAXPATHLEN]; +#endif + int data; jmp_buf errcatch, urgcatch; @@ -261,6 +269,11 @@ #endif char *cp; +#ifdef VIRTUAL + int virtual_len; + int set; +#endif + #ifdef SecureWare setluid(1); /* make sure there is a valid luid */ set_auth_parameters(argc,argv); @@ -499,6 +512,31 @@ authenticate(); conv_init(); + +#ifdef VIRTUAL + virtual_len = sizeof(virtual_addr); + if (getsockname(0, (struct sockaddr *) &virtual_addr, + &virtual_len) < 0) { + virtual_mode = 0; + } + else { + virtual_ptr = (struct sockaddr_in *) &virtual_addr; + set = 0; + entry = (struct aclmember *) NULL; + while (!set && getaclentry("virtual", &entry)) { + if (!strcmp(ARG0, inet_ntoa(virtual_ptr->sin_addr))) { + if (ARG1 != NULL && ARG2 != NULL) { + virtual_mode = 1; + strncpy(virtual_root, ARG1, MAXPATHLEN); + strncpy(virtual_banner, ARG2, MAXPATHLEN); + syslog(LOG_ERR, "VirtualFTP Connect to: %s", + inet_ntoa(virtual_ptr->sin_addr)); + } + } + } + } +#endif + if (is_shutdown(1) != 0) { syslog(LOG_INFO, "connection refused (server shut down) from %s [%s]", remotehost, remoteaddr); @@ -506,7 +544,8 @@ hostname); exit(0); } - show_banner(220); + + show_banner(220, virtual_mode, virtual_banner); entry = (struct aclmember *) NULL; if (getaclentry("lslong", &entry) && ARG0 && strlen(ARG0) > 0) { @@ -1108,6 +1147,13 @@ if (anonymous || guest) { /* We MUST do a chdir() after the chroot. Otherwise the old current * directory will be accessible as "." outside the new root! */ + +#ifdef VIRTUAL + if (virtual_mode) { + strcpy(pw->pw_dir, virtual_root); + } +#endif + if (anonymous) { if (chroot(pw->pw_dir) < 0 || chdir("/") < 0) { reply(550, "Can't set guest privileges."); --- makefiles/Makefile.aix +++ makefiles/Makefile.aix Fri May 26 20:57:36 1995 @@ -1,13 +1,14 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DDEBUG -DVIRTUAL ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = /lib/libc.a LINTFLAGS= LKERB = -lauth -lckrb -lkrb -ldes MKDEP = ../util/mkdep + SRCS = ftpd.c ftpcmd.c glob.c logwtmp.c popen.c vers.c access.c extensions.c \ realpath.c acl.c private.c authenticate.c conversions.c hostacc.c OBJS = ftpd.o ftpcmd.o glob.o logwtmp.o popen.o vers.o access.o extensions.o \ --- makefiles/Makefile.bsd +++ makefiles/Makefile.bsd Fri May 26 20:57:56 1995 @@ -1,12 +1,13 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DDEBUG -DVIRTUAL ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = /usr/lib/libc.a LINTFLAGS= LKERB = -lauth -lckrb -lkrb -ldes MKDEP = ../util/mkdep + SRCS = ftpd.c ftpcmd.c glob.c logwtmp.c popen.c vers.c access.c extensions.c \ realpath.c acl.c private.c authenticate.c conversions.c hostacc.c --- makefiles/Makefile.dgx +++ makefiles/Makefile.dgx Fri May 26 20:58:05 1995 @@ -1,12 +1,13 @@ CC = gcc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -g -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -g -DDEBUG -DVIRTUAL ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = -lc LINTFLAGS= LKERB = -lauth -lckrb -lkrb -ldes MKDEP = ../util/mkdep + SRCS = ftpd.c ftpcmd.c glob.c logwtmp.c popen.c vers.c access.c extensions.c \ realpath.c acl.c private.c authenticate.c conversions.c hostacc.c --- makefiles/Makefile.dyn +++ makefiles/Makefile.dyn Fri May 26 20:58:15 1995 @@ -1,7 +1,7 @@ CC = gcc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DDEBUG -DVIRTUAL ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = /lib/libc.a LINTFLAGS= --- makefiles/Makefile.gen +++ makefiles/Makefile.gen Fri May 26 20:58:25 1995 @@ -1,12 +1,14 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DDEBUG -DVIRTUAL ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = /lib/libc.a LINTFLAGS= LKERB = -lauth -lckrb -lkrb -ldes MKDEP = ../util/mkdep +DEFINES = -DVIRTUAL + SRCS = ftpd.c ftpcmd.c glob.c logwtmp.c popen.c vers.c access.c extensions.c \ realpath.c acl.c private.c authenticate.c conversions.c hostacc.c --- makefiles/Makefile.hpx +++ makefiles/Makefile.hpx Fri May 26 20:58:46 1995 @@ -1,12 +1,13 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -Aa -Dunix -D_HPUX_SOURCE -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -Aa -Dunix -DVIRTUAL -D_HPUX_SOURCE -O -DDEBUG ${IFLAGS} ${LFLAGS} LIBES = -lsupport -lc -lPW LIBC = /lib/libc.a LINTFLAGS= LKERB = -lauth -lckrb -lkrb -ldes MKDEP = ../util/mkdep.hpx + SRCS = ftpd.c ftpcmd.c glob.c logwtmp.c popen.c vers.c access.c extensions.c \ realpath.c acl.c private.c authenticate.c conversions.c hostacc.c --- makefiles/Makefile.isc +++ makefiles/Makefile.isc Fri May 26 20:58:57 1995 @@ -1,12 +1,13 @@ CC = gcc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O -DISC -DM_UNIX -DPOSIX_JC -DHAVE_VPRINTF -DHAVE_DIRENT -DNBBY=8 -DHAVE_GETDTABLESIZE -DHAVE_GETCWD -DREGEX -DSHADOW_PASSWORD ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DVIRTUAL -DISC -DM_UNIX -DPOSIX_JC -DHAVE_VPRINTF -DHAVE_DIRENT -DNBBY=8 -DHAVE_GETDTABLESIZE -DHAVE_GETCWD -DREGEX -DSHADOW_PASSWORD ${IFLAGS} ${LFLAGS} LIBES = -lsupport -linet -lnsl_s -lcposix -lPW -lsec LIBC = /lib/libc.a LINTFLAGS= #LKERB = MKDEP = ../util/mkdep + SRCS = ftpd.c ftpcmd.c glob.c logwtmp.c popen.c vers.c access.c extensions.c \ realpath.c acl.c private.c authenticate.c conversions.c hostacc.c --- makefiles/Makefile.lnx +++ makefiles/Makefile.lnx Fri May 26 20:59:22 1995 @@ -1,13 +1,13 @@ CC = gcc IFLAGS = -I.. -I../support -I/usr/include/bsd LFLAGS = -L../support -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DVIRTUAL -DDEBUG ${IFLAGS} ${LFLAGS} LIBES = -lsupport -lbsd LIBC = /usr/lib/libc.a LINTFLAGS= LKERB = -lauth -lckrb -lkrb -ldes MKDEP = ../util/mkdep - + SRCS = ftpd.c ftpcmd.c glob.c logwtmp.c popen.c vers.c access.c extensions.c \ realpath.c acl.c private.c authenticate.c conversions.c hostacc.c OBJS = ftpd.o ftpcmd.o glob.o logwtmp.o popen.o vers.o access.o extensions.o \ @@ -22,7 +22,7 @@ ${CC} ${CFLAGS} -o $@ ftpshut.c vers.o ${LIBES} ftpd: ${OBJS} ${LIBC} - ${CC} ${CFLAGS} -o $@ ${OBJS} ${LIBES} + ${CC} ${CFLAGS} ${DEFINES} -o $@ ${OBJS} ${LIBES} ckconfig: ckconfig.c ${CC} ${CFLAGS} -o $@ ckconfig.c --- makefiles/Makefile.nx2 +++ makefiles/Makefile.nx2 Fri May 26 20:59:12 1995 @@ -1,7 +1,7 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DVIRTUAL -DDEBUG ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = /lib/libsys_s.a LINTFLAGS= --- makefiles/Makefile.nx3 +++ makefiles/Makefile.nx3 Fri May 26 20:59:31 1995 @@ -1,7 +1,7 @@ CC = cc IFLAGS = -I.. LFLAGS = -L../support -CFLAGS = -O2 ${IFLAGS} ${LFLAGS} +CFLAGS = -O2 -DVIRTUAL ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = LINTFLAGS= --- makefiles/Makefile.osf +++ makefiles/Makefile.osf Fri May 26 20:59:39 1995 @@ -1,7 +1,7 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -s -x -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DVIRTUAL -DDEBUG ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = /lib/libc.a LINTFLAGS= --- makefiles/Makefile.ptx +++ makefiles/Makefile.ptx Fri May 26 20:59:47 1995 @@ -1,7 +1,7 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DVIRTUAL -DDEBUG ${IFLAGS} ${LFLAGS} LIBES = -lsupport -lsec -lgen -lseq -lsocket -linet -lnsl -lmalloc LIBC = /lib/libc.a LINTFLAGS= --- makefiles/Makefile.s41 +++ makefiles/Makefile.s41 Fri May 26 20:59:56 1995 @@ -2,7 +2,7 @@ #CC = acc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = $(OPT) -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = $(OPT) -DVIRTUAL -DDEBUG ${IFLAGS} ${LFLAGS} OPT = -g LIBES = -lsupport LIBC = /lib/libc.a --- makefiles/Makefile.sco +++ makefiles/Makefile.sco Fri May 26 21:00:09 1995 @@ -1,7 +1,7 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DVIRTUAL ${IFLAGS} ${LFLAGS} # 1) If you do not have -lprot_s, use -lprot instead. # 2) -lcrypt can be used in place of -lcrypt_i. If you do not have any crypt # library, get and install ftp.sco.com:/SLS/lng225* (International Crypt --- makefiles/Makefile.sgi +++ makefiles/Makefile.sgi Fri May 26 21:00:18 1995 @@ -1,7 +1,7 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DVIRTUAL -DDEBUG ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = /usr/lib/libc.a LINTFLAGS= --- makefiles/Makefile.sny +++ makefiles/Makefile.sny Fri May 26 21:00:26 1995 @@ -1,7 +1,7 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -O -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -O -DVIRTUAL -DDEBUG ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = /lib/libc.a LINTFLAGS= --- makefiles/Makefile.sol +++ makefiles/Makefile.sol Fri May 26 21:00:35 1995 @@ -1,7 +1,7 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -g -DDEBUG ${IFLAGS} ${LFLAGS} +CFLAGS = -g -DDEBUG -DVIRTUAL ${IFLAGS} ${LFLAGS} LIBES = -lsupport -lsocket -lnsl -lgen LIBC = /lib/libc.a LINTFLAGS= --- makefiles/Makefile.ult +++ makefiles/Makefile.ult Fri May 26 21:00:47 1995 @@ -1,7 +1,7 @@ CC = cc IFLAGS = -I.. -I../support LFLAGS = -L../support -CFLAGS = -Dconst="" -O -DDEBUG -DSYSSYSLOG ${IFLAGS} ${LFLAGS} +CFLAGS = -Dconst="" -O -DVIRTUAL -DDEBUG -DSYSSYSLOG ${IFLAGS} ${LFLAGS} LIBES = -lsupport LIBC = /lib/libc.a LINTFLAGS= Brian Kramer - Owner/Systems Administrator - bjkramer@pluto.njcc.com New Jersey Computer Connection - Public Access Unix Site - pluto.njcc.com Voice: 609-896-2799 - Fax: 609-896-2994 - Dialups: 609-896-3191 & 896-2722 Web: http://www.njcc.com/ Telnet/Dialup: pluto.njcc.com login as guest.