int nfsmount_s(const char *spec, const char *node, int flags,
char **extra_opts, int fake, int child)
{
+ struct mount_options *options = NULL;
struct sockaddr_in saddr;
char *hostname;
- int err;
+ int err, retval = EX_FAIL;
if (!parse_devname(spec, &hostname))
- return EX_FAIL;
+ goto out;
err = fill_ipv4_sockaddr(hostname, &saddr);
free(hostname);
if (!err)
- return EX_FAIL;
-
- extract_interesting_options(*extra_opts);
+ goto out;
- if (!child && addr_opt) {
- nfs_error(_("%s: Illegal option: 'addr='"), progname);
- return EX_FAIL;
+ options = po_split(*extra_opts);
+ if (!options) {
+ nfs_error(_("%s: internal option parsing error"), progname);
+ goto out;
}
- if (!append_addr_opt(&saddr, extra_opts))
- return EX_FAIL;
+ if (!append_addr_option(&saddr, options))
+ goto out;
+
+ if (po_join(options, extra_opts) == PO_FAILED) {
+ nfs_error(_("%s: internal option parsing error"), progname);
+ goto out;
+ }
if (verbose)
printf(_("%s: text-based options: '%s'\n"),
if (mount(spec, node, "nfs",
flags & ~(MS_USER|MS_USERS), *extra_opts)) {
mount_error(spec, node, errno);
- return EX_FAIL;
+ goto out;
}
}
- return EX_SUCCESS;
+ retval = EX_SUCCESS;
+
+out:
+ po_destroy(options);
+ return retval;
}
/*
int nfs4mount_s(const char *spec, const char *node, int flags,
char **extra_opts, int fake, int child)
{
+ struct mount_options *options = NULL;
struct sockaddr_in saddr;
char *hostname;
- int err;
+ int err, retval = EX_FAIL;
if (!parse_devname(spec, &hostname))
- return EX_FAIL;
+ goto out;
err = fill_ipv4_sockaddr(hostname, &saddr);
free(hostname);
if (!err)
- return EX_FAIL;
-
- extract_interesting_options(*extra_opts);
+ goto out;
- if (addr_opt) {
- nfs_error(_("%s: Illegal option: 'addr='"), progname);
- return EX_FAIL;
+ options = po_split(*extra_opts);
+ if (!options) {
+ nfs_error(_("%s: internal option parsing error"), progname);
+ goto out;
}
- if (!append_addr_opt(&saddr, extra_opts))
- return EX_FAIL;
+ if (!append_addr_option(&saddr, options))
+ goto out;
+
+ if (!append_clientaddr_option(&saddr, options))
+ goto out;
- if (!ca_opt && !append_clientaddr_opt(&saddr, extra_opts))
- return EX_FAIL;
+ if (po_join(options, extra_opts) == PO_FAILED) {
+ nfs_error(_("%s: internal option parsing error"), progname);
+ goto out;
+ }
if (verbose)
printf(_("%s: text-based options: '%s'\n"),
if (mount(spec, node, "nfs4",
flags & ~(MS_USER|MS_USERS), *extra_opts)) {
mount_error(spec, node, errno);
- return EX_FAIL;
+ goto out;
}
}
- return EX_SUCCESS;
+ retval = EX_SUCCESS;
+
+out:
+ po_destroy(options);
+ return retval;
}