diff --git a/NEWS b/NEWS index 2736cbc8..8d389899 100644 --- a/NEWS +++ b/NEWS @@ -54,6 +54,7 @@ NEWS * [core] wait for grandchild to be ready when daemonizing (fixes #2712, thx pasdVn) * [core] respond 411 Length Required if request has Transfer-Encoding: chunked (fixes #631) * [core] fixed the loading for default modules if they are specified explicitly + * [core] lighttpd -tt performs preflight startup checks (fixes #411) - 1.4.39 - 2016-01-02 * [core] fix memset_s call (fixes #2698) diff --git a/src/base.h b/src/base.h index 6f615a89..7eb9a5fa 100644 --- a/src/base.h +++ b/src/base.h @@ -510,6 +510,7 @@ typedef struct { buffer *breakagelog_file; unsigned short dont_daemonize; + unsigned short preflight_check; buffer *changeroot; buffer *username; buffer *groupname; diff --git a/src/mod_accesslog.c b/src/mod_accesslog.c index 5433f046..0aa0b760 100644 --- a/src/mod_accesslog.c +++ b/src/mod_accesslog.c @@ -584,6 +584,8 @@ SETDEFAULTS_FUNC(log_access_open) { if (buffer_string_is_empty(s->access_logfile)) continue; + if (srv->srvconf.preflight_check) continue; + if (-1 == (s->log_access_fd = open_logfile_or_pipe(srv, s->access_logfile->ptr))) return HANDLER_ERROR; diff --git a/src/network.c b/src/network.c index 0f66ebca..09339095 100644 --- a/src/network.c +++ b/src/network.c @@ -170,11 +170,11 @@ static int network_server_init(server *srv, buffer *host_token, specific_config buffer *b; int is_unix_domain_socket = 0; int fd; + int err; #ifdef __WIN32 WORD wVersionRequested; WSADATA wsaData; - int err; wVersionRequested = MAKEWORD( 2, 2 ); @@ -185,6 +185,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config return -1; } #endif + err = -1; srv_socket = calloc(1, sizeof(*srv_socket)); force_assert(NULL != srv_socket); @@ -380,6 +381,8 @@ static int network_server_init(server *srv, buffer *host_token, specific_config #endif } + if (srv->srvconf.preflight_check) break; + /* check if the socket exists and try to connect to it. */ if (-1 != (fd = connect(srv_socket->fd, (struct sockaddr *) &(srv_socket->addr), addr_len))) { close(fd); @@ -412,6 +415,11 @@ static int network_server_init(server *srv, buffer *host_token, specific_config goto error_free_socket; } + if (srv->srvconf.preflight_check) { + err = 0; + goto error_free_socket; + } + if (0 != bind(srv_socket->fd, (struct sockaddr *) &(srv_socket->addr), addr_len)) { switch(srv_socket->addr.plain.sa_family) { case AF_UNIX: @@ -501,7 +509,7 @@ error_free_socket: buffer_free(b); - return -1; + return err; /* -1 if error; 0 if srv->srvconf.preflight_check successful */ } int network_close(server *srv) { diff --git a/src/server.c b/src/server.c index 3d3bee0b..bb146a11 100644 --- a/src/server.c +++ b/src/server.c @@ -649,6 +649,7 @@ int main (int argc, char **argv) { i_am_root = 0; #endif srv->srvconf.dont_daemonize = 0; + srv->srvconf.preflight_check = 0; while(-1 != (o = getopt(argc, argv, "f:m:hvVDpt"))) { switch(o) { @@ -669,7 +670,7 @@ int main (int argc, char **argv) { buffer_copy_string(srv->srvconf.modules_dir, optarg); break; case 'p': print_config = 1; break; - case 't': test_config = 1; break; + case 't': ++test_config; break; case 'D': srv->srvconf.dont_daemonize = 1; break; case 'v': show_version(); return 0; case 'V': show_features(); return 0; @@ -701,7 +702,14 @@ int main (int argc, char **argv) { } if (test_config) { - printf("Syntax OK\n"); + if (1 == test_config) { + printf("Syntax OK\n"); + } else { /*(test_config > 1)*/ + test_config = 0; + srv->srvconf.preflight_check = 1; + srv->srvconf.dont_daemonize = 1; + buffer_reset(srv->srvconf.pid_file); + } } if (test_config || print_config) { @@ -1084,7 +1092,7 @@ int main (int argc, char **argv) { /* Close stderr ASAP in the child process to make sure that nothing * is being written to that fd which may not be valid anymore. */ - if (-1 == log_error_open(srv)) { + if (!srv->srvconf.preflight_check && -1 == log_error_open(srv)) { log_error_write(srv, __FILE__, __LINE__, "s", "Opening errorlog failed. Going down."); plugins_free(srv); @@ -1143,6 +1151,15 @@ int main (int argc, char **argv) { return -1; } + if (srv->srvconf.preflight_check) { + /*printf("Preflight OK");*//*(stdout reopened to /dev/null)*/ + plugins_free(srv); + network_close(srv); + server_free(srv); + + exit(0); + } + #ifdef HAVE_FORK /**