アットウィキロゴ

httpd-2.0.63_server_main.c

memo


処理の流れ





   382 int main(int argc, const char * const argv[])
   383 {
   384     char c;
   385     int configtestonly = 0;
   386     const char *confname = SERVER_CONFIG_FILE;
   387     const char *def_server_root = HTTPD_ROOT;
   388     const char *temp_error_log = NULL;
   389     process_rec *process;
   390     server_rec *server_conf;
   391     apr_pool_t *pglobal;
   392     apr_pool_t *pconf;
   393     apr_pool_t *plog; /* Pool of log streams, reset _after_ each read of conf */
   394     apr_pool_t *ptemp; /* Pool for temporary config stuff, reset often */
   395     apr_pool_t *pcommands; /* Pool for -D, -C and -c switches */
   396     apr_getopt_t *opt;
   397     apr_status_t rv;
   398     module **mod;
   399     const char *optarg;
   400     APR_OPTIONAL_FN_TYPE(ap_signal_server) *signal_server;
   401
   402     AP_MONCONTROL(0); /* turn off profiling of startup */
   403
   404     process = init_process(&argc, &argv);
   405     pglobal = process->pool;
   406     pconf = process->pconf;
   407     ap_server_argv0 = process->short_name;
   408
   409 #if APR_CHARSET_EBCDIC
   410     if (ap_init_ebcdic(pglobal) != APR_SUCCESS) {
   411         destroy_and_exit_process(process, 1);
   412     }
   413 #endif
   414
   415     apr_pool_create(&pcommands, pglobal);
   416     apr_pool_tag(pcommands, "pcommands");
   417     ap_server_pre_read_config  = apr_array_make(pcommands, 1, sizeof(char *));
   418     ap_server_post_read_config = apr_array_make(pcommands, 1, sizeof(char *));
   419     ap_server_config_defines   = apr_array_make(pcommands, 1, sizeof(char *));
   420
   421     ap_setup_prelinked_modules(process);
   422
   423     ap_run_rewrite_args(process);
   424
   425     /* Maintain AP_SERVER_BASEARGS list in http_main.h to allow the MPM
   426      * to safely pass on our args from its rewrite_args() handler.
   427      */

  1. オプション処理

   428     apr_getopt_init(&opt, pcommands, process->argc, process->argv);
   429
   430     while ((rv = apr_getopt(opt, AP_SERVER_BASEARGS, &c, &optarg))
   431             == APR_SUCCESS) {
   432         char **new;
   433
   434         switch (c) {
   435         case 'c':
   436             new = (char **)apr_array_push(ap_server_post_read_config);
   437             *new = apr_pstrdup(pcommands, optarg);
   438             break;
   439
   440         case 'C':
   441             new = (char **)apr_array_push(ap_server_pre_read_config);
   442             *new = apr_pstrdup(pcommands, optarg);
   443             break;
   444
   445         case 'd':
   446             def_server_root = optarg;
   447             break;
   448
   449         case 'D':
   450             new = (char **)apr_array_push(ap_server_config_defines);
   451             *new = apr_pstrdup(pcommands, optarg);
   452             break;
   453
   454         case 'e':
   455             if (strcasecmp(optarg, "emerg") == 0) {
   456                 ap_default_loglevel = APLOG_EMERG;
   457             }
   458             else if (strcasecmp(optarg, "alert") == 0) {
   459                 ap_default_loglevel = APLOG_ALERT;
   460             }
   461             else if (strcasecmp(optarg, "crit") == 0) {
   462                 ap_default_loglevel = APLOG_CRIT;
   463             }
   464             else if (strncasecmp(optarg, "err", 3) == 0) {
   465                 ap_default_loglevel = APLOG_ERR;
   466             }
   467             else if (strncasecmp(optarg, "warn", 4) == 0) {
   468                 ap_default_loglevel = APLOG_WARNING;
   469             }
   470             else if (strcasecmp(optarg, "notice") == 0) {
   471                 ap_default_loglevel = APLOG_NOTICE;
   472             }
   473             else if (strcasecmp(optarg, "info") == 0) {
   474                 ap_default_loglevel = APLOG_INFO;
   475             }
   476             else if (strcasecmp(optarg, "debug") == 0) {
   477                 ap_default_loglevel = APLOG_DEBUG;
   478             }
   479             else {
   480                 usage(process);
   481             }
   482             break;
   483
   484         case 'E':
   485             temp_error_log = apr_pstrdup(process->pool, optarg);
   486             break;
   487
   488         case 'X':
   489             new = (char **)apr_array_push(ap_server_config_defines);
   490             *new = "DEBUG";
   491             break;
   492
   493         case 'f':
   494             confname = optarg;
   495             break;
   496
   497         case 'v':
   498             printf("Server version: %s\n", ap_get_server_version());
   499             printf("Server built:   %s\n", ap_get_server_built());
   500             destroy_and_exit_process(process, 0);
   501
   502         case 'V':
   503             show_compile_settings();
   504             destroy_and_exit_process(process, 0);
   505
   506         case 'l':
   507             ap_show_modules();
   508             destroy_and_exit_process(process, 0);
   509
   510         case 'L':
   511             ap_show_directives();
   512             destroy_and_exit_process(process, 0);
   513
   514         case 't':
   515             configtestonly = 1;
   516             break;
   517
   518         case 'S':
   519             configtestonly = 1;
   520             new = (char **)apr_array_push(ap_server_config_defines);
   521             *new = "DUMP_VHOSTS";
   522             break;
   523
   524         case 'h':
   525         case '?':
   526             usage(process);
   527         }
   528     }
   529
   530     /* bad cmdline option?  then we die */
   531     if (rv != APR_EOF || opt->ind < opt->argc) {
   532         usage(process);
   533     }


   535     apr_pool_create(&plog, pglobal);
   536     apr_pool_tag(plog, "plog");
   537     apr_pool_create(&ptemp, pconf);
   538     apr_pool_tag(ptemp, "ptemp");
   539
   540     /* Note that we preflight the config file once
   541      * before reading it _again_ in the main loop.
   542      * This allows things, log files configuration
   543      * for example, to settle down.
   544      */
   545
   546     ap_server_root = def_server_root;
   547     if (temp_error_log) {
   548         ap_replace_stderr_log(process->pool, temp_error_log);
   549     }
   550     server_conf = ap_read_config(process, ptemp, confname, &ap_conftree);
   551     if (ap_run_pre_config(pconf, plog, ptemp) != OK) {
   552         ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0,
   553                      NULL, "Pre-configuration failed");
   554         destroy_and_exit_process(process, 1);
   555     }
   556
   557     ap_process_config_tree(server_conf, ap_conftree, process->pconf, ptemp);
   558     ap_fixup_virtual_hosts(pconf, server_conf);
   559     ap_fini_vhost_config(pconf, server_conf);
   560     apr_hook_sort_all();
   561     if (configtestonly) {
   562         ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "Syntax OK");
   563         destroy_and_exit_process(process, 0);
   564     }
   565
   566     signal_server = APR_RETRIEVE_OPTIONAL_FN(ap_signal_server);
   567     if (signal_server) {
   568         int exit_status;
   569
   570         if (signal_server(&exit_status, pconf) != 0) {
   571             destroy_and_exit_process(process, exit_status);
   572         }
   573     }
   574
   575     apr_pool_clear(plog);
   576
   577     if ( ap_run_open_logs(pconf, plog, ptemp, server_conf) != OK) {
   578         ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
   579                      0, NULL, "Unable to open logs");
   580         destroy_and_exit_process(process, 1);
   581     }
   582
   583     if ( ap_run_post_config(pconf, plog, ptemp, server_conf) != OK) {
   584         ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0,
   585                      NULL, "Configuration Failed");
   586         destroy_and_exit_process(process, 1);
   587     }
   588
   589     apr_pool_destroy(ptemp);
   590
   591     for (;;) {
   592         apr_hook_deregister_all();
   593         apr_pool_clear(pconf);
   594
   595         for (mod = ap_prelinked_modules; *mod != NULL; mod++) {
   596             ap_register_hooks(*mod, pconf);
   597         }
   598
   599         /* This is a hack until we finish the code so that it only reads
   600          * the config file once and just operates on the tree already in
   601          * memory.  rbb
   602          */
   603         ap_conftree = NULL;
   604         apr_pool_create(&ptemp, pconf);
   605         apr_pool_tag(ptemp, "ptemp");
   606         ap_server_root = def_server_root;
   607         server_conf = ap_read_config(process, ptemp, confname, &ap_conftree);
   608         if (ap_run_pre_config(pconf, plog, ptemp) != OK) {
   609             ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
   610                          0, NULL, "Pre-configuration failed");
   611             destroy_and_exit_process(process, 1);
   612         }
   613
   614         ap_process_config_tree(server_conf, ap_conftree, process->pconf, ptemp);
   615         ap_fixup_virtual_hosts(pconf, server_conf);
   616         ap_fini_vhost_config(pconf, server_conf);
   617         apr_hook_sort_all();
   618         apr_pool_clear(plog);
   619         if (ap_run_open_logs(pconf, plog, ptemp, server_conf) != OK) {
   620             ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
   621                          0, NULL, "Unable to open logs");
   622             destroy_and_exit_process(process, 1);
   623         }
   624
   625         if (ap_run_post_config(pconf, plog, ptemp, server_conf) != OK) {
   626             ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
   627                          0, NULL, "Configuration Failed");
   628             destroy_and_exit_process(process, 1);
   629         }
   630
   631         apr_pool_destroy(ptemp);
   632         apr_pool_lock(pconf, 1);
   633
   634         ap_run_optional_fn_retrieve();
   635
   636         if (ap_mpm_run(pconf, plog, server_conf))
   637             break;
   638
   639         apr_pool_lock(pconf, 0);
   640     }
   641
   642     apr_pool_lock(pconf, 0);
   643     destroy_and_exit_process(process, 0);
   644
   645     return 0; /* Termination 'ok' */
   646 }
   647
   648 /* force Expat to be linked into the server executable */
   649 #if defined(USE_EXPAT) && !defined(SHARED_CORE_BOOTSTRAP)
   650 #include "xmlparse.h"
   651 const XML_LChar *suck_in_expat(void);
   652 const XML_LChar *suck_in_expat(void)
   653 {
   654     return XML_ErrorString(XML_ERROR_NONE);
   655 }
   656 #endif /* USE_EXPAT */
   657
   658 #ifndef SHARED_CORE_BOOTSTRAP
   659 /*
   660  * Force apr_password_validate() into the image so that modules like
   661  * mod_auth can use it even if they're dynamically loaded.
   662  */
   663 void suck_in_apr_password_validate(void);
   664 void suck_in_apr_password_validate(void)
   665 {
   666     apr_password_validate("a", "b");
   667 }
   668 #endif
   669
   670 #ifdef AP_USING_AUTOCONF
   671 /* This ugly little hack pulls any function referenced in exports.c into
   672  * the web server.  exports.c is generated during the build, and it
   673  * has all of the APR functions specified by the apr/apr.exports and
   674  * apr-util/aprutil.exports files.
   675  */
   676 const void *suck_in_APR(void);
   677 const void *suck_in_APR(void)
   678 {
   679     extern const void *ap_ugly_hack;
   680
   681     return ap_ugly_hack;
   682 }
   683 #endif

