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 33 #ifndef lint 34 static const char rcsid[] = 35 "$FreeBSD$"; 36 #endif /* not lint */ 37 38 #include <errno.h> 39 #include <stdlib.h> 40 #include <string.h> 41 #include <time.h> 42 #include <unistd.h> 43 #include <rpcsvc/ypxfrd.h> 44 #include <rpcsvc/yp.h> 45 #include <rpc/rpc.h> 46 #include <sys/uio.h> 47 #include <sys/fcntl.h> 48 #include <sys/stat.h> 49 #include <sys/types.h> 50 #include "ypxfr_extern.h" 51 52 int fp = 0; 53 54 static bool_t xdr_my_xfr(register XDR *xdrs, xfr *objp) 55 { 56 while(1) { 57 if (!xdr_xfr(xdrs, objp)) 58 return(FALSE); 59 if (objp->ok == TRUE) { 60 if (write(fp, objp->xfr_u.xfrblock_buf.xfrblock_buf_val, 61 objp->xfr_u.xfrblock_buf.xfrblock_buf_len) == -1) { 62 yp_error("write failed: %s", strerror(errno)); 63 return(FALSE); 64 } 65 } 66 xdr_free(xdr_xfr, (char *)objp); 67 if (objp->ok == FALSE) { 68 switch(objp->xfr_u.xfrstat) { 69 case(XFR_DONE): 70 return(TRUE); 71 break; 72 case(XFR_READ_ERR): 73 yp_error("got read error from rpc.ypxfrd"); 74 return(FALSE); 75 break; 76 case(XFR_ACCESS): 77 yp_error("rpc.ypxfrd couldn't access the map"); 78 return(FALSE); 79 break; 80 case(XFR_DENIED): 81 yp_error("access to map denied by rpc.ypxfrd"); 82 return(FALSE); 83 break; 84 case(XFR_DB_TYPE_MISMATCH): 85 yp_error("client/server DB type mismatch"); 86 return(FALSE); 87 break; 88 case(XFR_DB_ENDIAN_MISMATCH): 89 yp_error("client/server byte order mismatch"); 90 return(FALSE); 91 break; 92 default: 93 yp_error("got unknown status from rpc.ypxfrd"); 94 return(FALSE); 95 break; 96 } 97 } 98 } 99 } 100 101 #define PERM_SECURE (S_IRUSR|S_IWUSR) 102 103 int ypxfrd_get_map(host, map, domain, tmpname) 104 char *host; 105 char *map; 106 char *domain; 107 char *tmpname; 108 { 109 CLIENT *clnt; 110 struct ypxfr_mapname req; 111 struct xfr resp; 112 struct timeval timeout = { 0, 25 }; 113 int status = 0; 114 115 req.xfrmap = map; 116 req.xfrdomain = domain; 117 req.xfrmap_filename = ""; 118 req.xfr_db_type = XFR_DB_BSD_HASH; /* 119 req.xfr_byte_order = XFR_ENDIAN_ANY; * Berkeley DB isn't 120 * byte-order sensitive. 121 */ 122 123 bzero((char *)&resp, sizeof(resp)); 124 125 if ((clnt = clnt_create(host, YPXFRD_FREEBSD_PROG, 126 YPXFRD_FREEBSD_VERS, "tcp")) == NULL) { 127 return(1); 128 } 129 130 if ((fp = open(tmpname, O_RDWR|O_CREAT, PERM_SECURE)) == -1) { 131 clnt_destroy(clnt); 132 yp_error("couldn't open %s: %s", tmpname, strerror(errno)); 133 return(1); 134 } 135 136 if (clnt_call(clnt,YPXFRD_GETMAP,xdr_ypxfr_mapname,(char *)&req, 137 xdr_my_xfr, (char *)&resp, timeout) != RPC_SUCCESS) { 138 yp_error("%s", clnt_sperror(clnt,"call to rpc.ypxfrd failed")); 139 status++; 140 unlink(tmpname); 141 } 142 143 clnt_destroy(clnt); 144 close(fp); 145 return(status); 146 } 147