summaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-06-23 13:37:08 +1000
committerNeil Brown <neilb@suse.de>2006-06-23 13:37:08 +1000
commitc2db41e8abb6ddc9d03a0c91c6db043fa0f85a8f (patch)
tree5ba4131cda3ac7353a4acbbcdcdd02eb8c618c3c /utils
parent11d34d11153df198103a57291937ea9ff8b7356e (diff)
downloadnfs-utils-c2db41e8abb6ddc9d03a0c91c6db043fa0f85a8f.tar.gz
nfs-utils-c2db41e8abb6ddc9d03a0c91c6db043fa0f85a8f.tar.xz
nfs-utils-c2db41e8abb6ddc9d03a0c91c6db043fa0f85a8f.zip
Try to make sure that clientid used for NFSv4 is reliable.
We need to give an IP address to identify this client to the server. The current code does a gethostbyname of the hostname. One some systems this returns 127.0.0.1 or similar, which is not useful. Instead, use getsockname of the sock used to connect to the server to confirm that the server is working. This gives the address on the interface that was chosen to talk to that server, which is the best address we can find (if there is a NAT in the way, it might still not work, but in that case there is nothing we can do).
Diffstat (limited to 'utils')
-rw-r--r--utils/mount/nfs4mount.c18
-rw-r--r--utils/mount/nfsmount.c2
2 files changed, 16 insertions, 4 deletions
diff --git a/utils/mount/nfs4mount.c b/utils/mount/nfs4mount.c
index b59c27c..717ad56 100644
--- a/utils/mount/nfs4mount.c
+++ b/utils/mount/nfs4mount.c
@@ -189,9 +189,10 @@ int nfs4mount(const char *spec, const char *node, int *flags,
static struct nfs4_mount_data data;
static char hostdir[1024];
static char ip_addr[16] = "127.0.0.1";
- static struct sockaddr_in server_addr;
+ static struct sockaddr_in server_addr, client_addr;
static int pseudoflavour[MAX_USER_FLAVOUR];
int num_flavour = 0;
+ int ip_addr_in_opts = 0;
char *hostname, *dirname, *old_opts;
char new_opts[1024];
@@ -302,6 +303,7 @@ int nfs4mount(const char *spec, const char *node, int *flags,
opteq+1);
strncpy(ip_addr,opteq+1, sizeof(ip_addr));
ip_addr[sizeof(ip_addr)-1] = '\0';
+ ip_addr_in_opts = 1;
} else if (!strcmp(opt, "sec")) {
num_flavour = parse_sec(opteq+1, pseudoflavour);
if (!num_flavour)
@@ -412,9 +414,19 @@ int nfs4mount(const char *spec, const char *node, int *flags,
NFS_PROGRAM, 4, data.proto == IPPROTO_UDP ? "udp" : "tcp",
ntohs(server_addr.sin_port));
}
- clnt_ping(&server_addr, NFS_PROGRAM, 4, data.proto);
- if (rpc_createerr.cf_stat == RPC_SUCCESS)
+ client_addr.sin_family = 0;
+ client_addr.sin_addr.s_addr = 0;
+ clnt_ping(&server_addr, NFS_PROGRAM, 4, data.proto, &client_addr);
+ if (rpc_createerr.cf_stat == RPC_SUCCESS) {
+ if (!ip_addr_in_opts &&
+ client_addr.sin_family != 0 &&
+ client_addr.sin_addr.s_addr != 0) {
+ snprintf(ip_addr, sizeof(ip_addr), "%s",
+ inet_ntoa(client_addr.sin_addr));
+ data.client_addr.len = strlen(ip_addr);
+ }
break;
+ }
switch(rpc_createerr.cf_stat){
case RPC_TIMEDOUT:
diff --git a/utils/mount/nfsmount.c b/utils/mount/nfsmount.c
index 1266660..2b1eb8c 100644
--- a/utils/mount/nfsmount.c
+++ b/utils/mount/nfsmount.c
@@ -376,7 +376,7 @@ probe_port(clnt_addr_t *server,
inet_ntoa(saddr->sin_addr), prog, *p_vers,
*p_prot == IPPROTO_UDP ? "udp" : "tcp", p_port);
}
- if (clnt_ping(saddr, prog, *p_vers, *p_prot))
+ if (clnt_ping(saddr, prog, *p_vers, *p_prot, NULL))
goto out_ok;
if (rpc_createerr.cf_stat == RPC_TIMEDOUT)
goto out_bad;