stoddard    99/12/20 11:07:36

  Modified:    src/main http_main.c
               src/include ap_mpm.h
               src/os/win32 main_win32.c
               src/modules/mpm/winnt winnt.c
  Log:
  Handle -k restart|shutdown command line option from http_main.c
  
  Revision  Changes    Path
  1.24      +31 -2     apache-2.0/src/main/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/http_main.c,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- http_main.c       1999/12/01 01:16:11     1.23
  +++ http_main.c       1999/12/20 19:07:22     1.24
  @@ -66,7 +66,8 @@
   
   const char *ap_server_argv0;
   
  -API_VAR_EXPORT const char *ap_server_root;
  +//API_VAR_IMPORT const char *ap_server_root;
  +const char *ap_server_root;
   
   ap_array_header_t *ap_server_pre_read_config;
   ap_array_header_t *ap_server_post_read_config;
  @@ -236,6 +237,11 @@
       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "Usage: 
%s [-D name] [-d directory] [-f file]", bin);
   #endif
       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "       
%s [-C \"directive\"] [-c \"directive\"]", pad);
  +#ifdef WIN32
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "       
%s [-k restart|shutdown|start]", pad);
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "       
%s [-n service_name]", pad);
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "       
%s [-i] [-u]", pad);
  +#endif
       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:");
   #ifdef SHARED_CORE
  @@ -246,6 +252,14 @@
       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");
  +#ifdef WIN32
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "  -n 
name          : set service name and use its ServerConfigFile");
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "  -k 
shutdown      : tell running Apache to shutdown");
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "  -k 
restart       : tell running Apache to do a graceful restart");
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "  -k 
start         : tell Apache to start");
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "  -i   
            : install an Apache service");
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "  -u   
            : uninstall an Apache service");
  +#endif
       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)");
  @@ -283,6 +297,10 @@
       ap_context_t *ptemp; /* Pool for temporary config stuff, reset often */
       ap_context_t *pcommands; /* Pool for -C and -c switches */
   
  +#ifdef WIN32
  +    char *signal = NULL;
  +#endif
  +
       ap_server_argv0 = process->short_name;
       
       ap_util_uri_init();
  @@ -296,7 +314,7 @@
       ap_server_post_read_config = ap_make_array(pcommands, 1, sizeof(char *));
       ap_server_config_defines   = ap_make_array(pcommands, 1, sizeof(char *));
   
  -    while (ap_getopt(pcommands, argc, argv, "C:c:d:f:vVlLth", &c) == 
APR_SUCCESS) {
  +    while (ap_getopt(pcommands, argc, argv, "C:c:d:f:k:vVlLth", &c) == 
APR_SUCCESS) {
           char **new;
           switch (c) {
        case 'c':
  @@ -313,6 +331,11 @@
        case 'f':
            confname = ap_optarg;
            break;
  +#ifdef WIN32
  +        case 'k':
  +         signal = ap_optarg;
  +            break;
  +#endif
        case 'v':
            printf("Server version: %s\n", ap_get_server_version());
            printf("Server built:   %s\n", ap_get_server_built());
  @@ -351,6 +374,12 @@
        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
"Syntax OK\n");
        destroy_and_exit_process(process, 0);
       }
  +#ifdef WIN32
  +    if (signal) {
  +        ap_signal_parent(pconf, signal, ap_server_root);
  +        destroy_and_exit_process(process, 0);
  +    }
  +#endif
       ap_clear_pool(plog);
       ap_run_open_logs(pconf, plog, ptemp, server_conf);
       ap_post_config_hook(pconf, plog, ptemp, server_conf);
  
  
  
  1.8       +5 -0      apache-2.0/src/include/ap_mpm.h
  
  Index: ap_mpm.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/include/ap_mpm.h,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ap_mpm.h  1999/12/13 22:53:07     1.7
  +++ ap_mpm.h  1999/12/20 19:07:23     1.8
  @@ -128,6 +128,11 @@
   void ap_start_shutdown(void);
   void ap_start_restart(int graceful);
   
  +/* 
  + * ap_signal_parent() - used to send a signal to the parent process.
  + */
  +void ap_signal_parent(ap_context_t *p, const char* signal, const char* 
server_root);
  +
   #ifdef HAS_OTHER_CHILD
   /*
    * register an other_child -- a child which the main loop keeps track of
  
  
  
  1.4       +13 -126   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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- main_win32.c      1999/12/17 21:04:57     1.3
  +++ main_win32.c      1999/12/20 19:07:31     1.4
  @@ -76,111 +76,13 @@
   __declspec(dllexport) int apache_main(int argc, char *argv[]);
   #define DEFAULTSERVICENAME "Apache"
   
  -static int send_signal(const char *signal, const char *server_root, 
ap_context_t *p)
  -{
  -    HANDLE event;
  -    char prefix[20];
  -    char *EventName;
  -    FILE *fp;
  -    int nread;
  -    char *fname;
  -    int end;
  -
  -    printf("signal = %s\n", signal);
  -
  -    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);
  -        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("Unable to open event %s.\n", EventName);
  -        return FALSE;
  -    }
  -    SetEvent(event);
  -    ResetEvent(event);
  -    CloseHandle(event);
  -    return TRUE;
  -}
  -int service_init()
  -{
  -/*
  -    common_init();
  - 
  -    ap_cpystrn(ap_server_root, HTTPD_ROOT, sizeof(ap_server_root));
  -    if (ap_registry_get_service_conf(pconf, ap_server_confname, 
sizeof(ap_server_confname),
  -                                     ap_server_argv0))
  -        return FALSE;
  -
  -    ap_setup_prelinked_modules();
  -    server_conf = ap_read_config(pconf, ptrans, ap_server_confname);
  -    ap_log_pid(pconf, ap_pid_fname);
  -    post_parse_init();
  -*/
  -    return TRUE;
  -}
  -
  -static void usage()
  -{
  -    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);
  -}
  -
   int main(int argc, char *argv[])
   {
       ap_context_t *pwincmd;
       int c;
       char *ch;
       char *service_name = NULL; //DEFAULTSERVICENAME;
  -    char *signal_to_send = NULL;
  +    char *signal = NULL;
       char *server_root = NULL;
       char *server_confname = SERVER_CONFIG_FILE;
       char *temp_server_confname = NULL;
  @@ -195,7 +97,6 @@
   
       ap_create_context(&pwincmd, NULL);
       if (pwincmd == NULL) {
  -//        printf(stderr,"");
           exit(0);
       }
   
  @@ -238,15 +139,15 @@
           new = (char **) ap_push_array(cmdtbl);
           *new = server_root;
           argc += 4;
  -        apache_main(new_argc, (char**) cmdtbl->elts);
  +        service_main(apache_main, new_argc, (char**) cmdtbl->elts);
           exit(0);
       }
   
       /* Munch away at the command line arguments... */
  -    while (ap_getopt(pwincmd, argc, argv, "n:k:iuC:c:d:f:vVlLth", &c) == 
APR_SUCCESS) {
  +    while (ap_getopt(pwincmd, argc, argv, "n:k:iuC:c:d:f:vVlLth?", &c) == 
APR_SUCCESS) {
           switch (c) {
           case 'k':
  -            signal_to_send = ap_pstrdup(pwincmd, ap_optarg);
  +            signal = ap_optarg;
               break;
           case 'i':
               install = TRUE;
  @@ -266,12 +167,6 @@
           case 'd':
               server_root = ap_os_canonical_filename(pwincmd, ap_optarg);
               break;
  -        case 'h':
  -            usage();
  -            break;
  -        case '?':
  -            usage();
  -            break;
           default:
               new = (char **) ap_push_array(cmdtbl);
               ch = ap_pstrndup(pwincmd, (char*)&c, 1);
  @@ -339,16 +234,18 @@
       }
   
       /* Handle -k <signal> -n <service_name> */
  -    if (service_name && signal_to_send) {
  -        send_signal_to_service(service_name, signal_to_send);
  +    if (service_name && signal) {
  +        send_signal_to_service(service_name, signal);
           exit(0);
       }
   
  -    /* Handle -k restart|shutdown */
  -    if (signal_to_send && strcasecmp(signal_to_send, "start")) {
  -        /* Treat -k start confpath as just -f confpath */
  -        send_signal(signal_to_send, server_root, pwincmd);
  -        exit(0);
  +    /* Let http_main handle -k restart|shutdown */
  +    if (signal && strcasecmp(signal, "start")) {
  +        new = (char **) ap_push_array(cmdtbl);
  +        *new = "-k";
  +        new = (char **) ap_push_array(cmdtbl);
  +        *new = signal;
  +        new_argc += 2;    
       }
   
       /* Complete building the new argv list. Need to add:
  @@ -373,14 +270,4 @@
   
       return apache_main(new_argc, (char**) cmdtbl->elts);
       
  -/* What is this? */
  -    /* Console application or a child process. */
  -#if 0
  -    if ((s = strrchr(argv[0], PATHSEPARATOR)) != NULL) {
  -        ap_server_argv0 = ++s;
  -    }
  -    else {
  -        ap_server_argv0 = argv[0];
  -    }
  -#endif
   }
  
  
  
  1.34      +85 -10    apache-2.0/src/modules/mpm/winnt/winnt.c
  
  Index: winnt.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/mpm/winnt/winnt.c,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- winnt.c   1999/12/09 21:50:16     1.33
  +++ winnt.c   1999/12/20 19:07:33     1.34
  @@ -75,7 +75,7 @@
    * Definitions of WINNT MPM specific config globals
    */
   
  -char *ap_pid_fname=NULL;
  +static char *ap_pid_fname = NULL;
   static int ap_threads_per_child = 0;
   static int workers_may_exit = 0;
   static int max_requests_per_child = 0;
  @@ -349,6 +349,61 @@
   {
       signal_parent(0);
   }
  +
  +void ap_signal_parent(ap_context_t *p, const char* signal, 
  +                      const char* server_root) 
  +{
  +    HANDLE event;
  +    char prefix[20];
  +    char *EventName;
  +    FILE *fp;
  +    int nread;
  +    char *fname;
  +    int end;
  +
  +    printf("signal = %s\n", signal);
  +
  +    fname = ap_server_root_relative (p, ap_pid_fname);
  +
  +    fp = fopen(fname, "r");
  +    if (!fp) {
  +     printf("Cannot read apache PID file %s. Error = %d\n", fname, errno);
  +        return;
  +    }
  +    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;
  +    }
  +    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("Unable to open event %s.\n", EventName);
  +        return;
  +    }
  +    SetEvent(event);
  +    ResetEvent(event);
  +    CloseHandle(event);
  +    return;
  +}
   /*
    * Initialise the signal names, in the global variables signal_name_prefix, 
    * signal_restart_name and signal_shutdown_name.
  @@ -1321,7 +1376,7 @@
       int rv;
       char buf[1024];
       char *pCommand;
  -
  +    int i;
       STARTUPINFO si;           /* Filled in prior to call to CreateProcess */
       PROCESS_INFORMATION pi;   /* filled in on call to CreateProces */
   
  @@ -1363,8 +1418,11 @@
           return -1;
       }
   
  -    //pCommand = ap_psprintf(p, "\"%s\" -f \"%s\"", buf, 
