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 2001/10/03 22:56:01 UTC
cvs commit: apache-1.3/src/main http_main.c
wrowe 01/10/03 13:56:01
Modified: src CHANGES
src/os/win32 service.c service.h registry.c
src/main http_main.c
Log:
Accept service names modified by the user in the Win/2000 Service Control
Panel applet. Allow the admin to specify -W dependency, where the given
service will become a dependency for Apache when configured with the
-k install and config options. Finally, document -w and -W.
Revision Changes Path
1.1720 +8 -0 apache-1.3/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/apache-1.3/src/CHANGES,v
retrieving revision 1.1719
retrieving revision 1.1720
diff -u -r1.1719 -r1.1720
--- CHANGES 2001/10/02 21:54:32 1.1719
+++ CHANGES 2001/10/03 20:56:00 1.1720
@@ -1,5 +1,13 @@
Changes with Apache 1.3.21
+ *) Handle user modification of WinNT/2K service display names. Prior
+ versions of Apache only accepted identical internal and display names
+ (where internal service names were space-stripped.) [William Rowe]
+
+ *) Introduce Win32 -W option for -k install/config to set up service
+ dependencies on the workstation, snmp and other services that given
+ modules or configurations might depend upon. [William Rowe]
+
*) Update the mime.types file to map video/vnd.mpegurl to mxu
and add commonly used audio/x-mpegurl for m3u extensions.
[Heiko Recktenwald <uz...@uni-bonn.de>, Lars Eilebrecht]
1.55 +104 -32 apache-1.3/src/os/win32/service.c
Index: service.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/os/win32/service.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -r1.54 -r1.55
--- service.c 2001/09/24 21:44:48 1.54
+++ service.c 2001/10/03 20:56:00 1.55
@@ -668,7 +668,6 @@
globdat.exit_status = globdat.main_fn( argc, argv );
}
-
/* Set the service description regardless of platform.
* We revert to set_service_description_string on NT/9x, the
* very long way so any Apache management program can grab the
@@ -696,6 +695,55 @@
}
+char *get_service_name(char *display_name)
+{
+ /* Get the service's true name from the SCM on NT/2000, since it
+ * can be changed by the user on 2000, especially, from the
+ * service control panel. We can't trust the service name to
+ * match a space-collapsed display name.
+ */
+ char service_name[MAX_PATH];
+ if (isWindowsNT())
+ {
+ SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
+ DWORD namelen = sizeof(service_name);
+ if (scm) {
+ BOOL ok = GetServiceKeyName(scm, display_name, service_name,
+ &namelen);
+ CloseServiceHandle(scm);
+ if (ok)
+ return strdup(service_name);
+ }
+ }
+ ap_remove_spaces(service_name, display_name);
+ return strdup(service_name);
+}
+
+
+char *get_display_name(char *service_name)
+{
+ /* Get the service's display name from the SCM on NT/2000, since it
+ * can be changed by the user on 2000, especially, from the
+ * service control panel. We can't trust the service name as
+ * provided by the user.
+ */
+ if (isWindowsNT())
+ {
+ char display_name[MAX_PATH];
+ SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
+ DWORD namelen = sizeof(display_name);
+ if (scm) {
+ BOOL ok = GetServiceDisplayName(scm, service_name, display_name,
+ &namelen);
+ CloseServiceHandle(scm);
+ if (ok)
+ return strdup(display_name);
+ }
+ }
+ return service_name;
+}
+
+
/* ChangeServiceConfig2() prototype:
*/
typedef WINADVAPI BOOL (WINAPI *CSD_T)(SC_HANDLE, DWORD, LPCVOID);
@@ -854,7 +902,11 @@
TCHAR szQuotedPath[512];
char *service_name;
int regargc = 0;
- char **regargv = malloc((argc + 4) * sizeof(char*)), **newelem = regargv;
+ char default_depends[] = "Tcpip\0Afd\0";
+ char *depends = default_depends;
+ size_t depends_len = sizeof(default_depends);
+ char **regargv = malloc((argc + 4) * sizeof(char*));
+ char **newelem = regargv;
regargc += 4;
*(newelem++) = "-d";
@@ -865,10 +917,28 @@
while (++argv, --argc) {
if ((**argv == '-') && strchr("kndf", argv[0][1]))
--argc, ++argv; /* Skip already handled -k -n -d -f options */
+ else if ((**argv == '-') && (argv[0][1] == 'W'))
+ {
+ /* Catch this service -W dependency
+ * the depends list is null seperated, double-null terminated
+ */
+ char *service = get_service_name(*(argv + 1));
+ size_t add_len = strlen(service) + 1;
+ char *more_depends = malloc(depends_len + add_len);
+ memcpy (more_depends, depends, depends_len - 1);
+ memcpy (more_depends + depends_len - 1, service, add_len);
+ depends_len += add_len;
+ depends = more_depends;
+ depends[depends_len - 1] = '\0';
+ ++argv, --argc;
+ }
else if ((**argv != '-') || !strchr("iuw", argv[0][1]))
*(newelem++) = *argv, ++regargc; /* Ignoring -i -u -w options */
}
+ /* Remove spaces from display name to create service name */
+ service_name = get_service_name(display_name);
+
printf(reconfig ? "Reconfiguring the %s service\n"
: "Installing the %s service\n",
display_name);
@@ -880,10 +950,6 @@
return;
}
- /* Remove spaces from display name to create service name */
- service_name = strdup(display_name);
- ap_remove_spaces(service_name, display_name);
-
if (isWindowsNT())
{
SC_HANDLE schService;
@@ -909,6 +975,12 @@
* required for DCOM communication. I am far from
* convinced we should toggle this, but be warned that
* future apache modules or ISAPI dll's may depend on it.
+ * Also UNC share users may need the networking service
+ * started (usually "LanmanWorkstation"). "ProtectedStorage"
+ * may be needed depending on how files and registry keys are
+ * stored. And W3SVC may be needed to wait until IIS has
+ * glommed and released 0.0.0.0:80 if the admin allocates
+ * two different IP's to Apache and IIS on the same port.
*/
if (reconfig)
{
@@ -925,7 +997,7 @@
szQuotedPath, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
- "Tcpip\0Afd\0", // dependencies
+ depends, // dependencies
NULL, // user account
NULL, // account password
display_name)) { // service display name
@@ -949,7 +1021,7 @@
szQuotedPath, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
- "Tcpip\0Afd\0", // dependencies
+ depends, // dependencies
NULL, // user account
NULL); // account password
if (!schService)
@@ -1056,9 +1128,8 @@
printf("Removing the %s service\n", display_name);
/* Remove spaces from display name to create service name */
- service_name = strdup(display_name);
- ap_remove_spaces(service_name, display_name);
-
+ service_name = get_service_name(display_name);
+
if (isWindowsNT())
{
SC_HANDLE schService;
@@ -1172,6 +1243,25 @@
display_name);
}
+
+BOOL isWindowsNT(void)
+{
+ static BOOL once = FALSE;
+ static BOOL isNT = FALSE;
+
+ if (!once)
+ {
+ OSVERSIONINFO osver;
+ osver.dwOSVersionInfoSize = sizeof(osver);
+ if (GetVersionEx(&osver))
+ if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ isNT = TRUE;
+ once = TRUE;
+ }
+ return isNT;
+}
+
+
/*
* A hack to determine if we're running as a service without waiting for
* the SCM to fail.
@@ -1202,8 +1292,8 @@
/* Remove spaces from display name to create service name */
strcpy(service_key, "System\\CurrentControlSet\\Services\\");
- service_name = strchr(service_key, '\0');
- ap_remove_spaces(service_name, display_name);
+ service_name = get_service_name(display_name);
+ strcat(service_key, service_name);
if (RegOpenKey(HKEY_LOCAL_MACHINE, service_key, &hkey) != ERROR_SUCCESS) {
return FALSE;
@@ -1212,22 +1302,6 @@
return TRUE;
}
-BOOL isWindowsNT(void)
-{
- static BOOL once = FALSE;
- static BOOL isNT = FALSE;
-
- if (!once)
- {
- OSVERSIONINFO osver;
- osver.dwOSVersionInfoSize = sizeof(osver);
- if (GetVersionEx(&osver))
- if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT)
- isNT = TRUE;
- once = TRUE;
- }
- return isNT;
-}
int send_signal_to_service(char *display_name, char *sig,
int argc, char **argv)
@@ -1253,9 +1327,7 @@
return FALSE;
}
- /* Remove spaces from display name to create service name */
- service_name = strdup(display_name);
- ap_remove_spaces(service_name, display_name);
+ service_name = get_service_name(display_name);
if (isWindowsNT())
{
1.19 +2 -0 apache-1.3/src/os/win32/service.h
Index: service.h
===================================================================
RCS file: /home/cvs/apache-1.3/src/os/win32/service.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- service.h 2001/02/14 14:22:11 1.18
+++ service.h 2001/10/03 20:56:00 1.19
@@ -79,6 +79,8 @@
char *display_name);
void service_set_status(int status);
void service_cd();
+char *get_service_name(char *display_name);
+char *get_display_name(char *service_name);
BOOL isProcessService();
BOOL isValidService(char *display_name);
void InstallService(pool *p, char *display_name, int argc, char **argv, int reconfig);
1.37 +3 -3 apache-1.3/src/os/win32/registry.c
Index: registry.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/os/win32/registry.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- registry.c 2001/02/14 14:22:10 1.36
+++ registry.c 2001/10/03 20:56:00 1.37
@@ -89,6 +89,7 @@
#include "httpd.h"
#include "http_log.h"
+#include "service.h"
/* Define where the Apache values are stored in the registry. In general
* VERSION will be the same across all beta releases for a particular
@@ -279,9 +280,8 @@
if (display_name == NULL)
return strdup("");
- service_name = strdup(display_name);
- ap_remove_spaces(service_name, display_name);
-
+ service_name = get_service_name(display_name);
+
key = malloc(strlen(SERVICEKEYPRE) +
strlen(service_name) +
strlen(SERVICEKEYPOST) + 1);
1.552 +20 -3 apache-1.3/src/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/http_main.c,v
retrieving revision 1.551
retrieving revision 1.552
diff -u -r1.551 -r1.552
--- http_main.c 2001/09/27 18:12:04 1.551
+++ http_main.c 2001/10/03 20:56:00 1.552
@@ -1310,6 +1310,8 @@
fprintf(stderr, " -k install | -i: install an Apache service\n");
fprintf(stderr, " -k config : reconfigure an installed Apache service\n");
fprintf(stderr, " -k uninstall | -u: uninstall an Apache service\n");
+ fprintf(stderr, " -W service : after -k config|install; Apache starts after 'service'\n");
+ fprintf(stderr, " -w : holds the window open for 30 seconds for fatal errors.\n");
#endif
#if defined(NETWARE)
@@ -7059,7 +7061,7 @@
reparsed = 1;
}
- while ((c = getopt(argc, argv, "D:C:c:Xd:f:vVlLz:Z:wiuStThk:n:")) != -1) {
+ while ((c = getopt(argc, argv, "D:C:c:Xd:f:vVlLz:Z:wiuStThk:n:W:")) != -1) {
#else /* !WIN32 */
while ((c = getopt(argc, argv, "D:C:c:Xd:f:vVlLsStTh")) != -1) {
#endif
@@ -7125,6 +7127,19 @@
else
signal_to_send = optarg;
break;
+ case 'W':
+ /* -With a dependent service */
+ if (install < 1) {
+ fprintf(stderr, "%s: invalid option: -W %s ignored\n"
+ "\t-W only modifies -k install or -k config\n",
+ argv[0], optarg);
+ }
+ else if (!isWindowsNT()) {
+ fprintf(stderr, "%s: invalid option: -W %s ignored\n"
+ "\t-W is only supported for Windows NT/2000\n",
+ argv[0], optarg);
+ }
+ break;
#endif /* WIN32 */
#ifdef NETWARE
case 's':
@@ -7225,6 +7240,10 @@
service_name = DEFAULTSERVICENAME;
}
+ if (service_name) {
+ service_name = get_display_name(service_name);
+ }
+
if (service_name && isValidService(service_name))
{
if (install == 2) {
@@ -7314,8 +7333,6 @@
}
if (install) {
- if (!service_name)
- service_name = ap_pstrdup(pconf, DEFAULTSERVICENAME);
if (install > 0)
InstallService(pconf, service_name, argc, argv, install == 1);
else