Log a message right before exiting gracefully
[privoxy.git] / w32svrapi.c
index e6f2363..71f2946 100644 (file)
@@ -1,7 +1,6 @@
-const char w32_svrapi_rcs[] = "$Id$";
 /*********************************************************************
  *
- * File        :  $Source$
+ * File        :  $Source: /cvsroot/ijbswa/current/w32svrapi.c,v $
  *
  * Purpose     :  Win32 Services API for Privoxy.
  *                Provides the implementation of an Win32 service to
@@ -16,8 +15,8 @@ const char w32_svrapi_rcs[] = "$Id$";
  *                a little more complexity to the code, but it is worth
  *                doing to provide that isolation.
  *
- * Copyright   :  Written by and Copyright (C) 2003 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2003, 2006 members of
+ *                the Privoxy team.  https://www.privoxy.org/
  *
  *                Written by and Copyright (C) 2003 Ian Cummings
  *                <ian_a_c@hotmail.com>
@@ -26,7 +25,7 @@ const char w32_svrapi_rcs[] = "$Id$";
  *                some very helpful feedback and suggestions during the
  *                development of this code.
  *
- *                This program is free software; you can redistribute it 
+ *                This program is free software; you can redistribute it
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -44,12 +43,8 @@ const char w32_svrapi_rcs[] = "$Id$";
  *                or write to the Free Software Foundation, Inc., 59
  *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * Revisions   :
- *    $Log$
- *
- *
  *********************************************************************/
-\f
+
 
 #include "config.h"
 
@@ -68,8 +63,6 @@ const char w32_svrapi_rcs[] = "$Id$";
 #endif /* ndef _WIN_CONSOLE */
 
 #include "w32svrapi.h"
-const char w32_svrapi_h_rcs[] = W32_SVRAPI_H_VERSION;
-
 
 /* Only the ANSI Win32 APIs are used at this time. If for some
  * reason, we're building under unicode then we must stop
@@ -123,7 +116,7 @@ static BOOL HasServiceControlManager()
       return FALSE;
    }
 
-   /* Try and connect to the SCM. If it fails check and see if the error 
+   /* Try and connect to the SCM. If it fails check and see if the error
     * code is ERROR_CALL_NOT_IMPLEMENTED, which means:
     *    "This function is not supported on this system."
     */
@@ -169,12 +162,12 @@ BOOL CanSystemSupportServices()
  * The Service functions are defined in <winsvc.h> which is where
  * the declarations used in this file are taken from
  *
