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"
2222#include "pg_autovacuum.h"
2323
2424#ifdef WIN32
25- unsignedint sleep ();
26-
2725SERVICE_STATUS ServiceStatus ;
2826SERVICE_STATUS_HANDLE hStatus ;
2927int 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
10741073args -> daemonize = 0 ;
10751074#else
1075+ args -> service_dependencies = 0 ;
10761076args -> install_as_service = 0 ;
10771077args -> remove_as_service = 0 ;
10781078args -> service_user = 0 ;
@@ -1166,7 +1166,17 @@ get_cmd_args(int argc, char *argv[])
11661166exit (0 );
11671167#ifdef WIN32
11681168case '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 ;
11701180break ;
11711181case 'I' :
11721182args -> install_as_service ++ ;
@@ -1359,7 +1369,7 @@ ControlHandler(DWORD request)
13591369
13601370/* Register with the Service Control Manager */
13611371static int
1362- InstallService ()
1372+ InstallService (void )
13631373{
13641374SC_HANDLE schService = NULL ;
13651375SC_HANDLE schSCManager = NULL ;
@@ -1471,7 +1481,7 @@ InstallService()
14711481
14721482/* Unregister from the Service Control Manager */
14731483static int
1474- RemoveService ()
1484+ RemoveService (void )
14751485{
14761486SC_HANDLE schService = NULL ;
14771487SC_HANDLE schSCManager = NULL ;
@@ -1699,7 +1709,7 @@ VacuumLoop(int argc, char **argv)
16991709fflush (LOGOUTPUT );
17001710}
17011711
1702- sleep (sleep_secs ); /* Larger Pause between outer loops */
1712+ pg_usleep (sleep_secs * 1000000 ); /* Larger Pause between outer loops */
17031713
17041714gettimeofday (& then ,0 );/* Reset time counter */
17051715
@@ -1753,15 +1763,12 @@ main(int argc, char *argv[])
17531763if (InstallService ()!= 0 )
17541764{
17551765FormatMessage (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 );
17591767exit (-1 );
17601768}
17611769else
17621770{
1763- log_entry ("Successfully installed Windows service" ,LVL_INFO );
1764- fflush (LOGOUTPUT );
1771+ fprintf (stderr ,"Successfully installed pg_autovacuum as a service.\n" );
17651772exit (0 );
17661773}
17671774}
@@ -1772,15 +1779,12 @@ main(int argc, char *argv[])
17721779if (RemoveService ()!= 0 )
17731780{
17741781FormatMessage (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 );
17781783exit (-1 );
17791784}
17801785else
17811786{
1782- log_entry ("Successfully removed Windows service" ,LVL_INFO );
1783- fflush (LOGOUTPUT );
1787+ fprintf (stderr ,"Successfully removed pg_autovacuum as a service.\n" );
17841788exit (0 );
17851789}
17861790}