static int getexport(char *exp, int len);
static int getpath(char *path, int len);
-static int parseopts(char *cp, struct exportent *ep);
+static int parseopts(char *cp, struct exportent *ep, int warn);
static int parsesquash(char *list, int **idp, int *lenp, char **ep);
static int parsenum(char **cpp);
static int parsemaptype(char *type);
}
struct exportent *
-getexportent(int fromkernel)
+getexportent(int fromkernel, int fromexports)
{
static struct exportent ee;
char exp[512];
strncpy(ee.e_hostname, exp, sizeof (ee.e_hostname) - 1);
ee.e_hostname[sizeof (ee.e_hostname) - 1] = '\0';
- if (parseopts(opt, &ee) < 0)
+ if (parseopts(opt, &ee, fromexports) < 0)
return NULL;
/* resolve symlinks */
"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:
ee.e_path[sizeof (ee.e_path) - 1] = '\0';
strncpy (ee.m_path, ee.e_path, sizeof (ee.m_path) - 1);
ee.m_path [sizeof (ee.m_path) - 1] = '\0';
- if (parseopts(options, &ee) < 0)
+ if (parseopts(options, &ee, 0) < 0)
return NULL;
return ⅇ
}
int
updateexportent(struct exportent *eep, char *options)
{
- if (parseopts(options, eep) < 0)
+ if (parseopts(options, eep, 0) < 0)
return 0;
return 1;
}
* Parse option string pointed to by cp and set mount options accordingly.
*/
static int
-parseopts(char *cp, struct exportent *ep)
+parseopts(char *cp, struct exportent *ep, int warn)
{
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;
ep->e_nsqgids = nsqgids;
out:
- if (!had_sync_opt)
+ if (warn && !had_sync_opt)
xlog(L_WARNING, "No 'sync' or 'async' option specified for export \"%s:%s\".\n"
" Assuming default behaviour ('sync').\n"
" NOTE: this default has changed from previous versions\n",
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);
}