From: Bill Stoddard Date: Wed, 8 Dec 1999 22:34:02 +0000 (+0000) Subject: Win32: First cut at getting apache -k restart|shutdown and running apache as a servic... X-Git-Tag: 1.3.10~111 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a43d9443b27078b0144d2b7bacf78a785aa457e4;p=apache Win32: First cut at getting apache -k restart|shutdown and running apache as a service working git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@84249 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/Apache.dsp b/Apache.dsp index bbb644ded9..e9fadf366e 100644 --- a/Apache.dsp +++ b/Apache.dsp @@ -41,7 +41,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "./include" /I "./lib/apr/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "WIN32_LEAN_AND_MEAN" /YX /FD /c # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe @@ -49,7 +49,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 CoreR\ApacheCore.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 lib\apr\Release\aprlib.lib CoreR\ApacheCore.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "Apache - Win32 Debug" @@ -65,7 +65,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /FD /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "./include" /I "./lib/apr/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "WIN32_LEAN_AND_MEAN" /YX /FD /c # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe @@ -73,7 +73,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 -# ADD LINK32 CoreD\ApacheCore.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 +# ADD LINK32 lib\apr\debug\aprlib.lib CoreD\ApacheCore.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 !ENDIF @@ -88,10 +88,26 @@ LINK32=link.exe SOURCE=.\os\win32\main_win32.c # End Source File +# Begin Source File + +SOURCE=.\os\win32\registry.c +# End Source File +# Begin Source File + +SOURCE=.\os\win32\service.c +# End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\os\win32\registry.h +# End Source File +# Begin Source File + +SOURCE=.\os\win32\service.h +# End Source File # End Group # Begin Group "Resource Files" diff --git a/ApacheCore.def b/ApacheCore.def index 0f2605a5a4..be38416682 100644 --- a/ApacheCore.def +++ b/ApacheCore.def @@ -222,7 +222,7 @@ EXPORTS ap_send_fd_length @215 ap_send_http_header @216 ap_send_http_trace @217 - ap_send_mmap @218 +; ap_send_mmap @218 ap_send_size @219 ap_server_root_relative @220 ap_set_byterange @221 @@ -368,3 +368,10 @@ EXPORTS ap_hook_fixups @363 regerror @364 ap_send_error_response @365 + ap_start_shutdown @366 +; ap_send_signal @367 + ap_pid_fname @368 + ap_read_config @369 + ap_server_pre_read_config @370 + ap_server_post_read_config @371 + ap_setup_prelinked_modules @372 diff --git a/ApacheCore.dsp b/ApacheCore.dsp index b5ceec246d..333887c48a 100644 --- a/ApacheCore.dsp +++ b/ApacheCore.dsp @@ -218,10 +218,6 @@ SOURCE=.\os\win32\readdir.c # End Source File # Begin Source File -SOURCE=.\os\win32\registry.c -# End Source File -# Begin Source File - SOURCE=.\main\rfc1413.c # End Source File # Begin Source File diff --git a/httpd.dsp b/httpd.dsp index b5ceec246d..333887c48a 100644 --- a/httpd.dsp +++ b/httpd.dsp @@ -218,10 +218,6 @@ SOURCE=.\os\win32\readdir.c # End Source File # Begin Source File -SOURCE=.\os\win32\registry.c -# End Source File -# Begin Source File - SOURCE=.\main\rfc1413.c # End Source File # Begin Source File diff --git a/libhttpd.def b/libhttpd.def index 0f2605a5a4..be38416682 100644 --- a/libhttpd.def +++ b/libhttpd.def @@ -222,7 +222,7 @@ EXPORTS ap_send_fd_length @215 ap_send_http_header @216 ap_send_http_trace @217 - ap_send_mmap @218 +; ap_send_mmap @218 ap_send_size @219 ap_server_root_relative @220 ap_set_byterange @221 @@ -368,3 +368,10 @@ EXPORTS ap_hook_fixups @363 regerror @364 ap_send_error_response @365 + ap_start_shutdown @366 +; ap_send_signal @367 + ap_pid_fname @368 + ap_read_config @369 + ap_server_pre_read_config @370 + ap_server_post_read_config @371 + ap_setup_prelinked_modules @372 diff --git a/server/mpm/winnt/registry.c b/server/mpm/winnt/registry.c index 93897a5120..0631b03766 100644 --- a/server/mpm/winnt/registry.c +++ b/server/mpm/winnt/registry.c @@ -1,3 +1,60 @@ +/* ==================================================================== + * Copyright (c) 1995-1999 The Apache Group. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the Apache Group + * for use in the Apache HTTP server project (http://www.apache.org/)." + * + * 4. The names "Apache Server" and "Apache Group" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the Apache Group + * for use in the Apache HTTP server project (http://www.apache.org/)." + * + * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Group and was originally based + * on public domain software written at the National Center for + * Supercomputing Applications, University of Illinois, Urbana-Champaign. + * For more information on the Apache Group and the Apache HTTP server + * project, please see . + * + */ + /* * Functions to handle interacting with the Win32 registry */ @@ -24,9 +81,9 @@ * * HKLM\Software\[Vendor]\[Software]\[Version]\ServerRoot */ - -#include -#include +#include "os.h" +//#include +//#include #include "httpd.h" #include "http_log.h" @@ -180,11 +237,11 @@ static int ap_registry_get_key_int(ap_context_t *p, char *key, char *name, char rv = RegCloseKey(hKey); if (rv != ERROR_SUCCESS) { - do_error(rv, "RegCloseKey HKLM\\%s", key); - if (retval == 0) { - /* Keep error status from RegQueryValueEx, if any */ - retval = -4; - } + do_error(rv, "RegCloseKey HKLM\\%s", key); + if (retval == 0) { + /* Keep error status from RegQueryValueEx, if any */ + retval = -4; + } } return retval < 0 ? retval : nSize; @@ -197,7 +254,7 @@ static int ap_registry_get_key_int(ap_context_t *p, char *key, char *name, char * dir will contain an empty string), or -1 if there was * an error getting the key. */ - +#if 0 int ap_registry_get_server_root(ap_context_t *p, char *dir, int size) { int rv; @@ -209,7 +266,19 @@ int ap_registry_get_server_root(ap_context_t *p, char *dir, int size) return (rv < -1) ? -1 : 0; } +#else +int ap_registry_get_server_root(ap_context_t *p, char **buf) +{ + int rv; + + rv = ap_registry_get_key_int(p, REGKEY, "ServerRoot", NULL, 0, buf); + if (rv < 0) { + *buf = NULL; + } + return (rv < -1) ? -1 : 0; +} +#endif char *ap_get_service_key(char *service_name) { char *key = malloc(strlen(SERVICEKEYPRE) + @@ -220,7 +289,7 @@ char *ap_get_service_key(char *service_name) return(key); } - +#if 0 int ap_registry_get_service_conf(ap_context_t *p, char *dir, int size, char *service_name) { int rv; @@ -234,6 +303,21 @@ int ap_registry_get_service_conf(ap_context_t *p, char *dir, int size, char *ser free(key); return (rv < -1) ? -1 : 0; } +#else +int ap_registry_get_service_conf(ap_context_t *p, char **buf, char *service_name) +{ + int rv; + char *key = ap_get_service_key(service_name); + + rv = ap_registry_get_key_int(p, key, "ConfPath", NULL, 0, buf); + if (rv < 0) { + *buf = NULL; + } + + free(key); + return (rv < -1) ? -1 : 0; +} +#endif /********************************************************************** * The rest of this file deals with storing keys or values in the registry diff --git a/server/mpm/winnt/service.c b/server/mpm/winnt/service.c index 8108ae1ad9..ec48db1f14 100644 --- a/server/mpm/winnt/service.c +++ b/server/mpm/winnt/service.c @@ -1,16 +1,70 @@ +/* ==================================================================== + * Copyright (c) 1995-1999 The Apache Group. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the Apache Group + * for use in the Apache HTTP server project (http://www.apache.org/)." + * + * 4. The names "Apache Server" and "Apache Group" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the Apache Group + * for use in the Apache HTTP server project (http://www.apache.org/)." + * + * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Group and was originally based + * on public domain software written at the National Center for + * Supercomputing Applications, University of Illinois, Urbana-Champaign. + * For more information on the Apache Group and the Apache HTTP server + * project, please see . + * + */ + #ifdef WIN32 -#include -#include +#include "os.h" #include -#include #include #include "httpd.h" #include "http_conf_globals.h" #include "http_log.h" #include "http_main.h" -#include "multithread.h" #include "service.h" #include "registry.h" @@ -41,14 +95,14 @@ int service_main(int (*main_fn)(int, char **), int argc, char **argv ) }; globdat.main_fn = main_fn; - globdat.stop_event = create_event(0, 0, "apache-signal"); + globdat.stop_event = CreateEvent(NULL, 0, 0, "apache-signal"); globdat.connected = 1; if(!StartServiceCtrlDispatcher(dispatchTable)) { /* This is a genuine failure of the SCM. */ - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, - "Error starting service control dispatcher"); + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, + "Error starting service control dispatcher"); return(globdat.exit_status); } else @@ -72,7 +126,7 @@ void __stdcall service_main_fn(DWORD argc, LPTSTR *argv) if(!(globdat.hServiceStatus = RegisterServiceCtrlHandler( globdat.name, service_ctrl))) { - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, "Failure registering service handler"); return; } @@ -83,7 +137,7 @@ void __stdcall service_main_fn(DWORD argc, LPTSTR *argv) 3000); // wait hint service_cd(); - if( service_init() ) +// if( service_init() ) /* Arguments are ok except for \! */ globdat.exit_status = (*globdat.main_fn)( argc, argv ); @@ -197,7 +251,7 @@ void InstallService(char *service_name, char *conf) if (GetModuleFileName( NULL, szPath, 512 ) == 0) { - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, "GetModuleFileName failed"); return; } @@ -210,8 +264,8 @@ void InstallService(char *service_name, char *conf) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) { - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, - "OpenSCManager failed"); + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, + "OpenSCManager failed"); } else { schService = CreateService( @@ -237,8 +291,8 @@ void InstallService(char *service_name, char *conf) printf("The %s service has been installed successfully.\n", service_name ); } else { - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, - "CreateService failed"); + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, + "CreateService failed"); } CloseServiceHandle(schSCManager); @@ -259,15 +313,15 @@ void RemoveService(char *service_name) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) { - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, - "OpenSCManager failed"); + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, + "OpenSCManager failed"); } else { schService = OpenService(schSCManager, service_name, SERVICE_ALL_ACCESS); if (schService == NULL) { /* Could not open the service */ - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, "OpenService failed"); } else { @@ -276,8 +330,8 @@ void RemoveService(char *service_name) // now remove the service if (DeleteService(schService) == 0) - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, - "DeleteService failed"); + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, + "DeleteService failed"); else printf("The %s service has been removed successfully.\n", service_name ); CloseServiceHandle(schService); @@ -307,8 +361,8 @@ BOOL isValidService(char *service_name) { int Err; if (!(schSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS))) { - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, - "OpenSCManager failed"); + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, + "OpenSCManager failed"); return FALSE; } @@ -320,8 +374,8 @@ BOOL isValidService(char *service_name) { Err = GetLastError(); if (Err != ERROR_SERVICE_DOES_NOT_EXIST && Err != ERROR_INVALID_NAME) - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, - "OpenService failed"); + ap_log_error(APLOG_MARK, APLOG_ERR, Err, NULL, + "OpenService failed"); return FALSE; } @@ -351,20 +405,20 @@ int send_signal_to_service(char *service_name, char *sig) { SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) { - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, - "OpenSCManager failed"); + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, + "OpenSCManager failed"); } else { schService = OpenService(schSCManager, service_name, SERVICE_ALL_ACCESS); if (schService == NULL) { /* Could not open the service */ - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, - "OpenService failed"); + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, + "OpenService failed"); } else { if (!QueryServiceStatus(schService, &globdat.ssStatus)) - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL, + ap_log_error(APLOG_MARK, APLOG_ERR, GetLastError(), NULL, "QueryService failed"); else { if (globdat.ssStatus.dwCurrentState == SERVICE_STOPPED && action == stop)