A few more mountd cleanups:

- Remove some horrible code that faked a "struct addrinfo" to be
  later passed to freeaddrinfo(). Instead, add a new group type
  "GT_DEFAULT" used to denote that the filesystem is exported to the
  world, and treat this case separately.
- Don't clear the AI_CANONNAME flag in a struct addrinfo returned
  by getaddrinfo. There's still a bit more struct addrinfo abuse
  left in here.
- Simplify do_mount() slightly by using an addrinfo pointer to keep
  track of the current address.
This commit is contained in:
Ian Dowse 2001-04-18 00:28:37 +00:00
parent c18e19a64d
commit 6d359f31fc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=75641
2 changed files with 34 additions and 74 deletions

View file

@ -143,6 +143,7 @@ struct grouplist {
#define GT_NULL 0x0
#define GT_HOST 0x1
#define GT_NET 0x2
#define GT_DEFAULT 0x3
#define GT_IGNORE 0x5
struct hostlist {
@ -879,7 +880,6 @@ get_exportlist()
struct exportlist **epp;
struct dirlist *dirhead;
struct statfs fsb, *fsp;
struct addrinfo *ai;
struct xucred anon;
char *cp, *endcp, *dirp, *hst, *usr, *dom, savedc;
int len, has_host, exflags, got_nondir, dirplen, num, i, netgrp;
@ -1087,21 +1087,9 @@ get_exportlist()
goto nextline;
}
if (!has_host) {
grp->gr_type = GT_HOST;
grp->gr_type = GT_DEFAULT;
if (debug)
warnx("adding a default entry");
/* add a default group and make the grp list NULL */
ai = malloc(sizeof(struct addrinfo));
ai->ai_flags = 0;
ai->ai_family = AF_INET; /* XXXX */
ai->ai_socktype = SOCK_DGRAM;
/* setting the length to 0 will match anything */
ai->ai_addrlen = 0;
ai->ai_flags = AI_CANONNAME;
ai->ai_canonname = strdup("Default");
ai->ai_addr = NULL;
ai->ai_next = NULL;
grp->gr_ptr.gt_addrinfo = ai;
/*
* Don't allow a network export coincide with a list of
@ -1662,8 +1650,7 @@ get_host(cp, grp, tgrp)
strlcpy(host, "?", sizeof(host));
ai->ai_canonname = strdup(host);
ai->ai_flags |= AI_CANONNAME;
} else
ai->ai_flags &= ~AI_CANONNAME;
}
if (debug)
fprintf(stderr, "got host %s\n", ai->ai_canonname);
/*
@ -1766,10 +1753,8 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
int dirplen;
struct statfs *fsb;
{
struct sockaddr *addrp;
struct sockaddr_storage ss;
struct addrinfo *ai;
int addrlen;
char *cp = NULL;
int done;
char savedc = '\0';
@ -1784,27 +1769,22 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
struct ntfs_args na;
} args;
ai = NULL;
addrlen = 0;
args.ua.fspec = 0;
args.ua.export.ex_flags = exflags;
args.ua.export.ex_anon = *anoncrp;
args.ua.export.ex_indexfile = ep->ex_indexfile;
if (grp->gr_type == GT_HOST) {
if (grp->gr_type == GT_HOST)
ai = grp->gr_ptr.gt_addrinfo;
addrp = ai->ai_addr;
addrlen = ai->ai_addrlen;
} else
addrp = NULL;
else
ai = NULL;
done = FALSE;
while (!done) {
switch (grp->gr_type) {
case GT_HOST:
if (addrp != NULL && addrp->sa_family == AF_INET6 &&
have_v6 == 0)
if (ai->ai_addr->sa_family == AF_INET6 && have_v6 == 0)
goto skip;
args.ua.export.ex_addr = addrp;
args.ua.export.ex_addrlen = addrlen;
args.ua.export.ex_addr = ai->ai_addr;
args.ua.export.ex_addrlen = ai->ai_addrlen;
args.ua.export.ex_masklen = 0;
break;
case GT_NET:
@ -1827,6 +1807,12 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
args.ua.export.ex_mask = (struct sockaddr *)&ss;
args.ua.export.ex_masklen = ss.ss_len;
break;
case GT_DEFAULT:
args.ua.export.ex_addr = NULL;
args.ua.export.ex_addrlen = 0;
args.ua.export.ex_mask = NULL;
args.ua.export.ex_masklen = 0;
break;
case GT_IGNORE:
return(0);
break;
@ -1878,15 +1864,9 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
*cp = '\0';
}
skip:
if (addrp) {
if (ai != NULL)
ai = ai->ai_next;
if (ai == NULL)
done = TRUE;
else {
addrp = ai->ai_addr;
addrlen = ai->ai_addrlen;
}
} else
if (ai == NULL)
done = TRUE;
}
if (cp)

View file

@ -143,6 +143,7 @@ struct grouplist {
#define GT_NULL 0x0
#define GT_HOST 0x1
#define GT_NET 0x2
#define GT_DEFAULT 0x3
#define GT_IGNORE 0x5
struct hostlist {
@ -879,7 +880,6 @@ get_exportlist()
struct exportlist **epp;
struct dirlist *dirhead;
struct statfs fsb, *fsp;
struct addrinfo *ai;
struct xucred anon;
char *cp, *endcp, *dirp, *hst, *usr, *dom, savedc;
int len, has_host, exflags, got_nondir, dirplen, num, i, netgrp;
@ -1087,21 +1087,9 @@ get_exportlist()
goto nextline;
}
if (!has_host) {
grp->gr_type = GT_HOST;
grp->gr_type = GT_DEFAULT;
if (debug)
warnx("adding a default entry");
/* add a default group and make the grp list NULL */
ai = malloc(sizeof(struct addrinfo));
ai->ai_flags = 0;
ai->ai_family = AF_INET; /* XXXX */
ai->ai_socktype = SOCK_DGRAM;
/* setting the length to 0 will match anything */
ai->ai_addrlen = 0;
ai->ai_flags = AI_CANONNAME;
ai->ai_canonname = strdup("Default");
ai->ai_addr = NULL;
ai->ai_next = NULL;
grp->gr_ptr.gt_addrinfo = ai;
/*
* Don't allow a network export coincide with a list of
@ -1662,8 +1650,7 @@ get_host(cp, grp, tgrp)
strlcpy(host, "?", sizeof(host));
ai->ai_canonname = strdup(host);
ai->ai_flags |= AI_CANONNAME;
} else
ai->ai_flags &= ~AI_CANONNAME;
}
if (debug)
fprintf(stderr, "got host %s\n", ai->ai_canonname);
/*
@ -1766,10 +1753,8 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
int dirplen;
struct statfs *fsb;
{
struct sockaddr *addrp;
struct sockaddr_storage ss;
struct addrinfo *ai;
int addrlen;
char *cp = NULL;
int done;
char savedc = '\0';
@ -1784,27 +1769,22 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
struct ntfs_args na;
} args;
ai = NULL;
addrlen = 0;
args.ua.fspec = 0;
args.ua.export.ex_flags = exflags;
args.ua.export.ex_anon = *anoncrp;
args.ua.export.ex_indexfile = ep->ex_indexfile;
if (grp->gr_type == GT_HOST) {
if (grp->gr_type == GT_HOST)
ai = grp->gr_ptr.gt_addrinfo;
addrp = ai->ai_addr;
addrlen = ai->ai_addrlen;
} else
addrp = NULL;
else
ai = NULL;
done = FALSE;
while (!done) {
switch (grp->gr_type) {
case GT_HOST:
if (addrp != NULL && addrp->sa_family == AF_INET6 &&
have_v6 == 0)
if (ai->ai_addr->sa_family == AF_INET6 && have_v6 == 0)
goto skip;
args.ua.export.ex_addr = addrp;
args.ua.export.ex_addrlen = addrlen;
args.ua.export.ex_addr = ai->ai_addr;
args.ua.export.ex_addrlen = ai->ai_addrlen;
args.ua.export.ex_masklen = 0;
break;
case GT_NET:
@ -1827,6 +1807,12 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
args.ua.export.ex_mask = (struct sockaddr *)&ss;
args.ua.export.ex_masklen = ss.ss_len;
break;
case GT_DEFAULT:
args.ua.export.ex_addr = NULL;
args.ua.export.ex_addrlen = 0;
args.ua.export.ex_mask = NULL;
args.ua.export.ex_masklen = 0;
break;
case GT_IGNORE:
return(0);
break;
@ -1878,15 +1864,9 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
*cp = '\0';
}
skip:
if (addrp) {
if (ai != NULL)
ai = ai->ai_next;
if (ai == NULL)
done = TRUE;
else {
addrp = ai->ai_addr;
addrlen = ai->ai_addrlen;
}
} else
if (ai == NULL)
done = TRUE;
}
if (cp)