diff options
| author | SummerGift <[email protected]> | 2017-12-23 16:54:24 +0800 |
|---|---|---|
| committer | SummerGift <[email protected]> | 2017-12-23 16:55:54 +0800 |
| commit | e8ec10d5e7b969d8534c7459c9f3f9d885ec5524 (patch) | |
| tree | 4b0bbc421463744fde85878e73a03c3f61fd5344 /components | |
| parent | 98d8145661e4da09eb0f9c40a3cb96590a373115 (diff) | |
[nfs] : upgrade from gethostbyname to getaddrinfo
Diffstat (limited to 'components')
| -rw-r--r-- | components/dfs/filesystems/nfs/rpc/clnt_generic.c | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/components/dfs/filesystems/nfs/rpc/clnt_generic.c b/components/dfs/filesystems/nfs/rpc/clnt_generic.c index 683b2fe42e..a6c223317d 100644 --- a/components/dfs/filesystems/nfs/rpc/clnt_generic.c +++ b/components/dfs/filesystems/nfs/rpc/clnt_generic.c @@ -45,39 +45,29 @@ CLIENT *clnt_create (const char *hostname, const unsigned long prog, const unsigned long vers, const char *proto) { int sock; - struct hostent *h; - struct sockaddr_in sin; + struct sockaddr_in server; + struct addrinfo hint, *res = NULL; struct timeval tv; CLIENT *client; - - h = (struct hostent *)gethostbyname(hostname); - if (h == NULL) { - rt_kprintf("unknown host\n"); - return (NULL); - } - if (h->h_addrtype != AF_INET) { - rt_kprintf("unknow inet\n"); - return (NULL); - } - memset((char*)&sin,0,sizeof(sin)); - sin.sin_family = h->h_addrtype; - sin.sin_port = 0; + int ret; - if (h->h_addrtype == AF_INET) - { - memmove((char *) &sin.sin_addr, h->h_addr, sizeof(sin.sin_addr)); - } - else - { - return NULL; - } + memset(&hint, 0, sizeof(hint)); + ret = getaddrinfo(hostname, NULL, &hint, &res); + if (ret != 0) + { + rt_kprintf("getaddrinfo err: %d '%s'\n", ret, hostname); + return NULL; + } + + memcpy(&server, res->ai_addr, sizeof(struct sockaddr_in)); + freeaddrinfo(res); sock = -1; if (strcmp(proto, "udp") == 0) { tv.tv_sec = 5; tv.tv_usec = 0; - client = clntudp_create(&sin, prog, vers, tv, &sock); + client = clntudp_create(&server, prog, vers, tv, &sock); if (client == NULL) return NULL; tv.tv_sec = 1; clnt_control(client, CLSET_TIMEOUT, (char*)&tv); |
