TEST(symlinks_are_not_resolved_in_tree_preview, IF(not_windows)) { int nlines; FILE *fp; char **lines; assert_success(os_mkdir(SANDBOX_PATH "/dir", 0777)); /* symlink() is not available on Windows, but the rest of the code is fine. */ #ifndef _WIN32 assert_success(symlink(".", SANDBOX_PATH "/dir/link")); #endif fp = qv_view_dir(SANDBOX_PATH "/dir"); lines = read_file_lines(fp, &nlines); assert_int_equal(4, nlines); assert_string_equal("dir/", lines[0]); assert_string_equal("`-- link/ -> .", lines[1]); assert_string_equal("", lines[2]); assert_string_equal("1 directory, 0 files", lines[3]); free_string_array(lines, nlines); fclose(fp); assert_success(unlink(SANDBOX_PATH "/dir/link")); assert_success(rmdir(SANDBOX_PATH "/dir")); }
/* Reads data to be displayed handling error cases. Returns zero on success, 1 * if file is a directory, 2 on file reading error, 3 on issues with viewer or * 4 on empty input. */ static int get_view_data(view_info_t *vi, const char file_to_view[]) { FILE *fp; const char *const viewer = get_viewer_for_file(get_last_path_component(file_to_view)); if(is_null_or_empty(viewer)) { if(is_dir(file_to_view)) { return 1; } else if((fp = fopen(file_to_view, "rb")) == NULL) { return 2; } } else if((fp = use_info_prog(viewer)) == NULL) { return 3; } vi->lines = is_null_or_empty(viewer) ? read_file_lines(fp, &vi->nlines) : read_stream_lines(fp, &vi->nlines); fclose(fp); if(vi->lines == NULL || vi->nlines == 0) { return 4; } return 0; }
/* Reads data to be displayed handling error cases. Returns zero on success, 1 * if file is a directory, 2 on file reading error, 3 on issues with viewer or * 4 on empty input. */ static int get_view_data(view_info_t *vi, const char file_to_view[]) { FILE *fp; const char *const viewer = gv_get_viewer(file_to_view); if(is_null_or_empty(viewer)) { if(is_dir(file_to_view)) { return 1; } fp = os_fopen(file_to_view, "rb"); if(fp == NULL) { return 2; } vi->lines = read_file_lines(fp, &vi->nlines); } else { const int graphics = is_graphics_viewer(viewer); FileView *const curr = curr_view; curr_view = curr_stats.view ? curr_view : (vi->view != NULL) ? vi->view : curr_view; curr_stats.preview_hint = vi->view; if(graphics) { /* Wait a bit to let terminal emulator do actual refresh (at least some * of them need this). */ usleep(50000); } fp = use_info_prog(viewer); curr_view = curr; curr_stats.preview_hint = NULL; if(fp == NULL) { return 3; } if(graphics) { vi->graphics = 1; } vi->lines = read_stream_lines(fp, &vi->nlines); } fclose(fp); if(vi->lines == NULL || vi->nlines == 0) { return 4; } return 0; }