/* * Class: edu_uw_apl_commons_tsk4j_filesys_FileSystem * Method: dirOpen * Signature: (JLjava/lang/String;)Ledu/uw/apl/commons/tsk4j/filesys/Directory; */ JNIEXPORT jobject JNICALL Java_edu_uw_apl_commons_tsk4j_filesys_FileSystem_dirOpen (JNIEnv *env, jobject thiz, jlong nativePtr, jstring path ) { const char* pathC = (*env)->GetStringUTFChars( env, path, NULL ); TSK_FS_INFO* info = (TSK_FS_INFO*)nativePtr; TSK_FS_DIR* fsDir = tsk_fs_dir_open( info, pathC ); if( !fsDir ) { (*env)->ReleaseStringUTFChars( env, path, pathC ); return (jobject)NULL; } TSK_FS_FILE* fsFile = fsDir->fs_file; jobject fileMeta = NULL; if( fsFile->meta ) { fileMeta = createFileMeta( env, fsFile->meta ); if( !fileMeta ) { tsk_fs_dir_close( fsDir ); (*env)->ReleaseStringUTFChars( env, path, pathC ); return NULL; } } jobject fileName = NULL; if( fsFile->name ) { fileName = createFileName( env, fsFile->name ); if( !fileName ) { tsk_fs_dir_close( fsDir ); (*env)->ReleaseStringUTFChars( env, path, pathC ); // LOOK: release fileMeta ???? return NULL; } } jobject file = createFile( env, fsFile, thiz, fileMeta, fileName ); if( !file ) { tsk_fs_dir_close( fsDir ); (*env)->ReleaseStringUTFChars( env, path, pathC ); // LOOK: release fileMeta, fileName ???? return NULL; } jobject result = createDirectory( env, fsDir, thiz, file ); if( !result ) { tsk_fs_dir_close( fsDir ); (*env)->ReleaseStringUTFChars( env, path, pathC ); // LOOK: release fileMeta, fileName, file ???? return NULL; } (*env)->ReleaseStringUTFChars( env, path, pathC ); return result; }
// directory read functions VALUE open_directory_by_name(int argc, VALUE *args, VALUE self) { VALUE name; VALUE opts; TSK_FS_DIR * tsk_dir; struct tsk4r_fs_wrapper * fs_ptr; Data_Get_Struct(self, struct tsk4r_fs_wrapper, fs_ptr); rb_scan_args(argc, args, "11", &name, &opts); VALUE new_obj; tsk_dir = tsk_fs_dir_open(fs_ptr->filesystem, StringValuePtr(name)); if (tsk_dir != NULL ) { printf("We are getting somewhere (open_directory_by_name)!!\n"); new_obj = rb_funcall(rb_cTSKFileSystemDir, rb_intern("new"), 2, self, name); } else { new_obj = Qnil; } return new_obj; }
/* Compare the differences between dir_open_meta and dir_open * @param a_path Path of directory to open * @param a_addr The metadata address of the same directory as the path * @returns 1 if a test failed */ static int test_dir_open_apis(TSK_FS_INFO * a_fs, const char *a_path, TSK_INUM_T a_addr) { TSK_FS_DIR *fs_dir_m; TSK_FS_DIR *fs_dir_p; TSK_FS_DIR *fs_dir_tmp; TSK_FS_FILE *fs_file_m; TSK_FS_FILE *fs_file_p; int retval = 0; size_t entry = 0; // open via inode addr fs_dir_m = tsk_fs_dir_open_meta(a_fs, a_addr); if (!fs_dir_m) { fprintf(stderr, "Error opening dir %" PRIuINUM " via meta\n", a_addr); tsk_error_print(stderr); return 1; } /* open the root directory to throw some more state into the system * in case data is cached from first call */ fs_dir_tmp = tsk_fs_dir_open_meta(a_fs, a_fs->root_inum); if (!fs_dir_tmp) { fprintf(stderr, "Error opening root directory via meta\n"); tsk_error_print(stderr); return 1; } // open via path fs_dir_p = tsk_fs_dir_open(a_fs, a_path); if (!fs_dir_p) { fprintf(stderr, "Error opening directory %s\n", a_path); tsk_error_print(stderr); return 1; } // test that path has the name structure set (correctly) if ((fs_dir_p->fs_file == NULL) || (fs_dir_p->fs_file->name == NULL)) { fprintf(stderr, "dir opened via path has null name (%s)\n", a_path); retval = 1; goto open_cleanup; } if (fs_dir_p->fs_file->name->meta_addr != fs_dir_p->fs_file->meta->addr) { fprintf(stderr, "dir opened via path has different meta addresses in name and meta (%s) (%" PRIuINUM " vs %" PRIuINUM "\n", a_path, fs_dir_p->fs_file->name->meta_addr, fs_dir_p->fs_file->meta->addr); retval = 1; goto open_cleanup; } // verify both methods have same dir addr if (fs_dir_p->fs_file->meta->addr != fs_dir_m->fs_file->meta->addr) { fprintf(stderr, "parent dir addrs from fs_dir_open_meta and via path are different: %" PRIuINUM " vs %" PRIuINUM " (%s - %" PRIuINUM "\n", fs_dir_p->fs_file->meta->addr, fs_dir_m->fs_file->meta->addr, a_path, a_addr); retval = 1; goto open_cleanup; } // verify path method has same dir addr as open via meta if (fs_dir_p->fs_file->meta->addr != a_addr) { fprintf(stderr, "parent dir addrs from fs_dir_open is diff from meta address %" PRIuINUM " (%s - %" PRIuINUM "\n", fs_dir_p->fs_file->meta->addr, a_path, a_addr); retval = 1; goto open_cleanup; } // verify both have same size if (tsk_fs_dir_getsize(fs_dir_p) != tsk_fs_dir_getsize(fs_dir_m)) { fprintf(stderr, "sizes from fs_dir_open_meta and via path are different: %" PRIuSIZE " vs %" PRIuSIZE " (%s - %" PRIuINUM "\n", tsk_fs_dir_getsize(fs_dir_p), tsk_fs_dir_getsize(fs_dir_m), a_path, a_addr); retval = 1; goto open_cleanup; } // compare the first entry in both. if (tsk_fs_dir_getsize(fs_dir_p) == 0) { fprintf(stderr, "directory sizes are 0\n"); retval = 1; goto open_cleanup; } fs_file_m = tsk_fs_dir_get(fs_dir_m, 0); if (fs_file_m == NULL) { fprintf(stderr, "Error opening entry 0 from meta open: %" PRIuINUM "\n", a_addr); tsk_error_print(stderr); retval = 1; goto open_cleanup; } fs_file_p = tsk_fs_dir_get(fs_dir_p, 0); if (fs_file_p == NULL) { fprintf(stderr, "Error opening entry 0 from path open: %" PRIuINUM "\n", a_addr); tsk_error_print(stderr); retval = 1; goto open_cleanup; } if (compare_names(fs_file_p->name, fs_file_m->name, 1)) { fprintf(stderr, "results from entry 0 are different\n"); retval = 1; goto open_cleanup; } tsk_fs_file_close(fs_file_m); tsk_fs_file_close(fs_file_p); // compare the last entry in both entry = tsk_fs_dir_getsize(fs_dir_m) - 1; fs_file_m = tsk_fs_dir_get(fs_dir_m, entry); if (fs_file_m == NULL) { fprintf(stderr, "Error opening entry %" PRIuSIZE " from meta open: %" PRIuINUM "\n", entry, a_addr); tsk_error_print(stderr); retval = 1; goto open_cleanup; } fs_file_p = tsk_fs_dir_get(fs_dir_p, entry); if (fs_file_p == NULL) { fprintf(stderr, "Error opening entry %" PRIuSIZE " from path open: %" PRIuINUM "\n", entry, a_addr); tsk_error_print(stderr); retval = 1; goto open_cleanup; } if (compare_names(fs_file_p->name, fs_file_m->name, 1)) { fprintf(stderr, "results from entry %" PRIuSIZE " are different\n", entry); retval = 1; goto open_cleanup; } tsk_fs_file_close(fs_file_m); tsk_fs_file_close(fs_file_p); open_cleanup: tsk_fs_dir_close(fs_dir_p); tsk_fs_dir_close(fs_dir_tmp); tsk_fs_dir_close(fs_dir_m); return retval; }