From a43d9443b27078b0144d2b7bacf78a785aa457e4 Mon Sep 17 00:00:00 2001 From: Bill Stoddard Date: Wed, 8 Dec 1999 22:34:02 +0000 Subject: 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 --- server/mpm/winnt/service.c | 110 +++++++++++++++++++++++++++++++++------------ 1 file changed, 82 insertions(+), 28 deletions(-) (limited to 'server/mpm/winnt/service.c') 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) -- cgit v1.2.3