svn commit: r203490 - in head/sbin: mount_nfs umount
Hajimu UMEMOTO
ume at FreeBSD.org
Thu Feb 4 15:17:49 UTC 2010
Author: ume
Date: Thu Feb 4 15:17:49 2010
New Revision: 203490
URL: http://svn.freebsd.org/changeset/base/203490
Log:
Introduce '[ipaddr]:path' notation.
Since the existing implementation searches ':' backward, a path which
includes ':' could not be mounted. You can now mount such path by
enclosing an IP address by '[]'.
Though we should change to search ':' forward, it will break
'ipv6addr:path' which is currently working. So, it still searches ':'
backward, at least for now.
MFC after: 2 weeks
Modified:
head/sbin/mount_nfs/mount_nfs.c
head/sbin/umount/umount.c
Modified: head/sbin/mount_nfs/mount_nfs.c
==============================================================================
--- head/sbin/mount_nfs/mount_nfs.c Thu Feb 4 14:40:08 2010 (r203489)
+++ head/sbin/mount_nfs/mount_nfs.c Thu Feb 4 15:17:49 2010 (r203490)
@@ -697,12 +697,17 @@ getnfsargs(char *spec, struct iovec **io
{
struct addrinfo hints, *ai_nfs, *ai;
enum tryret ret;
- int ecode, speclen, remoteerr;
+ int ecode, speclen, remoteerr, offset, have_bracket = 0;
char *hostp, *delimp, *errstr;
size_t len;
static char nam[MNAMELEN + 1], pname[MAXHOSTNAMELEN + 5];
- if ((delimp = strrchr(spec, ':')) != NULL) {
+ if (*spec == '[' && (delimp = strchr(spec + 1, ']')) != NULL &&
+ *(delimp + 1) == ':') {
+ hostp = spec + 1;
+ spec = delimp + 2;
+ have_bracket = 1;
+ } else if ((delimp = strrchr(spec, ':')) != NULL) {
hostp = spec;
spec = delimp + 1;
} else if ((delimp = strrchr(spec, '@')) != NULL) {
@@ -730,10 +735,15 @@ getnfsargs(char *spec, struct iovec **io
/* Make both '@' and ':' notations equal */
if (*hostp != '\0') {
len = strlen(hostp);
- memmove(nam, hostp, len);
- nam[len] = ':';
- memmove(nam + len + 1, spec, speclen);
- nam[len + speclen + 1] = '\0';
+ offset = 0;
+ if (have_bracket)
+ nam[offset++] = '[';
+ memmove(nam + offset, hostp, len);
+ if (have_bracket)
+ nam[len + offset++] = ']';
+ nam[len + offset++] = ':';
+ memmove(nam + len + offset, spec, speclen);
+ nam[len + speclen + offset] = '\0';
}
/*
Modified: head/sbin/umount/umount.c
==============================================================================
--- head/sbin/umount/umount.c Thu Feb 4 14:40:08 2010 (r203489)
+++ head/sbin/umount/umount.c Thu Feb 4 15:17:49 2010 (r203490)
@@ -325,14 +325,21 @@ umountfs(struct statfs *sfs)
if ((nfsdirname = strdup(sfs->f_mntfromname)) == NULL)
err(1, "strdup");
orignfsdirname = nfsdirname;
- if ((delimp = strrchr(nfsdirname, ':')) != NULL) {
- *delimp = '\0';
+ if (*nfsdirname == '[' &&
+ (delimp = strchr(nfsdirname + 1, ']')) != NULL &&
+ *(delimp + 1) == ':') {
+ hostp = nfsdirname + 1;
+ nfsdirname = delimp + 2;
+ } else if ((delimp = strrchr(nfsdirname, ':')) != NULL) {
hostp = nfsdirname;
+ nfsdirname = delimp + 1;
+ }
+ if (hostp != NULL) {
+ *delimp = '\0';
getaddrinfo(hostp, NULL, &hints, &ai);
if (ai == NULL) {
warnx("can't get net id for host");
}
- nfsdirname = delimp + 1;
}
/*
More information about the svn-src-head
mailing list