mountd - Module load handling
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Thu, 27 Nov 2014 14:54:53 +0000 (15:54 +0100)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Thu, 27 Nov 2014 18:59:07 +0000 (19:59 +0100)
- Change the way the 'nfs' module is loaded.
- Use getsysctlbyname() to get vfs.nfs.nfs_privport

Taken from: FreeBSD SVN 83687

sbin/mountd/mountd.c

index 6e4736f..607abaf 100644 (file)
  */
 
 #include <sys/param.h>
+#include <sys/module.h>
 #include <sys/mount.h>
 #include <sys/mountctl.h>
 #include <sys/fcntl.h>
+#include <sys/linker.h>
 #include <sys/stat.h>
 #include <sys/syslog.h>
 #include <sys/sysctl.h>
@@ -251,8 +253,7 @@ main(int argc, char **argv)
        int udpsock, tcpsock, udp6sock, tcp6sock;
        int xcreated = 0, s;
        int one = 1;
-       int c, error, mib[3];
-       struct vfsconf vfc;
+       int c;
 
        udp6conf = tcp6conf = NULL;
        udp6sock = tcp6sock = 0;
@@ -270,15 +271,11 @@ main(int argc, char **argv)
                have_v6 = 0;
        else
                close(s);
-       error = getvfsbyname("nfs", &vfc);
-       if (error && vfsisloadable("nfs")) {
-               if(vfsload("nfs"))
-                       err(1, "vfsload(nfs)");
-               endvfsent();    /* flush cache */
-               error = getvfsbyname("nfs", &vfc);
+       if (modfind("nfs") < 0) {
+               /* Not present in kernel, try loading it */
+               if (kldload("nfs") < 0 || modfind("nfs") < 0)
+                       errx(1, "NFS server is not available or loadable");
        }
-       if (error)
-               errx(1, "NFS support is not available in the running kernel");
 
        while ((c = getopt(argc, argv, "2dlnr")) != -1) {
                switch (c) {
@@ -360,11 +357,9 @@ main(int argc, char **argv)
 
 skip_v6:
        if (!resvport_only) {
-               mib[0] = CTL_VFS;
-               mib[1] = vfc.vfc_typenum;
-               mib[2] = NFS_NFSPRIVPORT;
-               if (sysctl(mib, 3, NULL, NULL, &resvport_only,
-                   sizeof(resvport_only)) != 0 && errno != ENOENT) {
+               if (sysctlbyname("vfs.nfs.nfs_privport", NULL, NULL,
+                       &resvport_only, sizeof(resvport_only)) != 0 &&
+                   errno != ENOENT) {
                        syslog(LOG_ERR, "sysctl: %m");
                        exit(1);
                }