Skip to content

Commit 0d1c832

Browse files
committed
[fix] fixed a bug (also been in nginx-rtmp-module) that relay failed if:
1. Nginx ran on Unix-like platforms. 2. nginx-http-flv-module compiled as a dynamic module. 3. Nginx ran in multi-processes mode.
1 parent e95f4d9 commit 0d1c832

File tree

1 file changed

+110
-7
lines changed

1 file changed

+110
-7
lines changed

ngx_rtmp_auto_push_module.c

+110-7
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,19 @@ static ngx_int_t
128128
ngx_rtmp_auto_push_init_process(ngx_cycle_t *cycle)
129129
{
130130
#if (NGX_HAVE_UNIX_DOMAIN)
131-
ngx_rtmp_auto_push_conf_t *apcf;
132-
ngx_listening_t *ls, *lss;
133-
struct sockaddr_un *saun;
134-
int reuseaddr;
135-
ngx_socket_t s;
136-
size_t n;
137-
ngx_file_info_t fi;
131+
ngx_rtmp_auto_push_conf_t *apcf;
132+
ngx_listening_t *ls, *lss;
133+
struct sockaddr_un *saun;
134+
#if (nginx_version >= 1009011)
135+
ngx_event_t *rev;
136+
ngx_connection_t *c, *old;
137+
ngx_module_t **modules;
138+
ngx_int_t i, auto_push_index, event_core_index;
139+
#endif
140+
int reuseaddr;
141+
ngx_socket_t s;
142+
size_t n;
143+
ngx_file_info_t fi;
138144

139145
if (ngx_process != NGX_PROCESS_WORKER) {
140146
return NGX_OK;
@@ -260,6 +266,103 @@ ngx_rtmp_auto_push_init_process(ngx_cycle_t *cycle)
260266
ls->reuseport = 0;
261267
#endif
262268

269+
/* for dynamic module */
270+
#if (nginx_version >= 1009011)
271+
auto_push_index = -1;
272+
event_core_index = -1;
273+
274+
modules = cycle->modules;
275+
276+
for (i = 0; modules[i]; ++i) {
277+
if (ngx_strcmp(modules[i]->name, "ngx_event_core_module") == 0) {
278+
event_core_index = i;
279+
}
280+
281+
if (ngx_strcmp(modules[i]->name, "ngx_rtmp_auto_push_module") == 0) {
282+
auto_push_index = i;
283+
}
284+
285+
if (auto_push_index != -1 && event_core_index != -1) {
286+
break;
287+
}
288+
}
289+
290+
if (auto_push_index > event_core_index) {
291+
c = ngx_get_connection(ls->fd, cycle->log);
292+
if (c == NULL) {
293+
goto sock_error;
294+
}
295+
296+
rev = c->read;
297+
298+
c->type = ls->type;
299+
c->log = &ls->log;
300+
301+
c->listening = ls;
302+
ls->connection = c;
303+
304+
rev->log = c->log;
305+
rev->accept = 1;
306+
307+
#if (NGX_HAVE_DEFERRED_ACCEPT)
308+
rev->deferred_accept = ls->deferred_accept;
309+
#endif
310+
311+
if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {
312+
if (ls->previous) {
313+
314+
/*
315+
* delete the old accept events that were bound to
316+
* the old cycle read events array
317+
*/
318+
319+
old = ls->previous->connection;
320+
321+
if (ngx_del_event(old->read, NGX_READ_EVENT, NGX_CLOSE_EVENT)
322+
== NGX_ERROR)
323+
{
324+
return NGX_ERROR;
325+
}
326+
327+
old->fd = (ngx_socket_t) -1;
328+
}
329+
}
330+
331+
#if (NGX_WIN32)
332+
if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
333+
ngx_iocp_conf_t *iocpcf;
334+
335+
rev->handler = ngx_event_acceptex;
336+
337+
if (ngx_add_event(rev, 0, NGX_IOCP_ACCEPT) == NGX_ERROR) {
338+
return NGX_ERROR;
339+
}
340+
341+
ls->log.handler = ngx_acceptex_log_error;
342+
343+
iocpcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_iocp_module);
344+
if (ngx_event_post_acceptex(ls, iocpcf->post_acceptex)
345+
== NGX_ERROR)
346+
{
347+
return NGX_ERROR;
348+
}
349+
} else {
350+
rev->handler = ngx_event_accept;
351+
352+
if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
353+
return NGX_ERROR;
354+
}
355+
}
356+
#else
357+
rev->handler = ngx_event_accept;
358+
359+
if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
360+
return NGX_ERROR;
361+
}
362+
#endif
363+
}
364+
#endif
365+
263366
return NGX_OK;
264367

265368
sock_error:

0 commit comments

Comments
 (0)