127 lines
3.8 KiB
C
127 lines
3.8 KiB
C
#include "tweak.h"
|
|
#include "server_def.h"
|
|
#include "s_extern.h"
|
|
#include <stdlib.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
#include "my-string.h"
|
|
|
|
int dbug=1;
|
|
|
|
const char *testcases[]={
|
|
"", ".","/",
|
|
"\nonlypwd",
|
|
"filename","/filename","//filename",
|
|
"dirname/filename","//dirname/filename","//dirname//filename",
|
|
"dir1name/dir2name/","//dir1name//dir2name//",
|
|
"filename\npasswd","filename\nsymlink\npasswd",
|
|
"file/.dir","../updir","file/../dir",
|
|
NULL};
|
|
|
|
/* PPATH structure from server_def.h */
|
|
#if 0
|
|
struct {
|
|
const char *fullp; /* ptr to string containing full pathname */
|
|
const char *f_ptr; /* ptr to begining of last path component */
|
|
unsigned int f_len; /* length of last component in path */
|
|
const char *d_ptr; /* ptr to beginning of directory component */
|
|
unsigned int d_len; /* length of directory part of path. */
|
|
const char *passwd; /* ptr to password */
|
|
char inetstr[16]; /* inet-address of remote-FSP */
|
|
char portstr [8]; /* port of remote-FSP */
|
|
};
|
|
#endif
|
|
|
|
#define NULLPPATH NULL, NULL, 0, NULL, 0, NULL, {0}, {0}
|
|
|
|
PPATH testresults[]={
|
|
{".",".",1,".",1,NULL,{0},{0}}, {0}, {".",".",1,".",1,NULL,{0},{0}},
|
|
{".",".",1,".",1,"onlypwd", {0},{0}},
|
|
{"filename","filename",8,".",1,NULL,{0},{0}} , {"filename","filename",8,".",1,NULL,{0},{0}} , {"filename","filename",8,".",1,NULL,{0},{0}},
|
|
{"dirname/filename","filename",8,"dirname",7,NULL, {0},{0}} , {"dirname/filename","filename",8,"dirname",7,NULL,{0},{0}} , {"dirname//filename","filename",8,"dirname",7,NULL,{0},{0}},
|
|
{"dir1name/dir2name/",".",1,"dir1name/dir2name",17,NULL,{0},{0}}, {"dir1name//dir2name//",".",1,"dir1name//dir2name",18,NULL,{0},{0}},
|
|
{"filename","filename",8,".",1,"passwd",{0},{0}}, {"filename","filename",8,".",1,"passwd",{0},{0}},
|
|
{NULLPPATH},{NULLPPATH},{NULLPPATH}
|
|
};
|
|
|
|
static void print_path(PPATH *pp)
|
|
{
|
|
printf("fullpath: %s ", pp->fullp);
|
|
if(strcmp(pp->fullp, pp->d_ptr))
|
|
{
|
|
printf("d_ptr: %s (%d) ", pp->d_ptr, pp->d_len);
|
|
} else {
|
|
printf("(%d) ", pp->d_len);
|
|
}
|
|
|
|
printf("f_ptr: %s (%d) ", pp->f_ptr, pp->f_len);
|
|
if(pp->passwd)
|
|
printf("passwd: %s", pp->passwd);
|
|
}
|
|
|
|
/** returns: 0 okay, 1 different */
|
|
static int compareresults(PPATH *p1, PPATH *p2)
|
|
{
|
|
if(p1->fullp==NULL && p2->fullp==NULL) return 0;
|
|
if(p1->fullp==NULL || p2->fullp==NULL) return -1;
|
|
if(strcmp(p1->fullp,p2->fullp)) return -1;
|
|
if(p1->f_len!=p2->f_len) return -1;
|
|
if(strcmp(p1->f_ptr,p2->f_ptr)) return -1;
|
|
if(p1->d_len!=p2->d_len) return -1;
|
|
if(strncmp(p1->d_ptr,p2->d_ptr,p1->d_len)) return -1;
|
|
if(p1->passwd==NULL && p2->passwd==NULL) return 0;
|
|
if(p1->passwd==NULL || p2->passwd==NULL) return -1;
|
|
if(strcmp(p1->passwd,p2->passwd)) return -1;
|
|
return 0;
|
|
}
|
|
|
|
static int runtestcase(void)
|
|
{
|
|
int rc=0;
|
|
int i=0;
|
|
PPATH pp;
|
|
const char *err;
|
|
char *test;
|
|
|
|
for(;testcases[i];i++)
|
|
{
|
|
test=strdup(testcases[i]);
|
|
pp.fullp=NULL;
|
|
err=parse_path(test,strlen(test)+1,&pp);
|
|
printf("parsing: '%s'",test);
|
|
if(err)
|
|
{
|
|
printf(" parse err: '%s'. ", err);
|
|
pp.fullp=NULL;
|
|
} else {
|
|
printf(" parsed okay. ");
|
|
}
|
|
if(compareresults(&pp,&testresults[i]))
|
|
{
|
|
printf("!!!TEST FAILED!!!\a\n");
|
|
rc=1;
|
|
} else {
|
|
printf(" Test passed.\n");
|
|
}
|
|
if(!err)
|
|
{
|
|
printf(" ");
|
|
print_path(&pp);
|
|
printf("\n");
|
|
}
|
|
free(test);
|
|
}
|
|
if (rc == 0) {
|
|
printf("ALL TESTS PASSED.\n");
|
|
} else {
|
|
printf("SOME TESTS FAILED.\n");
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
int main(int argc,const char *argv[])
|
|
{
|
|
return runtestcase();
|
|
}
|