1*ce0e08e2SPeter Avalos /* 2*ce0e08e2SPeter Avalos * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 3*ce0e08e2SPeter Avalos * unrestricted use provided that this legend is included on all tape 4*ce0e08e2SPeter Avalos * media and as a part of the software program in whole or part. Users 5*ce0e08e2SPeter Avalos * may copy or modify Sun RPC without charge, but are not authorized 6*ce0e08e2SPeter Avalos * to license or distribute it to anyone else except as part of a product or 7*ce0e08e2SPeter Avalos * program developed by the user. 8*ce0e08e2SPeter Avalos * 9*ce0e08e2SPeter Avalos * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 10*ce0e08e2SPeter Avalos * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 11*ce0e08e2SPeter Avalos * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 12*ce0e08e2SPeter Avalos * 13*ce0e08e2SPeter Avalos * Sun RPC is provided with no support and without any obligation on the 14*ce0e08e2SPeter Avalos * part of Sun Microsystems, Inc. to assist in its use, correction, 15*ce0e08e2SPeter Avalos * modification or enhancement. 16*ce0e08e2SPeter Avalos * 17*ce0e08e2SPeter Avalos * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 18*ce0e08e2SPeter Avalos * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 19*ce0e08e2SPeter Avalos * OR ANY PART THEREOF. 20*ce0e08e2SPeter Avalos * 21*ce0e08e2SPeter Avalos * In no event will Sun Microsystems, Inc. be liable for any lost revenue 22*ce0e08e2SPeter Avalos * or profits or other special, indirect and consequential damages, even if 23*ce0e08e2SPeter Avalos * Sun has been advised of the possibility of such damages. 24*ce0e08e2SPeter Avalos * 25*ce0e08e2SPeter Avalos * Sun Microsystems, Inc. 26*ce0e08e2SPeter Avalos * 2550 Garcia Avenue 27*ce0e08e2SPeter Avalos * Mountain View, California 94043 28*ce0e08e2SPeter Avalos * 29*ce0e08e2SPeter Avalos * @(#)pmap_svc.c 1.14 93/07/05 SMI; 1.23 89/04/05 Copyr 1984 Sun Micro 30*ce0e08e2SPeter Avalos * $NetBSD: pmap_svc.c,v 1.2 2000/10/20 11:49:40 fvdl Exp $ 31*ce0e08e2SPeter Avalos * $FreeBSD: src/usr.sbin/rpcbind/pmap_svc.c,v 1.5 2007/11/07 10:53:39 kevlo Exp $ 32*ce0e08e2SPeter Avalos * $DragonFly$ 33*ce0e08e2SPeter Avalos */ 34*ce0e08e2SPeter Avalos /* 35*ce0e08e2SPeter Avalos * Copyright (c) 1984 - 1991 by Sun Microsystems, Inc. 36*ce0e08e2SPeter Avalos */ 37*ce0e08e2SPeter Avalos 38*ce0e08e2SPeter Avalos /* 39*ce0e08e2SPeter Avalos * pmap_svc.c 40*ce0e08e2SPeter Avalos * The server procedure for the version 2 portmaper. 41*ce0e08e2SPeter Avalos * All the portmapper related interface from the portmap side. 42*ce0e08e2SPeter Avalos */ 43*ce0e08e2SPeter Avalos 44*ce0e08e2SPeter Avalos #ifdef PORTMAP 45*ce0e08e2SPeter Avalos #include <sys/types.h> 46*ce0e08e2SPeter Avalos #include <sys/socket.h> 47*ce0e08e2SPeter Avalos #include <stdio.h> 48*ce0e08e2SPeter Avalos #include <rpc/rpc.h> 49*ce0e08e2SPeter Avalos #include <rpc/pmap_prot.h> 50*ce0e08e2SPeter Avalos #include <rpc/rpcb_prot.h> 51*ce0e08e2SPeter Avalos #ifdef RPCBIND_DEBUG 52*ce0e08e2SPeter Avalos #include <stdlib.h> 53*ce0e08e2SPeter Avalos #endif 54*ce0e08e2SPeter Avalos #include "rpcbind.h" 55*ce0e08e2SPeter Avalos 56*ce0e08e2SPeter Avalos static struct pmaplist *find_service_pmap(rpcprog_t, rpcvers_t, rpcprot_t); 57*ce0e08e2SPeter Avalos static bool_t pmapproc_change(struct svc_req *, SVCXPRT *, u_long); 58*ce0e08e2SPeter Avalos static bool_t pmapproc_getport(struct svc_req *, SVCXPRT *); 59*ce0e08e2SPeter Avalos static bool_t pmapproc_dump(struct svc_req *, SVCXPRT *); 60*ce0e08e2SPeter Avalos 61*ce0e08e2SPeter Avalos /* 62*ce0e08e2SPeter Avalos * Called for all the version 2 inquiries. 63*ce0e08e2SPeter Avalos */ 64*ce0e08e2SPeter Avalos void 65*ce0e08e2SPeter Avalos pmap_service(struct svc_req *rqstp, SVCXPRT *xprt) 66*ce0e08e2SPeter Avalos { 67*ce0e08e2SPeter Avalos rpcbs_procinfo(RPCBVERS_2_STAT, rqstp->rq_proc); 68*ce0e08e2SPeter Avalos switch (rqstp->rq_proc) { 69*ce0e08e2SPeter Avalos case PMAPPROC_NULL: 70*ce0e08e2SPeter Avalos /* 71*ce0e08e2SPeter Avalos * Null proc call 72*ce0e08e2SPeter Avalos */ 73*ce0e08e2SPeter Avalos #ifdef RPCBIND_DEBUG 74*ce0e08e2SPeter Avalos if (debugging) 75*ce0e08e2SPeter Avalos fprintf(stderr, "PMAPPROC_NULL\n"); 76*ce0e08e2SPeter Avalos #endif 77*ce0e08e2SPeter Avalos check_access(xprt, rqstp->rq_proc, NULL, PMAPVERS); 78*ce0e08e2SPeter Avalos if ((!svc_sendreply(xprt, (xdrproc_t) xdr_void, NULL)) && 79*ce0e08e2SPeter Avalos debugging) { 80*ce0e08e2SPeter Avalos if (doabort) { 81*ce0e08e2SPeter Avalos rpcbind_abort(); 82*ce0e08e2SPeter Avalos } 83*ce0e08e2SPeter Avalos } 84*ce0e08e2SPeter Avalos break; 85*ce0e08e2SPeter Avalos 86*ce0e08e2SPeter Avalos case PMAPPROC_SET: 87*ce0e08e2SPeter Avalos /* 88*ce0e08e2SPeter Avalos * Set a program, version to port mapping 89*ce0e08e2SPeter Avalos */ 90*ce0e08e2SPeter Avalos pmapproc_change(rqstp, xprt, rqstp->rq_proc); 91*ce0e08e2SPeter Avalos break; 92*ce0e08e2SPeter Avalos 93*ce0e08e2SPeter Avalos case PMAPPROC_UNSET: 94*ce0e08e2SPeter Avalos /* 95*ce0e08e2SPeter Avalos * Remove a program, version to port mapping. 96*ce0e08e2SPeter Avalos */ 97*ce0e08e2SPeter Avalos pmapproc_change(rqstp, xprt, rqstp->rq_proc); 98*ce0e08e2SPeter Avalos break; 99*ce0e08e2SPeter Avalos 100*ce0e08e2SPeter Avalos case PMAPPROC_GETPORT: 101*ce0e08e2SPeter Avalos /* 102*ce0e08e2SPeter Avalos * Lookup the mapping for a program, version and return its 103*ce0e08e2SPeter Avalos * port number. 104*ce0e08e2SPeter Avalos */ 105*ce0e08e2SPeter Avalos pmapproc_getport(rqstp, xprt); 106*ce0e08e2SPeter Avalos break; 107*ce0e08e2SPeter Avalos 108*ce0e08e2SPeter Avalos case PMAPPROC_DUMP: 109*ce0e08e2SPeter Avalos /* 110*ce0e08e2SPeter Avalos * Return the current set of mapped program, version 111*ce0e08e2SPeter Avalos */ 112*ce0e08e2SPeter Avalos #ifdef RPCBIND_DEBUG 113*ce0e08e2SPeter Avalos if (debugging) 114*ce0e08e2SPeter Avalos fprintf(stderr, "PMAPPROC_DUMP\n"); 115*ce0e08e2SPeter Avalos #endif 116*ce0e08e2SPeter Avalos pmapproc_dump(rqstp, xprt); 117*ce0e08e2SPeter Avalos break; 118*ce0e08e2SPeter Avalos 119*ce0e08e2SPeter Avalos case PMAPPROC_CALLIT: 120*ce0e08e2SPeter Avalos /* 121*ce0e08e2SPeter Avalos * Calls a procedure on the local machine. If the requested 122*ce0e08e2SPeter Avalos * procedure is not registered this procedure does not return 123*ce0e08e2SPeter Avalos * error information!! 124*ce0e08e2SPeter Avalos * This procedure is only supported on rpc/udp and calls via 125*ce0e08e2SPeter Avalos * rpc/udp. It passes null authentication parameters. 126*ce0e08e2SPeter Avalos */ 127*ce0e08e2SPeter Avalos rpcbproc_callit_com(rqstp, xprt, PMAPPROC_CALLIT, PMAPVERS); 128*ce0e08e2SPeter Avalos break; 129*ce0e08e2SPeter Avalos 130*ce0e08e2SPeter Avalos default: 131*ce0e08e2SPeter Avalos svcerr_noproc(xprt); 132*ce0e08e2SPeter Avalos break; 133*ce0e08e2SPeter Avalos } 134*ce0e08e2SPeter Avalos } 135*ce0e08e2SPeter Avalos 136*ce0e08e2SPeter Avalos /* 137*ce0e08e2SPeter Avalos * returns the item with the given program, version number. If that version 138*ce0e08e2SPeter Avalos * number is not found, it returns the item with that program number, so that 139*ce0e08e2SPeter Avalos * the port number is now returned to the caller. The caller when makes a 140*ce0e08e2SPeter Avalos * call to this program, version number, the call will fail and it will 141*ce0e08e2SPeter Avalos * return with PROGVERS_MISMATCH. The user can then determine the highest 142*ce0e08e2SPeter Avalos * and the lowest version number for this program using clnt_geterr() and 143*ce0e08e2SPeter Avalos * use those program version numbers. 144*ce0e08e2SPeter Avalos */ 145*ce0e08e2SPeter Avalos static struct pmaplist * 146*ce0e08e2SPeter Avalos find_service_pmap(rpcprog_t prog, rpcvers_t vers, rpcprot_t prot) 147*ce0e08e2SPeter Avalos { 148*ce0e08e2SPeter Avalos struct pmaplist *hit = NULL; 149*ce0e08e2SPeter Avalos struct pmaplist *pml; 150*ce0e08e2SPeter Avalos 151*ce0e08e2SPeter Avalos for (pml = list_pml; pml != NULL; pml = pml->pml_next) { 152*ce0e08e2SPeter Avalos if ((pml->pml_map.pm_prog != prog) || 153*ce0e08e2SPeter Avalos (pml->pml_map.pm_prot != prot)) 154*ce0e08e2SPeter Avalos continue; 155*ce0e08e2SPeter Avalos hit = pml; 156*ce0e08e2SPeter Avalos if (pml->pml_map.pm_vers == vers) 157*ce0e08e2SPeter Avalos break; 158*ce0e08e2SPeter Avalos } 159*ce0e08e2SPeter Avalos return (hit); 160*ce0e08e2SPeter Avalos } 161*ce0e08e2SPeter Avalos 162*ce0e08e2SPeter Avalos static bool_t 163*ce0e08e2SPeter Avalos pmapproc_change(struct svc_req *rqstp __unused, SVCXPRT *xprt, unsigned long op) 164*ce0e08e2SPeter Avalos { 165*ce0e08e2SPeter Avalos struct pmap reg; 166*ce0e08e2SPeter Avalos RPCB rpcbreg; 167*ce0e08e2SPeter Avalos long ans; 168*ce0e08e2SPeter Avalos struct sockaddr_in *who; 169*ce0e08e2SPeter Avalos uid_t uid; 170*ce0e08e2SPeter Avalos char uidbuf[32]; 171*ce0e08e2SPeter Avalos 172*ce0e08e2SPeter Avalos #ifdef RPCBIND_DEBUG 173*ce0e08e2SPeter Avalos if (debugging) 174*ce0e08e2SPeter Avalos fprintf(stderr, "%s request for (%lu, %lu) : ", 175*ce0e08e2SPeter Avalos op == PMAPPROC_SET ? "PMAP_SET" : "PMAP_UNSET", 176*ce0e08e2SPeter Avalos reg.pm_prog, reg.pm_vers); 177*ce0e08e2SPeter Avalos #endif 178*ce0e08e2SPeter Avalos 179*ce0e08e2SPeter Avalos if (!svc_getargs(xprt, (xdrproc_t) xdr_pmap, (char *)®)) { 180*ce0e08e2SPeter Avalos svcerr_decode(xprt); 181*ce0e08e2SPeter Avalos return (FALSE); 182*ce0e08e2SPeter Avalos } 183*ce0e08e2SPeter Avalos 184*ce0e08e2SPeter Avalos if (!check_access(xprt, op, ®, PMAPVERS)) { 185*ce0e08e2SPeter Avalos svcerr_weakauth(xprt); 186*ce0e08e2SPeter Avalos return FALSE; 187*ce0e08e2SPeter Avalos } 188*ce0e08e2SPeter Avalos 189*ce0e08e2SPeter Avalos who = svc_getcaller(xprt); 190*ce0e08e2SPeter Avalos 191*ce0e08e2SPeter Avalos /* 192*ce0e08e2SPeter Avalos * Can't use getpwnam here. We might end up calling ourselves 193*ce0e08e2SPeter Avalos * and looping. 194*ce0e08e2SPeter Avalos */ 195*ce0e08e2SPeter Avalos if (__rpc_get_local_uid(xprt, &uid) < 0) 196*ce0e08e2SPeter Avalos rpcbreg.r_owner = "unknown"; 197*ce0e08e2SPeter Avalos else if (uid == 0) 198*ce0e08e2SPeter Avalos rpcbreg.r_owner = "superuser"; 199*ce0e08e2SPeter Avalos else { 200*ce0e08e2SPeter Avalos /* r_owner will be strdup-ed later */ 201*ce0e08e2SPeter Avalos snprintf(uidbuf, sizeof uidbuf, "%d", uid); 202*ce0e08e2SPeter Avalos rpcbreg.r_owner = uidbuf; 203*ce0e08e2SPeter Avalos } 204*ce0e08e2SPeter Avalos 205*ce0e08e2SPeter Avalos rpcbreg.r_prog = reg.pm_prog; 206*ce0e08e2SPeter Avalos rpcbreg.r_vers = reg.pm_vers; 207*ce0e08e2SPeter Avalos 208*ce0e08e2SPeter Avalos if (op == PMAPPROC_SET) { 209*ce0e08e2SPeter Avalos char buf[32]; 210*ce0e08e2SPeter Avalos 211*ce0e08e2SPeter Avalos snprintf(buf, sizeof buf, "0.0.0.0.%d.%d", 212*ce0e08e2SPeter Avalos (int)((reg.pm_port >> 8) & 0xff), 213*ce0e08e2SPeter Avalos (int)(reg.pm_port & 0xff)); 214*ce0e08e2SPeter Avalos rpcbreg.r_addr = buf; 215*ce0e08e2SPeter Avalos if (reg.pm_prot == IPPROTO_UDP) { 216*ce0e08e2SPeter Avalos rpcbreg.r_netid = udptrans; 217*ce0e08e2SPeter Avalos } else if (reg.pm_prot == IPPROTO_TCP) { 218*ce0e08e2SPeter Avalos rpcbreg.r_netid = tcptrans; 219*ce0e08e2SPeter Avalos } else { 220*ce0e08e2SPeter Avalos ans = FALSE; 221*ce0e08e2SPeter Avalos goto done_change; 222*ce0e08e2SPeter Avalos } 223*ce0e08e2SPeter Avalos ans = map_set(&rpcbreg, rpcbreg.r_owner); 224*ce0e08e2SPeter Avalos } else if (op == PMAPPROC_UNSET) { 225*ce0e08e2SPeter Avalos bool_t ans1, ans2; 226*ce0e08e2SPeter Avalos 227*ce0e08e2SPeter Avalos rpcbreg.r_addr = NULL; 228*ce0e08e2SPeter Avalos rpcbreg.r_netid = tcptrans; 229*ce0e08e2SPeter Avalos ans1 = map_unset(&rpcbreg, rpcbreg.r_owner); 230*ce0e08e2SPeter Avalos rpcbreg.r_netid = udptrans; 231*ce0e08e2SPeter Avalos ans2 = map_unset(&rpcbreg, rpcbreg.r_owner); 232*ce0e08e2SPeter Avalos ans = ans1 || ans2; 233*ce0e08e2SPeter Avalos } else { 234*ce0e08e2SPeter Avalos ans = FALSE; 235*ce0e08e2SPeter Avalos } 236*ce0e08e2SPeter Avalos done_change: 237*ce0e08e2SPeter Avalos if ((!svc_sendreply(xprt, (xdrproc_t) xdr_long, (caddr_t) &ans)) && 238*ce0e08e2SPeter Avalos debugging) { 239*ce0e08e2SPeter Avalos fprintf(stderr, "portmap: svc_sendreply\n"); 240*ce0e08e2SPeter Avalos if (doabort) { 241*ce0e08e2SPeter Avalos rpcbind_abort(); 242*ce0e08e2SPeter Avalos } 243*ce0e08e2SPeter Avalos } 244*ce0e08e2SPeter Avalos #ifdef RPCBIND_DEBUG 245*ce0e08e2SPeter Avalos if (debugging) 246*ce0e08e2SPeter Avalos fprintf(stderr, "%s\n", ans == TRUE ? "succeeded" : "failed"); 247*ce0e08e2SPeter Avalos #endif 248*ce0e08e2SPeter Avalos if (op == PMAPPROC_SET) 249*ce0e08e2SPeter Avalos rpcbs_set(RPCBVERS_2_STAT, ans); 250*ce0e08e2SPeter Avalos else 251*ce0e08e2SPeter Avalos rpcbs_unset(RPCBVERS_2_STAT, ans); 252*ce0e08e2SPeter Avalos return (TRUE); 253*ce0e08e2SPeter Avalos } 254*ce0e08e2SPeter Avalos 255*ce0e08e2SPeter Avalos /* ARGSUSED */ 256*ce0e08e2SPeter Avalos static bool_t 257*ce0e08e2SPeter Avalos pmapproc_getport(struct svc_req *rqstp __unused, SVCXPRT *xprt) 258*ce0e08e2SPeter Avalos { 259*ce0e08e2SPeter Avalos struct pmap reg; 260*ce0e08e2SPeter Avalos long lport; 261*ce0e08e2SPeter Avalos int port = 0; 262*ce0e08e2SPeter Avalos struct pmaplist *fnd; 263*ce0e08e2SPeter Avalos #ifdef RPCBIND_DEBUG 264*ce0e08e2SPeter Avalos char *uaddr; 265*ce0e08e2SPeter Avalos #endif 266*ce0e08e2SPeter Avalos 267*ce0e08e2SPeter Avalos if (!svc_getargs(xprt, (xdrproc_t) xdr_pmap, (char *)®)) { 268*ce0e08e2SPeter Avalos svcerr_decode(xprt); 269*ce0e08e2SPeter Avalos return (FALSE); 270*ce0e08e2SPeter Avalos } 271*ce0e08e2SPeter Avalos 272*ce0e08e2SPeter Avalos if (!check_access(xprt, PMAPPROC_GETPORT, ®, PMAPVERS)) { 273*ce0e08e2SPeter Avalos svcerr_weakauth(xprt); 274*ce0e08e2SPeter Avalos return FALSE; 275*ce0e08e2SPeter Avalos } 276*ce0e08e2SPeter Avalos 277*ce0e08e2SPeter Avalos #ifdef RPCBIND_DEBUG 278*ce0e08e2SPeter Avalos if (debugging) { 279*ce0e08e2SPeter Avalos uaddr = taddr2uaddr(rpcbind_get_conf(xprt->xp_netid), 280*ce0e08e2SPeter Avalos svc_getrpccaller(xprt)); 281*ce0e08e2SPeter Avalos fprintf(stderr, "PMAP_GETPORT req for (%lu, %lu, %s) from %s :", 282*ce0e08e2SPeter Avalos reg.pm_prog, reg.pm_vers, 283*ce0e08e2SPeter Avalos reg.pm_prot == IPPROTO_UDP ? "udp" : "tcp", uaddr); 284*ce0e08e2SPeter Avalos free(uaddr); 285*ce0e08e2SPeter Avalos } 286*ce0e08e2SPeter Avalos #endif 287*ce0e08e2SPeter Avalos fnd = find_service_pmap(reg.pm_prog, reg.pm_vers, reg.pm_prot); 288*ce0e08e2SPeter Avalos if (fnd) { 289*ce0e08e2SPeter Avalos char serveuaddr[32], *ua; 290*ce0e08e2SPeter Avalos int h1, h2, h3, h4, p1, p2; 291*ce0e08e2SPeter Avalos char *netid; 292*ce0e08e2SPeter Avalos 293*ce0e08e2SPeter Avalos if (reg.pm_prot == IPPROTO_UDP) { 294*ce0e08e2SPeter Avalos ua = udp_uaddr; 295*ce0e08e2SPeter Avalos netid = udptrans; 296*ce0e08e2SPeter Avalos } else { 297*ce0e08e2SPeter Avalos ua = tcp_uaddr; /* To get the len */ 298*ce0e08e2SPeter Avalos netid = tcptrans; 299*ce0e08e2SPeter Avalos } 300*ce0e08e2SPeter Avalos if (ua == NULL) { 301*ce0e08e2SPeter Avalos goto sendreply; 302*ce0e08e2SPeter Avalos } 303*ce0e08e2SPeter Avalos if (sscanf(ua, "%d.%d.%d.%d.%d.%d", &h1, &h2, &h3, 304*ce0e08e2SPeter Avalos &h4, &p1, &p2) == 6) { 305*ce0e08e2SPeter Avalos p1 = (fnd->pml_map.pm_port >> 8) & 0xff; 306*ce0e08e2SPeter Avalos p2 = (fnd->pml_map.pm_port) & 0xff; 307*ce0e08e2SPeter Avalos snprintf(serveuaddr, sizeof serveuaddr, 308*ce0e08e2SPeter Avalos "%d.%d.%d.%d.%d.%d", h1, h2, h3, h4, p1, p2); 309*ce0e08e2SPeter Avalos if (is_bound(netid, serveuaddr)) { 310*ce0e08e2SPeter Avalos port = fnd->pml_map.pm_port; 311*ce0e08e2SPeter Avalos } else { /* this service is dead; delete it */ 312*ce0e08e2SPeter Avalos delete_prog(reg.pm_prog); 313*ce0e08e2SPeter Avalos } 314*ce0e08e2SPeter Avalos } 315*ce0e08e2SPeter Avalos } 316*ce0e08e2SPeter Avalos sendreply: 317*ce0e08e2SPeter Avalos lport = port; 318*ce0e08e2SPeter Avalos if ((!svc_sendreply(xprt, (xdrproc_t) xdr_long, (caddr_t)&lport)) && 319*ce0e08e2SPeter Avalos debugging) { 320*ce0e08e2SPeter Avalos fprintf(stderr, "portmap: svc_sendreply\n"); 321*ce0e08e2SPeter Avalos if (doabort) { 322*ce0e08e2SPeter Avalos rpcbind_abort(); 323*ce0e08e2SPeter Avalos } 324*ce0e08e2SPeter Avalos } 325*ce0e08e2SPeter Avalos #ifdef RPCBIND_DEBUG 326*ce0e08e2SPeter Avalos if (debugging) 327*ce0e08e2SPeter Avalos fprintf(stderr, "port = %d\n", port); 328*ce0e08e2SPeter Avalos #endif 329*ce0e08e2SPeter Avalos rpcbs_getaddr(RPCBVERS_2_STAT, reg.pm_prog, reg.pm_vers, 330*ce0e08e2SPeter Avalos reg.pm_prot == IPPROTO_UDP ? udptrans : tcptrans, 331*ce0e08e2SPeter Avalos port ? udptrans : ""); 332*ce0e08e2SPeter Avalos 333*ce0e08e2SPeter Avalos return (TRUE); 334*ce0e08e2SPeter Avalos } 335*ce0e08e2SPeter Avalos 336*ce0e08e2SPeter Avalos /* ARGSUSED */ 337*ce0e08e2SPeter Avalos static bool_t 338*ce0e08e2SPeter Avalos pmapproc_dump(struct svc_req *rqstp __unused, SVCXPRT *xprt) 339*ce0e08e2SPeter Avalos { 340*ce0e08e2SPeter Avalos if (!svc_getargs(xprt, (xdrproc_t)xdr_void, NULL)) { 341*ce0e08e2SPeter Avalos svcerr_decode(xprt); 342*ce0e08e2SPeter Avalos return (FALSE); 343*ce0e08e2SPeter Avalos } 344*ce0e08e2SPeter Avalos 345*ce0e08e2SPeter Avalos if (!check_access(xprt, PMAPPROC_DUMP, NULL, PMAPVERS)) { 346*ce0e08e2SPeter Avalos svcerr_weakauth(xprt); 347*ce0e08e2SPeter Avalos return FALSE; 348*ce0e08e2SPeter Avalos } 349*ce0e08e2SPeter Avalos 350*ce0e08e2SPeter Avalos if ((!svc_sendreply(xprt, (xdrproc_t) xdr_pmaplist_ptr, 351*ce0e08e2SPeter Avalos (caddr_t)&list_pml)) && debugging) { 352*ce0e08e2SPeter Avalos if (debugging) 353*ce0e08e2SPeter Avalos fprintf(stderr, "portmap: svc_sendreply\n"); 354*ce0e08e2SPeter Avalos if (doabort) { 355*ce0e08e2SPeter Avalos rpcbind_abort(); 356*ce0e08e2SPeter Avalos } 357*ce0e08e2SPeter Avalos } 358*ce0e08e2SPeter Avalos return (TRUE); 359*ce0e08e2SPeter Avalos } 360*ce0e08e2SPeter Avalos 361*ce0e08e2SPeter Avalos #endif /* PORTMAP */ 362