/* Implements a normal path search for fname on the paths in env_var. Resolves symlinks, * which is needed to get the right config filename (i#1062). */ drfront_status_t drfront_searchenv(const char *fname, const char *env_var, OUT char *full_path, const size_t full_path_size, OUT bool *ret) { drfront_status_t status_check = DRFRONT_ERROR; size_t size_needed = 0; TCHAR wfname[MAX_PATH]; /* XXX: Not sure what the size for environment variable names should be. * Perhaps we want a drfront_char_to_tchar_size_needed */ TCHAR wenv_var[MAX_PATH]; TCHAR wfull_path[MAX_PATH]; if (full_path == NULL && ret == NULL) return DRFRONT_ERROR_INVALID_PARAMETER; status_check = drfront_char_to_tchar(fname, wfname, BUFFER_SIZE_ELEMENTS(wfname)); if (status_check != DRFRONT_SUCCESS) { *ret = false; return status_check; } status_check = drfront_char_to_tchar(env_var, wenv_var, BUFFER_SIZE_ELEMENTS(wenv_var)); if (status_check != DRFRONT_SUCCESS) { *ret = false; return status_check; } _wsearchenv(wfname, wenv_var, wfull_path); if (wfull_path[0] == L'\0') { *ret = false; return DRFRONT_ERROR; } status_check = drfront_tchar_to_char_size_needed(wfull_path, &size_needed); if (status_check != DRFRONT_SUCCESS) { *ret = false; return status_check; } else if (full_path_size < size_needed) { *ret = true; return DRFRONT_ERROR_INVALID_SIZE; } status_check = drfront_tchar_to_char(wfull_path, full_path, full_path_size); if (status_check != DRFRONT_SUCCESS) { *ret = false; return status_check; } full_path[full_path_size - 1] = '\0'; *ret = true; return DRFRONT_SUCCESS; }
/*--------------------------------------------------------------------------*/ char *searchEnv(const char *name, const char *env_var) { char *buffer = NULL; char fullpath[PATH_MAX]; strcpy(fullpath, ""); #if _MSC_VER { wchar_t *wname = NULL; wchar_t *wenv_var = NULL; wchar_t wfullpath[PATH_MAX]; wname = to_wide_string((char*)name); wenv_var = to_wide_string((char*)env_var); wcscpy(wfullpath, L""); _wsearchenv(wname, wenv_var, wfullpath); if (wcslen(wfullpath) > 0) { buffer = wide_string_to_UTF8(wfullpath); } FREE(wname); FREE(wenv_var); } #else searchenv_others(name, env_var, fullpath); if (strlen(fullpath) > 0) { buffer = strdup(fullpath); } #endif return buffer; }
static void test_searchenv(void) { const char *dirs[] = { "\\search_env_test", "\\search_env_test\\dir1", "\\search_env_test\\dir2", "\\search_env_test\\dir3longer" }; const char *files[] = { "\\search_env_test\\dir1\\1.dat", "\\search_env_test\\dir1\\2.dat", "\\search_env_test\\dir2\\1.dat", "\\search_env_test\\dir2\\3.dat", "\\search_env_test\\dir3longer\\3.dat" }; const WCHAR env_w[] = {'T','E','S','T','_','P','A','T','H',0}; const WCHAR dat1_w[] = {'1','.','d','a','t',0}; const WCHAR dat3_w[] = {'3','.','d','a','t',0}; char env1[4*MAX_PATH], env2[4*MAX_PATH], tmppath[MAX_PATH], path[2*MAX_PATH]; char result[MAX_PATH], exp[2*MAX_PATH]; WCHAR result_w[MAX_PATH]; int i, path_len; FILE *tmp_file; if (getenv("TEST_PATH")) { skip("TEST_PATH environment variable already set\n"); return; } path_len = GetTempPathA(MAX_PATH, tmppath); ok(path_len, "GetTempPath failed\n"); memcpy(path, tmppath, path_len); for (i=0; i<ARRAY_SIZE(dirs); i++) { strcpy(path+path_len, dirs[i]); ok(!mkdir(path), "mkdir failed (dir = %s)\n", path); } for (i=0; i<ARRAY_SIZE(files); i++) { strcpy(path+path_len, files[i]); tmp_file = fopen(path, "wb"); ok(tmp_file != NULL, "fopen failed (file = %s)\n", path); fclose(tmp_file); } strcpy(env1, "TEST_PATH="); strcpy(env2, "TEST_PATH=;"); for (i=1; i<ARRAY_SIZE(dirs); i++) { strcat(env1, tmppath); strcat(env1, dirs[i]); strcat(env1, ";"); strcat(env2, tmppath); strcat(env2, dirs[i]); strcat(env2, ";;"); } if (!p_searchenv_s || !p_wsearchenv_s) win_skip("searchenv_s or wsearchenv_s function is not available\n"); putenv(env1); memset(result, 'x', sizeof(result)); _searchenv("fail", "TEST_PATH", result); ok(!result[0], "got %s, expected ''\n", result); if (p_searchenv_s) { memset(result, 'x', sizeof(result)); i = p_searchenv_s("fail", "TEST_PATH", result, MAX_PATH); ok(i == ENOENT, "searchenv_s returned %d\n", i); ok(!result[0], "got %s, expected ''\n", result); } memset(result, 'x', sizeof(result)); strcpy(exp, tmppath); strcat(exp, files[0]); _searchenv("1.dat", "TEST_PATH", result); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); if (p_searchenv_s) { memset(result, 'x', sizeof(result)); i = p_searchenv_s("1.dat", "TEST_PATH", result, MAX_PATH); ok(!i, "searchenv_s returned %d\n", i); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); } memset(result_w, 'x', sizeof(result_w)); _wsearchenv(dat1_w, env_w, result_w); WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); if (p_wsearchenv_s) { memset(result_w, 'x', sizeof(result_w)); i = p_wsearchenv_s(dat1_w, env_w, result_w, MAX_PATH); ok(!i, "wsearchenv_s returned %d\n", i); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); } memset(result, 'x', sizeof(result)); strcpy(exp, tmppath); strcat(exp, files[3]); _searchenv("3.dat", "TEST_PATH", result); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); if (p_searchenv_s) { memset(result, 'x', sizeof(result)); i = p_searchenv_s("3.dat", "TEST_PATH", result, MAX_PATH); ok(!i, "searchenv_s returned %d\n", i); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); } memset(result_w, 'x', sizeof(result_w)); _wsearchenv(dat3_w, env_w, result_w); WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); if (p_wsearchenv_s) { memset(result_w, 'x', sizeof(result_w)); i = p_wsearchenv_s(dat3_w, env_w, result_w, MAX_PATH); ok(!i, "wsearchenv_s returned %d\n", i); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); } putenv(env2); memset(result, 'x', sizeof(result)); strcpy(exp, tmppath); strcat(exp, files[0]); _searchenv("1.dat", "TEST_PATH", result); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); if (p_searchenv_s) { memset(result, 'x', sizeof(result)); i = p_searchenv_s("1.dat", "TEST_PATH", result, MAX_PATH); ok(!i, "searchenv_s returned %d\n", i); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); } memset(result_w, 'x', sizeof(result_w)); _wsearchenv(dat1_w, env_w, result_w); WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); if (p_wsearchenv_s) { memset(result_w, 'x', sizeof(result_w)); i = p_wsearchenv_s(dat1_w, env_w, result_w, MAX_PATH); ok(!i, "wsearchenv_s returned %d\n", i); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); } memset(result, 'x', sizeof(result)); strcpy(exp, tmppath); strcat(exp, files[3]); _searchenv("3.dat", "TEST_PATH", result); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); if (p_searchenv_s) { memset(result, 'x', sizeof(result)); i = p_searchenv_s("3.dat", "TEST_PATH", result, MAX_PATH); ok(!i, "searchenv_s returned %d\n", i); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); } memset(result_w, 'x', sizeof(result_w)); _wsearchenv(dat3_w, env_w, result_w); WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); if (p_wsearchenv_s) { memset(result_w, 'x', sizeof(result_w)); i = p_wsearchenv_s(dat3_w, env_w, result_w, MAX_PATH); ok(!i, "wsearchenv_s returned %d\n", i); ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp); } putenv("TEST_PATH="); for (i=ARRAY_SIZE(files)-1; i>=0; i--) { strcpy(path+path_len, files[i]); ok(!remove(path), "remove failed (file = %s)\n", path); } for (i=ARRAY_SIZE(dirs)-1; i>=0; i--) { strcpy(path+path_len, dirs[i]); ok(!rmdir(path), "rmdir failed (dir = %s)\n", path); } }