#include "exportfs.h"
#include "xio.h"
-static int expsetup(struct nfsctl_export *exparg, nfs_export *exp);
+static int expsetup(struct nfsctl_export *exparg, nfs_export *exp, int unexport);
static int cltsetup(struct nfsctl_client *cltarg, nfs_client *clp);
int
return 0;
clp->m_exported = 1;
}
- if (!expsetup(&exparg, exp))
+ if (!expsetup(&exparg, exp, 0))
return 0;
if (nfsexport(&exparg) < 0)
return 0;
{
struct nfsctl_export exparg;
- if (!expsetup(&exparg, exp) || nfsunexport(&exparg) < 0)
+ if (!expsetup(&exparg, exp, 1) || nfsunexport(&exparg) < 0)
return 0;
exp->m_exported = 0;
return 1;
}
static int
-expsetup(struct nfsctl_export *exparg, nfs_export *exp)
+expsetup(struct nfsctl_export *exparg, nfs_export *exp, int unexport)
{
nfs_client *clp = exp->m_client;
struct stat stb;
sizeof (exparg->ex_client) - 1);
str_tolower(exparg->ex_client);
exparg->ex_flags = exp->m_export.e_flags;
- exparg->ex_dev = stb.st_dev;
+ exparg->ex_dev = (!unexport && (exp->m_export.e_flags & NFSEXP_FSID)) ?
+ exp->m_export.e_fsid : stb.st_dev;
exparg->ex_ino = stb.st_ino;
exparg->ex_anon_uid = exp->m_export.e_anonuid;
exparg->ex_anon_gid = exp->m_export.e_anongid;
"no_" : "");
fprintf(fp, "%ssecure_locks,", (ep->e_flags & NFSEXP_NOAUTHNLM)?
"in" : "");
-
+ if (ep->e_flags & NFSEXP_FSID) {
+ fprintf(fp, "fsid=%d,", ep->e_fsid);
+ }
fprintf(fp, "mapping=");
switch (ep->e_maptype) {
case CLE_MAP_IDENT:
parseopts(char *cp, struct exportent *ep)
{
int had_sync_opt = 0;
+ char *flname = efname?efname:"command line";
+ int flline = efp?efp->x_line:0;
squids = ep->e_squids; nsquids = ep->e_nsquids;
sqgids = ep->e_sqgids; nsqgids = ep->e_nsqgids;
ep->e_maptype = CLE_MAP_IDENT;
else if (strcmp(opt, "map_daemon") == 0) /* old style */
ep->e_maptype = CLE_MAP_UGIDD;
- else if (strncmp(opt, "anonuid=", 8) == 0)
- ep->e_anonuid = atoi(opt+8);
- else if (strncmp(opt, "anongid=", 8) == 0)
- ep->e_anongid = atoi(opt+8);
- else if (strncmp(opt, "squash_uids=", 12) == 0) {
+ else if (strncmp(opt, "anonuid=", 8) == 0) {
+ char *oe;
+ ep->e_anonuid = strtol(opt+8, &oe, 10);
+ if (opt[8]=='\0' || *oe != '\0') {
+ xlog(L_ERROR, "%s: %d: bad anonuid \"%s\"\n",
+ flname, flline, opt);
+ free(opt);
+ return -1;
+ }
+ } else if (strncmp(opt, "anongid=", 8) == 0) {
+ char *oe;
+ ep->e_anongid = strtol(opt+8, &oe, 10);
+ if (opt[8]=='\0' || *oe != '\0') {
+ xlog(L_ERROR, "%s: %d: bad anongid \"%s\"\n",
+ flname, flline, opt);
+ free(opt);
+ return -1;
+ }
+ } else if (strncmp(opt, "squash_uids=", 12) == 0) {
if (parsesquash(opt+12, &squids, &nsquids, &cp) < 0) {
free(opt);
return -1;
free(opt);
return -1;
}
+ } else if (strncmp(opt, "fsid=", 5) == 0) {
+ char *oe;
+ ep->e_fsid = strtoul(opt+5, &oe, 0);
+ if (opt[5]=='\0' || *oe != '\0') {
+ xlog(L_ERROR, "%s: %d: bad fsid \"%s\"\n",
+ flname, flline, opt);
+ free(opt);
+ return -1;
+ }
+ ep->e_flags |= NFSEXP_FSID;
} else {
xlog(L_ERROR, "%s:%d: unknown keyword \"%s\"\n",
- efname, efp->x_line, opt);
+ flname, flline, opt);
ep->e_flags |= NFSEXP_ALLSQUASH | NFSEXP_READONLY;
free(opt);
return -1;
xskip(efp, " \t");
if ((ok = xgettok(efp, 0, exp, len)) < 0)
xlog(L_ERROR, "%s:%d: syntax error",
- efname, efp->x_line);
+ efname?"command line":efname, efp->x_line);
return ok;
}
syntaxerr(char *msg)
{
xlog(L_ERROR, "%s:%d: syntax error: %s",
- efname, efp->x_line, msg);
+ efname, efp?efp->x_line:0, msg);
}