@@ -53,7 +53,7 @@ static mrb_value ngx_stream_mrb_add_listener(mrb_state *mrb, mrb_value self)
5353#else
5454 ngx_uint_t i ;
5555#endif
56- ngx_stream_listen_t * ls , * als ;
56+ ngx_stream_listen_opt_t * ls , * als ;
5757
5858 mrb_get_args (mrb , "H" , & listener );
5959 address = mrb_hash_get (mrb , listener , mrb_check_intern_cstr (mrb , "address" ));
@@ -76,13 +76,19 @@ static mrb_value ngx_stream_mrb_add_listener(mrb_state *mrb, mrb_value self)
7676
7777 cmcf = ngx_stream_conf_get_module_main_conf (cf , ngx_stream_core_module );
7878
79- ls = ngx_array_push (& cmcf -> listen );
79+ if (cmcf -> ports == NULL ) {
80+ cmcf -> ports = ngx_array_create (cf -> pool , 4 , sizeof (ngx_stream_listen_opt_t ));
81+ if (cmcf -> ports == NULL ) {
82+ mrb_raise (mrb , E_RUNTIME_ERROR , "Failed to create cmcf->ports array" );
83+ }
84+ }
85+
86+ ls = ngx_array_push (cmcf -> ports );
8087 if (ls == NULL ) {
8188 mrb_raise (mrb , E_RUNTIME_ERROR , "ngx_stream_mrb_add_listener ngx_array_push failed" );
8289 }
8390
84- ngx_memzero (ls , sizeof (ngx_stream_listen_t ));
85-
91+ ngx_memzero (ls , sizeof (ngx_stream_listen_opt_t ));
8692#if (nginx_version < 1015010 )
8793 ngx_memcpy (& ls -> sockaddr .sockaddr , & u .sockaddr , u .socklen );
8894 ls -> socklen = u .socklen ;
@@ -96,7 +102,6 @@ static mrb_value ngx_stream_mrb_add_listener(mrb_state *mrb, mrb_value self)
96102#endif
97103 ls -> type = SOCK_STREAM ;
98104 ls -> wildcard = u .wildcard ;
99- ls -> ctx = cf -> ctx ;
100105
101106#if (NGX_HAVE_INET6 )
102107 ls -> ipv6only = 1 ;
@@ -124,24 +129,24 @@ static mrb_value ngx_stream_mrb_add_listener(mrb_state *mrb, mrb_value self)
124129 }
125130 }
126131
127- als = cmcf -> listen . elts ;
132+ als = cmcf -> ports -> elts ;
128133
129134#if (nginx_version > 1015009 )
130135 for (n = 0 ; n < u .naddrs ; n ++ ) {
131- ls [n ] = ls [0 ];
132- ls [n ].sockaddr = u .addrs [n ].sockaddr ;
133- ls [n ].socklen = u .addrs [n ].socklen ;
134- ls [n ].addr_text = u .addrs [n ].name ;
135- ls [n ].wildcard = ngx_inet_wildcard (ls [n ].sockaddr );
136-
137- for (i = 0 ; i < cmcf -> listen .nelts - u .naddrs + n ; i ++ ) {
138- if (ls [n ].type != als [i ].type ) {
139- continue ;
140- }
141-
142- if (ngx_cmp_sockaddr (als [i ].sockaddr , als [i ].socklen , ls [n ].sockaddr , ls [n ].socklen , 1 ) != NGX_OK ) {
136+ ls [n ] = ls [0 ];
137+ ls [n ].sockaddr = u .addrs [n ].sockaddr ;
138+ ls [n ].socklen = u .addrs [n ].socklen ;
139+ ls [n ].addr_text = u .addrs [n ].name ;
140+ ls [n ].wildcard = ngx_inet_wildcard (ls [n ].sockaddr );
141+
142+ for (i = 0 ; i < cmcf -> ports -> nelts - u .naddrs + n ; i ++ ) {
143+ if (ls [n ].type != als [i ].type ) {
143144 continue ;
144- }
145+ }
146+
147+ if (ngx_cmp_sockaddr (als [i ].sockaddr , als [i ].socklen , ls [n ].sockaddr , ls [n ].socklen , 1 ) != NGX_OK ) {
148+ continue ;
149+ }
145150
146151 ngx_conf_log_error (NGX_LOG_EMERG , cf , 0 , "duplicate \"%V\" address and port pair" , & ls [n ].addr_text );
147152 mrb_raise (mrb , E_RUNTIME_ERROR , "duplicate address and port pair" );
0 commit comments