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); }