From 0036a143c415eac6388d992a4e637e7004147296 Mon Sep 17 00:00:00 2001 From: hjl Date: Fri, 11 Oct 2002 15:37:10 +0000 Subject: [PATCH] 2002-10-11 H.J. Lu * support/include/exportfs.h (export_errno): New. * support/nfs/exports.c: Include . (export_errno): New. (getexportent): Set export_errno to EINVAL for bad option. (parseopts): Likewise. Report the location of the default sync/async option. * utils/exportfs/exportfs.c (main): Initialize export_errno to 0. Return export_errno. --- ChangeLog | 13 +++++++++++++ support/include/exportfs.h | 3 +++ support/nfs/exports.c | 27 ++++++++++++++++----------- utils/exportfs/exportfs.c | 4 +++- 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3f957ae..1567d82 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2002-10-11 H.J. Lu + + * support/include/exportfs.h (export_errno): New. + + * support/nfs/exports.c: Include . + (export_errno): New. + (getexportent): Set export_errno to EINVAL for bad option. + (parseopts): Likewise. + Report the location of the default sync/async option. + + * utils/exportfs/exportfs.c (main): Initialize export_errno to + 0. Return export_errno. + 2002-10-11 Juan Gomez NeilBrown diff --git a/support/include/exportfs.h b/support/include/exportfs.h index deb837c..4021e60 100644 --- a/support/include/exportfs.h +++ b/support/include/exportfs.h @@ -77,4 +77,7 @@ int rmtab_read(void); struct nfskey * key_lookup(char *hname); +/* Record export error. */ +extern int export_errno; + #endif /* EXPORTFS_H */ diff --git a/support/nfs/exports.c b/support/nfs/exports.c index 3c5b198..3d23959 100644 --- a/support/nfs/exports.c +++ b/support/nfs/exports.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "nfslib.h" #include "exportfs.h" #include "xmalloc.h" @@ -31,6 +32,8 @@ #define EXPORT_DEFAULT_FLAGS \ (NFSEXP_READONLY|NFSEXP_ROOTSQUASH|NFSEXP_GATHERED_WRITES) +int export_errno; + static char *efname = NULL; static XFILE *efp = NULL; static int first; @@ -101,6 +104,7 @@ getexportent(int fromkernel, int fromexports) } if (ok < 0) { xlog(L_ERROR, "expected client(options...)"); + export_errno = EINVAL; return NULL; } first = 0; @@ -114,6 +118,7 @@ getexportent(int fromkernel, int fromexports) *opt++ = '\0'; if (!(sp = strchr(opt, ')')) || sp[1] != '\0') { syntaxerr("bad option list"); + export_errno = EINVAL; return NULL; } *sp = '\0'; @@ -122,6 +127,7 @@ getexportent(int fromkernel, int fromexports) } if (strlen(exp) >= sizeof(ee.e_hostname)) { syntaxerr("client name too long"); + export_errno = EINVAL; return NULL; } strncpy(ee.e_hostname, exp, sizeof (ee.e_hostname) - 1); @@ -370,7 +376,9 @@ parseopts(char *cp, struct exportent *ep, int warn) if (opt[8]=='\0' || *oe != '\0') { xlog(L_ERROR, "%s: %d: bad anonuid \"%s\"\n", flname, flline, opt); +bad_option: free(opt); + export_errno = EINVAL; return -1; } } else if (strncmp(opt, "anongid=", 8) == 0) { @@ -379,18 +387,15 @@ parseopts(char *cp, struct exportent *ep, int warn) if (opt[8]=='\0' || *oe != '\0') { xlog(L_ERROR, "%s: %d: bad anongid \"%s\"\n", flname, flline, opt); - free(opt); - return -1; + goto bad_option; } } else if (strncmp(opt, "squash_uids=", 12) == 0) { if (parsesquash(opt+12, &squids, &nsquids, &cp) < 0) { - free(opt); - return -1; + goto bad_option; } } else if (strncmp(opt, "squash_gids=", 12) == 0) { if (parsesquash(opt+12, &sqgids, &nsqgids, &cp) < 0) { - free(opt); - return -1; + goto bad_option; } } else if (strncmp(opt, "fsid=", 5) == 0) { char *oe; @@ -398,16 +403,14 @@ parseopts(char *cp, struct exportent *ep, int warn) if (opt[5]=='\0' || *oe != '\0') { xlog(L_ERROR, "%s: %d: bad fsid \"%s\"\n", flname, flline, opt); - free(opt); - return -1; + goto bad_option; } ep->e_flags |= NFSEXP_FSID; } else { xlog(L_ERROR, "%s:%d: unknown keyword \"%s\"\n", flname, flline, opt); ep->e_flags |= NFSEXP_ALLSQUASH | NFSEXP_READONLY; - free(opt); - return -1; + goto bad_option; } free(opt); while (isblank(*cp)) @@ -421,9 +424,11 @@ parseopts(char *cp, struct exportent *ep, int warn) out: if (warn && !had_sync_opt) - xlog(L_WARNING, "No 'sync' or 'async' option specified for export \"%s:%s\".\n" + xlog(L_WARNING, "%s [%d]: 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", + + flname, flline, ep->e_hostname, ep->e_path); return 1; diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c index 41f4750..60f130e 100644 --- a/utils/exportfs/exportfs.c +++ b/utils/exportfs/exportfs.c @@ -45,6 +45,8 @@ main(int argc, char **argv) xlog_open("exportfs"); + export_errno = 0; + while ((c = getopt(argc, argv, "aio:ruv")) != EOF) { switch(c) { case 'a': @@ -119,7 +121,7 @@ main(int argc, char **argv) xtab_export_write(); xtab_mount_write(); - return 0; + return export_errno; } /* we synchronise intention with reality. -- 2.39.2