From 3409bc9ae1614ba47430a3f593fdbe5fc177c878 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 2 Jun 2012 21:50:59 +0200 Subject: lib9/dial: add support for IPv6 The function p9dialparse() returns the host as a sockaddr_storage structure instead of a u32int, to be able to handle both IPv4 and IPv6 addresses. Because the sockaddr_storage structure also handle port numbers and Unix path names, there is no longer need to set them in the calling functions. However, these values are still returned for convenience. The sockaddr_in and sockaddr_un structures have been replaced by sockaddr_storage to handle Unix, IPv4 and IPv6 sockets. Names and addresses are resolved using either gethostbyname() or getaddrinfo() functions. The getaddrinfo() function is documented in RFC2553 and standardized since POSIX.1-2001. It supports both IPv4 and IPv6 addresses. The gethostbyname() function is deprecated since POSIX.1-2008. However, some libc implementations don't handle getaddrinfo() properly, thus we preferred to try gethostbyname() first. I've tried to preserve most of the old code logic to prevent from surprising or unwanted behavior. R=rsc http://codereview.appspot.com/6255068 --- src/cmd/vbackup/vmount.c | 19 ++++++++++--------- src/cmd/vbackup/vmount0.c | 19 ++++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) (limited to 'src/cmd/vbackup') diff --git a/src/cmd/vbackup/vmount.c b/src/cmd/vbackup/vmount.c index bdb283fb..dda0949f 100644 --- a/src/cmd/vbackup/vmount.c +++ b/src/cmd/vbackup/vmount.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include "mountnfs.h" @@ -20,7 +21,7 @@ void main(int argc, char **argv) { char *p, *net, *unx; - u32int host; + char host[INET_ADDRSTRLEN]; int n, port, proto, verbose; struct sockaddr_in sa; @@ -50,12 +51,17 @@ main(int argc, char **argv) usage(); p = p9netmkaddr(argv[0], "udp", "nfs"); - if(p9dialparse(strdup(p), &net, &unx, &host, &port) < 0) + if(p9dialparse(strdup(p), &net, &unx, &sa, &port) < 0) sysfatal("bad address '%s'", p); + if(sa.sin_family != AF_INET) + sysfatal("only IPv4 is supported"); + + inet_ntop(AF_INET, &(sa.sin_addr), host, INET_ADDRSTRLEN); + if(verbose) - print("nfs server is net=%s addr=%d.%d.%d.%d port=%d\n", - net, host&0xFF, (host>>8)&0xFF, (host>>16)&0xFF, host>>24, port); + print("nfs server is net=%s addr=%s port=%d\n", + net, host, port); proto = 0; if(strcmp(net, "tcp") == 0) @@ -65,11 +71,6 @@ main(int argc, char **argv) else sysfatal("bad proto %s: can only handle tcp and udp", net); - memset(&sa, 0, sizeof sa); - memmove(&sa.sin_addr, &host, 4); - sa.sin_family = AF_INET; - sa.sin_port = htons(port); - mountnfs(proto, &sa, handle, handlelen, argv[1]); exits(0); } diff --git a/src/cmd/vbackup/vmount0.c b/src/cmd/vbackup/vmount0.c index 93340c11..064e057b 100644 --- a/src/cmd/vbackup/vmount0.c +++ b/src/cmd/vbackup/vmount0.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include "mountnfs.h" @@ -22,7 +23,7 @@ void main(int argc, char **argv) { char *p, *net, *unx; - u32int host; + char host[INET_ADDRSTRLEN]; int n, port, proto, verbose; struct sockaddr_in sa; @@ -52,12 +53,17 @@ main(int argc, char **argv) usage(); p = p9netmkaddr(argv[0], "udp", "nfs"); - if(p9dialparse(strdup(p), &net, &unx, &host, &port) < 0) + if(p9dialparse(strdup(p), &net, &unx, &sa, &port) < 0) sysfatal("bad address '%s'", p); + if(sa.sin_family != AF_INET) + sysfatal("only IPv4 is supported"); + + inet_ntop(AF_INET, &(sa.sin_addr), host, INET_ADDRSTRLEN); + if(verbose) - print("nfs server is net=%s addr=%d.%d.%d.%d port=%d\n", - net, host&0xFF, (host>>8)&0xFF, (host>>16)&0xFF, host>>24, port); + print("nfs server is net=%s addr=%s port=%d\n", + net, host, port); proto = 0; if(strcmp(net, "tcp") == 0) @@ -67,11 +73,6 @@ main(int argc, char **argv) else sysfatal("bad proto %s: can only handle tcp and udp", net); - memset(&sa, 0, sizeof sa); - memmove(&sa.sin_addr, &host, 4); - sa.sin_family = AF_INET; - sa.sin_port = htons(port); - mountnfs(proto, &sa, handle, handlelen, argv[1]); exits(0); } -- cgit v1.2.3