*BSD News Article 52300


Return to BSD News archive

Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!simtel!news.kei.com!news.mathworks.com!tank.news.pipex.net!pipex!howland.reston.ans.net!vixen.cso.uiuc.edu!uwm.edu!homer.alpha.net!usenet
From: Dean Roth <Dean_Roth@mgic.com>
Newsgroups: comp.unix.bsd.bsdi.misc
Subject: Re: Multi homed FTP
Date: 2 Oct 1995 21:19:36 GMT
Organization: MGIC
Lines: 158
Message-ID: <44pl18$f15@homer.alpha.net>
References: <44odl2$g34@server05.icaen.uiowa.edu> <44on48$4dv@homer.alpha.net> <44p3ec$51h@news.cais.com>
NNTP-Posting-Host: mgic7.mgic.com
Mime-Version: 1.0
Content-Type: multipart/mixed;
	boundary="-------------------------------16883324488340"
X-Mailer: Mozilla 1.2N (Windows; I; 16bit)
To: jsloan@livnet.com

This is a multi-part message in MIME format.

---------------------------------16883324488340
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=us-ascii

jsloan@livnet.com (Jim Sloan) wrote:
>In article <44on48$4dv@homer.alpha.net>, Dean Roth <Dean_Roth@mgic.com> wrote:
>>dmorschh@ecn.uiowa.edu () wrote:
>Dean,
>  could you please give the rest of us the patch that you did to wuftpd to 
>allow it to support virtual domains?  This would be most helpful.  Or even 
>just the lines that you changed in the source.

See below. I hope you like C programming :-)

Dean


---------------------------------16883324488340
Content-Transfer-Encoding: 7bit
Content-Type: text/plain

You need wu-ftpd source code.

1. If you have source code from BSDI you are in luck. Skip to step 3.


2. Bad news. You don't already have source code. I hope you are a good
   C programmer.

   Get a copy of ftpd from wuarchive.wustl.edu . You MUST change the code
   to use quad words in a few places rather than longs. This is a messy
   operation. If you cannot do C programming, and/or do not understand
   the difference between int, long and quad, forget it. offset_t in BSDI
   is a quad, and parts of the code (s/f/printf) need to be changed or
   ftpd will core dump.

   Why don't I just give you some diffs? Because I've made other mods
   to ftpd to integrate it with a customer database that you wouldn't
   want, and couldn't use even if you had them.


3. Below is vhost.c. Add it to ftpd's makefile.

It expects to find file etc/vhosts in ftpd's
directory. NOTE: not /etc/vhosts, but ftpd's etc directory.

vhosts has the format:  IP  directory An example is shown below.

1.2.3.4   pub/foobar


This example is for ftp.foobar.com . When a connection is made to
that virtual host the code attached below looks up 1.2.3.4, the IP
associated with ftp.foobar.com, and changes to directory pub/foobar .
Users can use "cd" to move backward in the directory hierarchy.

The space between the IP number and directory name can be spaces and/or
tabs.

---vhost.c---


#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/syslog.h>


static int get_local_addr(int sd, struct in_addr *out)
{
    struct sockaddr addr;
    int len;

    len = sizeof(struct sockaddr);
    if(getsockname(sd,&addr,&len) < 0)
    {
                return(-1);
    }

    /*return ((struct sockaddr_in *)&addr)->sin_addr; /**/
    *out =  ((struct sockaddr_in *)&addr)->sin_addr;
        return(0);
}

check_virtual_host(int sock)
{
        int status;
        struct in_addr in;
        FILE *fptr;
        char ip[256];
        char buff[4096];

        status = get_local_addr(0, &in);

        if (status == 0)
        {
                strcpy(ip, inet_ntoa(in));
                syslog(LOG_INFO, "Host IP = [%s]", ip);
        }
        else
                syslog(LOG_INFO, "Host IP unknown");


        fptr = fopen("etc/vhosts", "r");
        if (!fptr)
                return(-1);

        while (fgets(buff, sizeof(buff), fptr))
        {
                char *dir_name;

                strtok(buff, " \t");    /* IP number */

                dir_name = strtok((char *)NULL, " \t\n");

                if (strcmp(ip, buff) == 0)
                {
                        chdir(dir_name);
                        break;
                }
        }

        fclose(fptr);
}



---ftpd.c---

4. Modify ftpd.c. Find an area of the code that looks like the example
   shown below.


    expand_id();

    if (anonymous || guest) {
        /* We MUST do a chdir() after the chroot. Otherwise the old current
         * directory will be accessible as "." outside the new root! */
        if (anonymous)
        {
            if (chroot(pw->pw_dir) < 0 || chdir("/") < 0) {
                reply(550, "Can't set guest privileges.");
                goto bad;
            }

            /* *********************************************** */
            /* GET (VIRTUAL) HOST IP AND CHANGE TO THAT SUBDIR */
            /* *********************************************** */
            check_virtual_host();

        }


Add the "check_virtual_host()" function as indicated, AFTER the chroot().