source


     1 /* Licensed to the Apache Software Foundation (ASF) under one or more
     2  * contributor license agreements.  See the NOTICE file distributed with
     3  * this work for additional information regarding copyright ownership.
     4  * The ASF licenses this file to You under the Apache License, Version 2.0
     5  * (the "License"); you may not use this file except in compliance with
     6  * the License.  You may obtain a copy of the License at
     7  *
     8  *     http://www.apache.org/licenses/LICENSE-2.0
     9  *
    10  * Unless required by applicable law or agreed to in writing, software
    11  * distributed under the License is distributed on an "AS IS" BASIS,
    12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  * See the License for the specific language governing permissions and
    14  * limitations under the License.
    15  */
    16
    17 #include "apr.h"
    18 #include "apr_strings.h"
    19 #include "apr_getopt.h"
    20 #include "apr_general.h"
    21 #include "apr_lib.h"
    22 #include "apr_md5.h"
    23 #include "apr_time.h"
    24 #include "apr_version.h"
    25 #include "apu_version.h"
    26
    27 #define APR_WANT_STDIO
    28 #define APR_WANT_STRFUNC
    29 #include "apr_want.h"
    30
    31 #define CORE_PRIVATE
    32 #include "ap_config.h"
    33 #include "httpd.h"
    34 #include "http_main.h"
    35 #include "http_log.h"
    36 #include "http_config.h"
    37 #include "http_vhost.h"
    38 #include "apr_uri.h"
    39 #include "util_ebcdic.h"
    40 #include "ap_mpm.h"
    41 #include "mpm_common.h"
    42
    43 /* WARNING: Win32 binds http_main.c dynamically to the server. Please place
    44  *          extern functions and global data in another appropriate module.
    45  *
    46  * Most significant main() global data can be found in http_config.c
    47  */
    48
    49 /* XXX - We should be able to grab the per-MPM settings here too */
    50 static void show_compile_settings(void)
    51 {
    52     printf("Server version: %s\n", ap_get_server_version());
    53     printf("Server built:   %s\n", ap_get_server_built());
    54     printf("Server's Module Magic Number: %u:%u\n",
    55            MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR);
    56     printf("Server loaded:  APR %s, APR-UTIL %s\n",
    57            apr_version_string(), apu_version_string());
    58     printf("Compiled using: APR %s, APR-UTIL %s\n",
    59            APR_VERSION_STRING, APU_VERSION_STRING);
    60     /* sizeof(foo) is long on some platforms so we might as well
    61      * make it long everywhere to keep the printf format
    62      * consistent
    63      */
    64     printf("Architecture:   %ld-bit\n", 8 * (long)sizeof(void *));
    65     printf("Server compiled with....\n");
    66 #ifdef BIG_SECURITY_HOLE
    67     printf(" -D BIG_SECURITY_HOLE\n");
    68 #endif
    69
    70 #ifdef SECURITY_HOLE_PASS_AUTHORIZATION
    71     printf(" -D SECURITY_HOLE_PASS_AUTHORIZATION\n");
    72 #endif
    73
    74 #ifdef APACHE_MPM_DIR
    75     printf(" -D APACHE_MPM_DIR=\"%s\"\n", APACHE_MPM_DIR);
    76 #endif
    77
    78 #ifdef HAVE_SHMGET
    78 #ifdef HAVE_SHMGET
    79     printf(" -D HAVE_SHMGET\n");
    80 #endif
    81
    82 #if APR_FILE_BASED_SHM
    83     printf(" -D APR_FILE_BASED_SHM\n");
    84 #endif
    85
    86 #if APR_HAS_SENDFILE
    87     printf(" -D APR_HAS_SENDFILE\n");
    88 #endif
    89
    90 #if APR_HAS_MMAP
    91     printf(" -D APR_HAS_MMAP\n");
    92 #endif
    93
    94 #ifdef NO_WRITEV
    95     printf(" -D NO_WRITEV\n");
    96 #endif
    97
    98 #ifdef NO_LINGCLOSE
    99     printf(" -D NO_LINGCLOSE\n");
   100 #endif
   101
   102 #if APR_HAVE_IPV6
   103     printf(" -D APR_HAVE_IPV6 (IPv4-mapped addresses ");
   104 #ifdef AP_ENABLE_V4_MAPPED
   105     printf("enabled)\n");
   106 #else
   107     printf("disabled)\n");
   108 #endif
   109 #endif
   110
   111 #if APR_USE_FLOCK_SERIALIZE
   112     printf(" -D APR_USE_FLOCK_SERIALIZE\n");
   113 #endif
   114
   115 #if APR_USE_SYSVSEM_SERIALIZE
   116     printf(" -D APR_USE_SYSVSEM_SERIALIZE\n");
   117 #endif
   118
   119 #if APR_USE_POSIXSEM_SERIALIZE
   120     printf(" -D APR_USE_POSIXSEM_SERIALIZE\n");
   121 #endif
   122
   123 #if APR_USE_FCNTL_SERIALIZE
   124     printf(" -D APR_USE_FCNTL_SERIALIZE\n");
   125 #endif
   126
   127 #if APR_USE_PROC_PTHREAD_SERIALIZE
   128     printf(" -D APR_USE_PROC_PTHREAD_SERIALIZE\n");
   129 #endif
   130
   131 #if APR_USE_PTHREAD_SERIALIZE
   132     printf(" -D APR_USE_PTHREAD_SERIALIZE\n");
   133 #endif
   134
   135 #if APR_PROCESS_LOCK_IS_GLOBAL
   136     printf(" -D APR_PROCESS_LOCK_IS_GLOBAL\n");
   137 #endif
   138
   139 #ifdef SINGLE_LISTEN_UNSERIALIZED_ACCEPT
   140     printf(" -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT\n");
   141 #endif
   142
   143 #if APR_HAS_OTHER_CHILD
   144     printf(" -D APR_HAS_OTHER_CHILD\n");
   145 #endif
   146
   147 #ifdef AP_HAVE_RELIABLE_PIPED_LOGS
   148     printf(" -D AP_HAVE_RELIABLE_PIPED_LOGS\n");
   149 #endif
   150
   151 #ifdef BUFFERED_LOGS
   152     printf(" -D BUFFERED_LOGS\n");
   153 #ifdef PIPE_BUF
   154     printf(" -D PIPE_BUF=%ld\n",(long)PIPE_BUF);
   155 #endif
   156 #endif
   157
   158 #if APR_CHARSET_EBCDIC
   159     printf(" -D APR_CHARSET_EBCDIC\n");
   160 #endif
   161
   162 #ifdef APACHE_XLATE
   163     printf(" -D APACHE_XLATE\n");
   164 #endif
   165
   166 #ifdef NEED_HASHBANG_EMUL
   167     printf(" -D NEED_HASHBANG_EMUL\n");
   168 #endif
   169
   170 #ifdef SHARED_CORE
   171     printf(" -D SHARED_CORE\n");
   172 #endif
   173
   174 /* This list displays the compiled in default paths: */
   175 #ifdef HTTPD_ROOT
   176     printf(" -D HTTPD_ROOT=\"" HTTPD_ROOT "\"\n");
   177 #endif
   178
   179 #ifdef SUEXEC_BIN
   180     printf(" -D SUEXEC_BIN=\"" SUEXEC_BIN "\"\n");
   181 #endif
   182
   183 #if defined(SHARED_CORE) && defined(SHARED_CORE_DIR)
   184     printf(" -D SHARED_CORE_DIR=\"" SHARED_CORE_DIR "\"\n");
   185 #endif
   186
   187 #ifdef DEFAULT_PIDLOG
   188     printf(" -D DEFAULT_PIDLOG=\"" DEFAULT_PIDLOG "\"\n");
   189 #endif
   190
   191 #ifdef DEFAULT_SCOREBOARD
   192     printf(" -D DEFAULT_SCOREBOARD=\"" DEFAULT_SCOREBOARD "\"\n");
   193 #endif
   194
   195 #ifdef DEFAULT_LOCKFILE
   196     printf(" -D DEFAULT_LOCKFILE=\"" DEFAULT_LOCKFILE "\"\n");
   197 #endif
   198
   199 #ifdef DEFAULT_ERRORLOG
   200     printf(" -D DEFAULT_ERRORLOG=\"" DEFAULT_ERRORLOG "\"\n");
   201 #endif
   202
   203 #ifdef AP_TYPES_CONFIG_FILE
   204     printf(" -D AP_TYPES_CONFIG_FILE=\"" AP_TYPES_CONFIG_FILE "\"\n");
   205 #endif
   206
   207 #ifdef SERVER_CONFIG_FILE
   208     printf(" -D SERVER_CONFIG_FILE=\"" SERVER_CONFIG_FILE "\"\n");
   209 #endif
   210 }
   211
   212 static void destroy_and_exit_process(process_rec *process,
   213                                      int process_exit_value)
   214 {
   215     apr_pool_destroy(process->pool); /* and destroy all descendent pools */
   216     apr_terminate();
   217     exit(process_exit_value);
   218 }
   219
   220 static process_rec *init_process(int *argc, const char * const * *argv)
   221 {
   222     process_rec *process;
   223     apr_pool_t *cntx;
   224     apr_status_t stat;
   225     const char *failed = "apr_app_initialize()";
   226
   227     stat = apr_app_initialize(argc, argv, NULL);
   228     if (stat == APR_SUCCESS) {
   229         failed = "apr_pool_create()";
   230         stat = apr_pool_create(&cntx, NULL);
   231     }
   232
   233     if (stat != APR_SUCCESS) {
   234         /* For all intents and purposes, this is impossibly unlikely,
   235          * but APR doesn't exist yet, we can't use it for reporting
   236          * these earliest two failures;
   237          */
   238         char ctimebuff[APR_CTIME_LEN];
   239         apr_ctime(ctimebuff, apr_time_now());
   240         fprintf(stderr, "[%s] [crit] (%d) %s: %s failed "
   241                         "to initial context, exiting\n",
   242                         ctimebuff, stat, (*argv)[0], failed);
   243         apr_terminate();
   244         exit(1);
   245     }
   246
   247     apr_pool_tag(cntx, "process");
   248     ap_open_stderr_log(cntx);
   249
   250     /* Now we have initialized apr and our logger, no more
   251      * exceptional error reporting required for the lifetime
   252      * of this server process.
   253      */
   254
   255     process = apr_palloc(cntx, sizeof(process_rec));
   256     process->pool = cntx;
   257
   258     apr_pool_create(&process->pconf, process->pool);
   259     apr_pool_tag(process->pconf, "pconf");
   260     process->argc = *argc;
   261     process->argv = *argv;
   262     process->short_name = apr_filepath_name_get((*argv)[0]);
   263     return process;
   264 }
   265
   266 static void usage(process_rec *process)
   267 {
   268     const char *bin = process->argv[0];
   269     char pad[MAX_STRING_LEN];
   270     unsigned i;
   271
   272     for (i = 0; i < strlen(bin); i++) {
   273         pad[i] = ' ';
   274     }
   275
   276     pad[i] = '\0';
   277
   278 #ifdef SHARED_CORE
   279     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL ,
   280                  "Usage: %s [-R directory] [-D name] [-d directory] [-f file]",
   281                  bin);
   282 #else
   283     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   284                  "Usage: %s [-D name] [-d directory] [-f file]", bin);
   285 #endif
   286
   287     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   288                  "       %s [-C \"directive\"] [-c \"directive\"]", pad);
   289
   290 #ifdef WIN32
   291     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   292                  "       %s [-w] [-k start|restart|stop|shutdown]", pad);
   293     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   294                  "       %s [-k install|config|uninstall] [-n service_name]",
   295                  pad);
   296 #endif
   297 #ifdef AP_MPM_WANT_SIGNAL_SERVER
   298     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   299                  "       %s [-k start|restart|graceful|stop]",
   300                  pad);
   301 #endif
   302     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   303                  "       %s [-v] [-V] [-h] [-l] [-L] [-t] [-S]", pad);
   304     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   305                  "Options:");
   306
   307 #ifdef SHARED_CORE
   308     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   309                  "  -R directory      : specify an alternate location for "
   310                  "shared object files");
   311 #endif
   312
   313     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   314                  "  -D name           : define a name for use in "
   315                  "<IfDefine name> directives");
   316     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   317                  "  -d directory      : specify an alternate initial "
   318                  "ServerRoot");
   319     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   320                  "  -f file           : specify an alternate ServerConfigFile");
   321     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   322                  "  -C \"directive\"    : process directive before reading "
   323                  "config files");
   324     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   325                  "  -c \"directive\"    : process directive after reading "
   326                  "config files");
   327
   328 #ifdef NETWARE
   329     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   330                  "  -n name           : set screen name");
   331 #endif
   332 #ifdef WIN32
   333     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   334                  "  -n name           : set service name and use its "
   335                  "ServerConfigFile");
   336     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   337                  "  -k start          : tell Apache to start");
   338     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   339                  "  -k restart        : tell running Apache to do a graceful "
   340                  "restart");
   341     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   342                  "  -k stop|shutdown  : tell running Apache to shutdown");
   343     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   344                  "  -k install        : install an Apache service");
   345     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   346                  "  -k config         : change startup Options of an Apache "
   347                  "service");
   348     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   349                  "  -k uninstall      : uninstall an Apache service");
   350     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   351                  "  -w                : hold open the console window on error");
   352 #endif
   353
   354     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   355                  "  -e level          : show startup errors of level "
   356                  "(see LogLevel)");
   357     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   358                  "  -E file           : log startup errors to file");
   359     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   360                  "  -v                : show version number");
   361     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   362                  "  -V                : show compile settings");
   363     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   364                  "  -h                : list available command line options "
   365                  "(this page)");
   366     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   367                  "  -l                : list compiled in modules");
   368     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   369                  "  -L                : list available configuration "
   370                  "directives");
   371     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   372                  "  -t -D DUMP_VHOSTS : show parsed settings (currently only "
   373                  "vhost settings)");
   374     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   375                  "  -S                : a synonym for -t -D DUMP_VHOSTS");
   376     ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
   377                  "  -t                : run syntax check for config files");
   378
   379     destroy_and_exit_process(process, 1);
   380 }
   381
   382 int main(int argc, const char * const argv[])
   383 {
   384     char c;
   385     int configtestonly = 0;
   386     const char *confname = SERVER_CONFIG_FILE;
   387     const char *def_server_root = HTTPD_ROOT;
   388     const char *temp_error_log = NULL;
   389     process_rec *process;
   390     server_rec *server_conf;
   391     apr_pool_t *pglobal;
   392     apr_pool_t *pconf;
   393     apr_pool_t *plog; /* Pool of log streams, reset _after_ each read of conf */
   394     apr_pool_t *ptemp; /* Pool for temporary config stuff, reset often */
   395     apr_pool_t *pcommands; /* Pool for -D, -C and -c switches */
   396     apr_getopt_t *opt;
   397     apr_status_t rv;
   398     module **mod;
   399     const char *optarg;
   400     APR_OPTIONAL_FN_TYPE(ap_signal_server) *signal_server;
   401
   402     AP_MONCONTROL(0); /* turn off profiling of startup */
   403
   404     process = init_process(&argc, &argv);
   405     pglobal = process->pool;
   406     pconf = process->pconf;
   407     ap_server_argv0 = process->short_name;
   408
   409 #if APR_CHARSET_EBCDIC
   410     if (ap_init_ebcdic(pglobal) != APR_SUCCESS) {
   411         destroy_and_exit_process(process, 1);
   412     }
   413 #endif
   414
   415     apr_pool_create(&pcommands, pglobal);
   416     apr_pool_tag(pcommands, "pcommands");
   417     ap_server_pre_read_config  = apr_array_make(pcommands, 1, sizeof(char *));
   418     ap_server_post_read_config = apr_array_make(pcommands, 1, sizeof(char *));
   419     ap_server_config_defines   = apr_array_make(pcommands, 1, sizeof(char *));
   420
   421     ap_setup_prelinked_modules(process);
   422
   423     ap_run_rewrite_args(process);
   424
   425     /* Maintain AP_SERVER_BASEARGS list in http_main.h to allow the MPM
   426      * to safely pass on our args from its rewrite_args() handler.
   427      */
   428     apr_getopt_init(&opt, pcommands, process->argc, process->argv);
   429
   430     while ((rv = apr_getopt(opt, AP_SERVER_BASEARGS, &c, &optarg))
   431             == APR_SUCCESS) {
   432         char **new;
   433
   434         switch (c) {
   435         case 'c':
   436             new = (char **)apr_array_push(ap_server_post_read_config);
   437             *new = apr_pstrdup(pcommands, optarg);
   438             break;
   439
   440         case 'C':
   441             new = (char **)apr_array_push(ap_server_pre_read_config);
   442             *new = apr_pstrdup(pcommands, optarg);
   443             break;
   444
   445         case 'd':
   446             def_server_root = optarg;
   447             break;
   448
   449         case 'D':
   450             new = (char **)apr_array_push(ap_server_config_defines);
   451             *new = apr_pstrdup(pcommands, optarg);
   452             break;
   453
   454         case 'e':
   455             if (strcasecmp(optarg, "emerg") == 0) {
   456                 ap_default_loglevel = APLOG_EMERG;
   457             }
   458             else if (strcasecmp(optarg, "alert") == 0) {
   459                 ap_default_loglevel = APLOG_ALERT;
   460             }
   461             else if (strcasecmp(optarg, "crit") == 0) {
   462                 ap_default_loglevel = APLOG_CRIT;
   463             }
   464             else if (strncasecmp(optarg, "err", 3) == 0) {
   465                 ap_default_loglevel = APLOG_ERR;
   466             }
   467             else if (strncasecmp(optarg, "warn", 4) == 0) {
   468                 ap_default_loglevel = APLOG_WARNING;
   469             }
   470             else if (strcasecmp(optarg, "notice") == 0) {
   471                 ap_default_loglevel = APLOG_NOTICE;
   472             }
   473             else if (strcasecmp(optarg, "info") == 0) {
   474                 ap_default_loglevel = APLOG_INFO;
   475             }
   476             else if (strcasecmp(optarg, "debug") == 0) {
   477                 ap_default_loglevel = APLOG_DEBUG;
   478             }
   479             else {
   480                 usage(process);
   481             }
   482             break;
   483
   484         case 'E':
   485             temp_error_log = apr_pstrdup(process->pool, optarg);
   486             break;
   487
   488         case 'X':
   489             new = (char **)apr_array_push(ap_server_config_defines);
   490             *new = "DEBUG";
   491             break;
   492
   493         case 'f':
   494             confname = optarg;
   495             break;
   496
   497         case 'v':
   498             printf("Server version: %s\n", ap_get_server_version());
   499             printf("Server built:   %s\n", ap_get_server_built());
   500             destroy_and_exit_process(process, 0);
   501
   502         case 'V':
   503             show_compile_settings();
   504             destroy_and_exit_process(process, 0);
   505
   506         case 'l':
   507             ap_show_modules();
   508             destroy_and_exit_process(process, 0);
   509
   510         case 'L':
   511             ap_show_directives();
   512             destroy_and_exit_process(process, 0);
   513
   514         case 't':
   515             configtestonly = 1;
   516             break;
   517
   518         case 'S':
   519             configtestonly = 1;
   520             new = (char **)apr_array_push(ap_server_config_defines);
   521             *new = "DUMP_VHOSTS";
   522             break;
   523
   524         case 'h':
   525         case '?':
   526             usage(process);
   527         }
   528     }
   529
   530     /* bad cmdline option?  then we die */
   531     if (rv != APR_EOF || opt->ind < opt->argc) {
   532         usage(process);
   533     }
   534
   535     apr_pool_create(&plog, pglobal);
   536     apr_pool_tag(plog, "plog");
   537     apr_pool_create(&ptemp, pconf);
   538     apr_pool_tag(ptemp, "ptemp");
   539
   540     /* Note that we preflight the config file once
   541      * before reading it _again_ in the main loop.
   542      * This allows things, log files configuration
   543      * for example, to settle down.
   544      */
   545
   546     ap_server_root = def_server_root;
   547     if (temp_error_log) {
   548         ap_replace_stderr_log(process->pool, temp_error_log);
   549     }
   550     server_conf = ap_read_config(process, ptemp, confname, &ap_conftree);
   551     if (ap_run_pre_config(pconf, plog, ptemp) != OK) {
   552         ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0,
   553                      NULL, "Pre-configuration failed");
   554         destroy_and_exit_process(process, 1);
   555     }
   556
   557     ap_process_config_tree(server_conf, ap_conftree, process->pconf, ptemp);
   558     ap_fixup_virtual_hosts(pconf, server_conf);
   559     ap_fini_vhost_config(pconf, server_conf);
   560     apr_hook_sort_all();
   561     if (configtestonly) {
   562         ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "Syntax OK");
   563         destroy_and_exit_process(process, 0);
   564     }
   565
   566     signal_server = APR_RETRIEVE_OPTIONAL_FN(ap_signal_server);
   567     if (signal_server) {
   568         int exit_status;
   569
   570         if (signal_server(&exit_status, pconf) != 0) {
   571             destroy_and_exit_process(process, exit_status);
   572         }
   573     }
   574
   575     apr_pool_clear(plog);
   576
   577     if ( ap_run_open_logs(pconf, plog, ptemp, server_conf) != OK) {
   578         ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
   579                      0, NULL, "Unable to open logs");
   580         destroy_and_exit_process(process, 1);
   581     }
   582
   583     if ( ap_run_post_config(pconf, plog, ptemp, server_conf) != OK) {
   584         ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0,
   585                      NULL, "Configuration Failed");
   586         destroy_and_exit_process(process, 1);
   587     }
   588
   589     apr_pool_destroy(ptemp);
   590
   591     for (;;) {
   592         apr_hook_deregister_all();
   593         apr_pool_clear(pconf);
   594
   595         for (mod = ap_prelinked_modules; *mod != NULL; mod++) {
   596             ap_register_hooks(*mod, pconf);
   597         }
   598
   599         /* This is a hack until we finish the code so that it only reads
   600          * the config file once and just operates on the tree already in
   601          * memory.  rbb
   602          */
   603         ap_conftree = NULL;
   604         apr_pool_create(&ptemp, pconf);
   605         apr_pool_tag(ptemp, "ptemp");
   606         ap_server_root = def_server_root;
   607         server_conf = ap_read_config(process, ptemp, confname, &ap_conftree);
   608         if (ap_run_pre_config(pconf, plog, ptemp) != OK) {
   609             ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
   610                          0, NULL, "Pre-configuration failed");
   611             destroy_and_exit_process(process, 1);
   612         }
   613
   614         ap_process_config_tree(server_conf, ap_conftree, process->pconf, ptemp);
   615         ap_fixup_virtual_hosts(pconf, server_conf);
   616         ap_fini_vhost_config(pconf, server_conf);
   617         apr_hook_sort_all();
   618         apr_pool_clear(plog);
   619         if (ap_run_open_logs(pconf, plog, ptemp, server_conf) != OK) {
   620             ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
   621                          0, NULL, "Unable to open logs");
   622             destroy_and_exit_process(process, 1);
   623         }
   624
   625         if (ap_run_post_config(pconf, plog, ptemp, server_conf) != OK) {
   626             ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
   627                          0, NULL, "Configuration Failed");
   628             destroy_and_exit_process(process, 1);
   629         }
   630
   631         apr_pool_destroy(ptemp);
   632         apr_pool_lock(pconf, 1);
   633
   634         ap_run_optional_fn_retrieve();
   635
   636         if (ap_mpm_run(pconf, plog, server_conf))
   637             break;
   638
   639         apr_pool_lock(pconf, 0);
   640     }
   641
   642     apr_pool_lock(pconf, 0);
   643     destroy_and_exit_process(process, 0);
   644
   645     return 0; /* Termination 'ok' */
   646 }
   647
   648 /* force Expat to be linked into the server executable */
   649 #if defined(USE_EXPAT) && !defined(SHARED_CORE_BOOTSTRAP)
   650 #include "xmlparse.h"
   651 const XML_LChar *suck_in_expat(void);
   652 const XML_LChar *suck_in_expat(void)
   653 {
   654     return XML_ErrorString(XML_ERROR_NONE);
   655 }
   656 #endif /* USE_EXPAT */
   657
   658 #ifndef SHARED_CORE_BOOTSTRAP
   659 /*
   660  * Force apr_password_validate() into the image so that modules like
   661  * mod_auth can use it even if they're dynamically loaded.
   662  */
   663 void suck_in_apr_password_validate(void);
   664 void suck_in_apr_password_validate(void)
   665 {
   666     apr_password_validate("a", "b");
   667 }
   668 #endif
   669
   670 #ifdef AP_USING_AUTOCONF
   671 /* This ugly little hack pulls any function referenced in exports.c into
   672  * the web server.  exports.c is generated during the build, and it
   673  * has all of the APR functions specified by the apr/apr.exports and
   674  * apr-util/aprutil.exports files.
   675  */
   676 const void *suck_in_APR(void);
   677 const void *suck_in_APR(void)
   678 {
   679     extern const void *ap_ugly_hack;
   680
   681     return ap_ugly_hack;
   682 }
   683 #endif
最終更新:2009年02月08日 15:33
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。