All of lore.kernel.org
 help / color / mirror / Atom feed
* PATCH: Return error on bad export
@ 2002-10-10 23:04 H. J. Lu
  0 siblings, 0 replies; only message in thread
From: H. J. Lu @ 2002-10-10 23:04 UTC (permalink / raw)
  To: nfs

Currently, we don't return an error when exportfs goes bad. Here is a
patch. I will check it in shortly if there is no objection.


H.J.
----
2002-10-10  H.J. Lu <hjl@lucon.org>

	* support/include/exportfs.h (export_errno): New.

	* support/nfs/exports.c: Include <errno.h>.
	(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.

Index: support/include/exportfs.h
===================================================================
RCS file: /cvsroot/nfs/nfs-utils/support/include/exportfs.h,v
retrieving revision 1.3
diff -u -p -r1.3 exportfs.h
--- support/include/exportfs.h	20 Sep 2001 00:37:17 -0000	1.3
+++ support/include/exportfs.h	10 Oct 2002 22:58:39 -0000
@@ -77,4 +77,7 @@ int				rmtab_read(void);
 
 struct nfskey *			key_lookup(char *hname);
 
+/* Record export error.  */
+extern int export_errno;
+
 #endif /* EXPORTFS_H */
Index: support/nfs/exports.c
===================================================================
RCS file: /cvsroot/nfs/nfs-utils/support/nfs/exports.c,v
retrieving revision 1.13
diff -u -p -r1.13 exports.c
--- support/nfs/exports.c	29 May 2002 06:07:43 -0000	1.13
+++ support/nfs/exports.c	10 Oct 2002 22:58:39 -0000
@@ -22,6 +22,7 @@
 #include <stdio.h>
 #include <ctype.h>
 #include <unistd.h>
+#include <errno.h>
 #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 fromexp
 	}
 	if (ok < 0) {
 		xlog(L_ERROR, "expected client(options...)");
+		export_errno = EINVAL;
 		return NULL;
 	}
 	first = 0;
@@ -114,6 +118,7 @@ getexportent(int fromkernel, int fromexp
 		*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 fromexp
 	}
 	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
 			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
 			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
 			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
 
 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;
Index: utils/exportfs/exportfs.c
===================================================================
RCS file: /cvsroot/nfs/nfs-utils/utils/exportfs/exportfs.c,v
retrieving revision 1.7
diff -u -p -r1.7 exportfs.c
--- utils/exportfs/exportfs.c	28 Feb 2002 01:37:45 -0000	1.7
+++ utils/exportfs/exportfs.c	10 Oct 2002 22:58:39 -0000
@@ -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.


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-10-10 23:04 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-10-10 23:04 PATCH: Return error on bad export H. J. Lu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.