All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Two more patches related to mountd IPv6 support
@ 2010-05-07 17:45 Chuck Lever
       [not found] ` <20100507174128.4221.36914.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Chuck Lever @ 2010-05-07 17:45 UTC (permalink / raw)
  To: steved; +Cc: linux-nfs

Steve-

Here are two more minor clean-up patches for IPv6 support in mountd.
The second patch defines the format in which IPv6 address are stored
in rmtab.  Since IPv6 addresses are new to this file, I hope there are
no backward-compatibility concerns about this change, but please let
me know if there might be a problem.

---

Chuck Lever (2):
      mountd: Convert colons in IPv6 presentation addresses to semicolons
      libexport.a: Refactor rmtab_read()


 support/export/rmtab.c |   64 +++++++++++++++++++++++++++++++-----------------
 support/nfs/rmtab.c    |   42 +++++++++++++++++++++++++++++---
 2 files changed, 80 insertions(+), 26 deletions(-)

-- 
Chuck Lever

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] libexport.a: Refactor rmtab_read()
       [not found] ` <20100507174128.4221.36914.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2010-05-07 17:45   ` Chuck Lever
  2010-05-07 17:45   ` [PATCH 2/2] mountd: Convert colons in IPv6 presentation addresses to semicolons Chuck Lever
  2010-05-24 10:03   ` [PATCH 0/2] Two more patches related to mountd IPv6 support Steve Dickson
  2 siblings, 0 replies; 4+ messages in thread
From: Chuck Lever @ 2010-05-07 17:45 UTC (permalink / raw)
  To: steved; +Cc: linux-nfs

Clean up: Make it easier to add IPv6 support by refactoring part of
rmtab_read() into a helper function.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---

 support/export/rmtab.c |   64 +++++++++++++++++++++++++++++++-----------------
 1 files changed, 41 insertions(+), 23 deletions(-)

diff --git a/support/export/rmtab.c b/support/export/rmtab.c
index b49e1aa..0ec495c 100644
--- a/support/export/rmtab.c
+++ b/support/export/rmtab.c
@@ -19,39 +19,57 @@
 #include "xio.h"
 #include "xlog.h"
 
+/*
+ * See if the entry already exists.  If not,
+ * this was an instantiated wild card, and we
+ * must add it.
+ */
+static void
+rmtab_read_wildcard(struct rmtabent *rep)
+{
+	nfs_export *exp, *exp2;
+	struct hostent *hp;
+
+	hp = gethostbyname(rep->r_client);
+	if (hp == NULL)
+		return;
+	hp = hostent_dup(hp);
+	if (hp == NULL)
+		return;
+
+	exp = export_allowed(hp, rep->r_path);
+	free(hp);
+	if (exp == NULL)
+		return;
+
+	exp2 = export_lookup(rep->r_client, exp->m_export.e_path, 0);
+	if (exp2 == NULL) {
+		struct exportent ee;
+
+		memset(&ee, 0, sizeof(ee));
+		dupexportent(&ee, &exp->m_export);
+
+		ee.e_hostname = rep->r_client;
+		exp2 = export_create(&ee, 0);
+		exp2->m_changed = exp->m_changed;
+	}
+	exp2->m_mayexport = 1;
+}
+
 int
 rmtab_read(void)
 {
 	struct rmtabent		*rep;
-	nfs_export		*exp = NULL;
 
 	setrmtabent("r");
 	while ((rep = getrmtabent(1, NULL)) != NULL) {
-		struct hostent		*hp = NULL;
 		int			htype;
-		
+
 		htype = client_gettype(rep->r_client);
-		if ((htype == MCL_FQDN || htype == MCL_SUBNETWORK)
-		    && (hp = gethostbyname (rep->r_client))
-		    && (hp = hostent_dup (hp),
-			exp = export_allowed (hp, rep->r_path))) {
-			/* see if the entry already exists, otherwise this was an instantiated
-			 * wild card, and we must add it
-			 */
-			nfs_export *exp2 = export_lookup(rep->r_client,
-							exp->m_export.e_path, 0);
-			if (!exp2) {
-				struct exportent ee;
-				dupexportent(&ee, &exp->m_export);
-				ee.e_hostname = rep->r_client;
-				exp2 = export_create(&ee, 0);
-				exp2->m_changed = exp->m_changed;
-			}
-			free (hp);
-			exp2->m_mayexport = 1;
-		} else if (hp) /* export_allowed failed */
-			free(hp);
+		if (htype == MCL_FQDN || htype == MCL_SUBNETWORK)
+			rmtab_read_wildcard(rep);
 	}
+
 	if (errno == EINVAL) {
 		/* Something goes wrong. We need to fix the rmtab
 		   file. */


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] mountd: Convert colons in IPv6 presentation addresses to semicolons
       [not found] ` <20100507174128.4221.36914.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  2010-05-07 17:45   ` [PATCH 1/2] libexport.a: Refactor rmtab_read() Chuck Lever
@ 2010-05-07 17:45   ` Chuck Lever
  2010-05-24 10:03   ` [PATCH 0/2] Two more patches related to mountd IPv6 support Steve Dickson
  2 siblings, 0 replies; 4+ messages in thread
From: Chuck Lever @ 2010-05-07 17:45 UTC (permalink / raw)
  To: steved; +Cc: linux-nfs

The /var/lib/nfs/rmtab file delineates fields in each of its lines
with a ":".  The first field contains the IP address of a client, in
presentation format.  IPv6 presentation format addresses contain
colons, which screws up the field delineation of rmtab.

Use a simple simple scheme to convert the colons in incoming client
names to some other character, and then convert them back when the
rmtab file is read.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---

 support/nfs/rmtab.c |   42 +++++++++++++++++++++++++++++++++++++++---
 1 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/support/nfs/rmtab.c b/support/nfs/rmtab.c
index a28abf3..ca789a3 100644
--- a/support/nfs/rmtab.c
+++ b/support/nfs/rmtab.c
@@ -19,6 +19,18 @@
 #include <signal.h>
 #include "nfslib.h"
 
+/*
+ * Colons in incoming IPv6 presentation addresses have to
+ * replaced with another character, since rmtab already
+ * uses colons to delineate fields.
+ *
+ * Use a printable character, but one that would never be
+ * found in a presentation address or domain name
+ */
+#define IPV6_COLON	';'
+
+#define LINELEN		(2048)
+
 static FILE	*rmfp = NULL;
 
 int
@@ -56,7 +68,8 @@ struct rmtabent *
 fgetrmtabent(FILE *fp, int log, long *pos)
 {
 	static struct rmtabent	re;
-	char	buf[2048], *count, *host, *path;
+	char		*count, *host, *path, *c;
+	static char	buf[LINELEN];
 
 	errno = 0;
 	if (!fp)
@@ -84,10 +97,16 @@ fgetrmtabent(FILE *fp, int log, long *pos)
 		else
 			re.r_count = 1;
 	} while (0);
+
 	strncpy(re.r_client, host, sizeof (re.r_client) - 1);
 	re.r_client[sizeof (re.r_client) - 1] = '\0';
+	for (c = re.r_client; *c != '\0'; c++)
+		if (*c == IPV6_COLON)
+			*c = ':';
+
 	strncpy(re.r_path, path, sizeof (re.r_path) - 1);
 	re.r_path[sizeof (re.r_path) - 1] = '\0';
+
 	return &re;
 }
 
@@ -100,10 +119,27 @@ putrmtabent(struct rmtabent *rep, long *pos)
 void
 fputrmtabent(FILE *fp, struct rmtabent *rep, long *pos)
 {
+	static char	buf[LINELEN];
+	char		*c;
+
 	if (!fp || (pos && fseek (fp, *pos, SEEK_SET) != 0))
 		return;
-	fprintf(fp, "%s:%s:0x%.8x\n", rep->r_client, rep->r_path,
-		rep->r_count);
+
+	/*
+	 * To avoid confusing the token parser in fgetrmtabent(),
+	 * convert colons in incoming IPv6 presentation addresses
+	 * to semicolons.
+	 */
+	if (strlen(rep->r_client) > sizeof(buf)) {
+		xlog(L_ERROR, "client name too large");
+		return;
+	}
+	strncpy(buf, rep->r_client, sizeof(buf));
+	for (c = buf; *c != '\0'; c++)
+		if (*c == ':')
+			*c = IPV6_COLON;
+
+	(void)fprintf(fp, "%s:%s:0x%.8x\n", buf, rep->r_path, rep->r_count);
 }
 
 void


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] Two more patches related to mountd IPv6 support
       [not found] ` <20100507174128.4221.36914.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  2010-05-07 17:45   ` [PATCH 1/2] libexport.a: Refactor rmtab_read() Chuck Lever
  2010-05-07 17:45   ` [PATCH 2/2] mountd: Convert colons in IPv6 presentation addresses to semicolons Chuck Lever
