summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2017-12-25 19:35:39 +0800
committerGitHub <[email protected]>2017-12-25 19:35:39 +0800
commit2289f6ac1ce6592a3b51aadd8aebafbadd9267f8 (patch)
tree06d1cb39cbb22ac50e3050fa1ab8069b1a4a39d3
parentc90573197a98109e59b4093dfec1f8670f01a04d (diff)
parent3b548038e190958215585866f3b5e5119c2e209b (diff)
Merge pull request #1131 from SummerGGift/fix_bug_in_nfs_ipv6
[nfs] : fix bug in nfs when enable ipv6
-rw-r--r--components/dfs/filesystems/nfs/rpc/clnt_generic.c74
1 files changed, 36 insertions, 38 deletions
diff --git a/components/dfs/filesystems/nfs/rpc/clnt_generic.c b/components/dfs/filesystems/nfs/rpc/clnt_generic.c
index dcc2eb2097..a3de64a2f0 100644
--- a/components/dfs/filesystems/nfs/rpc/clnt_generic.c
+++ b/components/dfs/filesystems/nfs/rpc/clnt_generic.c
@@ -1,4 +1,4 @@
-/* @(#)clnt_generic.c 2.2 88/08/01 4.0 RPCSRC */
+/* @(#)clnt_generic.c 2.2 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
@@ -41,49 +41,47 @@ static char sccsid[] = "@(#)clnt_generic.c 1.4 87/08/11 (C) 1987 SMI";
* returns client handle. Default options are set, which the user can
* change using the rpc equivalent of ioctl()'s.
*/
-CLIENT *clnt_create (const char *hostname, const unsigned long prog,
- const unsigned long vers, const char *proto)
+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 timeval tv;
- CLIENT *client;
+ int sock;
+ struct sockaddr_in server;
+ struct addrinfo hint, *res = NULL;
+ struct timeval tv;
+ CLIENT *client;
+ int ret;
- 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;
- memmove((char *) &sin.sin_addr, h->h_addr, h->h_length);
+ 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;
+ }
- sock = -1;
- if (strcmp(proto, "udp") == 0)
- {
- tv.tv_sec = 5;
- tv.tv_usec = 0;
- client = clntudp_create(&sin, prog, vers, tv, &sock);
- if (client == NULL) return NULL;
- tv.tv_sec = 1;
- clnt_control(client, CLSET_TIMEOUT, (char*)&tv);
- }
- else
- {
- rt_kprintf("unknow protocol\n");
- return NULL;
- }
+ memcpy(&server, res->ai_addr, sizeof(struct sockaddr_in));
+ freeaddrinfo(res);
- return (client);
+ sock = -1;
+ if (strcmp(proto, "udp") == 0)
+ {
+ tv.tv_sec = 5;
+ tv.tv_usec = 0;
+ client = clntudp_create(&server, prog, vers, tv, &sock);
+ if (client == NULL) return NULL;
+ tv.tv_sec = 1;
+ clnt_control(client, CLSET_TIMEOUT, (char *)&tv);
+ }
+ else
+ {
+ rt_kprintf("unknow protocol\n");
+ return NULL;
+ }
+
+ return (client);
}
void clnt_perror(CLIENT *rpch, const char *s)
{
- rt_kprintf("rpc client error:%s\n", s);
+ rt_kprintf("rpc client error:%s\n", s);
}