Various bugfixes and cleanups, mainly from Martin Blapp:

- Revert del_mlist() to its pre-tirpc prototype. Unlike NetBSD's version,
  ours lets the caller generate any syslog() messages, so that it
  can include the service name in the message.
- Initialise a few local variables to clarify the logic and avoid some
  compiler warnings.
- Remove a few unused functions and local variables, and fix some
  whitespace issues.
- Reinstate the logic for avoiding duplicate host entries that got
  removed accidentally in revision 1.41 (added in r1.5). This bit
  was submitted in a slightly different form by Thomas Quinot.

Submitted by:	Martin Blapp <mb@imp.ch>,
		Thomas Quinot <quinot@inf.enst.fr>
PR:		bin/26148
This commit is contained in:
iedowse 2001-04-17 22:25:48 +00:00
parent fcae29ec07
commit cc38e735a4
2 changed files with 94 additions and 136 deletions

View File

@ -165,7 +165,7 @@ void add_mlist __P((char *, char *));
int check_dirpath __P((char *));
int check_options __P((struct dirlist *));
int chk_host __P((struct dirlist *, struct sockaddr *, int *, int *));
int del_mlist __P((char *, char *, struct sockaddr *));
void del_mlist(char *hostp, char *dirp);
struct dirlist *dirp_search __P((struct dirlist *, char *));
int do_mount __P((struct exportlist *, struct grouplist *, int,
struct xucred *, char *, int, struct statfs *));
@ -179,7 +179,6 @@ void free_grp __P((struct grouplist *));
void free_host __P((struct hostlist *));
void get_exportlist __P((void));
int get_host __P((char *, struct grouplist *, struct grouplist *));
int get_num __P((char *));
struct hostlist *get_ht __P((void));
int get_line __P((void));
void get_mountlist __P((void));
@ -269,8 +268,10 @@ main(argc, argv)
int c, error, mib[3];
struct vfsconf vfc;
udp6conf = tcp6conf = NULL;
udp6sock = tcp6sock = NULL;
/* Check that another mountd isn't already running. */
if ((mountdlockfd = (open(MOUNTDLOCK, O_RDONLY|O_CREAT, 0444))) == -1)
err(1, "%s", MOUNTDLOCK);
@ -507,20 +508,16 @@ mntsrv(rqstp, transp)
char rpcpath[RPCMNT_PATHLEN + 1], dirpath[MAXPATHLEN];
int bad = 0, defset, hostset;
sigset_t sighup_mask;
struct sockaddr_in6 *sin6;
struct sockaddr_in *sin;
sigemptyset(&sighup_mask);
sigaddset(&sighup_mask, SIGHUP);
saddr = svc_getrpccaller(transp)->buf;
switch (saddr->sa_family) {
case AF_INET6:
sin6 = (struct sockaddr_in6 *)saddr;
sport = ntohs(sin6->sin6_port);
sport = ntohs(((struct sockaddr_in6 *)saddr)->sin6_port);
break;
case AF_INET:
sin = (struct sockaddr_in *)saddr;
sport = ntohs(sin->sin_port);
sport = ntohs(((struct sockaddr_in *)saddr)->sin_port);
break;
default:
syslog(LOG_ERR, "request from unknown address family");
@ -655,8 +652,8 @@ mntsrv(rqstp, transp)
if (!svc_sendreply(transp, xdr_void, (caddr_t)NULL))
syslog(LOG_ERR, "can't send reply");
if (!lookup_failed)
del_mlist(host, dirpath, saddr);
del_mlist(numerichost, dirpath, saddr);
del_mlist(host, dirpath);
del_mlist(numerichost, dirpath);
if (log)
syslog(LOG_NOTICE,
"umount request succeeded from %s for %s",
@ -673,8 +670,8 @@ mntsrv(rqstp, transp)
if (!svc_sendreply(transp, xdr_void, (caddr_t)NULL))
syslog(LOG_ERR, "can't send reply");
if (!lookup_failed)
del_mlist(host, NULL, saddr);
del_mlist(numerichost, NULL, saddr);
del_mlist(host, NULL);
del_mlist(numerichost, NULL);
if (log)
syslog(LOG_NOTICE,
"umountall request succeeded from %s",
@ -1135,11 +1132,11 @@ get_exportlist()
*/
grp = tgrp;
do {
if (do_mount(ep, grp, exflags, &anon, dirp,
dirplen, &fsb)) {
getexp_err(ep, tgrp);
goto nextline;
}
if (do_mount(ep, grp, exflags, &anon, dirp, dirplen,
&fsb)) {
getexp_err(ep, tgrp);
goto nextline;
}
} while (grp->gr_next && (grp = grp->gr_next));
/*
@ -1369,14 +1366,6 @@ add_dlist(dpp, newdp, grp, flags)
}
}
/*
* Search for a dirpath on the export point.
*/
void *
test()
{
}
/*
* Search for a dirpath on the export point.
*/
@ -1649,11 +1638,9 @@ get_host(cp, grp, tgrp)
struct grouplist *tgrp;
{
struct grouplist *checkgrp;
struct addrinfo *ai, hints;
struct addrinfo *ai, *tai, hints;
int ecode;
char host[NI_MAXHOST];
int i;
char *aptr[2];
if (grp->gr_type != GT_NULL) {
syslog(LOG_ERR, "Bad netgroup type for ip host %s", cp);
@ -1664,11 +1651,9 @@ get_host(cp, grp, tgrp)
hints.ai_protocol = IPPROTO_UDP;
ecode = getaddrinfo(cp, NULL, &hints, &ai);
if (ecode != 0) {
syslog(LOG_ERR,"can't get address info for "
"host %s", cp);
syslog(LOG_ERR,"can't get address info for host %s", cp);
return 1;
}
grp->gr_type = GT_HOST;
grp->gr_ptr.gt_addrinfo = ai;
while (ai != NULL) {
if (ai->ai_canonname == NULL) {
@ -1680,9 +1665,30 @@ get_host(cp, grp, tgrp)
} else
ai->ai_flags &= ~AI_CANONNAME;
if (debug)
(void)fprintf(stderr, "got host %s\n", ai->ai_canonname);
fprintf(stderr, "got host %s\n", ai->ai_canonname);
/*
* Sanity check: make sure we don't already have an entry
* for this host in the grouplist.
*/
for (checkgrp = tgrp; checkgrp != NULL;
checkgrp = checkgrp->gr_next) {
if (checkgrp->gr_type != GT_HOST)
continue;
for (tai = checkgrp->gr_ptr.gt_addrinfo; tai != NULL;
tai = tai->ai_next) {
if (sacmp(tai->ai_addr, ai->ai_addr) != 0)
continue;
if (debug)
fprintf(stderr,
"ignoring duplicate host %s\n",
ai->ai_canonname);
grp->gr_type = GT_IGNORE;
return (0);
}
}
ai = ai->ai_next;
}
grp->gr_type = GT_HOST;
return (0);
}
@ -1778,6 +1784,8 @@ 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;
@ -1843,6 +1851,9 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
else
cp = dirp + dirplen - 1;
if (errno == EPERM) {
if (debug)
warnx("can't change attributes for %s",
dirp);
syslog(LOG_ERR,
"can't change attributes for %s", dirp);
return (1);
@ -1901,6 +1912,7 @@ get_net(cp, net, maskflg)
long preflen;
int ecode;
p = prefp = NULL;
if ((opt_flags & OP_MASKLEN) && !maskflg) {
p = strchr(cp, '/');
*p = '\0';
@ -2180,28 +2192,14 @@ get_mountlist()
fclose(mlfile);
}
int
del_mlist(hostp, dirp, saddr)
char *hostp, *dirp;
struct sockaddr *saddr;
void
del_mlist(char *hostp, char *dirp)
{
struct mountlist *mlp, **mlpp;
struct mountlist *mlp2;
u_short sport;
FILE *mlfile;
int fnd = 0;
char host[NI_MAXHOST];
switch (saddr->sa_family) {
case AF_INET6:
sport = ntohs(((struct sockaddr_in6 *)saddr)->sin6_port);
break;
case AF_INET:
sport = ntohs(((struct sockaddr_in *)saddr)->sin_port);
break;
default:
return -1;
}
mlpp = &mlhead;
mlp = mlhead;
while (mlp) {
@ -2269,8 +2267,6 @@ void
free_grp(grp)
struct grouplist *grp;
{
struct addrinfo *ai;
if (grp->gr_type == GT_HOST) {
if (grp->gr_ptr.gt_addrinfo != NULL)
freeaddrinfo(grp->gr_ptr.gt_addrinfo);
@ -2346,23 +2342,6 @@ check_dirpath(dirp)
return (ret);
}
/*
* Just translate an ascii string to an integer.
*/
int
get_num(cp)
register char *cp;
{
register int res = 0;
while (*cp) {
if (*cp < '0' || *cp > '9')
return (-1);
res = res * 10 + (*cp++ - '0');
}
return (res);
}
static int
netpartcmp(struct sockaddr *s1, struct sockaddr *s2, int bitlen)
{

View File

@ -165,7 +165,7 @@ void add_mlist __P((char *, char *));
int check_dirpath __P((char *));
int check_options __P((struct dirlist *));
int chk_host __P((struct dirlist *, struct sockaddr *, int *, int *));
int del_mlist __P((char *, char *, struct sockaddr *));
void del_mlist(char *hostp, char *dirp);
struct dirlist *dirp_search __P((struct dirlist *, char *));
int do_mount __P((struct exportlist *, struct grouplist *, int,
struct xucred *, char *, int, struct statfs *));
@ -179,7 +179,6 @@ void free_grp __P((struct grouplist *));
void free_host __P((struct hostlist *));
void get_exportlist __P((void));
int get_host __P((char *, struct grouplist *, struct grouplist *));
int get_num __P((char *));
struct hostlist *get_ht __P((void));
int get_line __P((void));
void get_mountlist __P((void));
@ -269,8 +268,10 @@ main(argc, argv)
int c, error, mib[3];
struct vfsconf vfc;
udp6conf = tcp6conf = NULL;
udp6sock = tcp6sock = NULL;
/* Check that another mountd isn't already running. */
if ((mountdlockfd = (open(MOUNTDLOCK, O_RDONLY|O_CREAT, 0444))) == -1)
err(1, "%s", MOUNTDLOCK);
@ -507,20 +508,16 @@ mntsrv(rqstp, transp)
char rpcpath[RPCMNT_PATHLEN + 1], dirpath[MAXPATHLEN];
int bad = 0, defset, hostset;
sigset_t sighup_mask;
struct sockaddr_in6 *sin6;
struct sockaddr_in *sin;
sigemptyset(&sighup_mask);
sigaddset(&sighup_mask, SIGHUP);
saddr = svc_getrpccaller(transp)->buf;
switch (saddr->sa_family) {
case AF_INET6:
sin6 = (struct sockaddr_in6 *)saddr;
sport = ntohs(sin6->sin6_port);
sport = ntohs(((struct sockaddr_in6 *)saddr)->sin6_port);
break;
case AF_INET:
sin = (struct sockaddr_in *)saddr;
sport = ntohs(sin->sin_port);
sport = ntohs(((struct sockaddr_in *)saddr)->sin_port);
break;
default:
syslog(LOG_ERR, "request from unknown address family");
@ -655,8 +652,8 @@ mntsrv(rqstp, transp)
if (!svc_sendreply(transp, xdr_void, (caddr_t)NULL))
syslog(LOG_ERR, "can't send reply");
if (!lookup_failed)
del_mlist(host, dirpath, saddr);
del_mlist(numerichost, dirpath, saddr);
del_mlist(host, dirpath);
del_mlist(numerichost, dirpath);
if (log)
syslog(LOG_NOTICE,
"umount request succeeded from %s for %s",
@ -673,8 +670,8 @@ mntsrv(rqstp, transp)
if (!svc_sendreply(transp, xdr_void, (caddr_t)NULL))
syslog(LOG_ERR, "can't send reply");
if (!lookup_failed)
del_mlist(host, NULL, saddr);
del_mlist(numerichost, NULL, saddr);
del_mlist(host, NULL);
del_mlist(numerichost, NULL);
if (log)
syslog(LOG_NOTICE,
"umountall request succeeded from %s",
@ -1135,11 +1132,11 @@ get_exportlist()
*/
grp = tgrp;
do {
if (do_mount(ep, grp, exflags, &anon, dirp,
dirplen, &fsb)) {
getexp_err(ep, tgrp);
goto nextline;
}
if (do_mount(ep, grp, exflags, &anon, dirp, dirplen,
&fsb)) {
getexp_err(ep, tgrp);
goto nextline;
}
} while (grp->gr_next && (grp = grp->gr_next));
/*
@ -1369,14 +1366,6 @@ add_dlist(dpp, newdp, grp, flags)
}
}
/*
* Search for a dirpath on the export point.
*/
void *
test()
{
}
/*
* Search for a dirpath on the export point.
*/
@ -1649,11 +1638,9 @@ get_host(cp, grp, tgrp)
struct grouplist *tgrp;
{
struct grouplist *checkgrp;
struct addrinfo *ai, hints;
struct addrinfo *ai, *tai, hints;
int ecode;
char host[NI_MAXHOST];
int i;
char *aptr[2];
if (grp->gr_type != GT_NULL) {
syslog(LOG_ERR, "Bad netgroup type for ip host %s", cp);
@ -1664,11 +1651,9 @@ get_host(cp, grp, tgrp)
hints.ai_protocol = IPPROTO_UDP;
ecode = getaddrinfo(cp, NULL, &hints, &ai);
if (ecode != 0) {
syslog(LOG_ERR,"can't get address info for "
"host %s", cp);
syslog(LOG_ERR,"can't get address info for host %s", cp);
return 1;
}
grp->gr_type = GT_HOST;
grp->gr_ptr.gt_addrinfo = ai;
while (ai != NULL) {
if (ai->ai_canonname == NULL) {
@ -1680,9 +1665,30 @@ get_host(cp, grp, tgrp)
} else
ai->ai_flags &= ~AI_CANONNAME;
if (debug)
(void)fprintf(stderr, "got host %s\n", ai->ai_canonname);
fprintf(stderr, "got host %s\n", ai->ai_canonname);
/*
* Sanity check: make sure we don't already have an entry
* for this host in the grouplist.
*/
for (checkgrp = tgrp; checkgrp != NULL;
checkgrp = checkgrp->gr_next) {
if (checkgrp->gr_type != GT_HOST)
continue;
for (tai = checkgrp->gr_ptr.gt_addrinfo; tai != NULL;
tai = tai->ai_next) {
if (sacmp(tai->ai_addr, ai->ai_addr) != 0)
continue;
if (debug)
fprintf(stderr,
"ignoring duplicate host %s\n",
ai->ai_canonname);
grp->gr_type = GT_IGNORE;
return (0);
}
}
ai = ai->ai_next;
}
grp->gr_type = GT_HOST;
return (0);
}
@ -1778,6 +1784,8 @@ 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;
@ -1843,6 +1851,9 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
else
cp = dirp + dirplen - 1;
if (errno == EPERM) {
if (debug)
warnx("can't change attributes for %s",
dirp);
syslog(LOG_ERR,
"can't change attributes for %s", dirp);
return (1);
@ -1901,6 +1912,7 @@ get_net(cp, net, maskflg)
long preflen;
int ecode;
p = prefp = NULL;
if ((opt_flags & OP_MASKLEN) && !maskflg) {
p = strchr(cp, '/');
*p = '\0';
@ -2180,28 +2192,14 @@ get_mountlist()
fclose(mlfile);
}
int
del_mlist(hostp, dirp, saddr)
char *hostp, *dirp;
struct sockaddr *saddr;
void
del_mlist(char *hostp, char *dirp)
{
struct mountlist *mlp, **mlpp;
struct mountlist *mlp2;
u_short sport;
FILE *mlfile;
int fnd = 0;
char host[NI_MAXHOST];
switch (saddr->sa_family) {
case AF_INET6:
sport = ntohs(((struct sockaddr_in6 *)saddr)->sin6_port);
break;
case AF_INET:
sport = ntohs(((struct sockaddr_in *)saddr)->sin_port);
break;
default:
return -1;
}
mlpp = &mlhead;
mlp = mlhead;
while (mlp) {
@ -2269,8 +2267,6 @@ void
free_grp(grp)
struct grouplist *grp;
{
struct addrinfo *ai;
if (grp->gr_type == GT_HOST) {
if (grp->gr_ptr.gt_addrinfo != NULL)
freeaddrinfo(grp->gr_ptr.gt_addrinfo);
@ -2346,23 +2342,6 @@ check_dirpath(dirp)
return (ret);
}
/*
* Just translate an ascii string to an integer.
*/
int
get_num(cp)
register char *cp;
{
register int res = 0;
while (*cp) {
if (*cp < '0' || *cp > '9')
return (-1);
res = res * 10 + (*cp++ - '0');
}
return (res);
}
static int
netpartcmp(struct sockaddr *s1, struct sockaddr *s2, int bitlen)
{