Module Name: src Committed By: hannken Date: Fri Jun 4 10:46:01 UTC 2021
Modified Files: src/usr.sbin/mountd: mountd.c Log Message: Restructure do_nfssvc() and simplify the left cases GT_HOST and GT_NET. Add a helper add_export_arg() that emits a single export_args item and does the IPv6 check. Always use the path of the mount point for the export. To generate a diff of this commit: cvs rdiff -u -r1.134 -r1.135 src/usr.sbin/mountd/mountd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/mountd/mountd.c diff -u src/usr.sbin/mountd/mountd.c:1.134 src/usr.sbin/mountd/mountd.c:1.135 --- src/usr.sbin/mountd/mountd.c:1.134 Tue Feb 16 10:00:27 2021 +++ src/usr.sbin/mountd/mountd.c Fri Jun 4 10:46:01 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: mountd.c,v 1.134 2021/02/16 10:00:27 hannken Exp $ */ +/* $NetBSD: mountd.c,v 1.135 2021/06/04 10:46:01 hannken Exp $ */ /* * Copyright (c) 1989, 1993 @@ -42,7 +42,7 @@ __COPYRIGHT("@(#) Copyright (c) 1989, 19 #if 0 static char sccsid[] = "@(#)mountd.c 8.15 (Berkeley) 5/1/95"; #else -__RCSID("$NetBSD: mountd.c,v 1.134 2021/02/16 10:00:27 hannken Exp $"); +__RCSID("$NetBSD: mountd.c,v 1.135 2021/06/04 10:46:01 hannken Exp $"); #endif #endif /* not lint */ @@ -1918,6 +1918,40 @@ get_ht(void) return (hp); } +static int +add_export_arg(const char *path, int exflags, struct uucred *anoncrp, + struct sockaddr *addrp, int addrlen, struct sockaddr *maskp, int masklen, + char *indexfile) +{ + struct mountd_exports_list mel; + struct export_args export; + int error; + + if (addrp != NULL && addrp->sa_family == AF_INET6 && have_v6 == 0) + return 0; + + mel.mel_path = path; + mel.mel_nexports = 1; + mel.mel_exports = &export; + + export.ex_flags = exflags; + export.ex_anon = *anoncrp; + export.ex_indexfile = indexfile; + export.ex_addr = addrp; + export.ex_addrlen = addrlen; + export.ex_mask = maskp; + export.ex_masklen = masklen; + + error = nfssvc(NFSSVC_SETEXPORTSLIST, &mel); + + if (error) { + syslog(LOG_ERR, "Can't change attributes for %s: %m", path); + return 1; + } + + return 0; +} + /* * Do the nfssvc syscall to push the export info into the kernel. */ @@ -1930,92 +1964,37 @@ do_nfssvc(const char *line, size_t linen struct sockaddr_storage ss; struct addrinfo *ai; int addrlen; - int done; - struct export_args export; - export.ex_flags = exflags; - export.ex_anon = *anoncrp; - export.ex_indexfile = ep->ex_indexfile; if (grp->gr_type == GT_HOST) { - ai = grp->gr_ptr.gt_addrinfo; - addrp = ai->ai_addr; - addrlen = ai->ai_addrlen; - } else { - addrp = NULL; - ai = NULL; /* XXXGCC -Wuninitialized */ - addrlen = 0; /* XXXGCC -Wuninitialized */ - } - done = FALSE; - while (!done) { - struct mountd_exports_list mel; - - switch (grp->gr_type) { - case GT_HOST: - if (addrp != NULL && addrp->sa_family == AF_INET6 && - have_v6 == 0) - goto skip; - export.ex_addr = addrp; - export.ex_addrlen = addrlen; - export.ex_masklen = 0; - break; - case GT_NET: - export.ex_addr = (struct sockaddr *) - &grp->gr_ptr.gt_net.nt_net; - if (export.ex_addr->sa_family == AF_INET6 && - have_v6 == 0) - goto skip; - export.ex_addrlen = export.ex_addr->sa_len; - memset(&ss, 0, sizeof ss); - ss.ss_family = export.ex_addr->sa_family; - ss.ss_len = export.ex_addr->sa_len; - if (allones(&ss, grp->gr_ptr.gt_net.nt_len) != 0) { - syslog(LOG_ERR, - "\"%s\", line %ld: Bad network flag", - line, (unsigned long)lineno); - return (1); - } - export.ex_mask = (struct sockaddr *)&ss; - export.ex_masklen = ss.ss_len; - break; - default: - syslog(LOG_ERR, "\"%s\", line %ld: Bad netgroup type", + for (ai = grp->gr_ptr.gt_addrinfo; ai; ai = ai->ai_next) { + addrp = ai->ai_addr; + addrlen = ai->ai_addrlen; + if (add_export_arg(fsb->f_mntonname, exflags, anoncrp, + addrp, addrlen, NULL, 0, ep->ex_indexfile) != 0) + return 1; + } + } else if (grp->gr_type == GT_NET) { + addrp = (struct sockaddr *)&grp->gr_ptr.gt_net.nt_net; + addrlen = addrp->sa_len; + memset(&ss, 0, sizeof ss); + ss.ss_family = addrp->sa_family; + ss.ss_len = addrp->sa_len; + if (allones(&ss, grp->gr_ptr.gt_net.nt_len) != 0) { + syslog(LOG_ERR, "\"%s\", line %ld: Bad network flag", line, (unsigned long)lineno); - return (1); - }; - - /* - * XXX: - * Maybe I should just use the fsb->f_mntonname path? - */ - - mel.mel_path = dirp; - mel.mel_nexports = 1; - mel.mel_exports = &export; - - if (nfssvc(NFSSVC_SETEXPORTSLIST, &mel) != 0) { - syslog(LOG_ERR, - "\"%s\", line %ld: Can't change attributes for %s to %s: %m", - line, (unsigned long)lineno, - dirp, (grp->gr_type == GT_HOST) ? - grp->gr_ptr.gt_addrinfo->ai_canonname : - (grp->gr_type == GT_NET) ? - grp->gr_ptr.gt_net.nt_name : - "Unknown"); - return (1); + return 1; } -skip: - if (addrp) { - ai = ai->ai_next; - if (ai == NULL) - done = TRUE; - else { - addrp = ai->ai_addr; - addrlen = ai->ai_addrlen; - } - } else - done = TRUE; + if (add_export_arg(fsb->f_mntonname, exflags, anoncrp, + addrp, addrlen, (struct sockaddr *)&ss, ss.ss_len, + ep->ex_indexfile) != 0) + return 1; + } else { + syslog(LOG_ERR, "\"%s\", line %ld: Bad netgroup type", + line, (unsigned long)lineno); + return 1; } - return (0); + + return 0; } /*