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 * $FreeBSD: src/libexec/ypxfr/ypxfrd_getmap.c,v 1.7.2.1 2002/02/15 00:46:54 des Exp $ 33 */ 34 35 #include <errno.h> 36 #include <stdlib.h> 37 #include <string.h> 38 #include <time.h> 39 #include <unistd.h> 40 #include <rpcsvc/ypxfrd.h> 41 #include <rpcsvc/yp.h> 42 #include <rpc/rpc.h> 43 #include <sys/uio.h> 44 #include <sys/fcntl.h> 45 #include <sys/stat.h> 46 #include <sys/types.h> 47 #include "ypxfr_extern.h" 48 49 static int fp = 0; 50 51 static bool_t 52 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((xdrproc_t)xdr_xfr, 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 case(XFR_DB_TYPE_MISMATCH): 83 yp_error("client/server DB type mismatch"); 84 return(FALSE); 85 break; 86 case(XFR_DB_ENDIAN_MISMATCH): 87 yp_error("client/server byte order mismatch"); 88 return(FALSE); 89 break; 90 default: 91 yp_error("got unknown status from rpc.ypxfrd"); 92 return(FALSE); 93 break; 94 } 95 } 96 } 97 } 98 99 #define PERM_SECURE (S_IRUSR|S_IWUSR) 100 101 int 102 ypxfrd_get_map(char *host, char *map, char *domain, char *tmpname) 103 { 104 CLIENT *clnt; 105 struct ypxfr_mapname req; 106 struct xfr resp; 107 struct timeval timeout = { 0, 25 }; 108 int status = 0; 109 110 req.xfrmap = map; 111 req.xfrdomain = domain; 112 req.xfrmap_filename = ""; 113 req.xfr_db_type = XFR_DB_BSD_HASH; /* 114 req.xfr_byte_order = XFR_ENDIAN_ANY; * Berkeley DB isn't 115 * byte-order sensitive. 116 */ 117 118 bzero((char *)&resp, sizeof(resp)); 119 120 if ((clnt = clnt_create(host, YPXFRD_FREEBSD_PROG, 121 YPXFRD_FREEBSD_VERS, "tcp")) == NULL) { 122 return(1); 123 } 124 125 if ((fp = open(tmpname, O_RDWR|O_CREAT, PERM_SECURE)) == -1) { 126 clnt_destroy(clnt); 127 yp_error("couldn't open %s: %s", tmpname, strerror(errno)); 128 return(1); 129 } 130 131 if (clnt_call(clnt, YPXFRD_GETMAP, 132 (xdrproc_t)xdr_ypxfr_mapname, (char *)&req, 133 (xdrproc_t)xdr_my_xfr, (char *)&resp, 134 timeout) != RPC_SUCCESS) { 135 yp_error("%s", clnt_sperror(clnt,"call to rpc.ypxfrd failed")); 136 status++; 137 unlink(tmpname); 138 } 139 140 clnt_destroy(clnt); 141 close(fp); 142 return(status); 143 } 144