@ 2010-05-24 10:03   ` Steve Dickson
  2 siblings, 0 replies; 4+ messages in thread
From: Steve Dickson @ 2010-05-24 10:03 UTC (permalink / raw)
  To: Chuck Lever; +Cc: linux-nfs



On 05/07/2010 01:45 PM, Chuck Lever wrote:
> Steve-
> 
> Here are two more minor clean-up patches for IPv6 support in mountd.
> The second patch defines the format in which IPv6 address are stored
> in rmtab.  Since IPv6 addresses are new to this file, I hope there are
> no backward-compatibility concerns about this change, but please let
> me know if there might be a problem.
> 
> ---
> 
> Chuck Lever (2):
>       mountd: Convert colons in IPv6 presentation addresses to semicolons
>       libexport.a: Refactor rmtab_read()
> 
> 
>  support/export/rmtab.c |   64 +++++++++++++++++++++++++++++++-----------------
>  support/nfs/rmtab.c    |   42 +++++++++++++++++++++++++++++---
>  2 files changed, 80 insertions(+), 26 deletions(-)
> 
Committed...

steved.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-05-24 10:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-05-07 17:45 [PATCH 0/2] Two more patches related to mountd IPv6 support Chuck Lever
     [not found] ` <20100507174128.4221.36914.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2010-05-07 17:45   ` [PATCH 1/2] libexport.a: Refactor rmtab_read() Chuck Lever
2010-05-07 17:45   ` [PATCH 2/2] mountd: Convert colons in IPv6 presentation addresses to semicolons Chuck Lever
2010-05-24 10:03   ` [PATCH 0/2] Two more patches related to mountd IPv6 support Steve Dickson

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.