ap_server_confname);  
  -    pCommand = ap_psprintf(p, "\"%s\" -f \"%s\"", buf, SERVER_CONFIG_FILE);  
  +    /* Build the command line */
  +    pCommand = ap_psprintf(p, "\"%s\"", buf);  
  +    for (i = 1; i < server_conf->process->argc; i++) {
  +        pCommand = ap_pstrcat(p, pCommand, " \"", 
server_conf->process->argv[i], "\"", NULL);
  +    }
   
       /* Create a pipe to send socket info to the child */
       if (!CreatePipe(&hPipeRead, &hPipeWrite, &sa, 0)) {
  @@ -1497,6 +1555,11 @@
       /* Create child process 
        * Should only be one in this version of Apache for WIN32 
        */
  +#if 1
  +//    ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, 3000);
  +#else
  +//    service_set_status(SERVICE_START_PENDING);
  +#endif
       while (remaining_children_to_start--) {
           if (create_process(pconf, process_handles, process_kill_events, 
                              &current_live_processes) < 0) {
  @@ -1506,8 +1569,11 @@
               goto die_now;
           }
       }
  -
  -    /* service_set_status(SERVICE_RUNNING);*/
  +#if 1
  +//    ReportStatusToSCMgr(SERVICE_RUNNING, NO_ERROR, 3000);
  +#else
  +//    service_set_status(SERVICE_RUNNING);
  +#endif
       restart_pending = shutdown_pending = 0;
       
       /* Wait for shutdown or restart events or for child death */
  @@ -1640,7 +1706,7 @@
       else {
           /* This is the parent */
           parent_pid = my_pid = getpid();
  -        ap_log_pid(pconf, ap_pid_fname);
  +
       }
   
       ap_listen_pre_config();
  @@ -1700,9 +1766,14 @@
   
           ap_clear_pool(plog);
           ap_open_logs(server_conf, plog);
  -              setup_signal_names(ap_psprintf(pconf,"ap%d", parent_pid));
  +        setup_signal_names(ap_psprintf(pconf,"ap%d", parent_pid));
           if (!restart) {
  -            /* service_set_status(SERVICE_START_PENDING);*/
  +            ap_log_pid(pconf, ap_pid_fname);
  +#if 1
  +//            ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, 3000);
  +#else
  +//            service_set_status(SERVICE_START_PENDING);
  +#endif
               AMCSocketInitialize();
   //            setup_signal_names(ap_psprintf(pconf,"ap%d", parent_pid));
           
  @@ -1756,7 +1827,11 @@
               CloseHandle(restart_event);
               CloseHandle(shutdown_event);
               AMCSocketCleanup();
  -            /* service_set_status(SERVICE_STOPPED); */
  +#if 1
  +//            ReportStatusToSCMgr(SERVICE_STOPPED, NO_ERROR, 3000);
  +#else
  +//            service_set_status(SERVICE_STOPPED);
  +#endif
           }
       }
       return !restart;
  
  
  

Reply via email to