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