inline int access(const char* path, int amode) { return _waccess(nall::utf16_t(path), amode); }
/* ** Entry point ** */ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { // Avoid loading a dll from current directory SetDllDirectory(L""); CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); InitCommonControls(); if (lpCmdLine[0] == L'"') { // Strip quotes ++lpCmdLine; WCHAR* pos = wcsrchr(lpCmdLine, L'"'); if (pos) { *pos = L'\0'; } } WCHAR buffer[MAX_PATH]; GetModuleFileName(hInstance, buffer, MAX_PATH); // Remove the module's name from the path WCHAR* pos = wcsrchr(buffer, L'\\'); if (pos) { *(pos + 1) = L'\0'; } g_Data.programPath = g_Data.settingsPath = buffer; wcscat(buffer, L"Rainmeter.ini"); // Find the settings file and read skins path off it if (_waccess(buffer, 0) == 0) { g_Data.iniFile = buffer; if (GetPrivateProfileString(L"Rainmeter", L"SkinPath", L"", buffer, MAX_LINE_LENGTH, buffer) > 0) { g_Data.skinsPath = buffer; if (g_Data.skinsPath.back() != L'\\' && g_Data.skinsPath.back() != L'/') { g_Data.skinsPath += L'\\'; } } else { g_Data.skinsPath = g_Data.programPath; g_Data.skinsPath += L"Skins\\"; } } else { HRESULT hr = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, buffer); wcscat(buffer, L"\\Rainmeter\\"); g_Data.settingsPath = buffer; wcscat(buffer, L"Rainmeter.ini"); g_Data.iniFile = buffer; if (SUCCEEDED(hr) && _waccess(buffer, 0) == 0) { if (GetPrivateProfileString(L"Rainmeter", L"SkinPath", L"", buffer, MAX_LINE_LENGTH, buffer) > 0) { g_Data.skinsPath = buffer; if (g_Data.skinsPath.back() != L'\\' && g_Data.skinsPath.back() != L'/') { g_Data.skinsPath += L'\\'; } } else { std::wstring error = L"SkinPath not found.\nMake sure that Rainmeter has been run at least once."; MessageBox(NULL, error.c_str(), L"Rainmeter Skin Installer", MB_ERROR); return 1; } } else { std::wstring error = L"Rainmeter.ini not found.\nMake sure that Rainmeter has been run at least once."; MessageBox(NULL, error.c_str(), L"Rainmeter Skin Installer", MB_ERROR); return 1; } } if (_wcsnicmp(lpCmdLine, L"/LoadTheme ", 11) == 0) { // Skip "/LoadTheme " lpCmdLine += 11; if (*lpCmdLine && CloseRainmeterIfActive()) { CDialogInstall::LoadTheme(lpCmdLine, true); std::wstring file = g_Data.programPath + L"Rainmeter.exe"; SHELLEXECUTEINFO sei = {0}; sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.fMask = SEE_MASK_UNICODE; sei.lpFile = file.c_str(); sei.lpDirectory = g_Data.programPath.c_str(); sei.nShow = SW_SHOWNORMAL; ShellExecuteEx(&sei); } return 0; } else if (wcscmp(lpCmdLine, L"/Packager") == 0) { CDialogPackage::Create(hInstance, lpCmdLine); } else { CDialogInstall::Create(hInstance, lpCmdLine); } return 0; }
static sal_Bool GetSpecialFolder(rtl_uString **strPath, int nFolder) { sal_Bool bRet = sal_False; HINSTANCE hLibrary; sal_Char PathA[_MAX_PATH]; sal_Unicode PathW[_MAX_PATH]; if ((hLibrary = LoadLibrary("shell32.dll")) != NULL) { BOOL (WINAPI *pSHGetSpecialFolderPathA)(HWND, LPSTR, int, BOOL); BOOL (WINAPI *pSHGetSpecialFolderPathW)(HWND, LPWSTR, int, BOOL); pSHGetSpecialFolderPathA = (BOOL (WINAPI *)(HWND, LPSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathA"); pSHGetSpecialFolderPathW = (BOOL (WINAPI *)(HWND, LPWSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathW"); if (pSHGetSpecialFolderPathA) { if (pSHGetSpecialFolderPathA(GetActiveWindow(), PathA, nFolder, TRUE)) { rtl_string2UString( strPath, PathA, strlen(PathA), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS); OSL_ASSERT(*strPath != NULL); bRet = sal_True; } } else if (pSHGetSpecialFolderPathW) { if (pSHGetSpecialFolderPathW(GetActiveWindow(), PathW, nFolder, TRUE)) { rtl_uString_newFromStr( strPath, PathW); bRet = sal_True; } } else { HRESULT (WINAPI *pSHGetSpecialFolderLocation)(HWND, int, LPITEMIDLIST *) = (HRESULT (WINAPI *)(HWND, int, LPITEMIDLIST *))GetProcAddress(hLibrary, "SHGetSpecialFolderLocation"); BOOL (WINAPI *pSHGetPathFromIDListA)(LPCITEMIDLIST, LPSTR) = (BOOL (WINAPI *)(LPCITEMIDLIST, LPSTR))GetProcAddress(hLibrary, "SHGetPathFromIDListA"); BOOL (WINAPI *pSHGetPathFromIDListW)(LPCITEMIDLIST, LPWSTR) = (BOOL (WINAPI *)(LPCITEMIDLIST, LPWSTR))GetProcAddress(hLibrary, "SHGetPathFromIDListW"); HRESULT (WINAPI *pSHGetMalloc)(LPMALLOC *) = (HRESULT (WINAPI *)(LPMALLOC *))GetProcAddress(hLibrary, "SHGetMalloc"); if (pSHGetSpecialFolderLocation && (pSHGetPathFromIDListA || pSHGetPathFromIDListW ) && pSHGetMalloc ) { LPITEMIDLIST pidl; LPMALLOC pMalloc; HRESULT hr; hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl); /* Get SHGetSpecialFolderLocation fails if directory does not exists. */ /* If it fails we try to create the directory and redo the call */ if (! SUCCEEDED(hr)) { HKEY hRegKey; if (RegOpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", &hRegKey) == ERROR_SUCCESS) { LONG lRet; DWORD lSize = elementsof(PathA); DWORD Type = REG_SZ; switch (nFolder) { case CSIDL_APPDATA: lRet = RegQueryValueEx(hRegKey, "AppData", NULL, &Type, (LPBYTE)PathA, &lSize); break; case CSIDL_PERSONAL: lRet = RegQueryValueEx(hRegKey, "Personal", NULL, &Type, (LPBYTE)PathA, &lSize); break; default: lRet = -1l; } if ((lRet == ERROR_SUCCESS) && (Type == REG_SZ)) { if (_access(PathA, 0) < 0) CreateDirectory(PathA, NULL); hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl); } RegCloseKey(hRegKey); } } if (SUCCEEDED(hr)) { if (pSHGetPathFromIDListW && pSHGetPathFromIDListW(pidl, PathW)) { /* if directory does not exist, create it */ if (_waccess(PathW, 0) < 0) CreateDirectoryW(PathW, NULL); rtl_uString_newFromStr( strPath, PathW); bRet = sal_True; } else if (pSHGetPathFromIDListA && pSHGetPathFromIDListA(pidl, PathA)) { /* if directory does not exist, create it */ if (_access(PathA, 0) < 0) CreateDirectoryA(PathA, NULL); rtl_string2UString( strPath, PathA, strlen(PathA), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS); OSL_ASSERT(*strPath != NULL); bRet = sal_True; } } if (SUCCEEDED(pSHGetMalloc(&pMalloc))) { pMalloc->lpVtbl->Free(pMalloc, pidl); pMalloc->lpVtbl->Release(pMalloc); } } } } FreeLibrary(hLibrary); return (bRet); }
void CommandHandler::DoWriteKeyValueBang(std::vector<std::wstring>& args, MeterWindow* skin) { if (args.size() == 3 && skin) { // Add the skin file path to the args args.push_back(skin->GetFilePath()); } else if (args.size() < 4) { LogErrorF(skin, L"!WriteKeyValue: Invalid parameters"); return; } std::wstring& strIniFile = args[3]; if (skin) { skin->MakePathAbsolute(strIniFile); } const WCHAR* iniFile = strIniFile.c_str(); if (strIniFile.find(L"..\\") != std::wstring::npos || strIniFile.find(L"../") != std::wstring::npos) { LogErrorF(skin, L"!WriteKeyValue: Illegal path: %s", iniFile); return; } if (_wcsnicmp(iniFile, GetRainmeter().m_SkinPath.c_str(), GetRainmeter().m_SkinPath.size()) != 0 && _wcsnicmp(iniFile, GetRainmeter().m_SettingsPath.c_str(), GetRainmeter().m_SettingsPath.size()) != 0) { LogErrorF(skin, L"!WriteKeyValue: Illegal path: %s", iniFile); return; } // Verify whether the file exists. if (_waccess(iniFile, 0) == -1) { LogErrorF(skin, L"!WriteKeyValue: File not found: %s", iniFile); return; } // Verify whether the file is read-only. DWORD attr = GetFileAttributes(iniFile); if (attr == -1 || (attr & FILE_ATTRIBUTE_READONLY)) { LogWarningF(skin, L"!WriteKeyValue: File is read-only: %s", iniFile); return; } // Avoid "IniFileMapping" System::UpdateIniFileMappingList(); std::wstring strIniWrite = System::GetTemporaryFile(strIniFile); if (strIniWrite.size() == 1 && strIniWrite[0] == L'?') // error occurred { return; } bool temporary = !strIniWrite.empty(); if (temporary) { if (GetRainmeter().GetDebug()) { LogDebugF(skin, L"!WriteKeyValue: Writing to: %s (Temp: %s)", iniFile, strIniWrite.c_str()); } } else { if (GetRainmeter().GetDebug()) { LogDebugF(skin, L"!WriteKeyValue: Writing to: %s", iniFile); } strIniWrite = strIniFile; } const WCHAR* iniWrite = strIniWrite.c_str(); const WCHAR* section = args[0].c_str(); const WCHAR* key = args[1].c_str(); const std::wstring& strValue = args[2]; bool formula = false; BOOL write = 0; if (skin) { double value; formula = skin->GetParser().ParseFormula(strValue, &value); if (formula) { WCHAR buffer[256]; int len = _snwprintf_s(buffer, _TRUNCATE, L"%.5f", value); Measure::RemoveTrailingZero(buffer, len); write = WritePrivateProfileString(section, key, buffer, iniWrite); } } if (!formula) { write = WritePrivateProfileString(section, key, strValue.c_str(), iniWrite); } if (temporary) { if (write != 0) { WritePrivateProfileString(nullptr, nullptr, nullptr, iniWrite); // FLUSH // Copy the file back. if (!System::CopyFiles(strIniWrite, strIniFile)) { LogErrorF(skin, L"!WriteKeyValue: Failed to copy temporary file to original filepath: %s (Temp: %s)", iniFile, iniWrite); } } else // failed { LogErrorF(skin, L"!WriteKeyValue: Failed to write to: %s (Temp: %s)", iniFile, iniWrite); } // Remove the temporary file. System::RemoveFile(strIniWrite); } else { if (write == 0) // failed { LogErrorF(skin, L"!WriteKeyValue: Failed to write to: %s", iniFile); } } }
int qt_wince__access( const char *path, int pmode ) { return _waccess(reinterpret_cast<const wchar_t *> (QString::fromLatin1(path).utf16()),pmode); }
/* ** Entry point ** */ int SkinInstallerMain(LPWSTR lpCmdLine) { // Avoid loading a dll from current directory SetDllDirectory(L""); CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); InitCommonControls(); if (lpCmdLine[0] == L'"') { // Strip quotes ++lpCmdLine; WCHAR* pos = wcsrchr(lpCmdLine, L'"'); if (pos) { *pos = L'\0'; } } WCHAR buffer[MAX_PATH]; GetModuleFileName(GetInstanceHandle(), buffer, MAX_PATH); // Remove the module's name from the path WCHAR* pos = wcsrchr(buffer, L'\\'); if (pos) { *(pos + 1) = L'\0'; } g_Data.programPath = g_Data.settingsPath = buffer; wcscat(buffer, L"Rainmeter.ini"); // Find the settings file and read skins path off it if (_waccess(buffer, 0) == 0) { g_Data.iniFile = buffer; if (GetPrivateProfileString(L"Rainmeter", L"SkinPath", L"", buffer, MAX_LINE_LENGTH, buffer) > 0) { g_Data.skinsPath = buffer; if (g_Data.skinsPath.back() != L'\\' && g_Data.skinsPath.back() != L'/') { g_Data.skinsPath += L'\\'; } } else { g_Data.skinsPath = g_Data.programPath; g_Data.skinsPath += L"Skins\\"; } } else { HRESULT hr = SHGetFolderPath(nullptr, CSIDL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, buffer); wcscat(buffer, L"\\Rainmeter\\"); g_Data.settingsPath = buffer; wcscat(buffer, L"Rainmeter.ini"); g_Data.iniFile = buffer; if (SUCCEEDED(hr) && _waccess(buffer, 0) == 0) { if (GetPrivateProfileString(L"Rainmeter", L"SkinPath", L"", buffer, MAX_LINE_LENGTH, buffer) > 0) { g_Data.skinsPath = buffer; if (g_Data.skinsPath.back() != L'\\' && g_Data.skinsPath.back() != L'/') { g_Data.skinsPath += L'\\'; } } else { std::wstring error = L"SkinPath not found.\nMake sure that Rainmeter has been run at least once."; MessageBox(nullptr, error.c_str(), L"Rainmeter Skin Installer", MB_ERROR); return 1; } } else { std::wstring error = L"Rainmeter.ini not found.\nMake sure that Rainmeter has been run at least once."; MessageBox(nullptr, error.c_str(), L"Rainmeter Skin Installer", MB_ERROR); return 1; } } std::wstring layoutsPath = g_Data.settingsPath + L"Layouts\\"; if (_waccess(layoutsPath.c_str(), 0) == -1) { // Migrate Themes into Layouts for backwards compatibility and rename // Rainmeter.thm to Rainmeter.ini and RainThemes.bmp to Wallpaper.bmp. std::wstring themesPath = g_Data.settingsPath + L"Themes"; if (_waccess(themesPath.c_str(), 0) != -1) { // Migrate Themes into Layouts for backwards compatibility and rename // Rainmeter.thm to Rainmeter.ini and RainThemes.bmp to Wallpaper.bmp. MoveFile(themesPath.c_str(), layoutsPath.c_str()); layoutsPath += L'*'; // For FindFirstFile. WIN32_FIND_DATA fd; HANDLE hFind = FindFirstFile(layoutsPath.c_str(), &fd); layoutsPath.pop_back(); // Remove '*'. if (hFind != INVALID_HANDLE_VALUE) { do { if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && wcscmp(L".", fd.cFileName) != 0 && wcscmp(L"..", fd.cFileName) != 0) { std::wstring layoutFolder = layoutsPath + fd.cFileName; layoutFolder += L'\\'; std::wstring file = layoutFolder + L"Rainmeter.thm"; if (_waccess(file.c_str(), 0) != -1) { std::wstring newFile = layoutFolder + L"Rainmeter.ini"; MoveFile(file.c_str(), newFile.c_str()); } file = layoutFolder + L"RainThemes.bmp"; if (_waccess(file.c_str(), 0) != -1) { std::wstring newFile = layoutFolder + L"Wallpaper.bmp"; MoveFile(file.c_str(), newFile.c_str()); } } } while (FindNextFile(hFind, &fd)); FindClose(hFind); } } } if (_wcsnicmp(lpCmdLine, L"/LoadTheme ", 11) == 0) { // For backwards compatibility. std::wstring args = L"!LoadLayout \""; args += &lpCmdLine[11]; // Skip "/LoadTheme ". args += L'"'; std::wstring file = g_Data.programPath + L"Rainmeter.exe"; SHELLEXECUTEINFO sei = {0}; sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.fMask = SEE_MASK_UNICODE; sei.lpFile = file.c_str(); sei.lpParameters = args.c_str(); sei.lpDirectory = g_Data.programPath.c_str(); sei.nShow = SW_SHOWNORMAL; ShellExecuteEx(&sei); return 0; } else if (wcscmp(lpCmdLine, L"/Packager") == 0) { DialogPackage::Create(GetInstanceHandle(), lpCmdLine); } else { DialogInstall::Create(GetInstanceHandle(), lpCmdLine); } return 0; }
char* realpath(const char * name, char * resolved) { char *retname = NULL; /* SUSv3 says we must set `errno = EINVAL', and return NULL, * if `name' is passed as a NULL pointer. */ if (name == NULL) { errno = EINVAL; return NULL; } /* Otherwise, `name' must refer to a readable filesystem object, * if we are going to resolve its absolute path name. */ wchar_t wideNameBuffer[PATH_MAX]; wchar_t *wideName = wideNameBuffer; if (!utf8ToWide(name, wideName, PATH_MAX)) { errno = EINVAL; return NULL; } if (_waccess(wideName, 4) != 0) return NULL; /* If `name' didn't point to an existing entity, * then we don't get to here; we simply fall past this block, * returning NULL, with `errno' appropriately set by `access'. * * When we _do_ get to here, then we can use `_fullpath' to * resolve the full path for `name' into `resolved', but first, * check that we have a suitable buffer, in which to return it. */ if ((retname = resolved) == NULL) { /* Caller didn't give us a buffer, so we'll exercise the * option granted by SUSv3, and allocate one. * * `_fullpath' would do this for us, but it uses `malloc', and * Microsoft's implementation doesn't set `errno' on failure. * If we don't do this explicitly ourselves, then we will not * know if `_fullpath' fails on `malloc' failure, or for some * other reason, and we want to set `errno = ENOMEM' for the * `malloc' failure case. */ retname = (char *)malloc(PATH_MAX); if (retname == NULL) { errno = ENOMEM; return NULL; } } /* Otherwise, when we do have a valid buffer, * `_fullpath' should only fail if the path name is too long. */ wchar_t wideFullPathBuffer[PATH_MAX]; wchar_t *wideFullPath; if ((wideFullPath = _wfullpath(wideFullPathBuffer, wideName, PATH_MAX)) == NULL) { errno = ENAMETOOLONG; return NULL; } // Do a LongPath<->ShortPath roundtrip so that case is resolved by OS // FIXME: Check for failure size_t initialLength = wcslen(wideFullPath); GetShortPathNameW(wideFullPath, wideNameBuffer, PATH_MAX); GetLongPathNameW(wideNameBuffer, wideFullPathBuffer, initialLength + 1); // Convert back to UTF-8 if (!wideToUtf8(wideFullPathBuffer, retname, PATH_MAX)) { errno = EINVAL; return NULL; } // Force drive to be upper case if (retname[1] == ':') retname[0] = toupper(retname[0]); return retname; }
void Log::SetFile(LPCTSTR filenameIn, bool append) { if( !filenameIn ) return; CloseFile(); m_tofile = true; m_strOrgFileName = filenameIn; CString strFile = filenameIn; if (m_bAutoAddTimeToFileName) { int nPos = strFile.ReverseFind('.'); if (nPos) { CTime tm(time(NULL)); CString strTime = tm.Format(TEXT("%Y%m%d-%H")); strFile.Insert(nPos, strTime); } } LPCTSTR filename =strFile; // If filename is NULL or invalid we should throw an exception here bool bOverSized = FALSE; #ifdef _UNICODE if (_waccess(filename, 04) != -1) #else if(access(filename, 04) != -1) #endif // _UNICODE { //file exist, check size; HANDLE tmpfile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (tmpfile) { DWORD lfSize = GetFileSize(tmpfile, NULL); if (lfSize > 1024*1024*10) { bOverSized = true; } CloseHandle(tmpfile); } } CString strFileNew; if (!append || bOverSized) { // Build the backup filename BOOL bSucBack = FALSE; if(BackFile(strFile)) { bSucBack = DeleteFile(filename); } if (!bSucBack) { //back file failed //create new filename strFileNew = filename; strFileNew.Format(TEXT("%s+%d"), filename, rand(), TEXT(".bak")); filename = strFileNew; } } hlogfile = CreateFile( filename, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if (hlogfile == INVALID_HANDLE_VALUE) { // We should throw an exception here m_todebug = true; m_tofile = false; Print(0, _T("Error opening log file %s\n"), filename); return; } if (append) { SetFilePointer( hlogfile, 0, NULL, FILE_END ); } else { SetEndOfFile( hlogfile ); } nTotalLogWrited = 0; if (hlogfile) { //print log header CTime tm(time(NULL)); CString strTime; strTime.Format(TEXT("\r\n--------------------------------<<new log started %s>>----------------------------------------------\r\n"),tm.Format(TEXT("%Y-%m-%d-%H:%M:%S"))); this->ReallyPrintLine(strTime); } }
int main(void) { int r = 1, wait = 1, prefix_args_len = -1, needs_env_setup = 1, is_git_command = 1, full_path = 1, skip_arguments = 0, allocate_console = 0, show_console = 0; WCHAR exepath[MAX_PATH], exe[MAX_PATH], top_level_path[MAX_PATH]; LPWSTR cmd = NULL, exep = exe, prefix_args = NULL, basename; LPWSTR working_directory = NULL; /* Determine MSys2-based Git path. */ swprintf(msystem_bin, sizeof(msystem_bin), L"mingw%d\\bin", (int) sizeof(void *) * 8); *top_level_path = L'\0'; /* get the installation location */ GetModuleFileName(NULL, exepath, MAX_PATH); if (!PathRemoveFileSpec(exepath)) { fwprintf(stderr, L"Invalid executable path: %s\n", exepath); ExitProcess(1); } basename = exepath + wcslen(exepath) + 1; if (configure_via_resource(basename, exepath, exep, &prefix_args, &prefix_args_len, &is_git_command, &working_directory, &full_path, &skip_arguments, &allocate_console, &show_console)) { /* do nothing */ } else if (!wcsicmp(basename, L"git-gui.exe")) { static WCHAR buffer[BUFSIZE]; wait = 0; allocate_console = 1; initialize_top_level_path(top_level_path, exepath, NULL, 1); /* set the default exe module */ wcscpy(exe, top_level_path); PathAppend(exe, msystem_bin); PathAppend(exe, L"wish.exe"); if (_waccess(exe, 0) != -1) swprintf(buffer, BUFSIZE, L"\"%s\\%.*s\\libexec\\git-core\"", exepath, wcslen(msystem_bin) - 4, msystem_bin); else { wcscpy(exe, top_level_path); PathAppend(exe, L"mingw\\bin\\wish.exe"); swprintf(buffer, BUFSIZE, L"\"%s\\mingw\\libexec\\git-core\"", top_level_path); } PathAppend(buffer, L"git-gui"); prefix_args = buffer; prefix_args_len = wcslen(buffer); } else if (!wcsnicmp(basename, L"git-", 4)) { needs_env_setup = 0; /* Call a builtin */ prefix_args = basename + 4; prefix_args_len = wcslen(prefix_args); if (!wcsicmp(prefix_args + prefix_args_len - 4, L".exe")) prefix_args_len -= 4; /* set the default exe module */ wcscpy(exe, exepath); PathAppend(exe, L"git.exe"); } else if (!wcsicmp(basename, L"git.exe")) { initialize_top_level_path(top_level_path, exepath, NULL, 1); /* set the default exe module */ wcscpy(exe, top_level_path); PathAppend(exe, msystem_bin); PathAppend(exe, L"git.exe"); if (_waccess(exe, 0) == -1) { wcscpy(exe, top_level_path); PathAppend(exe, L"bin\\git.exe"); } } else if (!wcsicmp(basename, L"gitk.exe")) { static WCHAR buffer[BUFSIZE]; allocate_console = 1; initialize_top_level_path(top_level_path, exepath, NULL, 1); /* set the default exe module */ wcscpy(exe, top_level_path); swprintf(buffer, BUFSIZE, L"\"%s\"", top_level_path); PathAppend(exe, msystem_bin); PathAppend(exe, L"wish.exe"); if (_waccess(exe, 0) != -1) PathAppend(buffer, msystem_bin); else { wcscpy(exe, top_level_path); PathAppend(exe, L"mingw\\bin\\wish.exe"); PathAppend(buffer, L"mingw\\bin"); } PathAppend(buffer, L"gitk"); prefix_args = buffer; prefix_args_len = wcslen(buffer); } if (needs_env_setup) { if (!top_level_path[0]) initialize_top_level_path(top_level_path, exepath, msystem_bin, -4); setup_environment(top_level_path, full_path); } cmd = fixup_commandline(exepath, &exep, &wait, prefix_args, prefix_args_len, is_git_command, skip_arguments); if (working_directory == (LPWSTR)1) { int len = GetEnvironmentVariable(L"HOME", NULL, 0); if (len) { working_directory = malloc(sizeof(WCHAR) * len); GetEnvironmentVariable(L"HOME", working_directory, len); } } { STARTUPINFO si; PROCESS_INFORMATION pi; DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; HANDLE console_handle; BOOL br = FALSE; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); if (allocate_console | show_console) creation_flags |= CREATE_NEW_CONSOLE; else if ((console_handle = CreateFile(L"CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) CloseHandle(console_handle); else { #define STD_HANDLE(field, id) si.hStd##field = GetStdHandle(STD_##id); if (!si.hStd##field) si.hStd##field = INVALID_HANDLE_VALUE STD_HANDLE(Input, INPUT_HANDLE); STD_HANDLE(Output, OUTPUT_HANDLE); STD_HANDLE(Error, ERROR_HANDLE); si.dwFlags = STARTF_USESTDHANDLES; creation_flags |= CREATE_NO_WINDOW; } if (show_console) { si.dwFlags |= STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; } br = CreateProcess(/* module: null means use command line */ exep, cmd, /* modified command line */ NULL, /* process handle inheritance */ NULL, /* thread handle inheritance */ /* handles inheritable? */ allocate_console ? FALSE : TRUE, creation_flags, NULL, /* environment: use parent */ working_directory, /* use parent's */ &si, &pi); if (br) { if (wait) WaitForSingleObject(pi.hProcess, INFINITE); if (!GetExitCodeProcess(pi.hProcess, (DWORD *)&r)) print_error(L"error reading exit code", GetLastError()); CloseHandle(pi.hProcess); } else { print_error(L"error launching git", GetLastError()); r = 1; } } free(cmd); ExitProcess(r); }
static void setup_environment(LPWSTR top_level_path, int full_path) { WCHAR msystem[64]; LPWSTR path2 = NULL; int len; /* Set MSYSTEM */ swprintf(msystem, sizeof(msystem), L"MINGW%d", (int) sizeof(void *) * 8); SetEnvironmentVariable(L"MSYSTEM", msystem); /* if not set, set PLINK_PROTOCOL to ssh */ if (!GetEnvironmentVariable(L"PLINK_PROTOCOL", NULL, 0)) SetEnvironmentVariable(L"PLINK_PROTOCOL", L"ssh"); /* * set HOME to %HOMEDRIVE%%HOMEPATH% or %USERPROFILE% * With roaming profiles: HOMEPATH is the roaming location and * USERPROFILE is the local location */ if (!GetEnvironmentVariable(L"HOME", NULL, 0)) { LPWSTR e = NULL; len = GetEnvironmentVariable(L"HOMEPATH", NULL, 0); if (len) { DWORD attr, drvlen = GetEnvironmentVariable(L"HOMEDRIVE", NULL, 0); e = (LPWSTR)malloc(sizeof(WCHAR) * (drvlen + len)); drvlen = GetEnvironmentVariable(L"HOMEDRIVE", e, drvlen); GetEnvironmentVariable(L"HOMEPATH", e + drvlen, len); /* check if the path exists */ attr = GetFileAttributesW(e); if (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY)) SetEnvironmentVariable(L"HOME", e); else len = 0; /* use USERPROFILE */ free(e); } if (len == 0) { len = GetEnvironmentVariable(L"USERPROFILE", NULL, 0); if (len != 0) { e = (LPWSTR)malloc(len * sizeof(WCHAR)); GetEnvironmentVariable(L"USERPROFILE", e, len); SetEnvironmentVariable(L"HOME", e); free(e); } } } /* extend the PATH */ len = GetEnvironmentVariable(L"PATH", NULL, 0); len = sizeof(WCHAR) * (len + 2 * MAX_PATH); path2 = (LPWSTR)malloc(len); wcscpy(path2, top_level_path); if (!full_path) PathAppend(path2, L"cmd;"); else { PathAppend(path2, msystem_bin); if (_waccess(path2, 0) != -1) { /* We are in an MSys2-based setup */ wcscat(path2, L";"); wcscat(path2, top_level_path); PathAppend(path2, L"usr\\bin;"); } else { /* Fall back to MSys1 paths */ wcscpy(path2, top_level_path); PathAppend(path2, L"bin;"); wcscat(path2, top_level_path); PathAppend(path2, L"mingw\\bin;"); } } GetEnvironmentVariable(L"PATH", path2 + wcslen(path2), (len / sizeof(WCHAR)) - wcslen(path2)); SetEnvironmentVariable(L"PATH", path2); free(path2); }
static int configure_via_resource(LPWSTR basename, LPWSTR exepath, LPWSTR exep, LPWSTR *prefix_args, int *prefix_args_len, int *is_git_command, LPWSTR *working_directory, int *full_path, int *skip_arguments, int *allocate_console, int *show_console) { int i, id, minimal_search_path, needs_a_console, no_hide, wargc; LPWSTR *wargv; WCHAR *app_id; #define BUFSIZE 65536 static WCHAR buf[BUFSIZE]; LPWSTR buf2 = buf; int len; for (id = 0; ; id++) { minimal_search_path = 0; needs_a_console = 0; no_hide = 0; app_id = NULL; len = LoadString(NULL, id, buf, BUFSIZE); if (!len) { if (!id) return 0; /* no resources found */ fwprintf(stderr, L"Need a valid command-line; " L"Edit the string resources accordingly\n"); exit(1); } if (len >= BUFSIZE) { fwprintf(stderr, L"Could not read resource (too large)\n"); exit(1); } for (;;) { if (strip_prefix(buf, &len, L"MINIMAL_PATH=1 ")) minimal_search_path = 1; else if (strip_prefix(buf, &len, L"ALLOC_CONSOLE=1 ")) needs_a_console = 1; else if (strip_prefix(buf, &len, L"SHOW_CONSOLE=1 ")) no_hide = 1; else if (strip_prefix(buf, &len, L"APP_ID=")) { LPWSTR space = wcschr(buf, L' '); size_t app_id_len = space - buf; if (!space) { len -= 7; memmove(buf, buf + 7, len * sizeof(WCHAR)); break; } app_id = wcsdup(buf); app_id[app_id_len] = L'\0'; len -= app_id_len + 1; memmove(buf, buf + app_id_len + 1, len * sizeof(WCHAR)); } else break; } buf[len] = L'\0'; if (!id) SetEnvironmentVariable(L"EXEPATH", exepath); buf2 = expand_variables(buf, BUFSIZE); extract_first_arg(buf2, exepath, exep); if (_waccess(exep, 0) != -1) break; fwprintf(stderr, L"Skipping command-line '%s'\n('%s' not found)\n", buf2, exep); if (app_id) free(app_id); } *prefix_args = buf2; *prefix_args_len = wcslen(buf2); *is_git_command = 0; wargv = CommandLineToArgvW(GetCommandLine(), &wargc); for (i = 1; i < wargc; i++) { if (!wcscmp(L"--no-cd", wargv[i])) *working_directory = NULL; else if (!wcscmp(L"--cd-to-home", wargv[i])) *working_directory = (LPWSTR) 1; else if (!wcsncmp(L"--cd=", wargv[i], 5)) *working_directory = wcsdup(wargv[i] + 5); else if (!wcscmp(L"--minimal-search-path", wargv[i])) minimal_search_path = 1; else if (!wcscmp(L"--no-minimal-search-path", wargv[i])) minimal_search_path = 0; else if (!wcscmp(L"--needs-console", wargv[i])) needs_a_console = 1; else if (!wcscmp(L"--no-needs-console", wargv[i])) needs_a_console = 0; else if (!wcscmp(L"--hide", wargv[i])) no_hide = 0; else if (!wcscmp(L"--no-hide", wargv[i])) no_hide = 1; else if (!wcsncmp(L"--command=", wargv[i], 10)) { LPWSTR expanded; wargv[i] += 10; expanded = expand_variables(wargv[i], wcslen(wargv[i])); if (expanded == wargv[i]) expanded = wcsdup(expanded); extract_first_arg(expanded, exepath, exep); *prefix_args = expanded; *prefix_args_len = wcslen(*prefix_args); *skip_arguments = i; break; } else if (!wcsncmp(L"--app-id=", wargv[i], 9)) { free(app_id); app_id = wcsdup(wargv[i] + 9); } else break; *skip_arguments = i; } if (minimal_search_path) *full_path = 0; if (needs_a_console) *allocate_console = 1; if (no_hide) *show_console = 1; if (app_id) set_app_id(app_id); LocalFree(wargv); return 1; }
// =============================================================== // —качивает файлы с FTP bool DownloadFiles ( HINTERNET hFtp, const std::wstring& rootDir ) { //printf( "Resolve directory %s\n", rootDir.c_str() ); char buf[1024] = {0}; std::vector< std::wstring > dirs; DWORD c = 1024; WIN32_FIND_DATAW fd = { 0 }, ft = { 0 }; if ( !FtpSetCurrentDirectoryW( hFtp, rootDir.c_str() ) ) wprintf( ( L"Directory " + rootDir + L" are not avaible. Goodbay\n").c_str() ); HINTERNET hSearch = FtpFindFirstFileW( hFtp, NULL, &fd, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD , 0 ); if ( hSearch ) { do { if( wcscmp( fd.cFileName, L"." ) == 0 || wcscmp( fd.cFileName, L".." ) == 0 ) continue; if ( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { dirs.push_back( fd.cFileName ); } else { // —равниваем дату найденного файла с тем что сейчас в списке if ( _waccess( fd.cFileName, 0 ) == -1 ) { wprintf( L"Loading file %s\n", fd.cFileName ); if( !FtpGetFileW( hFtp, fd.cFileName, fd.cFileName, FALSE, 0, 0, 0 ) ) return false; } else { HANDLE ftFile = FindFirstFileW( fd.cFileName, &ft ); if ( CompareFileTime ( &ft.ftLastWriteTime, &fd.ftLastWriteTime ) < 0 ) { wprintf( L"Loading file %s\n", fd.cFileName ); if ( !FtpGetFileW( hFtp, fd.cFileName, fd.cFileName, FALSE, 0, 0, 0 ) ) return false; } } } } while ( InternetFindNextFile ( hSearch, &fd ) ); InternetCloseHandle ( hSearch ); } for( size_t k=0; k < dirs.size(); k++ ) { CreateDirectoryW( dirs[ k ].c_str(), NULL ); SetCurrentDirectoryW( dirs[ k ].c_str() ); DownloadFiles( hFtp, dirs[ k ] ); } FtpSetCurrentDirectoryW( hFtp, L".." ); SetCurrentDirectoryW( L".." ); return true; } // DownloadFiles