annotate src/os/win32/ngx_process.c @ 4147:7f64de1cc2c0

Fix for double content when return is used in error_page handler. Test case: location / { error_page 405 /nope; return 405; } location /nope { return 200; } This is expected to return 405 with empty body, but in 0.8.42+ will return builtin 405 error page as well (though not counted in Content-Length, thus breaking protocol). Fix is to use status provided by rewrite script execution in case it's less than NGX_HTTP_BAD_REQUEST even if r->error_status set. This check is in line with one in ngx_http_script_return_code(). Note that this patch also changes behaviour for "return 302 ..." and "rewrite ... redirect" used as error handler. E.g. location / { error_page 405 /redirect; return 405; } location /redirect { rewrite ^ http://example.com/; } will actually return redirect to "http://example.com/" instead of builtin 405 error page with meaningless Location header. This looks like correct change and it's in line with what happens on e.g. directory redirects in error handlers.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 27 Sep 2011 11:11:30 +0000
parents ab353d7dc182
children d620f497c50f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
4 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
5
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
11 int ngx_argc;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
12 char **ngx_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
13 char **ngx_os_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
14
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
15 ngx_int_t ngx_last_process;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
16 ngx_process_t ngx_processes[NGX_MAX_PROCESSES];
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
17
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
18
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
19 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
20 ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn)
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 {
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
22 u_long rc, n, code;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
23 ngx_int_t s;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
24 ngx_pid_t pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
25 ngx_exec_ctx_t ctx;
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
26 HANDLE events[2];
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
27 char file[MAX_PATH + 1];
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
28
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
29 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
30 s = respawn;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
31
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
32 } else {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
33 for (s = 0; s < ngx_last_process; s++) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
34 if (ngx_processes[s].handle == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
35 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
36 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
37 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
38
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
39 if (s == NGX_MAX_PROCESSES) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
40 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
41 "no more than %d processes can be spawned",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
42 NGX_MAX_PROCESSES);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
43 return NGX_INVALID_PID;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
44 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
45 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
46
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
47 n = GetModuleFileName(NULL, file, MAX_PATH);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
48
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
49 if (n == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
50 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
51 "GetModuleFileName() failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
52 return NGX_INVALID_PID;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
53 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
54
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
55 file[n] = '\0';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
56
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
57 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
58 "GetModuleFileName: \"%s\"", file);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
59
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
60 ctx.path = file;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
61 ctx.name = name;
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
62 ctx.args = GetCommandLine();
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
63 ctx.argv = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
64 ctx.envp = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
65
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
66 pid = ngx_execute(cycle, &ctx);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
67
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
68 if (pid == NGX_INVALID_PID) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
69 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
70 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
71
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
72 ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
73
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
74 ngx_processes[s].handle = ctx.child;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
75 ngx_processes[s].pid = pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
76 ngx_processes[s].name = name;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
77
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
78 ngx_sprintf(ngx_processes[s].term_event, "ngx_%s_term_%ul%Z", name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
79 ngx_sprintf(ngx_processes[s].quit_event, "ngx_%s_quit_%ul%Z", name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
80 ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%ul%Z",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
81 name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
82
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
83 events[0] = ngx_master_process_event;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
84 events[1] = ctx.child;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
85
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
86 rc = WaitForMultipleObjects(2, events, 0, 5000);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
87
3475
ab353d7dc182 *) introduce ngx_time_sigsafe_update() to update the error log time only
Igor Sysoev <igor@sysoev.ru>
parents: 3474
diff changeset
88 ngx_time_update();
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
89
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
90 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
91 "WaitForMultipleObjects: %ul", rc);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
92
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
93 switch (rc) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
94
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
95 case WAIT_OBJECT_0:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
96
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
97 ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
98 (char *) ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
99 if (ngx_processes[s].term == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
100 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
101 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
102 ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
103 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
104 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
105
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
106 ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
107 (char *) ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
108 if (ngx_processes[s].quit == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
109 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
110 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
111 ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
112 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
113 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
114
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
115 ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
116 (char *) ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
117 if (ngx_processes[s].reopen == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
118 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
119 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
120 ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
121 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
122 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
123
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
124 if (ResetEvent(ngx_master_process_event) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
125 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
126 "ResetEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
127 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
128 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
129 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
130
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
131 break;
2737
d52cf82d0d77 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2725
diff changeset
132
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
133 case WAIT_OBJECT_0 + 1:
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
134 if (GetExitCodeProcess(ctx.child, &code) == 0) {
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
135 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
136 "GetExitCodeProcess(%P) failed", pid);
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
137 }
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
138
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
139 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
140 "%s process %P exited with code %Xul",
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
141 name, pid, code);
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
142
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
143 goto failed;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
144
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
145 case WAIT_TIMEOUT:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
146 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
147 "the event \"%s\" was not signaled for 5s",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
148 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
149 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
150
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
151 case WAIT_FAILED:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
152 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
153 "WaitForSingleObject(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
154 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
155
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
156 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
157 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
158
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
159 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
160 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
161 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
162
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
163 switch (respawn) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
164
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
165 case NGX_PROCESS_RESPAWN:
3016
d82993af1da0 introduce NGX_PROCESS_JUST_SPAWN and change field name accordingly
Igor Sysoev <igor@sysoev.ru>
parents: 2909
diff changeset
166 ngx_processes[s].just_spawn = 0;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
167 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
168
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
169 case NGX_PROCESS_JUST_RESPAWN:
3016
d82993af1da0 introduce NGX_PROCESS_JUST_SPAWN and change field name accordingly
Igor Sysoev <igor@sysoev.ru>
parents: 2909
diff changeset
170 ngx_processes[s].just_spawn = 1;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
171 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
172 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
173
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
174 if (s == ngx_last_process) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
175 ngx_last_process++;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
176 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
177
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
178 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
179
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
180 failed:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
181
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
182 if (ngx_processes[s].reopen) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
183 ngx_close_handle(ngx_processes[s].reopen);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
184 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
185
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
186 if (ngx_processes[s].quit) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
187 ngx_close_handle(ngx_processes[s].quit);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
188 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
189
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
190 if (ngx_processes[s].term) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
191 ngx_close_handle(ngx_processes[s].term);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
192 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
193
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
194 TerminateProcess(ngx_processes[s].handle, 2);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
195
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
196 if (ngx_processes[s].handle) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
197 ngx_close_handle(ngx_processes[s].handle);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
198 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
199
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
200 return NGX_INVALID_PID;
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 }
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
202
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
203
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
204 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
205 ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
206 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
207 STARTUPINFO si;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
208 PROCESS_INFORMATION pi;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
209
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
210 ngx_memzero(&si, sizeof(STARTUPINFO));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
211 si.cb = sizeof(STARTUPINFO);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
212
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
213 ngx_memzero(&pi, sizeof(PROCESS_INFORMATION));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
214
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
215 if (CreateProcess(ctx->path, ctx->args,
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
216 NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
217 == 0)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
218 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
219 ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
220 "CreateProcess(\"%s\") failed", ngx_argv[0]);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
221
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
222 return 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
223 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
224
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
225 ctx->child = pi.hProcess;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
226
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
227 if (CloseHandle(pi.hThread) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
228 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
229 "CloseHandle(pi.hThread) failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
230 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
231
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
232 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
233 "start %s process %P", ctx->name, pi.dwProcessId);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
234
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
235 return pi.dwProcessId;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
236 }