/* Copyright (C) 1999 Beau Kuiper
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "ftpd.h"
/* this works correctly for all cased because rootdir has already been
corrected using getcwd */
char *dir_getreal(FTPSTATE *peer)
{
int a;
char *dir = getcwd2();
if (dir == NULL)
return(NULL);
a = strlen(peer->basedir);
if (strncmp(peer->basedir, dir, a) == 0)
return(dir);
freewrapper(dir);
errno = EACCES;
return(NULL);
}
/* a quicker way to get the virtual dir, replaces both
dir_toreal and dir_tovirtual. Note that the caller
must copy the result if it want's to change the
source */
char *dir_getvirtual(FTPSTATE *peer, char *normaldir)
{
int a, b;
a = strlen(peer->basedir);
b = strlen(normaldir);
if (a == 0)
return(normaldir);
if (b == a)
return("/");
return(normaldir + a);
}
void dir_combine(FTPSTATE *peer, char **pwd, char *newdir)
{
char *moddir, *nextpos, *curpos;
reallocwrapper(strlen(newdir) + strlen(*pwd)
+ strlen(peer->homedir) + 3, (void *)pwd);
moddir = *pwd + strlen(peer->basedir);
/* if the directory is /, set it to nothing */
if (moddir[1] == 0)
moddir[0] = 0;
if (newdir[0] == '/') /* absolute filename */
{
/* make newdir relative and clear result */
newdir++;
moddir[0] = 0;
}
else if (newdir[0] == '~')
{
strcpy(moddir, peer->homedir);
newdir++;
if (newdir[0] == '/')
newdir++;
}
curpos = newdir;
do
{
nextpos = strchr(curpos, '/');
if (nextpos != NULL)
*nextpos = 0;
if (strcmp(curpos, "") == 0);
else if (strcmp(curpos, ".") == 0);
else if (strcmp(curpos, "..") == 0)
{
char *newpos = strrchr(moddir, '/');
if (newpos)
*newpos = 0;
}
else
{
strcat(moddir, "/");
strcat(moddir, curpos);
}
if (nextpos)
{
/* repair earlier damage, set next component */
*nextpos = '/';
curpos = nextpos + 1;
}
else
curpos = NULL;
} while (curpos);
/* if the result is nothing, then it means root dir, so say so */
if ((*pwd)[0] == 0)
strcpy(*pwd, "/");
}
syntax highlighted by Code2HTML, v. 0.9.1