You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by st...@locus.apache.org on 2000/03/13 22:00:42 UTC
cvs commit: apache-1.3/src/support httpd.exp
stoddard 00/03/13 13:00:42
Modified: src ApacheCore.def CHANGES
src/include httpd.h
src/main util.c
src/os/win32 registry.c registry.h service.c service.h
src/support httpd.exp
Log:
NT does not handle spaces in service names well.
Attached are two patches to correct how Apache
deals with this.
The first patch adds the util function
ap_remove_spaces and exports it on all platforms.
The second patch changes some service and registry
functions to make use of this new function.
NT developers of Apache admin modules could use
some functionality from registry.c.
The third patch exports four ap_x functions from
registry.c
Submitted by: Keith Wannamaker
Reviewed by: Bill Stoddard
Revision Changes Path
1.21 +5 -0 apache-1.3/src/ApacheCore.def
Index: ApacheCore.def
===================================================================
RCS file: /home/cvs/apache-1.3/src/ApacheCore.def,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- ApacheCore.def 1999/11/05 15:41:06 1.20
+++ ApacheCore.def 2000/03/13 21:00:38 1.21
@@ -360,3 +360,8 @@
ap_SHA1Final @355
ap_sha1_base64 @356
ap_send_error_response @357
+ ap_remove_spaces @358
+ ap_get_service_key @359
+ ap_registry_get_server_root @360
+ ap_registry_get_service_conf @361
+ ap_registry_set_service_conf @362
1.1525 +7 -0 apache-1.3/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/apache-1.3/src/CHANGES,v
retrieving revision 1.1524
retrieving revision 1.1525
diff -u -r1.1524 -r1.1525
--- CHANGES 2000/03/12 16:48:50 1.1524
+++ CHANGES 2000/03/13 21:00:38 1.1525
@@ -1,3 +1,10 @@
+
+ *) WinNT: Do a better job at handling spaces in service names.
+ Add the util function ap_remove_spaces and export it on all
+ platforms. Change some Win32 service and registry functions to
+ make use of this new function.
+ [Keith Wannamaker <wa...@us.ibm.com>]
+
Changes with Apache 1.3.13
*) use send/recv instead of write/read in proxy_connect -- fixes
1.310 +1 -0 apache-1.3/src/include/httpd.h
Index: httpd.h
===================================================================
RCS file: /home/cvs/apache-1.3/src/include/httpd.h,v
retrieving revision 1.309
retrieving revision 1.310
diff -u -r1.309 -r1.310
--- httpd.h 2000/03/11 13:39:14 1.309
+++ httpd.h 2000/03/13 21:00:40 1.310
@@ -1034,6 +1034,7 @@
API_EXPORT(int) ap_rind(const char *, char);
API_EXPORT(char *) ap_escape_quotes (pool *p, const char *instring);
+API_EXPORT(void) ap_remove_spaces(char *dest, char *src);
/* Common structure for reading of config files / passwd files etc. */
typedef struct {
1.182 +13 -0 apache-1.3/src/main/util.c
Index: util.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/util.c,v
retrieving revision 1.181
retrieving revision 1.182
diff -u -r1.181 -r1.182
--- util.c 2000/03/01 09:13:37 1.181
+++ util.c 2000/03/13 21:00:40 1.182
@@ -2184,3 +2184,16 @@
*outchr = '\0';
return outstring;
}
+
+/* dest = src with whitespace removed
+ * length of dest assumed >= length of src
+ */
+API_EXPORT(void) ap_remove_spaces(char *dest, char *src)
+{
+ while (*src) {
+ if (!ap_isspace(*src))
+ *dest++ = *src;
+ src++;
+ }
+ *dest = 0;
+}
1.33 +17 -9 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.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- registry.c 2000/02/23 23:06:38 1.32
+++ registry.c 2000/03/13 21:00:41 1.33
@@ -199,7 +199,7 @@
* an error getting the key.
*/
-int ap_registry_get_server_root(pool *p, char *dir, int size)
+API_EXPORT(int) ap_registry_get_server_root(pool *p, char *dir, int size)
{
int rv;
@@ -211,21 +211,29 @@
return (rv < -1) ? -1 : 0;
}
-char *ap_get_service_key(char *service_name)
+API_EXPORT(char *) ap_get_service_key(char *display_name)
{
- char *key = malloc(strlen(SERVICEKEYPRE) +
- strlen(service_name) +
- strlen(SERVICEKEYPOST) + 1);
+ char *key, *service_name;
+
+ if (display_name == NULL)
+ return strdup("");
+
+ service_name = strdup(display_name);
+ ap_remove_spaces(service_name, display_name);
+
+ key = malloc(strlen(SERVICEKEYPRE) +
+ strlen(service_name) +
+ strlen(SERVICEKEYPOST) + 1);
sprintf(key,"%s%s%s", SERVICEKEYPRE, service_name, SERVICEKEYPOST);
return(key);
}
-int ap_registry_get_service_conf(pool *p, char *dir, int size, char *service_name)
+API_EXPORT(int) ap_registry_get_service_conf(pool *p, char *dir, int size, char *display_name)
{
int rv;
- char *key = ap_get_service_key(service_name);
+ char *key = ap_get_service_key(display_name);
rv = ap_registry_get_key_int(p, key, "ConfPath", dir, size, NULL);
if (rv < 0) {
@@ -443,10 +451,10 @@
* logged via aplog_error().
*/
-int ap_registry_set_service_conf(char *conf, char *service_name)
+API_EXPORT(int) ap_registry_set_service_conf(char *conf, char *display_name)
{
int rv;
- char *key = ap_get_service_key(service_name);
+ char *key = ap_get_service_key(display_name);
rv = ap_registry_store_key_int(key, "ConfPath", REG_SZ, conf, strlen(conf)+1);
free(key);
1.4 +3 -3 apache-1.3/src/os/win32/registry.h
Index: registry.h
===================================================================
RCS file: /home/cvs/apache-1.3/src/os/win32/registry.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- registry.h 1999/04/08 21:04:46 1.3
+++ registry.h 2000/03/13 21:00:41 1.4
@@ -2,7 +2,7 @@
* Declarations for users of the functions defined in registry.c
*/
-extern int ap_registry_get_server_root(pool *p, char *dir, int size);
+API_EXPORT(int) ap_registry_get_server_root(pool *p, char *dir, int size);
extern int ap_registry_set_server_root(char *dir);
-extern int ap_registry_get_service_conf(pool *p, char *dir, int size, char *service_name);
-extern int ap_registry_set_service_conf(char *dir, char *service_name);
+API_EXPORT(int) ap_registry_get_service_conf(pool *p, char *dir, int size, char *display_name);
+API_EXPORT(int) ap_registry_set_service_conf(char *dir, char *display_name);
1.14 +34 -14 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.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- service.c 1999/04/08 21:04:47 1.13
+++ service.c 2000/03/13 21:00:41 1.14
@@ -185,15 +185,16 @@
return(1);
}
-void InstallService(char *service_name, char *conf)
+void InstallService(char *display_name, char *conf)
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
TCHAR szPath[512];
TCHAR szQuotedPath[512];
+ char *service_name;
- printf("Installing the %s service to use %s\n", service_name, conf);
+ printf("Installing the %s service to use %s\n", display_name, conf);
if (GetModuleFileName( NULL, szPath, 512 ) == 0)
{
@@ -202,6 +203,10 @@
return;
}
+ /* Remove spaces from display name to create service name */
+ service_name = strdup(display_name);
+ ap_remove_spaces(service_name, display_name);
+
ap_snprintf(szQuotedPath, 512, "\"%s\"", szPath);
schSCManager = OpenSCManager(
@@ -217,7 +222,7 @@
schService = CreateService(
schSCManager, // SCManager database
service_name, // name of service
- service_name, // name to display
+ display_name, // name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
@@ -234,7 +239,7 @@
/* Now store the server_root in the registry */
if(!ap_registry_set_service_conf(conf, service_name))
- printf("The %s service has been installed successfully.\n", service_name );
+ printf("The %s service has been installed successfully.\n", display_name);
}
else {
ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL,
@@ -246,13 +251,18 @@
}
-void RemoveService(char *service_name)
+void RemoveService(char *display_name)
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
+ char *service_name;
- printf("Removing the %s service\n", service_name);
+ 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);
+
schSCManager = OpenSCManager(
NULL, // machine (NULL == local)
NULL, // database (NULL == default)
@@ -279,7 +289,7 @@
ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL,
"DeleteService failed");
else
- printf("The %s service has been removed successfully.\n", service_name );
+ printf("The %s service has been removed successfully.\n", display_name);
CloseServiceHandle(schService);
}
/* SCM removes registry parameters */
@@ -302,10 +312,15 @@
/* Determine is service_name is a valid service
*/
-BOOL isValidService(char *service_name) {
+BOOL isValidService(char *display_name) {
SC_HANDLE schSCM, schSVC;
+ char *service_name;
int Err;
+ /* Remove spaces from display name to create service name */
+ service_name = strdup(display_name);
+ ap_remove_spaces(service_name, display_name);
+
if (!(schSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS))) {
ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_WIN32ERROR, NULL,
"OpenSCManager failed");
@@ -326,9 +341,10 @@
return FALSE;
}
-int send_signal_to_service(char *service_name, char *sig) {
+int send_signal_to_service(char *display_name, char *sig) {
SC_HANDLE schService;
SC_HANDLE schSCManager;
+ char *service_name;
int success = FALSE;
enum { start, restart, stop, unknown } action;
@@ -345,6 +361,10 @@
return FALSE;
}
+ /* Remove spaces from display name to create service name */
+ service_name = strdup(display_name);
+ ap_remove_spaces(service_name, display_name);
+
schSCManager = OpenSCManager(
NULL, // machine (NULL == local)
NULL, // database (NULL == default)
@@ -368,11 +388,11 @@
"QueryService failed");
else {
if (globdat.ssStatus.dwCurrentState == SERVICE_STOPPED && action == stop)
- printf("The %s service is not started.\n", service_name);
+ printf("The %s service is not started.\n", display_name);
else if (globdat.ssStatus.dwCurrentState == SERVICE_RUNNING && action == start)
- printf("The %s service has already been started.\n", service_name);
+ printf("The %s service has already been started.\n", display_name);
else {
- printf("The %s service is %s.\n", service_name, participle[action]);
+ printf("The %s service is %s.\n", display_name, participle[action]);
if (action == stop || action == restart)
success = ap_stop_service(schService);
@@ -380,9 +400,9 @@
success = ap_start_service(schService);
if( success )
- printf("The %s service has %s.\n", service_name, past[action]);
+ printf("The %s service has %s.\n", display_name, past[action]);
else
- printf("Failed to %s the %s service.\n", sig, service_name );
+ printf("Failed to %s the %s service.\n", sig, display_name);
}
CloseServiceHandle(schService);
1.5 +4 -4 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.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- service.h 1999/04/08 21:04:48 1.4
+++ service.h 2000/03/13 21:00:41 1.5
@@ -7,11 +7,11 @@
void service_set_status(int status);
void service_cd();
BOOL isProcessService();
-BOOL isValidService(char *service_name);
-void InstallService(char *service_name, char *conf);
-void RemoveService(char *service_name);
+BOOL isValidService(char *display_name);
+void InstallService(char *display_name, char *conf);
+void RemoveService(char *display_name);
int service_init();
-int send_signal_to_service(char *service_name, char *sig);
+int send_signal_to_service(char *display_name, char *sig);
#endif /* WIN32 */
#endif /* SERVICE_H */
1.30 +1 -0 apache-1.3/src/support/httpd.exp
Index: httpd.exp
===================================================================
RCS file: /home/cvs/apache-1.3/src/support/httpd.exp,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- httpd.exp 1999/12/09 19:21:51 1.29
+++ httpd.exp 2000/03/13 21:00:41 1.30
@@ -267,6 +267,7 @@
ap_register_cleanup
ap_register_other_child
ap_remove_module
+ap_remove_spaces
ap_requires
ap_reset_timeout
ap_response_code_string