@@ -752,4 +752,74 @@ ngx_stream_lua_ffi_balancer_get_last_failure(ngx_stream_lua_request_t *r,
752
752
}
753
753
754
754
755
+ int
756
+ ngx_stream_lua_ffi_balancer_bind_to_local_addr (ngx_stream_lua_request_t * r ,
757
+ const u_char * addr , size_t addr_len , u_char * errbuf , size_t * errbuf_size )
758
+ {
759
+ u_char * p ;
760
+ ngx_int_t rc ;
761
+ ngx_str_t addr_str ;
762
+ ngx_addr_t * addr_val ;
763
+ ngx_stream_lua_ctx_t * ctx ;
764
+ ngx_stream_upstream_t * u ;
765
+
766
+ if (r == NULL ) {
767
+ p = ngx_snprintf (errbuf , * errbuf_size , "no request found" );
768
+ * errbuf_size = p - errbuf ;
769
+ return NGX_ERROR ;
770
+ }
771
+
772
+ u = r -> session -> upstream ;
773
+ if (u == NULL ) {
774
+ p = ngx_snprintf (errbuf , * errbuf_size , "no upstream found" );
775
+ * errbuf_size = p - errbuf ;
776
+ return NGX_ERROR ;
777
+ }
778
+
779
+ ctx = ngx_stream_lua_get_module_ctx (r , ngx_stream_lua_module );
780
+ if (ctx == NULL ) {
781
+ p = ngx_snprintf (errbuf , * errbuf_size , "no ctx found" );
782
+ * errbuf_size = p - errbuf ;
783
+ return NGX_ERROR ;
784
+ }
785
+
786
+ if ((ctx -> context & NGX_STREAM_LUA_CONTEXT_BALANCER ) == 0 ) {
787
+ p = ngx_snprintf (errbuf , * errbuf_size ,
788
+ "API disabled in the current context" );
789
+ * errbuf_size = p - errbuf ;
790
+ return NGX_ERROR ;
791
+ }
792
+
793
+ addr_val = ngx_pcalloc (r -> pool , sizeof (ngx_addr_t ));
794
+ if (addr_val == NULL ) {
795
+ p = ngx_snprintf (errbuf , * errbuf_size , "no memory" );
796
+ * errbuf_size = p - errbuf ;
797
+ return NGX_ERROR ;
798
+ }
799
+
800
+ addr_str .len = addr_len ;
801
+ addr_str .data = ngx_palloc (r -> pool , addr_len );
802
+ if (addr_str .data == NULL ) {
803
+ p = ngx_snprintf (errbuf , * errbuf_size , "no memory" );
804
+ * errbuf_size = p - errbuf ;
805
+ return NGX_ERROR ;
806
+ }
807
+
808
+ ngx_memcpy (addr_str .data , addr , addr_len );
809
+
810
+ rc = ngx_parse_addr_port (r -> pool , addr_val , addr_str .data , addr_str .len );
811
+ if (rc != NGX_OK ) {
812
+ p = ngx_snprintf (errbuf , * errbuf_size , "parse addr port failed" );
813
+ * errbuf_size = p - errbuf ;
814
+ return NGX_ERROR ;
815
+ }
816
+
817
+ addr_val -> name = addr_str ;
818
+
819
+ u -> peer .local = addr_val ;
820
+
821
+ return NGX_OK ;
822
+ }
823
+
824
+
755
825
/* vi:set ft=c ts=4 sw=4 et fdm=marker: */
0 commit comments