Skip to content

Commit e02e056

Browse files
author
Neil Conway
committed
pg_autovacuum fixes from Dave Page:
- Dependency services may not be correctly registered when installing as a Windows Service. - The sleep time is changed from milliseconds to seconds as it should be. - Error messages during service installation/removal are logged to stderr.
1 parent 0960dc2 commit e02e056

File tree

1 file changed

+21
-17
lines changed

1 file changed

+21
-17
lines changed

contrib/pg_autovacuum/pg_autovacuum.c

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Revisions by Christopher B. Browne, Liberty RMS
55
* Win32 Service code added by Dave Page
66
*
7-
* $PostgreSQL: pgsql/contrib/pg_autovacuum/pg_autovacuum.c,v 1.27 2004/12/02 22:48:10 momjian Exp $
7+
* $PostgreSQL: pgsql/contrib/pg_autovacuum/pg_autovacuum.c,v 1.28 2005/01/24 00:13:38 neilc Exp $
88
*/
99

1010
#include "postgres_fe.h"
@@ -22,11 +22,10 @@
2222
#include "pg_autovacuum.h"
2323

2424
#ifdef WIN32
25-
unsigned int sleep();
26-
2725
SERVICE_STATUS ServiceStatus;
2826
SERVICE_STATUS_HANDLE hStatus;
2927
int appMode = 0;
28+
char deps[255];
3029
#endif
3130

3231
/* define atooid */
@@ -1073,6 +1072,7 @@ get_cmd_args(int argc, char *argv[])
10731072
#ifndef WIN32
10741073
args->daemonize = 0;
10751074
#else
1075+
args->service_dependencies = 0;
10761076
args->install_as_service = 0;
10771077
args->remove_as_service = 0;
10781078
args->service_user = 0;
@@ -1166,7 +1166,17 @@ get_cmd_args(int argc, char *argv[])
11661166
exit(0);
11671167
#ifdef WIN32
11681168
case 'E':
1169-
args->service_dependencies = optarg;
1169+
/*
1170+
* CreateService() expects a list of service
1171+
* dependencies as a NUL-separated, double-NUL
1172+
* terminated list (although we only allow the user to
1173+
* specify a single dependency). So we zero out the
1174+
* list first, and make sure to leave room for two NUL
1175+
* terminators.
1176+
*/
1177+
ZeroMemory(deps, sizeof(deps));
1178+
snprintf(deps, sizeof(deps) - 2, "%s", optarg);
1179+
args->service_dependencies = deps;
11701180
break;
11711181
case 'I':
11721182
args->install_as_service++;
@@ -1359,7 +1369,7 @@ ControlHandler(DWORD request)
13591369

13601370
/* Register with the Service Control Manager */
13611371
static int
1362-
InstallService()
1372+
InstallService(void)
13631373
{
13641374
SC_HANDLE schService = NULL;
13651375
SC_HANDLE schSCManager = NULL;
@@ -1471,7 +1481,7 @@ InstallService()
14711481

14721482
/* Unregister from the Service Control Manager */
14731483
static int
1474-
RemoveService()
1484+
RemoveService(void)
14751485
{
14761486
SC_HANDLE schService = NULL;
14771487
SC_HANDLE schSCManager = NULL;
@@ -1699,7 +1709,7 @@ VacuumLoop(int argc, char **argv)
16991709
fflush(LOGOUTPUT);
17001710
}
17011711

1702-
sleep(sleep_secs); /* Larger Pause between outer loops */
1712+
pg_usleep(sleep_secs * 1000000); /* Larger Pause between outer loops */
17031713

17041714
gettimeofday(&then, 0); /* Reset time counter */
17051715

@@ -1753,15 +1763,12 @@ main(int argc, char *argv[])
17531763
if (InstallService() != 0)
17541764
{
17551765
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL);
1756-
sprintf(logbuffer, "%s", (char *) lpMsgBuf);
1757-
log_entry(logbuffer, LVL_ERROR);
1758-
fflush(LOGOUTPUT);
1766+
fprintf(stderr, "Error: %s\n", (char *) lpMsgBuf);
17591767
exit(-1);
17601768
}
17611769
else
17621770
{
1763-
log_entry("Successfully installed Windows service", LVL_INFO);
1764-
fflush(LOGOUTPUT);
1771+
fprintf(stderr, "Successfully installed pg_autovacuum as a service.\n");
17651772
exit(0);
17661773
}
17671774
}
@@ -1772,15 +1779,12 @@ main(int argc, char *argv[])
17721779
if (RemoveService() != 0)
17731780
{
17741781
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL);
1775-
sprintf(logbuffer, "%s", (char *) lpMsgBuf);
1776-
log_entry(logbuffer, LVL_ERROR);
1777-
fflush(LOGOUTPUT);
1782+
fprintf(stderr, "Error: %s\n", (char *) lpMsgBuf);
17781783
exit(-1);
17791784
}
17801785
else
17811786
{
1782-
log_entry("Successfully removed Windows service", LVL_INFO);
1783-
fflush(LOGOUTPUT);
1787+
fprintf(stderr, "Successfully removed pg_autovacuum as a service.\n");
17841788
exit(0);
17851789
}
17861790
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy