You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2002/02/07 01:24:12 UTC
cvs commit: httpd-2.0/server/mpm/winnt mpm_winnt.h service.c
wrowe 02/02/06 16:24:12
Modified: server/mpm/winnt mpm_winnt.h service.c
Log:
Upon advice of the FirstBill, I began looking for exceptions that occur
only in the service-mode. SetServiceDescription was borked, now fixed.
Since we don't use the posix/libc style stderr, I've also pitched that
code, which was causing an exception.
Revision Changes Path
1.31 +9 -0 httpd-2.0/server/mpm/winnt/mpm_winnt.h
Index: mpm_winnt.h
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/mpm_winnt.h,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- mpm_winnt.h 17 Nov 2001 07:54:34 -0000 1.30
+++ mpm_winnt.h 7 Feb 2002 00:24:12 -0000 1.31
@@ -147,6 +147,15 @@
ap_winapi_pfn_##fn = (ap_winapi_fpt_##fn) ap_load_dll_func(lib, #fn, ord); \
return (*(ap_winapi_pfn_##fn)) names; }; \
+/* Win2K kernel only */
+AP_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, ChangeServiceConfig2A, 0, (
+ SC_HANDLE hService,
+ DWORD dwInfoLevel,
+ LPVOID lpInfo),
+ (hService, dwInfoLevel, lpInfo));
+#undef ChangeServiceConfig2
+#define ChangeServiceConfig2 ap_winapi_ChangeServiceConfig2A
+
/* WinNT kernel only */
AP_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, CancelIo, 0, (
IN HANDLE hFile),
1.40 +28 -29 httpd-2.0/server/mpm/winnt/service.c
Index: service.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/service.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- service.c 17 Oct 2001 15:51:22 -0000 1.39
+++ service.c 7 Feb 2002 00:24:12 -0000 1.40
@@ -413,10 +413,6 @@
* notify the service control manager of the name change.
*/
-/* ChangeServiceConfig2() prototype:
- */
-typedef WINADVAPI BOOL (WINAPI *CSD_T)(SC_HANDLE, DWORD, LPCVOID);
-
/* Windows 2000 alone supports ChangeServiceConfig2 in order to
* register our server_version string... so we need some fixups
* to avoid binding to that function if we are on WinNT/9x.
@@ -425,8 +421,6 @@
{
const char *full_description;
SC_HANDLE schSCManager;
- CSD_T ChangeServiceDescription = NULL;
- HANDLE hwin2000scm;
BOOL ret = 0;
/* Nothing to do if we are a console
@@ -438,19 +432,22 @@
*/
full_description = ap_get_server_version();
- if ((osver.dwPlatformId == VER_PLATFORM_WIN32_NT)
- && (hwin2000scm = GetModuleHandle("ADVAPI32.DLL"))
- && (ChangeServiceDescription = (CSD_T) GetProcAddress(hwin2000scm,
- "ChangeServiceConfig2A"))
- && (schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)))
+ if ((osver.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ && (osver.dwMajorVersion > 4)
+ && (ChangeServiceConfig2)
+ && (schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)))
{
SC_HANDLE schService = OpenService(schSCManager, mpm_service_name,
SERVICE_ALL_ACCESS);
if (schService) {
- if (ChangeServiceDescription(schService,
- 1 /* SERVICE_CONFIG_DESCRIPTION */,
- &full_description))
+ /* Cast is necessary, ChangeServiceConfig2 handles multiple
+ * object types, some volatile, some not.
+ */
+ if (ChangeServiceConfig2(schService,
+ 1 /* SERVICE_CONFIG_DESCRIPTION */,
+ (LPVOID) &full_description)) {
full_description = NULL;
+ }
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
@@ -584,9 +581,13 @@
HANDLE hPipeReadDup;
HANDLE thread;
DWORD threadid;
- SECURITY_ATTRIBUTES sa = {0};
+ SECURITY_ATTRIBUTES sa;
const char *ignored;
+ sa.nLength = sizeof(sa);
+ sa.bInheritHandle = TRUE;
+ sa.lpSecurityDescriptor = NULL;
+
/* args and service names live in the same pool */
mpm_service_set_name(mpm_new_argv->pool, &ignored, argv[0]);
@@ -603,9 +604,8 @@
return;
}
- ReportStatusToSCMgr(globdat.ssStatus.dwCurrentState, // service state
- NO_ERROR, // exit code
- 3000); // wait hint, 3 seconds more
+ /* Report status, no errors, and buy 3 more seconds */
+ ReportStatusToSCMgr(globdat.ssStatus.dwCurrentState, NO_ERROR, 3000);
/* Create a pipe to send stderr messages to the system error log */
hCurrentProcess = GetCurrentProcess();
@@ -620,18 +620,17 @@
(LPVOID) hPipeRead, 0, &threadid);
if (thread)
{
- int fh;
- FILE *fl;
CloseHandle(thread);
- fflush(stderr);
- SetStdHandle(STD_ERROR_HANDLE, hPipeWrite);
-
- fh = _open_osfhandle((long) STD_ERROR_HANDLE,
- _O_WRONLY | _O_BINARY);
- dup2(fh, STDERR_FILENO);
- fl = _fdopen(STDERR_FILENO, "wcb");
- memcpy(stderr, fl, sizeof(FILE));
- }
+ SetStdHandle(STD_ERROR_HANDLE, hPipeWrite);
+
+/* XXX: To support stderr, we need some code like this.
+ * but not this specific code, turned out to be very buggy.
+ * fh = _open_osfhandle((long) STD_ERROR_HANDLE,
+ * _O_WRONLY | _O_BINARY);
+ * dup2(fh, STDERR_FILENO);
+ * fl = _fdopen(STDERR_FILENO, "wcb");
+ * memcpy(stderr, fl, sizeof(FILE));
+ */ }
else
{
CloseHandle(hPipeRead);