📄 testfile.c
字号:
while (thread_count) { PR_Wait(mon, PR_INTERVAL_NO_TIMEOUT); } PR_ExitMonitor(mon); /* * Start a bunch of reader threads */ offset = 0; len = CHUNK_SIZE; PR_EnterMonitor(mon); for (i = 0; i < NUM_RDWR_THREADS; i++) { fparamp = PR_NEW(File_Rdwr_Param); if (fparamp == NULL) { printf( "testfile failed to alloc File_Rdwr_Param struct\n"); rv = -1; goto cleanup; } fparamp->pathname = pathname; fparamp->buf = in_buf->data + offset; fparamp->offset = offset; fparamp->len = len; t = create_new_thread(PR_USER_THREAD, File_Read, (void *)fparamp, PR_PRIORITY_NORMAL, scope, PR_UNJOINABLE_THREAD, 0, i); offset += len; if ((offset + len) > BUF_DATA_SIZE) break; } thread_count = i; /* Wait for reader threads to exit */ while (thread_count) { PR_Wait(mon, PR_INTERVAL_NO_TIMEOUT); } PR_ExitMonitor(mon); if (memcmp(in_buf->data, out_buf->data, offset) != 0) { printf("File Test failed: file data corrupted\n"); rv = -1; goto cleanup; } if ((PR_Delete(pathname)) < 0) { printf("testfile failed to unlink file %s\n",pathname); rv = -1; goto cleanup; } /* * Test PR_Available, PR_Seek, PR_GetFileInfo, PR_Rename, PR_Access */ if (Misc_File_Tests(pathname) < 0) { rv = -1; }cleanup: if ((PR_RmDir(TEST_DIR)) < 0) { printf("testfile failed to rmdir %s\n", TEST_DIR); rv = -1; } return rv;}struct dirtest_arg { PRMonitor *mon; PRInt32 done;};static PRInt32 RunDirTest(void){int i;PRThread *t;PRMonitor *mon;struct dirtest_arg thrarg; mon = PR_NewMonitor(); if (!mon) { printf("RunDirTest: Error - failed to create monitor\n"); dirtest_failed = 1; return -1; } thrarg.mon = mon; for (i = 0; i < NUM_DIRTEST_THREADS; i++) { thrarg.done= 0; t = create_new_thread(PR_USER_THREAD, DirTest, &thrarg, PR_PRIORITY_NORMAL, PR_LOCAL_THREAD, PR_UNJOINABLE_THREAD, 0, i); if (!t) { printf("RunDirTest: Error - failed to create thread\n"); dirtest_failed = 1; return -1; } PR_EnterMonitor(mon); while (!thrarg.done) PR_Wait(mon, PR_INTERVAL_NO_TIMEOUT); PR_ExitMonitor(mon); } PR_DestroyMonitor(mon); return 0;}static PRInt32 PR_CALLBACK DirTest(void *arg){struct dirtest_arg *tinfo = (struct dirtest_arg *) arg;PRFileDesc *fd_file;PRDir *fd_dir;int i;int path_len;PRDirEntry *dirEntry;PRFileInfo info;PRInt32 num_files = 0;#if defined(XP_PC) && defined(WIN32)HANDLE hfile;#endif#define FILES_IN_DIR 20 /* * Create Test dir */ DPRINTF(("Creating test dir %s\n",TEST_DIR)); if ((PR_MkDir(TEST_DIR, 0777)) < 0) { printf( "testfile failed to create dir %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } fd_dir = PR_OpenDir(TEST_DIR); if (fd_dir == NULL) { printf( "testfile failed to open dirctory %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } strcpy(pathname, TEST_DIR); strcat(pathname, "/"); strcat(pathname, FILE_NAME); path_len = strlen(pathname); for (i = 0; i < FILES_IN_DIR; i++) { sprintf(pathname + path_len,"%d%s",i,""); DPRINTF(("Creating test file %s\n",pathname)); fd_file = PR_Open(pathname, PR_RDWR | PR_CREATE_FILE, 0777); if (fd_file == NULL) { printf( "testfile failed to create/open file %s [%d, %d]\n", pathname, PR_GetError(), PR_GetOSError()); return -1; } PR_Close(fd_file); }#if defined(XP_UNIX) || defined(XP_MAC) || (defined(XP_PC) && defined(WIN32)) || defined(XP_OS2) || defined(XP_BEOS) /* * Create a hidden file - a platform-dependent operation */ strcpy(pathname, TEST_DIR); strcat(pathname, "/"); strcat(pathname, HIDDEN_FILE_NAME);#if defined(XP_UNIX) || defined(XP_MAC) || defined(XP_BEOS) DPRINTF(("Creating hidden test file %s\n",pathname)); fd_file = PR_Open(pathname, PR_RDWR | PR_CREATE_FILE, 0777); if (fd_file == NULL) { printf( "testfile failed to create/open hidden file %s [%d, %d]\n", pathname, PR_GetError(), PR_GetOSError()); return -1; }#if defined(XP_MAC) {#include <files.h> OSErr err; FCBPBRec fcbpb; CInfoPBRec pb; Str255 pascalMacPath; fcbpb.ioNamePtr = pascalMacPath; fcbpb.ioVRefNum = 0; fcbpb.ioRefNum = fd_file->secret->md.osfd; fcbpb.ioFCBIndx = 0; err = PBGetFCBInfoSync(&fcbpb); if (err != noErr) { PR_Close(fd_file); return -1; } pb.hFileInfo.ioNamePtr = pascalMacPath; pb.hFileInfo.ioVRefNum = fcbpb.ioFCBVRefNum; pb.hFileInfo.ioDirID = fcbpb.ioFCBParID; pb.hFileInfo.ioFDirIndex = 0; err = PBGetCatInfoSync(&pb); if (err != noErr) { PR_Close(fd_file); return -1; } pb.hFileInfo.ioNamePtr = pascalMacPath; pb.hFileInfo.ioVRefNum = fcbpb.ioFCBVRefNum; pb.hFileInfo.ioDirID = fcbpb.ioFCBParID; pb.hFileInfo.ioFDirIndex = 0; pb.hFileInfo.ioFlFndrInfo.fdFlags |= fInvisible; err = PBSetCatInfoSync(&pb); if (err != noErr) { PR_Close(fd_file); return -1; } }#endif PR_Close(fd_file); #elif defined(XP_PC) && defined(WIN32) DPRINTF(("Creating hidden test file %s\n",pathname)); hfile = CreateFile(pathname, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_HIDDEN, NULL); if (hfile == INVALID_HANDLE_VALUE) { printf("testfile failed to create/open hidden file %s [0, %d]\n", pathname, GetLastError()); return -1; } CloseHandle(hfile); #elif defined(OS2) DPRINTF(("Creating hidden test file %s\n",pathname)); fd_file = PR_Open(pathname, PR_RDWR | PR_CREATE_FILE, (int)FILE_HIDDEN); if (fd_file == NULL) { printf("testfile failed to create/open hidden file %s [%d, %d]\n", pathname, PR_GetError(), PR_GetOSError()); return -1; } PR_Close(fd_file);#endif /* XP _UNIX || XP_MAC*/#endif /* XP_UNIX || XP_MAC ||(XP_PC && WIN32) */ if (PR_FAILURE == PR_CloseDir(fd_dir)) { printf( "testfile failed to close dirctory %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } fd_dir = PR_OpenDir(TEST_DIR); if (fd_dir == NULL) { printf( "testfile failed to reopen dirctory %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } /* * List all files, including hidden files */ DPRINTF(("Listing all files in directory %s\n",TEST_DIR));#if defined(XP_UNIX) || defined(XP_MAC) || (defined(XP_PC) && defined(WIN32)) || defined(XP_OS2) || defined(XP_BEOS) num_files = FILES_IN_DIR + 1;#else num_files = FILES_IN_DIR;#endif while ((dirEntry = PR_ReadDir(fd_dir, PR_SKIP_BOTH)) != NULL) { num_files--; strcpy(pathname, TEST_DIR); strcat(pathname, "/"); strcat(pathname, dirEntry->name); DPRINTF(("\t%s\n",dirEntry->name)); if ((PR_GetFileInfo(pathname, &info)) < 0) { printf( "testfile failed to GetFileInfo file %s [%d, %d]\n", pathname, PR_GetError(), PR_GetOSError()); return -1; } if (info.type != PR_FILE_FILE) { printf( "testfile incorrect fileinfo for file %s [%d, %d]\n", pathname, PR_GetError(), PR_GetOSError()); return -1; } } if (num_files != 0) { printf( "testfile failed to find all files in directory %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } PR_CloseDir(fd_dir);#if defined(XP_UNIX) || defined(XP_MAC) || (defined(XP_PC) && defined(WIN32)) || defined(XP_OS2) || defined(XP_BEOS) /* * List all files, except hidden files */ fd_dir = PR_OpenDir(TEST_DIR); if (fd_dir == NULL) { printf( "testfile failed to reopen dirctory %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } DPRINTF(("Listing non-hidden files in directory %s\n",TEST_DIR)); while ((dirEntry = PR_ReadDir(fd_dir, PR_SKIP_HIDDEN)) != NULL) { DPRINTF(("\t%s\n",dirEntry->name)); if (!strcmp(HIDDEN_FILE_NAME, dirEntry->name)) { printf("testfile found hidden file %s\n", pathname); return -1; } } /* * Delete hidden file */ strcpy(pathname, TEST_DIR); strcat(pathname, "/"); strcat(pathname, HIDDEN_FILE_NAME); if (PR_FAILURE == PR_Delete(pathname)) { printf( "testfile failed to delete hidden file %s [%d, %d]\n", pathname, PR_GetError(), PR_GetOSError()); return -1; } PR_CloseDir(fd_dir);#endif /* XP_UNIX || XP_MAC || (XP_PC && WIN32) */ strcpy(renamename, TEST_DIR); strcat(renamename, ".RENAMED"); if (PR_FAILURE == PR_Rename(TEST_DIR, renamename)) { printf( "testfile failed to rename directory %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } if (PR_FAILURE == PR_MkDir(TEST_DIR, 0777)) { printf( "testfile failed to recreate dir %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } if (PR_SUCCESS == PR_Rename(renamename, TEST_DIR)) { printf( "testfile renamed directory to existing name %s\n", renamename); return -1; } if (PR_FAILURE == PR_RmDir(TEST_DIR)) { printf( "testfile failed to rmdir %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } if (PR_FAILURE == PR_Rename(renamename, TEST_DIR)) { printf( "testfile failed to rename directory %s [%d, %d]\n", renamename, PR_GetError(), PR_GetOSError()); return -1; } fd_dir = PR_OpenDir(TEST_DIR); if (fd_dir == NULL) { printf( "testfile failed to reopen directory %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } strcpy(pathname, TEST_DIR); strcat(pathname, "/"); strcat(pathname, FILE_NAME); path_len = strlen(pathname); for (i = 0; i < FILES_IN_DIR; i++) { sprintf(pathname + path_len,"%d%s",i,""); if (PR_FAILURE == PR_Delete(pathname)) { printf( "testfile failed to delete file %s [%d, %d]\n", pathname, PR_GetError(), PR_GetOSError()); return -1; } } PR_CloseDir(fd_dir); if (PR_FAILURE == PR_RmDir(TEST_DIR)) { printf( "testfile failed to rmdir %s [%d, %d]\n", TEST_DIR, PR_GetError(), PR_GetOSError()); return -1; } PR_EnterMonitor(tinfo->mon); tinfo->done = 1; PR_Notify(tinfo->mon); PR_ExitMonitor(tinfo->mon); return 0;}/************************************************************************//* * Test file and directory NSPR APIs */int main(int argc, char **argv){#ifdef WIN32 PRUint32 len;#endif#if defined(XP_UNIX) || defined(XP_OS2_EMX) int opt; extern char *optarg; extern int optind;#endif#if defined(XP_UNIX) || defined(XP_OS2_EMX) while ((opt = getopt(argc, argv, "d")) != EOF) { switch(opt) { case 'd': _debug_on = 1; break; default: break; } }#endif PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0); PR_STDIO_INIT();#ifdef XP_MAC SetupMacPrintfLog("testfile.log");#endif mon = PR_NewMonitor(); if (mon == NULL) { printf("testfile: PR_NewMonitor failed\n"); exit(2); }#ifdef WIN32 len = GetTempPath(TMPDIR_LEN, testdir); if ((len > 0) && (len < (TMPDIR_LEN - 6))) { /* * enough space for prdir */ strcpy((testdir + len),"prdir"); TEST_DIR = testdir; printf("TEST_DIR = %s\n",TEST_DIR); } #endif if (FileTest() < 0) { printf("File Test failed\n"); exit(2); } printf("File Test passed\n"); if ((RunDirTest() < 0) || dirtest_failed) { printf("Dir Test failed\n"); exit(2); } printf("Dir Test passed\n"); PR_DestroyMonitor(mon); PR_Cleanup(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -