1 /*- 2 * Copyright (c) 1990, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Mike Olson. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37 #if defined(LIBC_SCCS) && !defined(lint) 38 static char sccsid[] = "@(#)bt_conv.c 8.5 (Berkeley) 8/17/94"; 39 #endif /* LIBC_SCCS and not lint */ 40 #include <sys/cdefs.h> 41 __FBSDID("$FreeBSD$"); 42 43 #include <sys/param.h> 44 45 #include <stdio.h> 46 47 #include <db.h> 48 #include "btree.h" 49 50 static void mswap(PAGE *); 51 52 /* 53 * __BT_BPGIN, __BT_BPGOUT -- 54 * Convert host-specific number layout to/from the host-independent 55 * format stored on disk. 56 * 57 * Parameters: 58 * t: tree 59 * pg: page number 60 * h: page to convert 61 */ 62 void 63 __bt_pgin(t, pg, pp) 64 void *t; 65 pgno_t pg; 66 void *pp; 67 { 68 PAGE *h; 69 indx_t i, top; 70 u_char flags; 71 char *p; 72 73 if (!F_ISSET(((BTREE *)t), B_NEEDSWAP)) 74 return; 75 if (pg == P_META) { 76 mswap(pp); 77 return; 78 } 79 80 h = pp; 81 M_32_SWAP(h->pgno); 82 M_32_SWAP(h->prevpg); 83 M_32_SWAP(h->nextpg); 84 M_32_SWAP(h->flags); 85 M_16_SWAP(h->lower); 86 M_16_SWAP(h->upper); 87 88 top = NEXTINDEX(h); 89 if ((h->flags & P_TYPE) == P_BINTERNAL) 90 for (i = 0; i < top; i++) { 91 M_16_SWAP(h->linp[i]); 92 p = (char *)GETBINTERNAL(h, i); 93 P_32_SWAP(p); 94 p += sizeof(u_int32_t); 95 P_32_SWAP(p); 96 p += sizeof(pgno_t); 97 if (*(u_char *)p & P_BIGKEY) { 98 p += sizeof(u_char); 99 P_32_SWAP(p); 100 p += sizeof(pgno_t); 101 P_32_SWAP(p); 102 } 103 } 104 else if ((h->flags & P_TYPE) == P_BLEAF) 105 for (i = 0; i < top; i++) { 106 M_16_SWAP(h->linp[i]); 107 p = (char *)GETBLEAF(h, i); 108 P_32_SWAP(p); 109 p += sizeof(u_int32_t); 110 P_32_SWAP(p); 111 p += sizeof(u_int32_t); 112 flags = *(u_char *)p; 113 if (flags & (P_BIGKEY | P_BIGDATA)) { 114 p += sizeof(u_char); 115 if (flags & P_BIGKEY) { 116 P_32_SWAP(p); 117 p += sizeof(pgno_t); 118 P_32_SWAP(p); 119 } 120 if (flags & P_BIGDATA) { 121 p += sizeof(u_int32_t); 122 P_32_SWAP(p); 123 p += sizeof(pgno_t); 124 P_32_SWAP(p); 125 } 126 } 127 } 128 } 129 130 void 131 __bt_pgout(t, pg, pp) 132 void *t; 133 pgno_t pg; 134 void *pp; 135 { 136 PAGE *h; 137 indx_t i, top; 138 u_char flags; 139 char *p; 140 141 if (!F_ISSET(((BTREE *)t), B_NEEDSWAP)) 142 return; 143 if (pg == P_META) { 144 mswap(pp); 145 return; 146 } 147 148 h = pp; 149 top = NEXTINDEX(h); 150 if ((h->flags & P_TYPE) == P_BINTERNAL) 151 for (i = 0; i < top; i++) { 152 p = (char *)GETBINTERNAL(h, i); 153 P_32_SWAP(p); 154 p += sizeof(u_int32_t); 155 P_32_SWAP(p); 156 p += sizeof(pgno_t); 157 if (*(u_char *)p & P_BIGKEY) { 158 p += sizeof(u_char); 159 P_32_SWAP(p); 160 p += sizeof(pgno_t); 161 P_32_SWAP(p); 162 } 163 M_16_SWAP(h->linp[i]); 164 } 165 else if ((h->flags & P_TYPE) == P_BLEAF) 166 for (i = 0; i < top; i++) { 167 p = (char *)GETBLEAF(h, i); 168 P_32_SWAP(p); 169 p += sizeof(u_int32_t); 170 P_32_SWAP(p); 171 p += sizeof(u_int32_t); 172 flags = *(u_char *)p; 173 if (flags & (P_BIGKEY | P_BIGDATA)) { 174 p += sizeof(u_char); 175 if (flags & P_BIGKEY) { 176 P_32_SWAP(p); 177 p += sizeof(pgno_t); 178 P_32_SWAP(p); 179 } 180 if (flags & P_BIGDATA) { 181 p += sizeof(u_int32_t); 182 P_32_SWAP(p); 183 p += sizeof(pgno_t); 184 P_32_SWAP(p); 185 } 186 } 187 M_16_SWAP(h->linp[i]); 188 } 189 190 M_32_SWAP(h->pgno); 191 M_32_SWAP(h->prevpg); 192 M_32_SWAP(h->nextpg); 193 M_32_SWAP(h->flags); 194 M_16_SWAP(h->lower); 195 M_16_SWAP(h->upper); 196 } 197 198 /* 199 * MSWAP -- Actually swap the bytes on the meta page. 200 * 201 * Parameters: 202 * p: page to convert 203 */ 204 static void 205 mswap(pg) 206 PAGE *pg; 207 { 208 char *p; 209 210 p = (char *)pg; 211 P_32_SWAP(p); /* magic */ 212 p += sizeof(u_int32_t); 213 P_32_SWAP(p); /* version */ 214 p += sizeof(u_int32_t); 215 P_32_SWAP(p); /* psize */ 216 p += sizeof(u_int32_t); 217 P_32_SWAP(p); /* free */ 218 p += sizeof(u_int32_t); 219 P_32_SWAP(p); /* nrecs */ 220 p += sizeof(u_int32_t); 221 P_32_SWAP(p); /* flags */ 222 p += sizeof(u_int32_t); 223 } 224