+struct peer_addr_cst {
+ struct udp *udp;
+ struct peer_config *cfg;
+ comm_peer_addr_answer_fn *cb;
+ void *cst;
+};
+
+static void *peer_addr_config(void *commst, dict_t *dict, struct cloc loc,
+ cstring_t desc)
+{
+ struct peer_config *cfg;
+ cfg=safe_malloc(sizeof(*cfg),"peer addr config");
+ cfg->address=dict_read_string(dict, "address",False,desc,loc);
+ if (cfg->address)
+ cfg->remoteport=dict_read_number(dict,"port",True,desc,loc,0);
+ else cfg->remoteport=0;
+ if (cfg->address)
+ return cfg;
+ free(cfg);
+ return NULL;
+}
+
+static void peer_resolve_callback(void *sst, struct in_addr *address)
+{
+ struct peer_addr_cst *pacst=sst;
+ struct udp *st=pacst->udp;
+ struct peer_config *cfg=pacst->cfg;
+ struct comm_addr ca;
+ if (address) {
+ FILLZERO(ca);
+ ca.comm=&st->ops;
+ ca.priv.sin.sin_family=AF_INET;
+ ca.priv.sin.sin_port=htons(cfg->remoteport);
+ ca.priv.sin.sin_addr=*address;
+ pacst->cb(pacst->cst,&ca);
+ } else {
+ pacst->cb(pacst->cst,0);
+ }
+ free(pacst);
+}
+
+static bool_t peer_addr_request(void *commst, void *from_peer_config,
+ comm_peer_addr_answer_fn *cb, void *cst)
+{