patches: match current lighttpd patch state
[git-osx-installer.git] / patches / lighttpd / q / t_server_idle-timeout.diff
blob622b404f2cab9cddaf4280cb41a8a5c1a6de5712
1 Subject: [PATCH] server.c: support -i <secs> idle timeout option
3 After <secs> of no activity the server will initiate a graceful
4 shutdown. Defaults to off (0).
6 Signed-off-by: Kyle J. McKay <mackyle@gmail.com>
8 ---
9 src/server.c | 44 ++++++++++++++++++++++++++++++++++++--------
10 1 file changed, 36 insertions(+), 8 deletions(-)
12 diff --git a/src/server.c b/src/server.c
13 index bd65413a..e7b6074f 100644
14 --- a/src/server.c
15 +++ b/src/server.c
16 @@ -559,6 +559,7 @@ static void show_help (void) {
17 "usage:\n" \
18 " -f <name> filename of the config-file\n" \
19 " -m <name> module directory (default: "LIBRARY_DIR")\n" \
20 +" -i <secs> graceful shutdown after <secs> of inactivity\n" \
21 " -p print the parsed config-file in internal form, and exit\n" \
22 " -t test the config-file, and exit\n" \
23 " -D don't go to background (default: go to background)\n" \
24 @@ -581,6 +582,8 @@ int main (int argc, char **argv) {
25 int num_childs = 0;
26 int pid_fd = -1, fd;
27 size_t i;
28 + time_t idle_timeout = 0, server_activity = time(NULL);
29 + int timed_out = 0;
30 #ifdef HAVE_SIGACTION
31 struct sigaction act;
32 #endif
33 @@ -616,7 +619,7 @@ int main (int argc, char **argv) {
34 #endif
35 srv->srvconf.dont_daemonize = 0;
37 - while(-1 != (o = getopt(argc, argv, "f:m:hvVDpt"))) {
38 + while(-1 != (o = getopt(argc, argv, "f:m:i:hvVDpt"))) {
39 switch(o) {
40 case 'f':
41 if (srv->config_storage) {
42 @@ -634,6 +637,18 @@ int main (int argc, char **argv) {
43 case 'm':
44 buffer_copy_string(srv->srvconf.modules_dir, optarg);
45 break;
46 + case 'i': {
47 + char *endptr;
48 + long timeout = strtol(optarg, &endptr, 0);
49 + if (!*optarg || *endptr || timeout < 0) {
50 + log_error_write(srv, __FILE__, __LINE__, "ss",
51 + "Invalid idle timeout value:", optarg);
52 + server_free(srv);
53 + return -1;
54 + }
55 + idle_timeout = (time_t)timeout;
56 + break;
57 + }
58 case 'p': print_config = 1; break;
59 case 't': test_config = 1; break;
60 case 'D': srv->srvconf.dont_daemonize = 1; break;
61 @@ -1519,6 +1534,7 @@ int main (int argc, char **argv) {
62 "polls:", n);
64 #endif
65 + server_activity = time(NULL);
66 fd_ndx = -1;
67 do {
68 fdevent_handler handler;
69 @@ -1559,6 +1575,13 @@ int main (int argc, char **argv) {
70 strerror(errno));
73 + if (idle_timeout && !graceful_shutdown && time(NULL) - server_activity >= idle_timeout) {
74 + log_error_write(srv, __FILE__, __LINE__, "sDs", "[note] idle timeout", (int)idle_timeout,
75 + "s exceeded, initiating graceful shutdown");
76 + timed_out = 1;
77 + graceful_shutdown = 1;
78 + }
80 for (ndx = 0; ndx < srv->joblist->used; ndx++) {
81 connection *con = srv->joblist->ptr[ndx];
82 handler_t r;
83 @@ -1584,16 +1607,21 @@ int main (int argc, char **argv) {
84 remove_pid_file(srv, &pid_fd);
87 + if (timed_out) {
88 + log_error_write(srv, __FILE__, __LINE__, "s",
89 + "server stopped by idle timeout");
90 + } else {
91 #ifdef HAVE_SIGACTION
92 - log_error_write(srv, __FILE__, __LINE__, "sdsd",
93 - "server stopped by UID =",
94 - last_sigterm_info.si_uid,
95 - "PID =",
96 - last_sigterm_info.si_pid);
97 + log_error_write(srv, __FILE__, __LINE__, "sdsd",
98 + "server stopped by UID =",
99 + last_sigterm_info.si_uid,
100 + "PID =",
101 + last_sigterm_info.si_pid);
102 #else
103 - log_error_write(srv, __FILE__, __LINE__, "s",
104 - "server stopped");
105 + log_error_write(srv, __FILE__, __LINE__, "s",
106 + "server stopped");
107 #endif
110 /* clean-up */
111 log_error_close(srv);