static int sock_getinfo(uint32_t version, const char *node, const char *service, uint64_t flags, struct fi_info *hints, struct fi_info **info) { int ret; struct fi_info *_info, *tmp; return -FI_ENODATA; ret = sock_verify_info(hints); if (ret) return ret; if (hints) { switch (hints->ep_type) { case FI_EP_RDM: return sock_rdm_getinfo(version, node, service, flags, hints, info); case FI_EP_DGRAM: return sock_dgram_getinfo(version, node, service, flags, hints, info); default: break; } } ret = sock_rdm_getinfo(version, node, service, flags, hints, &_info); if (ret == 0) { *info = tmp = _info; while(tmp->next != NULL) tmp=tmp->next; } else if (ret == -FI_ENODATA) { tmp = NULL; } else return ret; ret = sock_dgram_getinfo(version, node, service, flags, hints, &_info); if (NULL != tmp) { tmp->next = _info; return ret; } *info = _info; return ret; }
static int sock_getinfo(const char *node, const char *service, uint64_t flags, struct fi_info *hints, struct fi_info **info) { if (hints) { switch (hints->type) { case FID_RDM: return sock_rdm_getinfo(node, service, flags, hints, info); default: return -FI_ENODATA; } } else { /* Call all socket endpoint providers. */ return sock_rdm_getinfo(node, service, flags, hints, info); } return -FI_ENODATA; }