@@ -602,7 +602,12 @@ static void send_subscription(int sfd, char *host, char *message, uint16_t messa
602602 memset (& udp_addr , 0 , sizeof (struct sockaddr_in ));
603603 udp_addr .sin_family = AF_INET ;
604604 udp_addr .sin_port = htons (atoi (udp_port + 1 ));
605- udp_addr .sin_addr .s_addr = inet_addr (host );
605+ char * resolved = uwsgi_resolve_ip (host );
606+ if (!resolved ) {
607+ uwsgi_error ("send_subscription()/socket()" );
608+ return ;
609+ }
610+ udp_addr .sin_addr .s_addr = inet_addr (resolved );
606611 ret = sendto (fd , message , message_size , 0 , (struct sockaddr * ) & udp_addr , sizeof (udp_addr ));
607612 udp_port [0 ] = ':' ;
608613 }
@@ -652,15 +657,15 @@ static int uwsgi_subscription_ub_fix(struct uwsgi_buffer *ub, uint8_t modifier1,
652657 return 0 ;
653658}
654659
655- 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 ) {
660+ 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 ) {
656661 struct uwsgi_buffer * ub = uwsgi_buffer_new (4096 );
657662
658663 // make space for uwsgi header
659664 ub -> pos = 4 ;
660665
661666 if (uwsgi_buffer_append_keyval (ub , "key" , 3 , key , keysize ))
662667 goto end ;
663- if (uwsgi_buffer_append_keyval (ub , "address" , 7 , socket_name , strlen (socket_name )))
668+ if (uwsgi_buffer_append_keyval (ub , "address" , 7 , address , strlen (address )))
664669 goto end ;
665670
666671 if (uwsgi .subscribe_with_modifier1 ) {
@@ -716,16 +721,16 @@ static struct uwsgi_buffer *uwsgi_subscription_ub(char *key, size_t keysize, uin
716721 return NULL ;
717722}
718723
719- 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 ) {
724+ 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 ) {
720725
721- if (socket_name == NULL && !uwsgi .sockets )
726+ if (address == NULL && !uwsgi .sockets )
722727 return ;
723728
724- if (!socket_name ) {
725- socket_name = uwsgi .sockets -> name ;
729+ if (!address ) {
730+ address = uwsgi .sockets -> name ;
726731 }
727732
728- struct uwsgi_buffer * ub = uwsgi_subscription_ub (key , keysize , modifier1 , modifier2 , cmd , socket_name , sign , sni_key , sni_crt , sni_ca );
733+ struct uwsgi_buffer * ub = uwsgi_subscription_ub (key , keysize , modifier1 , modifier2 , cmd , address , sign , sni_key , sni_crt , sni_ca );
729734
730735 if (!ub )
731736 return ;
@@ -735,8 +740,8 @@ void uwsgi_send_subscription_from_fd(int fd, char *udp_address, char *key, size_
735740}
736741
737742
738- 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 ) {
739- uwsgi_send_subscription_from_fd (-1 , udp_address , key , keysize , modifier1 , modifier2 , cmd , socket_name , sign , sni_key , sni_crt , sni_ca );
743+ 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 ) {
744+ uwsgi_send_subscription_from_fd (-1 , udp_address , key , keysize , modifier1 , modifier2 , cmd , address , sign , sni_key , sni_crt , sni_ca );
740745}
741746
742747#ifdef UWSGI_SSL
@@ -837,27 +842,43 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
837842 int keysize = 0 ;
838843 char * modifier1 = NULL ;
839844 int modifier1_len = 0 ;
840- char * socket_name = NULL ;
845+ char * address = NULL ;
846+ char * address_resolved = NULL ;
841847 char * udp_address = subscription ;
842848 char * udp_port = NULL ;
843849 char * subscription_key = NULL ;
844850 char * sign = NULL ;
845851
846- // check for explicit socket_name
852+ // Check for an explicit address. This may be a reference to a shared
853+ // socket i.e. "=0=REST", a unix socket "/path/to/socket.sock=REST",
854+ // or a udp socket "server-address:port=REST"
847855 char * equal = strchr (subscription , '=' );
848856 if (equal ) {
849- socket_name = subscription ;
850- if (socket_name [0 ] == '=' ) {
851- equal = strchr (socket_name + 1 , '=' );
857+ address = subscription ;
858+ if (address [0 ] == '=' ) {
859+ equal = strchr (address + 1 , '=' );
852860 if (!equal )
853861 return ;
854862 * equal = '\0' ;
855- struct uwsgi_socket * us = uwsgi_get_shared_socket_by_num (atoi (socket_name + 1 ));
863+ struct uwsgi_socket * us = uwsgi_get_shared_socket_by_num (atoi (address + 1 ));
856864 if (!us )
857865 return ;
858- socket_name = us -> name ;
866+ address = us -> name ;
859867 }
860868 * equal = '\0' ;
869+
870+ char * address_port = strchr (address , ':' );
871+ if (address_port ) {
872+ * address_port = '\0' ;
873+ char * resolved = uwsgi_resolve_ip (address );
874+ * address_port = ':' ;
875+
876+ if (!resolved )
877+ return ;
878+
879+ address_resolved = uwsgi_concat2n (resolved , strlen (resolved ), address_port , equal - address_port );
880+ }
881+
861882 udp_address = equal + 1 ;
862883 }
863884
@@ -900,7 +921,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
900921 modifier1_len = strlen (modifier1 );
901922 keysize = strlen (key );
902923 }
903- uwsgi_send_subscription (udp_address , key , keysize , uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , socket_name , sign , NULL , NULL , NULL );
924+ uwsgi_send_subscription (udp_address , key , keysize , uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , address_resolved ? address_resolved : address , sign , NULL , NULL , NULL );
904925 modifier1 = NULL ;
905926 modifier1_len = 0 ;
906927 }
@@ -918,7 +939,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
918939 modifier1_len = strlen (modifier1 );
919940 keysize = strlen (key );
920941 }
921- uwsgi_send_subscription (udp_address , key , keysize , uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , socket_name , sign , NULL , NULL , NULL );
942+ uwsgi_send_subscription (udp_address , key , keysize , uwsgi_str_num (modifier1 , modifier1_len ), 0 , cmd , address_resolved ? address_resolved : address , sign , NULL , NULL , NULL );
922943 modifier1 = NULL ;
923944 modifier1_len = 0 ;
924945 lines [i ] = '\n' ;
@@ -947,7 +968,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
947968 modifier1_len = strlen (modifier1 );
948969 }
949970
950- 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 );
971+ 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 );
951972 if (modifier1 )
952973 modifier1 [-1 ] = ',' ;
953974 if (sign )
@@ -958,6 +979,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
958979 if (equal )
959980 * equal = '=' ;
960981 free (udp_address );
982+ free (address_resolved );
961983
962984}
963985
@@ -967,6 +989,7 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
967989 char * s2_key = NULL ;
968990 char * s2_socket = NULL ;
969991 char * s2_addr = NULL ;
992+ char * s2_addr_resolved = NULL ;
970993 char * s2_weight = NULL ;
971994 char * s2_sign = NULL ;
972995 char * s2_modifier1 = NULL ;
@@ -1051,14 +1074,23 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
10511074 s2_addr = uwsgi_str (uwsgi .sockets -> name );
10521075 }
10531076
1077+ char * port = strchr (s2_addr , ':' );
1078+ if (port ) {
1079+ * port = '\0' ;
1080+ char * resolved = uwsgi_resolve_ip (s2_addr );
1081+ if (!resolved ) goto end ;
1082+ * port = ':' ;
1083+ s2_addr_resolved = uwsgi_concat2n (resolved , strlen (resolved ), port , strlen (port ));
1084+ }
1085+
10541086 ub = uwsgi_buffer_new (uwsgi .page_size );
10551087 if (!ub ) goto end ;
10561088 // leave space for the header
10571089 ub -> pos = 4 ;
10581090
10591091 if (uwsgi_buffer_append_keyval (ub , "key" , 3 , s2_key , strlen (s2_key )))
10601092 goto end ;
1061- if (uwsgi_buffer_append_keyval (ub , "address" , 7 , s2_addr , strlen (s2_addr )))
1093+ if (uwsgi_buffer_append_keyval (ub , "address" , 7 , s2_addr_resolved ? s2_addr_resolved : s2_addr , strlen (s2_addr_resolved ? s2_addr_resolved : s2_addr )))
10621094 goto end ;
10631095 if (uwsgi_buffer_append_keynum (ub , "modifier1" , 9 , modifier1 ))
10641096 goto end ;
@@ -1140,6 +1172,8 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
11401172 free (s2_socket );
11411173 if (s2_addr )
11421174 free (s2_addr );
1175+ if (s2_addr_resolved )
1176+ free (s2_addr_resolved );
11431177 if (s2_weight )
11441178 free (s2_weight );
11451179 if (s2_modifier1 )
0 commit comments