int flags, /* MS_ flags */
fake, /* actually do the mount? */
child; /* forked bg child? */
+
+ sa_family_t family; /* supported address family */
};
static int nfs_parse_devname(struct nfsmount_info *mi)
* Returns 1 if 'clientaddr=' option created successfully or if
* 'clientaddr=' option is already present; otherwise zero.
*/
-static int append_clientaddr_option(struct sockaddr_in *saddr,
- struct mount_options *options)
+static int nfs_append_clientaddr_option(const struct sockaddr *sap,
+ socklen_t salen,
+ struct mount_options *options)
{
- struct sockaddr_in my_addr;
- char new_option[32];
+ struct sockaddr_storage dummy;
+ struct sockaddr *my_addr = (struct sockaddr *)&dummy;
+ socklen_t my_len = sizeof(dummy);
- if (po_contains(options, "clientaddr") == PO_SUCCEEDED)
+ if (po_contains(options, "clientaddr") == PO_FOUND)
return 1;
- if (!get_client_address(saddr, &my_addr))
- return 0;
-
- snprintf(new_option, sizeof(new_option) - 1,
- "clientaddr=%s", inet_ntoa(my_addr.sin_addr));
+ nfs_callback_address(sap, salen, my_addr, &my_len);
- if (po_append(options, new_option) == PO_SUCCEEDED)
- return 1;
- return 0;
+ return nfs_append_generic_address_option(my_addr, my_len,
+ "clientaddr", options);
}
/*
* Resolve the 'mounthost=' hostname and append a new option using
- * the resulting IPv4 address.
+ * the resulting address.
*/
-static int fix_mounthost_option(struct mount_options *options)
+static int nfs_fix_mounthost_option(const sa_family_t family,
+ struct mount_options *options)
{
- struct sockaddr_in maddr;
- char *mounthost, new_option[32];
+ struct sockaddr_storage dummy;
+ struct sockaddr *sap = (struct sockaddr *)&dummy;
+ socklen_t salen = sizeof(dummy);
+ char *mounthost;
mounthost = po_get(options, "mounthost");
if (!mounthost)
return 1;
- if (!fill_ipv4_sockaddr(mounthost, &maddr))
+ if (!nfs_name_to_address(mounthost, family, sap, &salen)) {
+ nfs_error(_("%s: unable to determine mount server's address"),
+ progname);
return 0;
+ }
- snprintf(new_option, sizeof(new_option) - 1,
- "mountaddr=%s", inet_ntoa(maddr.sin_addr));
-
- if (po_append(options, new_option) == PO_SUCCEEDED)
- return 1;
- return 0;
+ return nfs_append_generic_address_option(sap, salen,
+ "mountaddr", options);
}
/*
return 0;
if (strncmp(mi->type, "nfs4", 4) == 0) {
- if (!append_clientaddr_option(&saddr, mi->options))
+ if (!nfs_append_clientaddr_option((struct sockaddr *)&saddr,
+ sizeof(saddr), mi->options))
return 0;
} else {
- if (!fix_mounthost_option(mi->options))
+ if (!nfs_fix_mounthost_option(mi->family, mi->options))
return 0;
if (!mi->fake && !verify_lock_option(mi->options))
return 0;
.flags = flags,
.fake = fake,
.child = child,
+#ifdef IPV6_SUPPORTED
+ .family = AF_UNSPEC, /* either IPv4 or v6 */
+#else
+ .family = AF_INET, /* only IPv4 */
+#endif
};
int retval = EX_FAIL;