ypxfrd_getmap.c revision 16132
1/* 2 * Copyright (c) 1995, 1996 3 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by Bill Paul. 16 * 4. Neither the name of the author nor the names of any co-contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * $Id: ypxfrd_getmap.c,v 1.7 1996/06/02 19:51:33 wpaul Exp $ 33 */ 34 35#include <sys/types.h> 36#include <time.h> 37#include <rpcsvc/ypxfrd.h> 38#include <rpcsvc/yp.h> 39#include <rpc/rpc.h> 40#include <sys/uio.h> 41#include <sys/fcntl.h> 42#include <sys/stat.h> 43#include <errno.h> 44#include "ypxfr_extern.h" 45 46#ifndef lint 47static const char rcsid[] = "$Id: ypxfrd_getmap.c,v 1.7 1996/06/02 19:51:33 wpaul Exp $"; 48#endif 49 50int fp = 0; 51 52static bool_t xdr_my_xfr(register XDR *xdrs, xfr *objp) 53{ 54 while(1) { 55 if (!xdr_xfr(xdrs, objp)) 56 return(FALSE); 57 if (objp->ok == TRUE) { 58 if (write(fp, objp->xfr_u.xfrblock_buf.xfrblock_buf_val, 59 objp->xfr_u.xfrblock_buf.xfrblock_buf_len) == -1) { 60 yp_error("write failed: %s", strerror(errno)); 61 return(FALSE); 62 } 63 } 64 xdr_free(xdr_xfr, (char *)objp); 65 if (objp->ok == FALSE) { 66 switch(objp->xfr_u.xfrstat) { 67 case(XFR_DONE): 68 return(TRUE); 69 break; 70 case(XFR_READ_ERR): 71 yp_error("got read error from rpc.ypxfrd"); 72 return(FALSE); 73 break; 74 case(XFR_ACCESS): 75 yp_error("rpc.ypxfrd couldn't access the map"); 76 return(FALSE); 77 break; 78 case(XFR_DENIED): 79 yp_error("access to map denied by rpc.ypxfrd"); 80 return(FALSE); 81 break; 82 default: 83 yp_error("got unknown status from rpc.ypxfrd"); 84 return(FALSE); 85 break; 86 } 87 } 88 } 89} 90 91#define PERM_SECURE (S_IRUSR|S_IWUSR) 92 93int ypxfrd_get_map(host, map, domain, tmpname) 94 char *host; 95 char *map; 96 char *domain; 97 char *tmpname; 98{ 99 CLIENT *clnt; 100 struct ypxfr_mapname req; 101 struct xfr resp; 102 struct timeval timeout = { 0, 25 }; 103 int status = 0; 104 105 req.xfrmap = map; 106 req.xfrdomain = domain; 107 bzero((char *)&resp, sizeof(resp)); 108 109 if ((clnt = clnt_create(host, YPXFRD_FREEBSD_PROG, 110 YPXFRD_FREEBSD_VERS, "tcp")) == NULL) { 111 return(1); 112 } 113 114 if ((fp = open(tmpname, O_RDWR|O_CREAT, PERM_SECURE)) == -1) { 115 clnt_destroy(clnt); 116 yp_error("couldn't open %s: %s", tmpname, strerror(errno)); 117 return(1); 118 } 119 120 if (clnt_call(clnt,YPXFRD_GETMAP,xdr_ypxfr_mapname,(char *)&req, 121 xdr_my_xfr, (char *)&resp, timeout) != RPC_SUCCESS) { 122 yp_error("%s", clnt_sperror(clnt,"call to rpc.ypxfrd failed")); 123 status++; 124 unlink(tmpname); 125 } 126 127 clnt_destroy(clnt); 128 close(fp); 129 return(status); 130} 131