#define EXPORT_DEFAULT_FLAGS \
(NFSEXP_ASYNC|NFSEXP_READONLY|NFSEXP_ROOTSQUASH|NFSEXP_GATHERED_WRITES)
+static char *efname = NULL;
static XFILE *efp = NULL;
static int first;
static int *squids = NULL, nsquids = 0,
if (!(efp = xfopen(fname, type)))
xlog(L_ERROR, "can't open %s for %sing",
fname, strcmp(type, "r")? "writ" : "read");
+ efname = strdup(fname);
first = 1;
}
struct exportent *
-getexportent(void)
+getexportent(int fromkernel)
{
static struct exportent ee;
char exp[512];
freesquash();
ee.e_flags = EXPORT_DEFAULT_FLAGS;
+ /* some kernels assume the default is sync rather than
+ * async. More recent kernels always report one or other,
+ * but this test makes sure we assume same as kernel
+ * Ditto for wgather
+ */
+ if (fromkernel) {
+ ee.e_flags &= ~NFSEXP_ASYNC;
+ ee.e_flags &= ~NFSEXP_GATHERED_WRITES;
+ }
ee.e_maptype = CLE_MAP_IDENT;
ee.e_anonuid = -2;
ee.e_anongid = -2;
if (efp)
xfclose(efp);
efp = NULL;
+ if (efname)
+ free(efname);
+ efname = NULL;
freesquash();
}
ep->e_flags |= NFSEXP_CROSSMNT;
else if (!strcmp(opt, "hide"))
ep->e_flags &= ~NFSEXP_CROSSMNT;
+ else if (!strcmp(opt, "crossmnt")) /* old style */
+ ep->e_flags |= NFSEXP_CROSSMNT;
+ else if (!strcmp(opt, "nocrossmnt")) /* old style */
+ ep->e_flags &= ~NFSEXP_CROSSMNT;
else if (!strcmp(opt, "wdelay"))
ep->e_flags |= NFSEXP_GATHERED_WRITES;
else if (!strcmp(opt, "no_wdelay"))
return -1;
}
} else {
- xlog(L_ERROR,
- "Unknown keyword \"%s\" in export file\n",
- opt);
+ xlog(L_ERROR, "%s:%d: unknown keyword \"%s\"\n",
+ efname, efp->x_line, 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, "error parsing export entry");
+ xlog(L_ERROR, "%s:%d: syntax error",
+ efname, efp->x_line);
return ok;
}
static void
syntaxerr(char *msg)
{
- xlog(L_ERROR, "syntax error in exports file (line %d): %s",
- efp->x_line, msg);
+ xlog(L_ERROR, "%s:%d: syntax error: %s",
+ efname, efp->x_line, msg);
}