#include "tweak.h" #include "server_def.h" #include "s_extern.h" #include #ifdef HAVE_UNISTD_H #include #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(); }