boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate) { namespace fs = boost::filesystem; char pszPath[MAX_PATH] = ""; if(SHGetSpecialFolderPathA(NULL, pszPath, nFolder, fCreate)) { return fs::path(pszPath); } printf("SHGetSpecialFolderPathA() failed, could not obtain requested path.\n"); return fs::path(""); }
void ReadALConfig(void) { const char *str; FILE *f; cfgBlocks = calloc(1, sizeof(ConfigBlock)); cfgBlocks->name = strdup("general"); cfgCount = 1; #ifdef _WIN32 if(SHGetSpecialFolderPathA(NULL, buffer, CSIDL_APPDATA, FALSE) != FALSE) { size_t p = strlen(buffer); snprintf(buffer+p, sizeof(buffer)-p, "\\alsoft.ini"); f = fopen(buffer, "rt"); if(f) { LoadConfigFromFile(f); fclose(f); } } #else f = fopen("/etc/openal/alsoft.conf", "r"); if(f) { LoadConfigFromFile(f); fclose(f); } if((str=getenv("HOME")) != NULL && *str) { snprintf(buffer, sizeof(buffer), "%s/.alsoftrc", str); f = fopen(buffer, "r"); if(f) { LoadConfigFromFile(f); fclose(f); } } #endif if((str=getenv("ALSOFT_CONF")) != NULL && *str) { f = fopen(str, "r"); if(f) { LoadConfigFromFile(f); fclose(f); } } }
char *csync_get_user_home_dir(void) { char tmp[MAX_PATH] = {0}; char *szPath = NULL; if (SHGetSpecialFolderPathA(NULL, tmp, CSIDL_PROFILE, TRUE)) { szPath = c_malloc(strlen(tmp) + 1); if (szPath == NULL) { return NULL; } strcpy(szPath, tmp); return szPath; } return NULL; }
std::string sysdep_get_homedir() { char buf[MAX_PATH]; #if 1 // works under win98se if (SUCCEEDED(SHGetSpecialFolderPathA(NULL, buf, CSIDL_PERSONAL,FALSE))) #else // newer version for NT only if (SUCCEEDED(SHGetFolderPath(NULL,CSIDL_PERSONAL,NULL,0,buf))) #endif { return std::string(buf); } else { return std::string(); } }
static char * find_my_documents_folder () { /* One for safety, just in case. */ char dir[MAX_PATH + 1]; char *result; dir[0] = '\0'; /* May return false even if successful. */ SHGetSpecialFolderPathA (0, dir, CSIDL_PERSONAL, 0); if (dir[0] == '\0') return NULL; result = malloc (strlen (dir) + 1); if (!result) return NULL; strcpy (result, dir); return result; }
/************************************************************************* * SHGetSpecialFolderPathW */ BOOL WINAPI SHGetSpecialFolderPathW ( HWND hwndOwner, LPWSTR szPath, DWORD csidl, BOOL bCreate) { char szTemp[MAX_PATH]; BOOL Ret; if ((Ret = SHGetSpecialFolderPathA(hwndOwner, szTemp, csidl, bCreate))) { if (!MultiByteToWideChar( CP_ACP, 0, szTemp, -1, szPath, MAX_PATH )) szPath[MAX_PATH-1] = 0; } TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate); return Ret; }
char *Bgethomedir(void) { #ifdef _WIN32 TCHAR appdata[MAX_PATH]; //# if defined SHGetFolderPath // if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, appdata))) //# if defined SHGetSpecialFolderPath if (SUCCEEDED(SHGetSpecialFolderPathA(NULL, appdata, CSIDL_APPDATA, FALSE))) //# else //# error Cannot find SHGetFolderPath or SHGetSpecialFolderPath. Perhaps your shlobj.h is ancient? //# endif return strdup(appdata); return NULL; #else char *e = getenv("HOME"); if (!e) return NULL; return strdup(e); #endif }
static char * evdns_get_default_hosts_filename(void) { #ifdef WIN32 /* Windows is a little coy about where it puts its configuration * files. Sure, they're _usually_ in C:\windows\system32, but * there's no reason in principle they couldn't be in * W:\hoboken chicken emergency\ */ char path[MAX_PATH+1]; static const char hostfile[] = "\\drivers\\etc\\hosts"; char *path_out; size_t len_out; if (! SHGetSpecialFolderPathA(NULL, path, CSIDL_SYSTEM, 0)) return NULL; len_out = strlen(path)+strlen(hostfile); path_out = (char *)malloc(len_out+1); evutil_snprintf(path_out, len_out+1, "%s%s", path, hostfile); return path_out; #else return mm_strdup("/etc/hosts"); #endif }
char *Bgethomedir(void) { #ifdef _WIN32 TCHAR appdata[MAX_PATH]; if (SUCCEEDED(SHGetSpecialFolderPathA(NULL, appdata, CSIDL_APPDATA, FALSE))) return strdup(appdata); return NULL; #elif defined __APPLE__ #if LOWANG_IOS const char* Sys_GetResourceDir(void); return strdup(Sys_GetResourceDir()); #else FSRef ref; CFStringRef str; CFURLRef base; char *s; if (FSFindFolder(kUserDomain, kVolumeRootFolderType, kDontCreateFolder, &ref) < 0) return NULL; base = CFURLCreateFromFSRef(NULL, &ref); if (!base) return NULL; str = CFURLCopyFileSystemPath(base, kCFURLPOSIXPathStyle); CFRelease(base); if (!str) return NULL; s = (char*)CFStringGetCStringPtr(str,CFStringGetSystemEncoding()); if (s) s = strdup(s); CFRelease(str); return s; #endif #else char *e = getenv("HOME"); if (!e) return NULL; return strdup(e); #endif }
void ReadALConfig(void) { char buffer[PATH_MAX]; const char *str; FILE *f; #ifdef _WIN32 if(SHGetSpecialFolderPathA(NULL, buffer, CSIDL_APPDATA, FALSE) != FALSE) { size_t p = strlen(buffer); snprintf(buffer+p, sizeof(buffer)-p, "\\alsoft.ini"); TRACE("Loading config %s...\n", buffer); f = fopen(buffer, "rt"); if(f) { LoadConfigFromFile(f); fclose(f); } } #else str = "/etc/openal/alsoft.conf"; TRACE("Loading config %s...\n", str); f = fopen(str, "r"); if(f) { LoadConfigFromFile(f); fclose(f); } if(!(str=getenv("XDG_CONFIG_DIRS")) || str[0] == 0) str = "/etc/xdg"; strncpy(buffer, str, sizeof(buffer)-1); buffer[sizeof(buffer)-1] = 0; /* Go through the list in reverse, since "the order of base directories * denotes their importance; the first directory listed is the most * important". Ergo, we need to load the settings from the later dirs * first so that the settings in the earlier dirs override them. */ while(1) { char *next = strrchr(buffer, ':'); if(next) *(next++) = 0; else next = buffer; if(next[0] != '/') WARN("Ignoring XDG config dir: %s\n", next); else { size_t len = strlen(next); strncpy(next+len, "/alsoft.conf", buffer+sizeof(buffer)-next-len); buffer[sizeof(buffer)-1] = 0; TRACE("Loading config %s...\n", next); f = fopen(next, "r"); if(f) { LoadConfigFromFile(f); fclose(f); } } if(next == buffer) break; } if((str=getenv("HOME")) != NULL && *str) { snprintf(buffer, sizeof(buffer), "%s/.alsoftrc", str); TRACE("Loading config %s...\n", buffer); f = fopen(buffer, "r"); if(f) { LoadConfigFromFile(f); fclose(f); } } if((str=getenv("XDG_CONFIG_HOME")) != NULL && str[0] != 0) snprintf(buffer, sizeof(buffer), "%s/%s", str, "alsoft.conf"); else { buffer[0] = 0; if((str=getenv("HOME")) != NULL && str[0] != 0) snprintf(buffer, sizeof(buffer), "%s/.config/%s", str, "alsoft.conf"); } if(buffer[0] != 0) { TRACE("Loading config %s...\n", buffer); f = fopen(buffer, "r"); if(f) { LoadConfigFromFile(f); fclose(f); } } #endif if((str=getenv("ALSOFT_CONF")) != NULL && *str) { TRACE("Loading config %s...\n", str); f = fopen(str, "r"); if(f) { LoadConfigFromFile(f); fclose(f); } } }
static void test_find_file(void) { DWORD ret; UINT dwCur, dwOut ; char tmp[MAX_PATH]; char appdir[MAX_PATH]; char curdir[MAX_PATH]; char filename[MAX_PATH]; char outBuf[MAX_PATH]; char windir[MAX_PATH]; static const char empty[] = "", regedit[] = "regedit", regedit_exe[] = "regedit.exe"; memset(appdir, 0, MAX_PATH); memset(windir, 0, MAX_PATH); dwCur=MAX_PATH; dwOut=MAX_PATH; memset(curdir, 0, MAX_PATH); memset(outBuf, 0, MAX_PATH); ret = VerFindFileA(0, regedit, empty, empty, curdir, &dwCur, outBuf, &dwOut); switch(ret) { case 0L: ok(dwCur == 1, "Wrong length of buffer for current location: " "got %d(%s) expected 1\n", dwCur, curdir); ok(dwOut == 1, "Wrong length of buffer for the recommended installation location: " "got %d(%s) expected 1\n", dwOut, outBuf); break; case VFF_BUFFTOOSMALL: ok(dwCur == MAX_PATH, "Wrong length of buffer for current location: " "got %d(%s) expected MAX_PATH\n", dwCur, curdir); ok(dwOut == MAX_PATH, "Wrong length of buffer for the recommended installation location: " "got %d(%s) expected MAX_PATH\n", dwOut, outBuf); break; default: ok(0, "Got unexpected return value %x\n", ret); } if(!GetWindowsDirectoryA(windir, MAX_PATH)) trace("GetWindowsDirectoryA failed\n"); else { sprintf(appdir, "%s\\regedit.exe", windir); if(INVALID_FILE_ATTRIBUTES == GetFileAttributesA(appdir)) trace("GetFileAttributesA(%s) failed\n", appdir); else { dwCur=MAX_PATH; dwOut=MAX_PATH; memset(curdir, 0, MAX_PATH); memset(outBuf, 0, MAX_PATH); ret = VerFindFileA(0, regedit_exe, empty, empty, curdir, &dwCur, outBuf, &dwOut); switch(ret) { case VFF_CURNEDEST: ok(dwCur == 1 + strlen(windir), "Wrong length of buffer for current location: " "got %d(%s) expected %d\n", dwCur, curdir, lstrlenA(windir)+1); ok(dwOut == 1, "Wrong length of buffer for the recommended installation location: " "got %d(%s) expected 1\n", dwOut, outBuf); break; case VFF_BUFFTOOSMALL: ok(dwCur == MAX_PATH, "Wrong length of buffer for current location: " "got %d(%s) expected MAX_PATH\n", dwCur, curdir); ok(dwOut == MAX_PATH, "Wrong length of buffer for the recommended installation location: " "got %d(%s) expected MAX_PATH\n", dwOut, outBuf); break; default: ok(0, "Got unexpected return value %x\n", ret); } dwCur=MAX_PATH; dwOut=MAX_PATH; memset(curdir, 0, MAX_PATH); memset(outBuf, 0, MAX_PATH); ret = VerFindFileA(0, regedit_exe, NULL, NULL, curdir, &dwCur, outBuf, &dwOut); switch(ret) { case VFF_CURNEDEST: ok(dwCur == 1 + strlen(windir), "Wrong length of buffer for current location: " "got %d(%s) expected %d\n", dwCur, curdir, lstrlenA(windir)+1); ok(dwOut == 1, "Wrong length of buffer for the recommended installation location: " "got %d(%s) expected 1\n", dwOut, outBuf); break; case VFF_BUFFTOOSMALL: ok(dwCur == MAX_PATH, "Wrong length of buffer for current location: " "got %d(%s) expected MAX_PATH\n", dwCur, curdir); ok(dwOut == MAX_PATH, "Wrong length of buffer for the recommended installation location: " "got %d(%s) expected MAX_PATH\n", dwOut, outBuf); break; default: ok(0, "Got unexpected return value %x\n", ret); } } } if(!GetSystemDirectoryA(windir, MAX_PATH) || !SHGetSpecialFolderPathA(0, appdir, CSIDL_PROGRAM_FILES, FALSE) || !GetTempPathA(MAX_PATH, tmp) || !GetTempFileNameA(tmp, "tes", 0, filename)) ok(0, "GetSystemDirectoryA, SHGetSpecialFolderPathA, GetTempPathA or GetTempFileNameA failed\n"); else { char *p = strrchr(filename, '\\'); if(p) { *(p++) ='\0'; SetCurrentDirectoryA(filename); memmove(filename, p, 1 + strlen(p)); } dwCur=MAX_PATH; dwOut=MAX_PATH; memset(outBuf, 0, MAX_PATH); memset(curdir, 0, MAX_PATH); ret = VerFindFileA(0, filename, NULL, NULL, curdir, &dwCur, outBuf, &dwOut); switch(ret) { case VFF_CURNEDEST: ok(dwOut == 1, "Wrong length of buffer for the recommended installation location" "got %d(%s) expected 1\n", dwOut, outBuf); break; case VFF_BUFFTOOSMALL: ok(dwOut == MAX_PATH, "Wrong length of buffer for the recommended installation location" "got %d(%s) expected MAX_PATH\n", dwOut, outBuf); break; default: todo_wine ok(0, "Got unexpected return value %x\n", ret); } dwCur=MAX_PATH; dwOut=MAX_PATH; memset(outBuf, 0, MAX_PATH); memset(curdir, 0, MAX_PATH); ret = VerFindFileA(VFFF_ISSHAREDFILE, filename, NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(VFF_CURNEDEST == ret, "Wrong return value got %x expected VFF_CURNEDEST\n", ret); ok(dwOut == 1 + strlen(windir), "Wrong length of buffer for current location: " "got %d(%s) expected %d\n", dwOut, outBuf, lstrlenA(windir)+1); dwCur=MAX_PATH; dwOut=MAX_PATH; memset(outBuf, 0, MAX_PATH); memset(curdir, 0, MAX_PATH); ret = VerFindFileA(0, filename, NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(VFF_CURNEDEST == ret, "Wrong return value got %x expected VFF_CURNEDEST\n", ret); ok(dwOut == 1 + strlen(appdir), "Wrong length of buffer for current location: " "got %d(%s) expected %d\n", dwOut, outBuf, lstrlenA(appdir)+1); /* search for filename */ dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, filename, NULL, NULL, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, filename, NULL, empty, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, filename, NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, filename, NULL, NULL, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, filename, NULL, empty, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, filename, NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); /* search for regedit */ dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "regedit", NULL, NULL, curdir, &dwCur, outBuf, &dwOut); ok(!ret, "Wrong return value got %x expected 0\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "regedit", NULL, empty, curdir, &dwCur, outBuf, &dwOut); ok(!ret, "Wrong return value got %x expected 0\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "regedit", NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit", NULL, NULL, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit", NULL, empty, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit", NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); /* search for regedit.exe */ dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "regedit.exe", NULL, NULL, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "regedit.exe", NULL, empty, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "regedit.exe", NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit.exe", NULL, NULL, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit.exe", NULL, empty, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit.exe", NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); /* nonexistent filename */ dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "doesnotexist.exe", NULL, NULL, curdir, &dwCur, outBuf, &dwOut); ok(!ret, "Wrong return value got %x expected 0\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "doesnotexist.exe", NULL, empty, curdir, &dwCur, outBuf, &dwOut); ok(!ret, "Wrong return value got %x expected 0\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "doesnotexist.exe", NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(0, "doesnotexist.exe", NULL, "C:\\random_path_does_not_exist", curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "doesnotexist.exe", NULL, NULL, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "doesnotexist.exe", NULL, empty, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "doesnotexist.exe", NULL, appdir, curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); dwCur=MAX_PATH; dwOut=MAX_PATH; ret = VerFindFileA(VFFF_ISSHAREDFILE, "doesnotexist.exe", NULL, "C:\\random_path_does_not_exist", curdir, &dwCur, outBuf, &dwOut); ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret); DeleteFileA(filename); } }