summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWeston Andros Adamson <dros@netapp.com>2012-05-01 14:54:39 -0400
committerSteve Dickson <steved@redhat.com>2012-05-01 14:55:50 -0400
commit946c1c81c2f38b65acff632be4d4604e3959a323 (patch)
tree8a9403eacde97c3351406851d922083c8ff5b0ca
parenta38b3e395f1c76ceb316b394a813abd4e885cc67 (diff)
downloadnfs-utils-946c1c81c2f38b65acff632be4d4604e3959a323.tar.gz
nfs-utils-946c1c81c2f38b65acff632be4d4604e3959a323.tar.xz
nfs-utils-946c1c81c2f38b65acff632be4d4604e3959a323.zip
mountd: support IPv6 [] escaping with fsloc hosts
mountd uses colons to split fsloc hosts, but this doesn't work with IPv6 addresses (they contain ':'). To fix this, mountd is changed to expect all IPv6 addresses to be escaped by '[' and ']' so colons that are part of the address may be skipped. To fix IPv6 referrals, this patch must be used with the nfsd patch that properly parses escaped IPv6 addresses in fs_location->hosts. Signed-off-by: Weston Andros Adamson <dros@netapp.com> Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--utils/mountd/fsloc.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/utils/mountd/fsloc.c b/utils/mountd/fsloc.c
index 704b7a0..bc737d1 100644
--- a/utils/mountd/fsloc.c
+++ b/utils/mountd/fsloc.c
@@ -120,10 +120,11 @@ static struct servers *parse_list(char **list)
*/
static struct servers *method_list(char *data)
{
- char *copy, *ptr=data;
+ char *copy, *ptr=data, *p;
char **list;
int i, listsize;
struct servers *rv=NULL;
+ bool v6esc = false;
xlog(L_NOTICE, "method_list(%s)", data);
for (ptr--, listsize=1; ptr; ptr=index(ptr, ':'), listsize++)
@@ -134,9 +135,22 @@ static struct servers *method_list(char *data)
xlog(L_NOTICE, "converted to %s", copy);
if (list && copy) {
ptr = copy;
- for (i=0; i<listsize; i++) {
- list[i] = strsep(&ptr, ":");
+ for (p = ptr, i = 0; *p && i < listsize; p++) {
+ if (*p == '[')
+ v6esc = true;
+ else if (*p == ']')
+ v6esc = false;
+
+ if (!v6esc && *p == ':') {
+ *p = '\0';
+ if (*ptr)
+ list[i++] = ptr;
+ ptr = p + 1;
+ }
}
+ if (*ptr)
+ list[i++] = ptr;
+ list[i] = NULL;
rv = parse_list(list);
}
free(copy);