@@ -643,7 +643,12 @@ static void send_subscription(int sfd, char *host, char *message, uint16_t messa
643643 memset (& udp_addr , 0 , sizeof (struct sockaddr_in ));
644644 udp_addr .sin_family = AF_INET ;
645645 udp_addr .sin_port = htons (atoi (udp_port + 1 ));
646- udp_addr .sin_addr .s_addr = inet_addr (host );
646+ char * resolved = uwsgi_resolve_ip (host );
647+ if (!resolved ) {
648+ uwsgi_error ("send_subscription()/socket()" );
649+ return ;
650+ }
651+ udp_addr .sin_addr .s_addr = inet_addr (resolved );
647652 ret = sendto (fd , message , message_size , 0 , (struct sockaddr * ) & udp_addr , sizeof (udp_addr ));
648653 udp_port [0 ] = ':' ;
649654 }
@@ -669,15 +674,15 @@ static void send_subscription(int sfd, char *host, char *message, uint16_t messa
669674 close (fd );
670675}
671676
672- static struct uwsgi_buffer * uwsgi_subscription_ub (char * key , size_t keysize , uint8_t modifier1 , uint8_t modifier2 , uint8_t cmd , char * socket_name , char * sign , char * sni_key , char * sni_crt , char * sni_ca ) {
677+ static struct uwsgi_buffer * uwsgi_subscription_ub (char * key , size_t keysize , uint8_t modifier1 , uint8_t modifier2 , uint8_t cmd , char * address , char * sign , char * sni_key , char * sni_crt , char * sni_ca ) {
673678 struct uwsgi_buffer * ub = uwsgi_buffer_new (4096 );
674679
675680 // make space for uwsgi header
676681 ub -> pos = 4 ;
677682
678683 if (uwsgi_buffer_append_keyval (ub , "key" , 3 , key , keysize ))
679684 goto end ;
680- if (uwsgi_buffer_append_keyval (ub , "address" , 7 , socket_name , strlen (socket_name )))
685+ if (uwsgi_buffer_append_keyval (ub , "address" , 7 , address , strlen (address )))
681686 goto end ;
682687
683688 if (uwsgi .subscribe_with_modifier1 ) {
@@ -752,16 +757,16 @@ static struct uwsgi_buffer *uwsgi_subscription_ub(char *key, size_t keysize, uin
752757 return NULL ;
753758}
754759
755- void uwsgi_send_subscription_from_fd (int fd , char * udp_address , char * key , size_t keysize , uint8_t modifier1 , uint8_t modifier2 , uint8_t cmd , char * socket_name , char * sign , char * sni_key , char * sni_crt , char * sni_ca ) {
760+ void uwsgi_send_subscription_from_fd (int fd , char * udp_address , char * key , size_t keysize , uint8_t modifier1 , uint8_t modifier2 , uint8_t cmd , char * address , char * sign , char * sni_key , char * sni_crt , char * sni_ca ) {
756761
757- if (socket_name == NULL && !uwsgi .sockets )
762+ if (address == NULL && !uwsgi .sockets )
758763 return ;
759764
760- if (!socket_name ) {
761- socket_name = uwsgi .sockets -> name ;
765+ if (!address ) {
766+ address = uwsgi .sockets -> name ;
762767 }
763768
764- struct uwsgi_buffer * ub = uwsgi_subscription_ub (key , keysize , modifier1 , modifier2 , cmd , socket_name , sign , sni_key , sni_crt , sni_ca );
769+ struct uwsgi_buffer * ub = uwsgi_subscription_ub (key , keysize , modifier1 , modifier2 , cmd , address , sign , sni_key , sni_crt , sni_ca );
765770
766771 if (!ub )
767772 return ;
@@ -771,8 +776,8 @@ void uwsgi_send_subscription_from_fd(int fd, char *udp_address, char *key, size_
771776}
772777
773778
774- void uwsgi_send_subscription (char * udp_address , char * key , size_t keysize , uint8_t modifier1 , uint8_t modifier2 , uint8_t cmd , char * socket_name , char * sign , char * sni_key , char * sni_crt , char * sni_ca ) {
775- uwsgi_send_subscription_from_fd (-1 , udp_address , key , keysize , modifier1 , modifier2 , cmd , socket_name , sign , sni_key , sni_crt , sni_ca );
779+ void uwsgi_send_subscription (char * udp_address , char * key , size_t keysize , uint8_t modifier1 , uint8_t modifier2 , uint8_t cmd , char * address , char * sign , char * sni_key , char * sni_crt , char * sni_ca ) {
780+ uwsgi_send_subscription_from_fd (-1 , udp_address , key , keysize , modifier1 , modifier2 , cmd , address , sign , sni_key , sni_crt , sni_ca );
776781}
777782
778783#ifdef UWSGI_SSL
@@ -880,27 +885,43 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
880885 int keysize = 0 ;
881886 char * modifier1 = NULL ;
882887 int modifier1_len = 0 ;
883- char * socket_name = NULL ;
888+ char * address = NULL ;
889+ char * address_resolved = NULL ;
884890 char * udp_address = subscription ;
885891 char * udp_port = NULL ;
886892 char * subscription_key = NULL ;
887893 char * sign = NULL ;
888894
889- // check for explicit socket_name
895+ // Check for an explicit address. This may be a reference to a shared
896+ // socket i.e. "=0=REST", a unix socket "/path/to/socket.sock=REST",
897+ // or a udp socket "server-address:port=REST"
890898 char * equal = strchr (subscription , '=' );
891899 if (equal ) {
892- socket_name = subscription ;
893- if (socket_name [0 ] == '=' ) {
894- equal = strchr (socket_name + 1 , '=' );
900+ address = subscription ;
901+ if (address [0 ] == '=' ) {
902+ equal = strchr (address + 1 , '=' );
895903 if (!equal )
896904 return ;
897905 * equal = '\0' ;
898- struct uwsgi_socket * us = uwsgi_get_shared_socket_by_num (atoi (socket_name + 1 ));
906+ struct uwsgi_socket * us = uwsgi_get_shared_socket_by_num (atoi (address + 1 ));
899907 if (!us )
900908 return ;
901- socket_name = us -> name ;
909+ address = us -> name ;
902910 }
903911 * equal = '\0' ;
912+
913+ char * address_port = strchr (address , ':' );
914+ if (address_port ) {
915+ * address_port = '\0' ;
916+ char * resolved = uwsgi_resolve_ip (address );
917+ * address_port = ':' ;
918+
919+ if (!resolved )
920+ return ;
921+
922+ address_resolved = uwsgi_concat2n (resolved , strlen (resolved ), address_port , equal - address_port );
923+ }
924+
904925 udp_address = equal + 1 ;
905926 }
906927
@@ -943,7 +964,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
943964 modifier1_len = strlen (modifier1 );
944965 keysize = strlen (key );
945966 }
946- uwsgi_send_subscription (udp_address , key , keysize , uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , socket_name , sign , NULL , NULL , NULL );
967+ uwsgi_send_subscription (udp_address , key , keysize , uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , address_resolved ? address_resolved : address , sign , NULL , NULL , NULL );
947968 modifier1 = NULL ;
948969 modifier1_len = 0 ;
949970 }
@@ -961,7 +982,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
961982 modifier1_len = strlen (modifier1 );
962983 keysize = strlen (key );
963984 }
964- uwsgi_send_subscription (udp_address , key , keysize , uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , socket_name , sign , NULL , NULL , NULL );
985+ uwsgi_send_subscription (udp_address , key , keysize , uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , address_resolved ? address_resolved : address , sign , NULL , NULL , NULL );
965986 modifier1 = NULL ;
966987 modifier1_len = 0 ;
967988 lines [i ] = '\n' ;
@@ -990,7 +1011,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
9901011 modifier1_len = strlen (modifier1 );
9911012 }
9921013
993- uwsgi_send_subscription (udp_address , subscription_key + 1 , strlen (subscription_key + 1 ), uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , socket_name , sign , NULL , NULL , NULL );
1014+ uwsgi_send_subscription (udp_address , subscription_key + 1 , strlen (subscription_key + 1 ), uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , address_resolved ? address_resolved : address , sign , NULL , NULL , NULL );
9941015 if (modifier1 )
9951016 modifier1 [-1 ] = ',' ;
9961017 if (sign )
@@ -1001,6 +1022,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
10011022 if (equal )
10021023 * equal = '=' ;
10031024 free (udp_address );
1025+ free (address_resolved );
10041026
10051027}
10061028
@@ -1010,6 +1032,7 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
10101032 char * s2_key = NULL ;
10111033 char * s2_socket = NULL ;
10121034 char * s2_addr = NULL ;
1035+ char * s2_addr_resolved = NULL ;
10131036 char * s2_weight = NULL ;
10141037 char * s2_sign = NULL ;
10151038 char * s2_modifier1 = NULL ;
@@ -1056,7 +1079,18 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
10561079 modifier2 = atoi (s2_modifier2 );
10571080 }
10581081
1059- uwsgi_send_subscription (s2_server , s2_key , strlen (s2_key ), modifier1 , modifier2 , cmd , s2_addr , s2_sign , s2_sni_key , s2_sni_crt , s2_sni_ca );
1082+ if (s2_addr ) {
1083+ char * port = strchr (s2_addr , ':' );
1084+ if (port ) {
1085+ * port = '\0' ;
1086+ char * resolved = uwsgi_resolve_ip (s2_addr );
1087+ if (!resolved ) goto end ;
1088+ * port = ':' ;
1089+ s2_addr_resolved = uwsgi_concat2n (resolved , strlen (resolved ), port , strlen (port ));
1090+ }
1091+ }
1092+
1093+ uwsgi_send_subscription (s2_server , s2_key , strlen (s2_key ), modifier1 , modifier2 , cmd , s2_addr_resolved ? s2_addr_resolved : s2_addr , s2_sign , s2_sni_key , s2_sni_crt , s2_sni_ca );
10601094end :
10611095 if (s2_server )
10621096 free (s2_server );
@@ -1066,6 +1100,8 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
10661100 free (s2_socket );
10671101 if (s2_addr )
10681102 free (s2_addr );
1103+ if (s2_addr_resolved )
1104+ free (s2_addr_resolved );
10691105 if (s2_weight )
10701106 free (s2_weight );
10711107 if (s2_modifier1 )
0 commit comments