diff --git a/libexec/rpc.rquotad/rquotad.c b/libexec/rpc.rquotad/rquotad.c --- a/libexec/rpc.rquotad/rquotad.c +++ b/libexec/rpc.rquotad/rquotad.c @@ -45,6 +45,7 @@ (void)sig; (void)rpcb_unset(RQUOTAPROG, RQUOTAVERS, NULL); + (void)rpcb_unset(RQUOTAPROG, EXT_RQUOTAVERS, NULL); exit(0); } @@ -55,8 +56,10 @@ int ok; struct sockaddr_storage from; socklen_t fromlen; + struct netconfig *nconf; int vers; int ch; + void *handle; while ((ch = getopt(argc, argv, "d")) != -1) { switch (ch) { @@ -76,6 +79,7 @@ if (!debug) daemon(0, 0); (void)rpcb_unset(RQUOTAPROG, RQUOTAVERS, NULL); + (void)rpcb_unset(RQUOTAPROG, EXT_RQUOTAVERS, NULL); (void)signal(SIGINT, cleanup); (void)signal(SIGTERM, cleanup); (void)signal(SIGHUP, cleanup); @@ -85,11 +89,20 @@ /* create and register the service */ if (from_inetd) { - transp = svc_tli_create(0, NULL, NULL, 0, 0); - if (transp == NULL) { - syslog(LOG_ERR, "couldn't create udp service."); + if ((handle = setnetconfig()) == NULL) { + syslog(LOG_ERR, "setnetconfig failed"); exit(1); } + + while ((nconf = getnetconfig(handle)) != NULL) { + transp = svc_tli_create(0, nconf, NULL, 0, 0); + if (transp == NULL) { + syslog(LOG_ERR, "couldn't create %s service.", + nconf->nc_proto); + exit(1); + } + } + vers = RQUOTAVERS; ok = svc_reg(transp, RQUOTAPROG, RQUOTAVERS, rquota_service_1, NULL); @@ -101,11 +114,11 @@ } else { vers = RQUOTAVERS; ok = svc_create(rquota_service_1, - RQUOTAPROG, RQUOTAVERS, "udp"); + RQUOTAPROG, RQUOTAVERS, "netpath"); if (ok) { vers = EXT_RQUOTAVERS; ok = svc_create(rquota_service_2, - RQUOTAPROG, EXT_RQUOTAVERS, "udp"); + RQUOTAPROG, EXT_RQUOTAVERS, "netpath"); } } @@ -113,7 +126,7 @@ syslog(LOG_ERR, "unable to register (RQUOTAPROG, %s, %s)", vers == RQUOTAVERS ? "RQUOTAVERS" : "EXT_RQUOTAVERS", - from_inetd ? "(inetd)" : "udp"); + from_inetd ? "(inetd)" : "netpath"); exit(1); }