2020#include "io-util.h"
2121#include "list.h"
2222#include "missing.h"
23+ #include "resolve-private.h"
2324#include "socket-util.h"
2425#include "util.h"
2526#include "process-util.h"
@@ -912,26 +913,29 @@ static int alloc_query(sd_resolve *resolve, bool floating, sd_resolve_query **_q
912913 return 0 ;
913914}
914915
915- _public_ int sd_resolve_getaddrinfo (
916+
917+ int resolve_getaddrinfo_with_destroy_callback (
916918 sd_resolve * resolve ,
917- sd_resolve_query * * _q ,
919+ sd_resolve_query * * ret_query ,
918920 const char * node , const char * service ,
919921 const struct addrinfo * hints ,
920- sd_resolve_getaddrinfo_handler_t callback , void * userdata ) {
922+ sd_resolve_getaddrinfo_handler_t callback ,
923+ sd_resolve_destroy_t destroy_callback ,
924+ void * userdata ) {
921925
922926 _cleanup_ (sd_resolve_query_unrefp ) sd_resolve_query * q = NULL ;
927+ size_t node_len , service_len ;
923928 AddrInfoRequest req = {};
924929 struct iovec iov [3 ];
925930 struct msghdr mh = {};
926931 int r ;
927- size_t node_len , service_len ;
928932
929933 assert_return (resolve , - EINVAL );
930934 assert_return (node || service , - EINVAL );
931935 assert_return (callback , - EINVAL );
932936 assert_return (!resolve_pid_changed (resolve ), - ECHILD );
933937
934- r = alloc_query (resolve , !_q , & q );
938+ r = alloc_query (resolve , !ret_query , & q );
935939 if (r < 0 )
936940 return r ;
937941
@@ -968,14 +972,27 @@ _public_ int sd_resolve_getaddrinfo(
968972 return - errno ;
969973
970974 resolve -> n_outstanding ++ ;
975+ q -> destroy_callback = destroy_callback ;
976+
977+ if (ret_query )
978+ * ret_query = q ;
971979
972- if (_q )
973- * _q = q ;
974980 TAKE_PTR (q );
975981
976982 return 0 ;
977983}
978984
985+ _public_ int sd_resolve_getaddrinfo (
986+ sd_resolve * resolve ,
987+ sd_resolve_query * * ret_query ,
988+ const char * node , const char * service ,
989+ const struct addrinfo * hints ,
990+ sd_resolve_getaddrinfo_handler_t callback ,
991+ void * userdata ) {
992+
993+ return resolve_getaddrinfo_with_destroy_callback (resolve , ret_query , node , service , hints , callback , NULL , userdata );
994+ }
995+
979996static int getaddrinfo_done (sd_resolve_query * q ) {
980997 assert (q );
981998 assert (q -> done );
@@ -987,13 +1004,14 @@ static int getaddrinfo_done(sd_resolve_query* q) {
9871004 return q -> getaddrinfo_handler (q , q -> ret , q -> addrinfo , q -> userdata );
9881005}
9891006
990- _public_ int sd_resolve_getnameinfo (
1007+ int resolve_getnameinfo_with_destroy_callback (
9911008 sd_resolve * resolve ,
992- sd_resolve_query * * _q ,
1009+ sd_resolve_query * * ret_query ,
9931010 const struct sockaddr * sa , socklen_t salen ,
9941011 int flags ,
9951012 uint64_t get ,
9961013 sd_resolve_getnameinfo_handler_t callback ,
1014+ sd_resolve_destroy_t destroy_callback ,
9971015 void * userdata ) {
9981016
9991017 _cleanup_ (sd_resolve_query_unrefp ) sd_resolve_query * q = NULL ;
@@ -1010,7 +1028,7 @@ _public_ int sd_resolve_getnameinfo(
10101028 assert_return (callback , - EINVAL );
10111029 assert_return (!resolve_pid_changed (resolve ), - ECHILD );
10121030
1013- r = alloc_query (resolve , !_q , & q );
1031+ r = alloc_query (resolve , !ret_query , & q );
10141032 if (r < 0 )
10151033 return r ;
10161034
@@ -1040,15 +1058,29 @@ _public_ int sd_resolve_getnameinfo(
10401058 if (sendmsg (resolve -> fds [REQUEST_SEND_FD ], & mh , MSG_NOSIGNAL ) < 0 )
10411059 return - errno ;
10421060
1043- if (_q )
1044- * _q = q ;
1045-
10461061 resolve -> n_outstanding ++ ;
1062+ q -> destroy_callback = destroy_callback ;
1063+
1064+ if (ret_query )
1065+ * ret_query = q ;
1066+
10471067 TAKE_PTR (q );
10481068
10491069 return 0 ;
10501070}
10511071
1072+ _public_ int sd_resolve_getnameinfo (
1073+ sd_resolve * resolve ,
1074+ sd_resolve_query * * ret_query ,
1075+ const struct sockaddr * sa , socklen_t salen ,
1076+ int flags ,
1077+ uint64_t get ,
1078+ sd_resolve_getnameinfo_handler_t callback ,
1079+ void * userdata ) {
1080+
1081+ return resolve_getnameinfo_with_destroy_callback (resolve , ret_query , sa , salen , flags , get , callback , NULL , userdata );
1082+ }
1083+
10521084static int getnameinfo_done (sd_resolve_query * q ) {
10531085
10541086 assert (q );
0 commit comments