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