Example #1
0
/* 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;
}
Example #2
0
/*--------------------------------------------------------------------------*/
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;
}
Example #3
0
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);
    }
}