diff options
Diffstat (limited to 'src/bin/pg_ctl/pg_ctl.c')
| -rw-r--r-- | src/bin/pg_ctl/pg_ctl.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 74b23a4ab56..8a4a9193bf8 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -135,6 +135,12 @@ static void print_msg(const char *msg); static void adjust_data_dir(void); #if defined(WIN32) || defined(__CYGWIN__) +#if (_MSC_VER >= 1800) +#include <versionhelpers.h> +#else +static bool IsWindowsXPOrGreater(void); +static bool IsWindows7OrGreater(void); +#endif static bool pgwin32_IsInstalled(SC_HANDLE); static char *pgwin32_CommandLine(bool); static void pgwin32_doRegister(void); @@ -1226,6 +1232,29 @@ do_kill(pgpid_t pid) #if defined(WIN32) || defined(__CYGWIN__) +#if (_MSC_VER < 1800) +static bool +IsWindowsXPOrGreater(void) +{ + OSVERSIONINFO osv; + osv.dwOSVersionInfoSize = sizeof(osv); + + /* Windows XP = Version 5.1 */ + return (!GetVersionEx(&osv) || /* could not get version */ + osv.dwMajorVersion > 5 || (osv.dwMajorVersion == 5 && osv.dwMinorVersion >= 1)); +} + +static bool IsWindows7OrGreater(void) +{ + OSVERSIONINFO osv; + osv.dwOSVersionInfoSize = sizeof(osv); + + /* Windows 7 = Version 6.0 */ + return (!GetVersionEx(&osv) || /* could not get version */ + osv.dwMajorVersion > 6 || (osv.dwMajorVersion == 6 && osv.dwMinorVersion >= 0)); +} +#endif + static bool pgwin32_IsInstalled(SC_HANDLE hSCM) { @@ -1655,12 +1684,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser * IsProcessInJob() is not available on < WinXP, so there is no need * to log the error every time in that case */ - OSVERSIONINFO osv; - - osv.dwOSVersionInfoSize = sizeof(osv); - if (!GetVersionEx(&osv) || /* could not get version */ - (osv.dwMajorVersion == 5 && osv.dwMinorVersion > 0) || /* 5.1=xp, 5.2=2003, etc */ - osv.dwMajorVersion > 5) /* anything newer should have the API */ + if (IsWindowsXPOrGreater()) /* * Log error if we can't get version, or if we're on WinXP/2003 or @@ -1692,7 +1716,6 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser JOBOBJECT_BASIC_LIMIT_INFORMATION basicLimit; JOBOBJECT_BASIC_UI_RESTRICTIONS uiRestrictions; JOBOBJECT_SECURITY_LIMIT_INFORMATION securityLimit; - OSVERSIONINFO osv; ZeroMemory(&basicLimit, sizeof(basicLimit)); ZeroMemory(&uiRestrictions, sizeof(uiRestrictions)); @@ -1708,10 +1731,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser if (as_service) { - osv.dwOSVersionInfoSize = sizeof(osv); - if (!GetVersionEx(&osv) || - osv.dwMajorVersion < 6 || - (osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0)) + if (!IsWindows7OrGreater()) { /* * On Windows 7 (and presumably later), |