- *********************************************************************/ 
+ *********************************************************************/
 
 
 /*********************************************************************
  * Open a connection to the service control manager
- *********************************************************************/ 
+ *********************************************************************/
 SC_HANDLE w32_open_sc_manager(
   LPCTSTR lpMachineName,   /* computer name */
   LPCTSTR lpDatabaseName,  /* SCM database name */
@@ -209,7 +202,7 @@ SC_HANDLE w32_open_sc_manager(
     */
    FreeLibrary(hDll);
    SetLastError(dwLastErr);
-     
+
    return hScm;
 
 } /* -END- w32_open_sc_manager */
@@ -257,7 +250,7 @@ BOOL w32_close_service_handle(
 
 /*********************************************************************
  * Open a service
- *********************************************************************/ 
+ *********************************************************************/
 SC_HANDLE w32_open_service(
   SC_HANDLE hSCManager,   /* handle to SCM database */
   LPCTSTR lpServiceName,  /* service name */
@@ -292,7 +285,7 @@ SC_HANDLE w32_open_service(
     */
    FreeLibrary(hDll);
    SetLastError(dwLastErr);
-     
+
    return hSrv;
 
 } /* -END- w32_open_service */
@@ -355,7 +348,7 @@ SC_HANDLE w32_create_service(
     */
    FreeLibrary(hDll);
    SetLastError(dwLastErr);
-     
+
    return hSrv;
 
 } /* -END- w32_create_service */
@@ -488,13 +481,13 @@ SERVICE_STATUS_HANDLE w32_register_service_ctrl_handler(
    HMODULE     hDll = NULL;
    FARPROC     pFunc = NULL;
    DWORD       dwLastErr = 0;
-   BOOL        bRet;
+   SERVICE_STATUS_HANDLE hServStat = (SERVICE_STATUS_HANDLE)0;
 
    /* Load the DLL with the SCM functions or return a failure status */
    hDll = LoadLibrary("Advapi32.dll");
    if (hDll == NULL)
    {
-      return FALSE;
+      return hServStat;
    }
 
    /* Get the address of the RegisterServiceCtrlHandler function, or return a failure status */
@@ -502,11 +495,11 @@ SERVICE_STATUS_HANDLE w32_register_service_ctrl_handler(
    if (pFunc == NULL)
    {
       FreeLibrary(hDll);
-      return FALSE;
+      return hServStat;
    }
 
    /* Close the handle, and save the error code */
-   bRet = (BOOL)(*pFunc)(lpServiceName, lpHandlerProc);
+   hServStat = (SERVICE_STATUS_HANDLE)(*pFunc)(lpServiceName, lpHandlerProc);
    dwLastErr = GetLastError();
 
    /* Release the library and then restore the last error
@@ -515,7 +508,7 @@ SERVICE_STATUS_HANDLE w32_register_service_ctrl_handler(
    FreeLibrary(hDll);
    SetLastError(dwLastErr);
 
-   return bRet;
+   return hServStat;
 
 } /* -END- w32_register_service_ctrl_handler */
 
@@ -567,12 +560,12 @@ static void display_win32_msg(BOOL bIsError, char *msg)
 #else
    if (bIsError)
    {
-      MessageBox(NULL, msg, "Privoxy Error", 
+      MessageBox(NULL, msg, "Privoxy Error",
          MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST);
    }
    else
    {
-      MessageBox(NULL, msg, "Privoxy Information", 
+      MessageBox(NULL, msg, "Privoxy Information",
          MB_OK | MB_ICONINFORMATION | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST);
    }
 #endif
@@ -632,9 +625,9 @@ BOOL install_service(const char *service_name)
     * We'll temporarily use szDisplayName as a second buffer.
     *********************************************************************/
    GetModuleFileName(NULL, szDisplayName, MAX_PATH);
-   sprintf(szModule, "\"%s\" --service", szDisplayName); 
+   sprintf(szModule, "\"%s\" --service", szDisplayName);
+
 
-   
    /*********************************************************************
     * Get the display name for the service
     *********************************************************************/
@@ -644,7 +637,7 @@ BOOL install_service(const char *service_name)
    /*********************************************************************
     * Create the service
     *********************************************************************/
-   hService = w32_create_service(hSCM, 
+   hService = w32_create_service(hSCM,
                            service_name,              /* the internal service name */
                            szDisplayName,             /* the display name */
                            SERVICE_ALL_ACCESS,        /* get full access during creation */
@@ -767,7 +760,7 @@ static void WINAPI privoxy_w32_service_start(DWORD dw, LPSTR* pszArgs)
 {
    int child_id;
 
-   /* Arg zero is always the service name, and we need to 
+   /* Arg zero is always the service name, and we need to
     * know it when we call RegisterServiceCtrlHandler.
     */
    strcpy(szThisServiceName, pszArgs[0]);
@@ -789,6 +782,9 @@ static void WINAPI privoxy_w32_service_start(DWORD dw, LPSTR* pszArgs)
    w32_set_service_status(hSrv_status, &srv_status);
 
 #ifndef FEATURE_PTHREAD
+   /* NOTE: a cygwin cross-compiler build for --host=i686-w64-mingw32 must disable POSIX threading - eg
+    *         ./configure --host=i686-w64-mingw32 --disable-pthread
+    */
    child_id = _beginthread(w32_service_listen_loop, 0, NULL);
    if (child_id > 0)
 #else
@@ -919,7 +915,7 @@ static void WINAPI privoxy_w32_service_handler(DWORD dwOpcode)
           * even after the process had disappeared.
           *
           * It seems that if we call exit in the ServiceMain thread, it causes
-          * the SCM to not recieve the status we sent in the line above. The
+          * the SCM to not receive the status we sent in the line above. The
           * simple fix was to create a new thread to actually call exit for us
           * whilst this thread continues and returns to its caller.
           */