Hi,

Here's a diff that allows telling mountd the udp and tcp port to use.

Christopher


Index: mountd.8
===================================================================
RCS file: /cvs/src/sbin/mountd/mountd.8,v
retrieving revision 1.16
diff -u -p -r1.16 mountd.8
--- mountd.8    31 May 2007 19:19:46 -0000      1.16
+++ mountd.8    27 Jul 2011 11:55:43 -0000
@@ -63,6 +63,8 @@ Enable debugging mode.
 .Nm
 will not detach from the controlling terminal and will print
 debugging messages to stderr.
+.It Fl n Ar port
+Specifies which udp and tcp ports mountd should bind to.
 .It Fl n
 Do not require that clients make mount requests from reserved ports.
 (Normally, only mount requests from reserved ports are accepted.)
Index: mountd.c
===================================================================
RCS file: /cvs/src/sbin/mountd/mountd.c,v
retrieving revision 1.71
diff -u -p -r1.71 mountd.c
--- mountd.c    22 Mar 2010 16:35:27 -0000      1.71
+++ mountd.c    27 Jul 2011 11:55:45 -0000
@@ -211,11 +211,15 @@ volatile sig_atomic_t gotterm;
 int
 main(int argc, char *argv[])
 {
+       struct sockaddr_in inetaddr;
+       int port=0;
+       int udpsock, tcpsock;
        SVCXPRT *udptransp, *tcptransp;
        FILE *pidfile;
+       const char *errstr = NULL;
        int c;

-       while ((c = getopt(argc, argv, "dnr")) != -1)
+       while ((c = getopt(argc, argv, "dnp:r")) != -1)
                switch (c) {
                case 'd':
                        debug = 1;
@@ -223,11 +227,18 @@ main(int argc, char *argv[])
                case 'n':
                        resvport_only = 0;
                        break;
+               case 'p':
+                       port = strtonum(optarg, 1, (1<<16) - 1, &errstr);
+                       if (errstr) {
+                               fprintf(stderr, "mountd port is %s: %s\n", 
errstr, optarg);
+                               return(1);
+                       }
+                       break;
                case 'r':
                        /* Compatibility */
                        break;
                default:
-                       fprintf(stderr, "usage: mountd [-dn] [exportsfile]\n");
+                       fprintf(stderr, "usage: mountd [-dn] [-p port] 
[exportsfile]\n");
                        exit(1);
                }
        argc -= optind;
@@ -273,8 +284,52 @@ main(int argc, char *argv[])
        signal(SIGHUP, (void (*)(int)) new_exportlist);
        signal(SIGTERM, (void (*)(int)) send_umntall);
        signal(SIGSYS, SIG_IGN);
-       if ((udptransp = svcudp_create(RPC_ANYSOCK)) == NULL ||
-           (tcptransp = svctcp_create(RPC_ANYSOCK, 0, 0)) == NULL) {
+       
+       /* Create tcp/udp sockets */
+       if(port == 0)
+               udpsock = tcpsock = RPC_ANYSOCK;
+
+       else {
+               if ((udpsock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+                       syslog(LOG_ERR, "can't create udp socket");
+                       return (1);
+               }
+               memset(&inetaddr, 0, sizeof inetaddr);
+               inetaddr.sin_family = AF_INET;
+               inetaddr.sin_addr.s_addr = INADDR_ANY;
+               inetaddr.sin_port = htons(port);
+               inetaddr.sin_len = sizeof(inetaddr);
+               if (bind(udpsock, (struct sockaddr *)&inetaddr,
+                   sizeof(inetaddr)) < 0) {
+                       syslog(LOG_ERR, "can't bind udp addr");
+                       return (1);
+               }
+
+
+               if ((tcpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+                       syslog(LOG_ERR, "can't create tcp socket");
+                       return (1);
+               }
+               memset(&inetaddr, 0, sizeof inetaddr);
+               inetaddr.sin_family = AF_INET;
+               inetaddr.sin_addr.s_addr = INADDR_ANY;
+               inetaddr.sin_port = htons(port);
+               inetaddr.sin_len = sizeof(inetaddr);
+               if (bind(tcpsock, (struct sockaddr *)&inetaddr,
+                   sizeof (inetaddr)) < 0) {
+                       syslog(LOG_ERR, "can't bind tcp addr");
+                       return (1);
+               }
+#if 0
+               if (listen(tcpsock, 5) < 0) {
+                       syslog(LOG_ERR, "listen failed");
+                       return (1);
+               }
+#endif
+       }
+
+       if ((udptransp = svcudp_create(udpsock)) == NULL ||
+           (tcptransp = svctcp_create(tcpsock, 0, 0)) == NULL) {
                syslog(LOG_ERR, "Can't create socket");
                exit(1);
        }

Reply via email to