#include #include #include #include #include #include #include #include #include #include #include "tsttmp.h" // defines DbgPrint as printf extern int errno; VOID dir0(char *); VOID dir1(char *); VOID dir2(char *); VOID dir3(char *); VOID dir4(char *); VOID dir5(char *); int main(int argc, char *argv[]) { DbgPrint("argc = %d, argv[1] = %s\n", argc, argv[1]); if (argc != 2) { DbgPrint("Usage: 'tstdir basedirectory' (basedirectory is usually /psx/test)\n"); return 1; } dir0(argv[1]); dir1(argv[1]); dir2(argv[1]); dir3(argv[1]); dir4(argv[1]); dir5(argv[1]); return 1; } VOID dir0(char *f) { int rc; DIR *dir; struct dirent *dirent; DbgPrint("dir0:++ %s\n",f); dir = opendir(f); ASSERT(dir != NULL); errno = 0; dirent = readdir(dir); while( dirent ) { DbgPrint("%s\n",&dirent->d_name); dirent = readdir(dir); } ASSERT(errno == 0); rc = closedir(dir); ASSERT(rc==0); rc = closedir(dir); ASSERT(rc==-1 && errno == EBADF); DbgPrint("dir0:--\n"); } VOID dir1(char *f) { int rc,i; DIR *dir; char buf1[256],buf2[256]; struct dirent *dirent; DbgPrint("dir1:++ %s\n",f); dir = opendir(f); ASSERT(dir != NULL); // // Get Two Directory entries. // i = 0; errno = 0; dirent = readdir(dir); if ( dirent ) { strcpy(buf1,(char *)&dirent->d_name); i++; } dirent = readdir(dir); if ( dirent ) { strcat(buf1,(char *)&dirent->d_name); i++; } // // Go past a few entries // dirent = readdir(dir); if ( dirent ) { dirent = readdir(dir); } // // Rewind the directory stream and then read into a new buffer // and compare results // rewinddir(dir); buf2[0]='\0'; while(i--) { dirent = readdir(dir); ASSERT(dirent); strcat(buf2,(char *)&dirent->d_name); } ASSERT(strcmp(buf1,buf2) == 0); rc = closedir(dir); ASSERT(rc==0); rc = closedir(dir); ASSERT(rc==-1 && errno == EBADF); DbgPrint("dir1:--\n"); } VOID dir2(char *f) { int rc; char buf[256], *b; DbgPrint("dir2:++ %s\n",f); rc = chdir(f); ASSERT(rc==0); b = getcwd(buf,256); ASSERT(b); b = getcwd(buf,-1); ASSERT(b==NULL && errno == EINVAL); b = getcwd(buf,1); ASSERT(b==NULL && errno == ERANGE); rc = chdir("/psx/test/tstdirs"); ASSERT(rc==0); b = getcwd(buf,256); ASSERT(b); b = getcwd(buf,-1); ASSERT(b==NULL && errno == EINVAL); b = getcwd(buf,1); ASSERT(b==NULL && errno == ERANGE); DbgPrint("dir2:--\n"); } VOID dir3(char *f) { int rc; DIR *dir; struct dirent *dirent; DbgPrint("dir3:++ %s\n",f); rc = chdir(f); ASSERT(rc==0); dir = opendir("."); ASSERT(dir != NULL); errno = 0; dirent = readdir(dir); while( dirent ) { DbgPrint("%s\n",&dirent->d_name); dirent = readdir(dir); } ASSERT(errno == 0); rc = closedir(dir); ASSERT(rc==0); rc = chdir("/psx/test/tstdirs"); ASSERT(rc==0); dir = opendir("."); ASSERT(dir != NULL); errno = 0; dirent = readdir(dir); while( dirent ) { DbgPrint("%s\n",&dirent->d_name); dirent = readdir(dir); } ASSERT(errno == 0); rc = closedir(dir); ASSERT(rc==0); DbgPrint("dir3:--\n"); } VOID dir4(char *f) { int rc; DIR *dir; struct dirent *dirent; DbgPrint("dir4:++ %s\n",f); dir = opendir(f); ASSERT(dir != NULL); if ( fork() == 0 ) { sleep(10); errno = 0; dirent = readdir(dir); while( dirent ) { DbgPrint("%s\n",&dirent->d_name); dirent = readdir(dir); } ASSERT(errno == 0); rc = closedir(dir); ASSERT(rc==0); rc = closedir(dir); ASSERT(rc==-1 && errno == EBADF); _exit(0); } rc = closedir(dir); ASSERT(rc==0); rc = closedir(dir); ASSERT(rc==-1 && errno == EBADF); wait(NULL); DbgPrint("dir4:--\n"); } VOID dir5(char *f) { int rc; char buf[256], *b; PCH Arg[3], Env[4]; DbgPrint("dir5:++ %s\n",f); rc = chdir(f); ASSERT(rc==0); b = getcwd(buf,256); ASSERT(b); b = getcwd(buf,-1); ASSERT(b==NULL && errno == EINVAL); b = getcwd(buf,1); ASSERT(b==NULL && errno == ERANGE); rc = chdir("/psx/test/tstdirs"); ASSERT(rc==0); b = getcwd(buf,256); ASSERT(b); b = getcwd(buf,-1); ASSERT(b==NULL && errno == EINVAL); b = getcwd(buf,1); ASSERT(b==NULL && errno == ERANGE); Arg[0]="tsthello.xxx"; Arg[1]=(PCH)NULL; Env[0]="NTUSER=ELLENA"; Env[1]=(PCH)NULL; execve("\\DosDevices\\D:\\PSX\\TSTHELLO.exe",Arg,Env); ASSERT(FALSE); DbgPrint("dir5:--\n"); }