stoddard 99/12/17 13:04:58
Modified: src/os/win32 main_win32.c
Log:
Windows:
Some more work to properly handle -k restart,shutdown. I have made a
simplifying
assumption that the relative name of the server pidfile is always
logs/httpd.pid.
This saves the error prone effort of reading the config file in apache.exe (as
opposed to ApacheCore.dll). I am really working hard to keep Windows specific
junk out of http_main.c.
Revision Changes Path
1.3 +90 -141 apache-2.0/src/os/win32/main_win32.c
Index: main_win32.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/os/win32/main_win32.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- main_win32.c 1999/12/08 22:34:09 1.2
+++ main_win32.c 1999/12/17 21:04:57 1.3
@@ -66,7 +66,8 @@
*/
#include "httpd.h"
-#include "http_config.h" /* ap_server_root_relative */
+#include "http_main.h"
+#include "http_config.h"
#include "apr_getopt.h"
#include "service.h"
#include "http_log.h"
@@ -75,17 +76,7 @@
__declspec(dllexport) int apache_main(int argc, char *argv[]);
#define DEFAULTSERVICENAME "Apache"
-#if 0
-API_VAR_IMPORT int ap_optreset;
-API_VAR_IMPORT char *ap_optarg;
-API_VAR_IMPORT int ap_optind;
-#endif
-API_VAR_IMPORT char *ap_pid_fname; /* Need to read the config first */
-API_VAR_IMPORT char *ap_server_root;
-API_VAR_IMPORT ap_array_header_t *ap_server_pre_read_config;
-API_VAR_IMPORT ap_array_header_t *ap_server_post_read_config;
-#if 0
-static int send_signal(ap_context_t *p, char *signal)
+static int send_signal(const char *signal, const char *server_root,
ap_context_t *p)
{
HANDLE event;
char prefix[20];
@@ -97,8 +88,7 @@
printf("signal = %s\n", signal);
- fname = ap_server_root_relative (p, ap_pid_fname);
-
+ fname = ap_make_full_path(p, server_root, DEFAULT_PIDLOG);
fp = fopen(fname, "r");
if (!fp) {
printf("Cannot read apache PID file %s. Error = %d\n", fname, errno);
@@ -130,8 +120,7 @@
event = OpenEvent(EVENT_ALL_ACCESS, FALSE, EventName);
printf("event handle = %d\n", event);
if (event == NULL) {
- printf("Unknown signal name \"%s\". Use either shutdown or restart.\n",
- signal);
+ printf("Unable to open event %s.\n", EventName);
return FALSE;
}
SetEvent(event);
@@ -139,62 +128,6 @@
CloseHandle(event);
return TRUE;
}
-#else
-static int send_signal(ap_context_t *p, char *signal)
-{
- HANDLE event;
- char prefix[20];
- char *EventName;
- FILE *fp;
- int nread;
- char *fname;
- int end;
-
- printf("signal = %s\n", signal);
-
- fname = "e:/apache/logs/httpd.pid";
-
- fp = fopen(fname, "r");
- if (!fp) {
- printf("Cannot read apache PID file %s. Error = %d\n", fname, errno);
- return FALSE;
- }
- prefix[0] = 'a';
- prefix[1] = 'p';
-
- nread = fread(prefix+2, 1, sizeof(prefix)-3, fp);
- if (nread == 0) {
- fclose(fp);
- printf("PID file %s was empty\n", fname);
- return FALSE;
- }
- fclose(fp);
-
- /* Terminate the prefix string */
- end = 2 + nread - 1;
- while (end > 0 && (prefix[end] == '\r' || prefix[end] == '\n'))
- end--;
- prefix[end + 1] = '\0';
-
- /* Build the event name. Should be one of the following...
- * apPID_shutdown
- * apPID_restart
- */
- EventName = ap_pstrcat(p,prefix,"_",signal,NULL);
- printf("event name = %s\n", EventName);
- event = OpenEvent(EVENT_ALL_ACCESS, FALSE, EventName);
- printf("event handle = %d\n", event);
- if (event == NULL) {
- printf("Unknown signal name \"%s\". Use either shutdown or restart.\n",
- signal);
- return FALSE;
- }
- SetEvent(event);
- ResetEvent(event);
- CloseHandle(event);
- return TRUE;
-}
-#endif
int service_init()
{
/*
@@ -212,32 +145,52 @@
*/
return TRUE;
}
-#if 0
-int main(int argc, char *argv[])
+
+static void usage()
{
- return apache_main(argc, argv);
+ const char *bin = "apache";
+ char pad[MAX_STRING_LEN];
+ unsigned i;
+
+ for (i = 0; i < strlen(bin); i++)
+ pad[i] = ' ';
+ pad[i] = '\0';
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "Usage:
%s [-D name] [-d directory] [-f file]", bin);
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "
%s [-C \"directive\"] [-c \"directive\"]", pad);
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "
%s [-v] [-V] [-h] [-l] [-L] [-S] [-t] [-T]", pad);
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
"Options:");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -D
name : define a name for use in <IfDefine name> directives");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -d
directory : specify an alternate initial ServerRoot");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -f
file : specify an alternate ServerConfigFile");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -C
\"directive\" : process directive before reading config files");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -c
\"directive\" : process directive after reading config files");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -v
: show version number");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -V
: show compile settings");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -h
: list available command line options (this page)");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -l
: list compiled in modules");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -L
: list available configuration directives");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -t
: run syntax check for config files (with docroot check)");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, " -T
: run syntax check for config files (without docroot check)");
+ exit(0);
}
-#else
+
int main(int argc, char *argv[])
{
ap_context_t *pwincmd;
int c;
char *ch;
char *service_name = NULL; //DEFAULTSERVICENAME;
- char *tmp_server_root = NULL;
char *signal_to_send = NULL;
- char *server_confname = NULL;
+ char *server_root = NULL;
+ char *server_confname = SERVER_CONFIG_FILE;
+ char *temp_server_confname = NULL;
char cwd[MAX_STRING_LEN];
char **new;
BOOLEAN install = FALSE;
BOOLEAN uninstall = FALSE;
- BOOLEAN k = FALSE;
- BOOLEAN n = FALSE;
- BOOLEAN d = FALSE;
- BOOLEAN f = FALSE;
- ap_array_header_t *table;
+ ap_array_header_t *cmdtbl;
int new_argc = 0;
ap_create_context(&pwincmd, NULL);
@@ -246,17 +199,17 @@
exit(0);
}
- /* Set up default ap_server_root (do we need HTTPD_ROOT? I think not...)
*/
+ /* Set up default server_root */
if (!GetCurrentDirectory(sizeof(cwd),cwd)) {
ap_log_error(APLOG_MARK,APLOG_ERR, GetLastError(), NULL,
"GetCurrentDirectory() failure");
exit(0);
}
- ap_server_root = ap_os_canonical_filename(pwincmd, cwd);
+ server_root = ap_os_canonical_filename(pwincmd, cwd);
- table = ap_make_array(pwincmd, 1, sizeof(char *));
+ cmdtbl = ap_make_array(pwincmd, 1, sizeof(char *));
/* Add the new_argv[0] */
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
*new = argv[0];
new_argc++;
@@ -272,20 +225,20 @@
int i;
ap_registry_get_service_conf(pwincmd, &server_confname, argv[0]);
for (i = 0; i < argc ; i++) {
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
*new = argv[i];
}
/* Add server_confname to the argument list */
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
*new = "-f";
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
*new = server_confname;
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
*new = "-d";
- new = (char **) ap_push_array(table);
- *new = ap_server_root;
+ new = (char **) ap_push_array(cmdtbl);
+ *new = server_root;
argc += 4;
- apache_main(new_argc, (char**) table->elts);
+ apache_main(new_argc, (char**) cmdtbl->elts);
exit(0);
}
@@ -309,58 +262,67 @@
break;
case 'f':
server_confname = ap_optarg;
- f = TRUE;
break;
case 'd':
- ap_server_root = ap_optarg;
- d = TRUE;
+ server_root = ap_os_canonical_filename(pwincmd, ap_optarg);
+ break;
+ case 'h':
+ usage();
break;
+ case '?':
+ usage();
+ break;
default:
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
ch = ap_pstrndup(pwincmd, (char*)&c, 1);
*new = ap_pstrcat(pwincmd,"-", ch, NULL);
new_argc++;
if (ap_optarg) {
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
*new = ap_optarg;
new_argc++;
}
break;
}
}
-
- /* Check for conflicting options */
- /* Determine ap_server_confname.
- * ap_server_confname is found in this order:
+ /* Determine server_confname.
+ * server_confname is found in this order:
* (1) -f or -n
* (2) [-d]/SERVER_CONFIG_FILE
* (3) ./SERVER_CONFIG_FILE
* (4) [Registry: HKLM\Software\[product]\ServerRoot]/SERVER_CONFIG_FILE
* (5) /HTTPD_ROOT/SERVER_CONFIG_FILE (Humm, I don't think we should
even try this... )
*/
- if (!server_confname) {
- server_confname = ap_pstrdup(pwincmd, SERVER_CONFIG_FILE);
- if (access(ap_server_root_relative(pwincmd, server_confname), 0)) {
- ap_registry_get_server_root(pwincmd, &tmp_server_root);
- if (tmp_server_root)
- ap_server_root = ap_pstrdup(pwincmd,
ap_os_canonical_filename(pwincmd, tmp_server_root));
- else {
- /* use default server_root */
- }
+ temp_server_confname = ap_pstrdup(pwincmd, server_confname);
+ if (!ap_os_is_path_absolute(temp_server_confname)) {
+ temp_server_confname = ap_make_full_path(pwincmd, server_root,
temp_server_confname);
+ }
+ temp_server_confname = ap_os_canonical_filename(pwincmd,
temp_server_confname);
+ ap_getparents(temp_server_confname);
+ ap_no2slash(temp_server_confname);
+
+ if (access(temp_server_confname, 0)) {
+ ap_registry_get_server_root(pwincmd, &server_root);
+ if (!server_root) {
+ server_root = HTTPD_ROOT;
}
- }
+ server_root = ap_os_canonical_filename(pwincmd, server_root);
- /* Canonicalize the server_confname */
- if (!ap_os_is_path_absolute(server_confname)) {
- char *full_conf_path;
- full_conf_path = ap_pstrcat(pwincmd, ap_server_root, "/",
server_confname, NULL);
- full_conf_path = ap_os_canonical_filename(pwincmd, full_conf_path);
- server_confname = full_conf_path;
+ temp_server_confname = ap_pstrdup(pwincmd, server_confname);
+ if (!ap_os_is_path_absolute(temp_server_confname)) {
+ temp_server_confname = ap_make_full_path(pwincmd, server_root,
temp_server_confname);
+ }
+ temp_server_confname = ap_os_canonical_filename(pwincmd,
temp_server_confname);
+ ap_getparents(temp_server_confname);
+ ap_no2slash(temp_server_confname);
}
- ap_getparents(server_confname);
- ap_no2slash(server_confname);
+ server_confname = temp_server_confname;
+
+ /* By now, we should have canonicalized absolute paths to
+ * server_root and server_confname */
+
/* Handle -i (install as a service) */
if (install) {
if (!service_name)
@@ -385,19 +347,7 @@
/* Handle -k restart|shutdown */
if (signal_to_send && strcasecmp(signal_to_send, "start")) {
/* Treat -k start confpath as just -f confpath */
-#if 0
- server_rec *server_conf;
- process_rec process;
- process.pool = pwincmd;
- process.pconf = pwincmd;
- process.argc = argc;
- process.argv = argv;
- ap_setup_prelinked_modules(&process);
- ap_server_pre_read_config = ap_make_array(pwincmd, 1, sizeof(char
*));
- ap_server_post_read_config = ap_make_array(pwincmd, 1, sizeof(char
*));
- server_conf = ap_read_config(&process, pwincmd, server_confname);
-#endif
- send_signal(pwincmd, signal_to_send);
+ send_signal(signal_to_send, server_root, pwincmd);
exit(0);
}
@@ -405,14 +355,14 @@
* -f server_conf
* -d server_root
*/
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
*new = "-f";
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
*new = server_confname;
- new = (char **) ap_push_array(table);
+ new = (char **) ap_push_array(cmdtbl);
*new = "-d";
- new = (char **) ap_push_array(table);
- *new = ap_server_root;
+ new = (char **) ap_push_array(cmdtbl);
+ *new = server_root;
new_argc += 4;
/* Set optreset and optind to allow ap_getopt to work correctly
@@ -421,7 +371,7 @@
ap_optreset = 1;
ap_optind = 1;
- return apache_main(new_argc, (char**) table->elts);
+ return apache_main(new_argc, (char**) cmdtbl->elts);
/* What is this? */
/* Console application or a child process. */
@@ -434,4 +384,3 @@
}
#endif
}
-#endif