diff --git a/usr.sbin/rpc.lockd/lockd.c b/usr.sbin/rpc.lockd/lockd.c index 0368a7f62a80..ad20004f4aa9 100644 --- a/usr.sbin/rpc.lockd/lockd.c +++ b/usr.sbin/rpc.lockd/lockd.c @@ -1,4 +1,4 @@ -/* $NetBSD: lockd.c,v 1.10 2007/12/15 19:44:56 perry Exp $ */ +/* $NetBSD: lockd.c,v 1.11 2012/08/13 12:22:21 pgoyette Exp $ */ /* * Copyright (c) 1995 @@ -35,7 +35,7 @@ #include #ifndef lint -__RCSID("$NetBSD: lockd.c,v 1.10 2007/12/15 19:44:56 perry Exp $"); +__RCSID("$NetBSD: lockd.c,v 1.11 2012/08/13 12:22:21 pgoyette Exp $"); #endif /* @@ -51,6 +51,7 @@ __RCSID("$NetBSD: lockd.c,v 1.10 2007/12/15 19:44:56 perry Exp $"); #include #include #include +#include #include #include #include @@ -84,14 +85,16 @@ int main(int argc, char **argv) { SVCXPRT *transp; - int ch, i, maxindex, s; + int ch, i, minindex, maxindex, s; + bool use_ipv4, use_ipv6; struct sigaction sigchild, sigalarm; int grace_period = 30; struct netconfig *nconf; int maxrec = RPC_MAXDATASIZE; (void)setprogname(*argv); - while ((ch = getopt(argc, argv, "d:g:")) != (-1)) { + use_ipv4 = use_ipv6 = false; + while ((ch = getopt(argc, argv, "d:g:46")) != (-1)) { switch (ch) { case 'd': debug_level = atoi(optarg); @@ -107,6 +110,12 @@ main(int argc, char **argv) /* NOTREACHED */ } break; + case '4': + use_ipv4 = true; + break; + case '6': + use_ipv6 = true; + break; default: case '?': usage(); @@ -119,23 +128,31 @@ main(int argc, char **argv) (void)rpcb_unset(NLM_PROG, NLM_VERSX, NULL); (void)rpcb_unset(NLM_PROG, NLM_VERS4, NULL); - /* - * Check if IPv6 support is present. - */ - s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); - if (s < 0) - maxindex = 2; - else { - (void)close(s); - maxindex = 4; + if (!use_ipv4 && !use_ipv6) { + s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + if (s < 0) + use_ipv4 = true; + else { + (void)close(s); + use_ipv4 = use_ipv6 = true; + } } + if (use_ipv4) + minindex = 0; + else + minindex = 2; + + if (use_ipv6) + maxindex = 4; + else + maxindex = 2; (void)rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec); - for (i = 0; i < maxindex; i++) { + for (i = minindex; i < maxindex; i++) { nconf = getnetconfigent(transports[i]); if (nconf == NULL) - errx(1, "cannot get udp netconf."); + errx(1, "cannot get %s netconf.", transports[i]); transp = svc_tli_create(RPC_ANYFD, nconf, NULL, RPC_MAXDATASIZE, RPC_MAXDATASIZE); diff --git a/usr.sbin/rpc.lockd/rpc.lockd.8 b/usr.sbin/rpc.lockd/rpc.lockd.8 index 41427e35c035..5850ce23585f 100644 --- a/usr.sbin/rpc.lockd/rpc.lockd.8 +++ b/usr.sbin/rpc.lockd/rpc.lockd.8 @@ -1,4 +1,4 @@ -.\" $NetBSD: rpc.lockd.8,v 1.6 2002/02/02 01:42:45 wiz Exp $ +.\" $NetBSD: rpc.lockd.8,v 1.7 2012/08/13 12:22:21 pgoyette Exp $ .\" .\" Copyright (c) 1995 A.R.Gordon, andrew.gordon@net-tel.co.uk .\" All rights reserved. @@ -32,7 +32,7 @@ .\" SUCH DAMAGE. .\" .\" -.Dd September 24, 1995 +.Dd August 11, 2012 .Dt RPC.LOCKD 8 .Os .Sh NAME @@ -42,6 +42,7 @@ .Nm .Op Fl d Ar debug_level .Op Fl g Ar grace period +.Op Fl 46 .Sh DESCRIPTION The .Nm @@ -71,6 +72,17 @@ option allow to specify the grace period, in seconds. During the grace period .Nm only accepts requests from hosts which are reinitialising locks which existed before the server restart. Default is 30 seconds. +.It Fl 4 +Listen for requests using IPv4. +Do not listen using IPv6 unless the +.Fl 6 +option is also specified. +By default, +.Nm +listens for requests using both IPv4 and IPv6 if available. +.It Fl 6 +Listen for requests using IPv6. +It is an error if IPv6 is not available. .El .Pp Error conditions are logged to syslog, irrespective of the debug level,