@@ -41,7 +41,6 @@ static mrb_value ngx_stream_mrb_get_ngx_mruby_name(mrb_state *mrb, mrb_value sel
4141
4242static mrb_value ngx_stream_mrb_add_listener (mrb_state * mrb , mrb_value self )
4343{
44- ngx_stream_core_main_conf_t * cmcf ;
4544 ngx_stream_mruby_srv_conf_t * mscf = mrb -> ud ;
4645 ngx_stream_core_srv_conf_t * cscf = mscf -> ctx -> cscf ;
4746 ngx_conf_t * cf = mscf -> ctx -> cf ;
@@ -53,7 +52,7 @@ static mrb_value ngx_stream_mrb_add_listener(mrb_state *mrb, mrb_value self)
5352#else
5453 ngx_uint_t i ;
5554#endif
56- ngx_stream_listen_t * ls , * als ;
55+ ngx_stream_listen_opt_t ls ;
5756
5857 mrb_get_args (mrb , "H" , & listener );
5958 address = mrb_hash_get (mrb , listener , mrb_check_intern_cstr (mrb , "address" ));
@@ -74,93 +73,57 @@ static mrb_value ngx_stream_mrb_add_listener(mrb_state *mrb, mrb_value self)
7473 mrb_raise (mrb , E_RUNTIME_ERROR , "ngx_stream_mrb_add_listener ngx_parse_url failed" );
7574 }
7675
77- cmcf = ngx_stream_conf_get_module_main_conf (cf , ngx_stream_core_module );
78-
79- ls = ngx_array_push (& cmcf -> listen );
80- if (ls == NULL ) {
81- mrb_raise (mrb , E_RUNTIME_ERROR , "ngx_stream_mrb_add_listener ngx_array_push failed" );
82- }
83-
84- ngx_memzero (ls , sizeof (ngx_stream_listen_t ));
85-
86- #if (nginx_version < 1015010 )
87- ngx_memcpy (& ls -> sockaddr .sockaddr , & u .sockaddr , u .socklen );
88- ls -> socklen = u .socklen ;
89- #endif
90-
91- ls -> backlog = NGX_LISTEN_BACKLOG ;
92-
93- #if (nginx_version >= 1013000 )
94- ls -> rcvbuf = -1 ;
95- ls -> sndbuf = -1 ;
96- #endif
97- ls -> type = SOCK_STREAM ;
98- ls -> wildcard = u .wildcard ;
99- ls -> ctx = cf -> ctx ;
76+ ngx_memzero (& ls , sizeof (ngx_stream_listen_opt_t ));
77+ ls .rcvbuf = -1 ;
78+ ls .sndbuf = -1 ;
79+ ls .type = SOCK_STREAM ;
80+ ls .wildcard = u .wildcard ;
10081
10182#if (NGX_HAVE_INET6 )
102- ls -> ipv6only = 1 ;
83+ ls . ipv6only = 1 ;
10384#endif
10485
10586#if !(NGX_WIN32 )
10687 if (mrb_bool (mrb_hash_get (mrb , listener , mrb_check_intern_cstr (mrb , "udp" )))) {
107- ls -> type = SOCK_DGRAM ;
88+ ls . type = SOCK_DGRAM ;
10889 }
10990#endif
11091
111- if (ls -> type == SOCK_DGRAM ) {
92+ if (ls . type == SOCK_DGRAM ) {
11293#if (NGX_STREAM_SSL )
113- if (ls -> ssl ) {
94+ if (ls . ssl ) {
11495 mrb_raise (mrb , E_RUNTIME_ERROR , "\"ssl\" parameter is incompatible with \"udp\"" );
11596 }
11697#endif
11798
118- if (ls -> so_keepalive ) {
99+ if (ls . so_keepalive ) {
119100 mrb_raise (mrb , E_RUNTIME_ERROR , "\"so_keepalive\" parameter is incompatible with \"udp\"" );
120101 }
121102
122- if (ls -> proxy_protocol ) {
103+ if (ls . proxy_protocol ) {
123104 mrb_raise (mrb , E_RUNTIME_ERROR , "\"proxy_protocol\" parameter is incompatible with \"udp\"" );
124105 }
125106 }
126107
127- als = cmcf -> listen .elts ;
128-
129- #if (nginx_version > 1015009 )
130108 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 ) {
143- continue ;
144- }
145-
146- ngx_conf_log_error (NGX_LOG_EMERG , cf , 0 , "duplicate \"%V\" address and port pair" , & ls [n ].addr_text );
147- mrb_raise (mrb , E_RUNTIME_ERROR , "duplicate address and port pair" );
148- }
149- }
150- #else
151- for (i = 0 ; i < cmcf -> listen .nelts - 1 ; i ++ ) {
152- if (ls -> type != als [i ].type ) {
109+ for (i = 0 ; i < n ; i ++ ) {
110+ if (ngx_cmp_sockaddr (u .addrs [n ].sockaddr , u .addrs [n ].socklen , u .addrs [i ].sockaddr , u .addrs [i ].socklen , 1 ) ==
111+ NGX_OK ) {
112+ goto next ;
113+ }
114+ next :
153115 continue ;
154116 }
155117
156- if (ngx_cmp_sockaddr (& als [i ].sockaddr .sockaddr , als [i ].socklen , & ls -> sockaddr .sockaddr , ls -> socklen , 1 ) != NGX_OK ) {
157- continue ;
158- }
118+ ls .sockaddr = u .addrs [n ].sockaddr ;
119+ ls .socklen = u .addrs [n ].socklen ;
120+ ls .addr_text = u .addrs [n ].name ;
121+ ls .wildcard = ngx_inet_wildcard (ls .sockaddr );
159122
160- ngx_conf_log_error (NGX_LOG_EMERG , cf , 0 , "duplicate \"%V\" address and port pair" , & u .url );
161- mrb_raise (mrb , E_RUNTIME_ERROR , "duplicate address and port pair" );
123+ if (ngx_stream_add_listen (cf , cscf , & ls ) != NGX_OK ) {
124+ mrb_raise (mrb , E_RUNTIME_ERROR , "can't add strem listener" );
125+ }
162126 }
163- #endif
164127
165128 return mrb_true_value ();
166129}
0 commit comments