1*c63c52b2Schristos /* $NetBSD: svc_simple.c,v 1.6 1997/07/13 20:13:24 christos Exp $ */ 29e15c989Scgd 363d7b677Scgd /* 463d7b677Scgd * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 563d7b677Scgd * unrestricted use provided that this legend is included on all tape 663d7b677Scgd * media and as a part of the software program in whole or part. Users 763d7b677Scgd * may copy or modify Sun RPC without charge, but are not authorized 863d7b677Scgd * to license or distribute it to anyone else except as part of a product or 963d7b677Scgd * program developed by the user. 1063d7b677Scgd * 1163d7b677Scgd * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 1263d7b677Scgd * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 1363d7b677Scgd * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 1463d7b677Scgd * 1563d7b677Scgd * Sun RPC is provided with no support and without any obligation on the 1663d7b677Scgd * part of Sun Microsystems, Inc. to assist in its use, correction, 1763d7b677Scgd * modification or enhancement. 1863d7b677Scgd * 1963d7b677Scgd * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 2063d7b677Scgd * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 2163d7b677Scgd * OR ANY PART THEREOF. 2263d7b677Scgd * 2363d7b677Scgd * In no event will Sun Microsystems, Inc. be liable for any lost revenue 2463d7b677Scgd * or profits or other special, indirect and consequential damages, even if 2563d7b677Scgd * Sun has been advised of the possibility of such damages. 2663d7b677Scgd * 2763d7b677Scgd * Sun Microsystems, Inc. 2863d7b677Scgd * 2550 Garcia Avenue 2963d7b677Scgd * Mountain View, California 94043 3063d7b677Scgd */ 3163d7b677Scgd 32*c63c52b2Schristos #include <sys/cdefs.h> 3363d7b677Scgd #if defined(LIBC_SCCS) && !defined(lint) 34*c63c52b2Schristos #if 0 35*c63c52b2Schristos static char *sccsid = "@(#)svc_simple.c 1.18 87/08/11 Copyr 1984 Sun Micro"; 36*c63c52b2Schristos static char *sccsid = "@(#)svc_simple.c 2.2 88/08/01 4.0 RPCSRC"; 37*c63c52b2Schristos #else 38*c63c52b2Schristos __RCSID("$NetBSD: svc_simple.c,v 1.6 1997/07/13 20:13:24 christos Exp $"); 39*c63c52b2Schristos #endif 4063d7b677Scgd #endif 4163d7b677Scgd 4263d7b677Scgd /* 4363d7b677Scgd * svc_simple.c 4463d7b677Scgd * Simplified front end to rpc. 4563d7b677Scgd * 4663d7b677Scgd * Copyright (C) 1984, Sun Microsystems, Inc. 4763d7b677Scgd */ 4863d7b677Scgd 4963d7b677Scgd #include <stdio.h> 502e2a3a25Scgd #include <stdlib.h> 513c565bbeSjtc #include <string.h> 5263d7b677Scgd #include <rpc/rpc.h> 53*c63c52b2Schristos #include <rpc/pmap_clnt.h> 5463d7b677Scgd #include <sys/socket.h> 5563d7b677Scgd #include <netdb.h> 5663d7b677Scgd 5763d7b677Scgd static struct proglst { 58*c63c52b2Schristos char *(*p_progname) __P((char [UDPMSGSIZE])); 5963d7b677Scgd int p_prognum; 6063d7b677Scgd int p_procnum; 6163d7b677Scgd xdrproc_t p_inproc, p_outproc; 6263d7b677Scgd struct proglst *p_nxt; 6363d7b677Scgd } *proglst; 64*c63c52b2Schristos 6563d7b677Scgd static SVCXPRT *transp; 6663d7b677Scgd struct proglst *pl; 6763d7b677Scgd 68*c63c52b2Schristos static void universal __P((struct svc_req *, SVCXPRT *)); 69*c63c52b2Schristos 7018ec2ba0Sjtc int 7163d7b677Scgd registerrpc(prognum, versnum, procnum, progname, inproc, outproc) 72*c63c52b2Schristos char *(*progname) __P((char [UDPMSGSIZE])); 7363d7b677Scgd xdrproc_t inproc, outproc; 7463d7b677Scgd { 7563d7b677Scgd 7663d7b677Scgd if (procnum == NULLPROC) { 7763d7b677Scgd (void) fprintf(stderr, 78*c63c52b2Schristos "can't reassign procedure number %ld\n", NULLPROC); 7963d7b677Scgd return (-1); 8063d7b677Scgd } 8163d7b677Scgd if (transp == 0) { 8263d7b677Scgd transp = svcudp_create(RPC_ANYSOCK); 8363d7b677Scgd if (transp == NULL) { 8463d7b677Scgd (void) fprintf(stderr, "couldn't create an rpc server\n"); 8563d7b677Scgd return (-1); 8663d7b677Scgd } 8763d7b677Scgd } 8863d7b677Scgd (void) pmap_unset((u_long)prognum, (u_long)versnum); 8963d7b677Scgd if (!svc_register(transp, (u_long)prognum, (u_long)versnum, 9063d7b677Scgd universal, IPPROTO_UDP)) { 9163d7b677Scgd (void) fprintf(stderr, "couldn't register prog %d vers %d\n", 9263d7b677Scgd prognum, versnum); 9363d7b677Scgd return (-1); 9463d7b677Scgd } 9563d7b677Scgd pl = (struct proglst *)malloc(sizeof(struct proglst)); 9663d7b677Scgd if (pl == NULL) { 9763d7b677Scgd (void) fprintf(stderr, "registerrpc: out of memory\n"); 9863d7b677Scgd return (-1); 9963d7b677Scgd } 10063d7b677Scgd pl->p_progname = progname; 10163d7b677Scgd pl->p_prognum = prognum; 10263d7b677Scgd pl->p_procnum = procnum; 10363d7b677Scgd pl->p_inproc = inproc; 10463d7b677Scgd pl->p_outproc = outproc; 10563d7b677Scgd pl->p_nxt = proglst; 10663d7b677Scgd proglst = pl; 10763d7b677Scgd return (0); 10863d7b677Scgd } 10963d7b677Scgd 11063d7b677Scgd static void 11163d7b677Scgd universal(rqstp, transp) 11263d7b677Scgd struct svc_req *rqstp; 11363d7b677Scgd SVCXPRT *transp; 11463d7b677Scgd { 11563d7b677Scgd int prog, proc; 11663d7b677Scgd char *outdata; 11763d7b677Scgd char xdrbuf[UDPMSGSIZE]; 11863d7b677Scgd struct proglst *pl; 11963d7b677Scgd 12063d7b677Scgd /* 12163d7b677Scgd * enforce "procnum 0 is echo" convention 12263d7b677Scgd */ 12363d7b677Scgd if (rqstp->rq_proc == NULLPROC) { 1242e2a3a25Scgd if (svc_sendreply(transp, xdr_void, NULL) == FALSE) { 12563d7b677Scgd (void) fprintf(stderr, "xxx\n"); 12663d7b677Scgd exit(1); 12763d7b677Scgd } 12863d7b677Scgd return; 12963d7b677Scgd } 13063d7b677Scgd prog = rqstp->rq_prog; 13163d7b677Scgd proc = rqstp->rq_proc; 13263d7b677Scgd for (pl = proglst; pl != NULL; pl = pl->p_nxt) 13363d7b677Scgd if (pl->p_prognum == prog && pl->p_procnum == proc) { 13463d7b677Scgd /* decode arguments into a CLEAN buffer */ 1353c565bbeSjtc memset(xdrbuf, 0, sizeof(xdrbuf)); /* required ! */ 13663d7b677Scgd if (!svc_getargs(transp, pl->p_inproc, xdrbuf)) { 13763d7b677Scgd svcerr_decode(transp); 13863d7b677Scgd return; 13963d7b677Scgd } 14063d7b677Scgd outdata = (*(pl->p_progname))(xdrbuf); 1412e2a3a25Scgd if (outdata == NULL && 1422e2a3a25Scgd pl->p_outproc != xdr_void) 14363d7b677Scgd /* there was an error */ 14463d7b677Scgd return; 14563d7b677Scgd if (!svc_sendreply(transp, pl->p_outproc, outdata)) { 14663d7b677Scgd (void) fprintf(stderr, 14763d7b677Scgd "trouble replying to prog %d\n", 14863d7b677Scgd pl->p_prognum); 14963d7b677Scgd exit(1); 15063d7b677Scgd } 15163d7b677Scgd /* free the decoded arguments */ 15263d7b677Scgd (void)svc_freeargs(transp, pl->p_inproc, xdrbuf); 15363d7b677Scgd return; 15463d7b677Scgd } 15563d7b677Scgd (void) fprintf(stderr, "never registered prog %d\n", prog); 15663d7b677Scgd exit(1); 15763d7b677Scgd } 15863d7b677Scgd 159