summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Conway2005-01-24 00:13:38 +0000
committerNeil Conway2005-01-24 00:13:38 +0000
commite02e0564f186e96985ee5f1f603740cfdf46e3bc (patch)
tree3e3547d638dd7b01eac17a719ab9924cd078a083
parent0960dc2293cbc44401bf90af38461c7cb54b6b87 (diff)
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.
-rw-r--r--contrib/pg_autovacuum/pg_autovacuum.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/contrib/pg_autovacuum/pg_autovacuum.c b/contrib/pg_autovacuum/pg_autovacuum.c
index 8053b647ce6..7b53052d678 100644
--- a/contrib/pg_autovacuum/pg_autovacuum.c
+++ b/contrib/pg_autovacuum/pg_autovacuum.c
@@ -4,7 +4,7 @@
* Revisions by Christopher B. Browne, Liberty RMS
* Win32 Service code added by Dave Page
*
- * $PostgreSQL: pgsql/contrib/pg_autovacuum/pg_autovacuum.c,v 1.27 2004/12/02 22:48:10 momjian Exp $
+ * $PostgreSQL: pgsql/contrib/pg_autovacuum/pg_autovacuum.c,v 1.28 2005/01/24 00:13:38 neilc Exp $
*/
#include "postgres_fe.h"
@@ -22,11 +22,10 @@
#include "pg_autovacuum.h"
#ifdef WIN32
-unsigned int sleep();
-
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
int appMode = 0;
+char deps[255];
#endif
/* define atooid */
@@ -1073,6 +1072,7 @@ get_cmd_args(int argc, char *argv[])
#ifndef WIN32
args->daemonize = 0;
#else
+ args->service_dependencies = 0;
args->install_as_service = 0;
args->remove_as_service = 0;
args->service_user = 0;
@@ -1166,7 +1166,17 @@ get_cmd_args(int argc, char *argv[])
exit(0);
#ifdef WIN32
case 'E':
- args->service_dependencies = optarg;
+ /*
+ * CreateService() expects a list of service
+ * dependencies as a NUL-separated, double-NUL
+ * terminated list (although we only allow the user to
+ * specify a single dependency). So we zero out the
+ * list first, and make sure to leave room for two NUL
+ * terminators.
+ */
+ ZeroMemory(deps, sizeof(deps));
+ snprintf(deps, sizeof(deps) - 2, "%s", optarg);
+ args->service_dependencies = deps;
break;
case 'I':
args->install_as_service++;
@@ -1359,7 +1369,7 @@ ControlHandler(DWORD request)
/* Register with the Service Control Manager */
static int
-InstallService()
+InstallService(void)
{
SC_HANDLE schService = NULL;
SC_HANDLE schSCManager = NULL;
@@ -1471,7 +1481,7 @@ InstallService()
/* Unregister from the Service Control Manager */
static int
-RemoveService()
+RemoveService(void)
{
SC_HANDLE schService = NULL;
SC_HANDLE schSCManager = NULL;
@@ -1699,7 +1709,7 @@ VacuumLoop(int argc, char **argv)
fflush(LOGOUTPUT);
}
- sleep(sleep_secs); /* Larger Pause between outer loops */
+ pg_usleep(sleep_secs * 1000000); /* Larger Pause between outer loops */
gettimeofday(&then, 0); /* Reset time counter */
@@ -1753,15 +1763,12 @@ main(int argc, char *argv[])
if (InstallService() != 0)
{
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL);
- sprintf(logbuffer, "%s", (char *) lpMsgBuf);
- log_entry(logbuffer, LVL_ERROR);
- fflush(LOGOUTPUT);
+ fprintf(stderr, "Error: %s\n", (char *) lpMsgBuf);
exit(-1);
}
else
{
- log_entry("Successfully installed Windows service", LVL_INFO);
- fflush(LOGOUTPUT);
+ fprintf(stderr, "Successfully installed pg_autovacuum as a service.\n");
exit(0);
}
}
@@ -1772,15 +1779,12 @@ main(int argc, char *argv[])
if (RemoveService() != 0)
{
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL);
- sprintf(logbuffer, "%s", (char *) lpMsgBuf);
- log_entry(logbuffer, LVL_ERROR);
- fflush(LOGOUTPUT);
+ fprintf(stderr, "Error: %s\n", (char *) lpMsgBuf);
exit(-1);
}
else
{
- log_entry("Successfully removed Windows service", LVL_INFO);
- fflush(LOGOUTPUT);
+ fprintf(stderr, "Successfully removed pg_autovacuum as a service.\n");
exit(0);
}
}