5
5
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
7
* $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.110 2009/04/05 04:19:58 tgl Exp $
7
* $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.111 2009/06/11 14:49:07 momjian Exp $
9
9
*-------------------------------------------------------------------------
117
117
static void WINAPI pgwin32_ServiceHandler(DWORD);
118
118
static void WINAPI pgwin32_ServiceMain(DWORD, LPTSTR *);
119
119
static void pgwin32_doRunAsService(void);
120
static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo, bool as_service);
120
static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service);
122
122
static SERVICE_STATUS status;
123
123
static SERVICE_STATUS_HANDLE hStatus = (SERVICE_STATUS_HANDLE) 0;
413
413
* Look in post_opts for a -p switch.
415
* This parsing code is not amazingly bright; it could for instance
416
* get fooled if ' -p' occurs within a quoted argument value. Given
417
* that few people pass complicated settings in post_opts, it's
418
* probably good enough.
415
* This parsing code is not amazingly bright; it could for instance get
416
* fooled if ' -p' occurs within a quoted argument value. Given that few
417
* people pass complicated settings in post_opts, it's probably good
420
420
for (p = post_opts; *p;)
448
448
* Search config file for a 'port' option.
450
* This parsing code isn't amazingly bright either, but it should be
451
* okay for valid port settings.
450
* This parsing code isn't amazingly bright either, but it should be okay
451
* for valid port settings.
604
604
if ((arg1 = strstr(optline, " \"")) != NULL)
606
*arg1 = '\0'; /* terminate so we get only program name */
607
post_opts = arg1 + 1; /* point past whitespace */
606
*arg1 = '\0'; /* terminate so we get only program
608
post_opts = arg1 + 1; /* point past whitespace */
609
610
if (postgres_path == NULL)
610
611
postgres_path = optline;
1142
1143
pgwin32_SetServiceStatus(DWORD currentState)
1144
1145
status.dwCurrentState = currentState;
1145
SetServiceStatus(hStatus, (LPSERVICE_STATUS) & status);
1146
SetServiceStatus(hStatus, (LPSERVICE_STATUS) &status);
1148
1149
static void WINAPI
1286
1287
* also load the couple of functions that *do* exist in minwg headers but not
1287
1288
* on NT4. That way, we don't break on NT4.
1289
typedef BOOL(WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD, PLUID_AND_ATTRIBUTES, DWORD, PSID_AND_ATTRIBUTES, PHANDLE);
1290
typedef BOOL(WINAPI * __IsProcessInJob) (HANDLE, HANDLE, PBOOL);
1291
typedef HANDLE(WINAPI * __CreateJobObject) (LPSECURITY_ATTRIBUTES, LPCTSTR);
1292
typedef BOOL(WINAPI * __SetInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD);
1293
typedef BOOL(WINAPI * __AssignProcessToJobObject) (HANDLE, HANDLE);
1294
typedef BOOL(WINAPI * __QueryInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD, LPDWORD);
1290
typedef BOOL (WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD, PLUID_AND_ATTRIBUTES, DWORD, PSID_AND_ATTRIBUTES, PHANDLE);
1291
typedef BOOL (WINAPI * __IsProcessInJob) (HANDLE, HANDLE, PBOOL);
1292
typedef HANDLE (WINAPI * __CreateJobObject) (LPSECURITY_ATTRIBUTES, LPCTSTR);
1293
typedef BOOL (WINAPI * __SetInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD);
1294
typedef BOOL (WINAPI * __AssignProcessToJobObject) (HANDLE, HANDLE);
1295
typedef BOOL (WINAPI * __QueryInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD, LPDWORD);
1296
1297
/* Windows API define missing from MingW headers */
1297
1298
#define DISABLE_MAX_PRIVILEGE 0x1
1309
1310
* automatically destroyed when pg_ctl exits.
1312
CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo, bool as_service)
1313
CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service)
1464
1465
osv.dwOSVersionInfoSize = sizeof(osv);
1465
1466
if (!GetVersionEx(&osv) ||
1466
1467
osv.dwMajorVersion < 6 ||
1467
(osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0))
1468
(osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0))
1470
* On Windows 7 (and presumably later), JOB_OBJECT_UILIMIT_HANDLES prevents us from
1471
* starting as a service. So we only enable it on Vista and earlier (version <= 6.0)
1471
* On Windows 7 (and presumably later),
1472
* JOB_OBJECT_UILIMIT_HANDLES prevents us from
1473
* starting as a service. So we only enable it on
1474
* Vista and earlier (version <= 6.0)
1473
1476
uiRestrictions.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;
1520
1523
printf(_(" %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"), progname);
1521
1524
printf(_(" %s stop [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"), progname);
1522
1525
printf(_(" %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
1523
" [-o \"OPTIONS\"]\n"), progname);
1526
" [-o \"OPTIONS\"]\n"), progname);
1524
1527
printf(_(" %s reload [-D DATADIR] [-s]\n"), progname);
1525
1528
printf(_(" %s status [-D DATADIR]\n"), progname);
1526
1529
printf(_(" %s kill SIGNALNAME PID\n"), progname);