xref: /titanic_51/usr/src/cmd/sendmail/db/db/db_auto.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1 /* Do not edit: automatically built by dist/db_gen.sh. */
2 #include "config.h"
3 
4 #ifndef NO_SYSTEM_INCLUDES
5 #include <ctype.h>
6 #include <errno.h>
7 #include <stddef.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #endif
11 
12 #include "db_int.h"
13 #include "db_page.h"
14 #include "db_dispatch.h"
15 #include "db_am.h"
16 /*
17  * PUBLIC: int __db_addrem_log
18  * PUBLIC:     __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t,
19  * PUBLIC:     u_int32_t, u_int32_t, db_pgno_t, u_int32_t,
20  * PUBLIC:     size_t, const DBT *, const DBT *, DB_LSN *));
21  */
22 int __db_addrem_log(logp, txnid, ret_lsnp, flags,
23 	opcode, fileid, pgno, indx, nbytes, hdr,
24 	dbt, pagelsn)
25 	DB_LOG *logp;
26 	DB_TXN *txnid;
27 	DB_LSN *ret_lsnp;
28 	u_int32_t flags;
29 	u_int32_t opcode;
30 	u_int32_t fileid;
31 	db_pgno_t pgno;
32 	u_int32_t indx;
33 	size_t nbytes;
34 	const DBT *hdr;
35 	const DBT *dbt;
36 	DB_LSN * pagelsn;
37 {
38 	DBT logrec;
39 	DB_LSN *lsnp, null_lsn;
40 	u_int32_t zero;
41 	u_int32_t rectype, txn_num;
42 	int ret;
43 	u_int8_t *bp;
44 
45 	rectype = DB_db_addrem;
46 	txn_num = txnid == NULL ? 0 : txnid->txnid;
47 	if (txnid == NULL) {
48 		ZERO_LSN(null_lsn);
49 		lsnp = &null_lsn;
50 	} else
51 		lsnp = &txnid->last_lsn;
52 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
53 	    + sizeof(opcode)
54 	    + sizeof(fileid)
55 	    + sizeof(pgno)
56 	    + sizeof(indx)
57 	    + sizeof(nbytes)
58 	    + sizeof(u_int32_t) + (hdr == NULL ? 0 : hdr->size)
59 	    + sizeof(u_int32_t) + (dbt == NULL ? 0 : dbt->size)
60 	    + sizeof(*pagelsn);
61 	if ((ret = __os_malloc(logrec.size, NULL, &logrec.data)) != 0)
62 		return (ret);
63 
64 	bp = logrec.data;
65 	memcpy(bp, &rectype, sizeof(rectype));
66 	bp += sizeof(rectype);
67 	memcpy(bp, &txn_num, sizeof(txn_num));
68 	bp += sizeof(txn_num);
69 	memcpy(bp, lsnp, sizeof(DB_LSN));
70 	bp += sizeof(DB_LSN);
71 	memcpy(bp, &opcode, sizeof(opcode));
72 	bp += sizeof(opcode);
73 	memcpy(bp, &fileid, sizeof(fileid));
74 	bp += sizeof(fileid);
75 	memcpy(bp, &pgno, sizeof(pgno));
76 	bp += sizeof(pgno);
77 	memcpy(bp, &indx, sizeof(indx));
78 	bp += sizeof(indx);
79 	memcpy(bp, &nbytes, sizeof(nbytes));
80 	bp += sizeof(nbytes);
81 	if (hdr == NULL) {
82 		zero = 0;
83 		memcpy(bp, &zero, sizeof(u_int32_t));
84 		bp += sizeof(u_int32_t);
85 	} else {
86 		memcpy(bp, &hdr->size, sizeof(hdr->size));
87 		bp += sizeof(hdr->size);
88 		memcpy(bp, hdr->data, hdr->size);
89 		bp += hdr->size;
90 	}
91 	if (dbt == NULL) {
92 		zero = 0;
93 		memcpy(bp, &zero, sizeof(u_int32_t));
94 		bp += sizeof(u_int32_t);
95 	} else {
96 		memcpy(bp, &dbt->size, sizeof(dbt->size));
97 		bp += sizeof(dbt->size);
98 		memcpy(bp, dbt->data, dbt->size);
99 		bp += dbt->size;
100 	}
101 	if (pagelsn != NULL)
102 		memcpy(bp, pagelsn, sizeof(*pagelsn));
103 	else
104 		memset(bp, 0, sizeof(*pagelsn));
105 	bp += sizeof(*pagelsn);
106 #ifdef DIAGNOSTIC
107 	if ((u_int32_t)(bp - (u_int8_t *)logrec.data) != logrec.size)
108 		fprintf(stderr, "Error in log record length");
109 #endif
110 	ret = log_put(logp, ret_lsnp, (DBT *)&logrec, flags);
111 	if (txnid != NULL)
112 		txnid->last_lsn = *ret_lsnp;
113 	__os_free(logrec.data, 0);
114 	return (ret);
115 }
116 
117 /*
118  * PUBLIC: int __db_addrem_print
119  * PUBLIC:    __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
120  */
121 int
122 __db_addrem_print(notused1, dbtp, lsnp, notused2, notused3)
123 	DB_LOG *notused1;
124 	DBT *dbtp;
125 	DB_LSN *lsnp;
126 	int notused2;
127 	void *notused3;
128 {
129 	__db_addrem_args *argp;
130 	u_int32_t i;
131 	u_int ch;
132 	int ret;
133 
134 	i = 0;
135 	ch = 0;
136 	notused1 = NULL;
137 	notused2 = 0;
138 	notused3 = NULL;
139 
140 	if ((ret = __db_addrem_read(dbtp->data, &argp)) != 0)
141 		return (ret);
142 	printf("[%lu][%lu]db_addrem: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
143 	    (u_long)lsnp->file,
144 	    (u_long)lsnp->offset,
145 	    (u_long)argp->type,
146 	    (u_long)argp->txnid->txnid,
147 	    (u_long)argp->prev_lsn.file,
148 	    (u_long)argp->prev_lsn.offset);
149 	printf("\topcode: %lu\n", (u_long)argp->opcode);
150 	printf("\tfileid: %lu\n", (u_long)argp->fileid);
151 	printf("\tpgno: %lu\n", (u_long)argp->pgno);
152 	printf("\tindx: %lu\n", (u_long)argp->indx);
153 	printf("\tnbytes: %lu\n", (u_long)argp->nbytes);
154 	printf("\thdr: ");
155 	for (i = 0; i < argp->hdr.size; i++) {
156 		ch = ((u_int8_t *)argp->hdr.data)[i];
157 		if (isprint(ch) || ch == 0xa)
158 			putchar(ch);
159 		else
160 			printf("%#x ", ch);
161 	}
162 	printf("\n");
163 	printf("\tdbt: ");
164 	for (i = 0; i < argp->dbt.size; i++) {
165 		ch = ((u_int8_t *)argp->dbt.data)[i];
166 		if (isprint(ch) || ch == 0xa)
167 			putchar(ch);
168 		else
169 			printf("%#x ", ch);
170 	}
171 	printf("\n");
172 	printf("\tpagelsn: [%lu][%lu]\n",
173 	    (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
174 	printf("\n");
175 	__os_free(argp, 0);
176 	return (0);
177 }
178 
179 /*
180  * PUBLIC: int __db_addrem_read __P((void *, __db_addrem_args **));
181  */
182 int
183 __db_addrem_read(recbuf, argpp)
184 	void *recbuf;
185 	__db_addrem_args **argpp;
186 {
187 	__db_addrem_args *argp;
188 	u_int8_t *bp;
189 	int ret;
190 
191 	ret = __os_malloc(sizeof(__db_addrem_args) +
192 	    sizeof(DB_TXN), NULL, &argp);
193 	if (ret != 0)
194 		return (ret);
195 	argp->txnid = (DB_TXN *)&argp[1];
196 	bp = recbuf;
197 	memcpy(&argp->type, bp, sizeof(argp->type));
198 	bp += sizeof(argp->type);
199 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
200 	bp += sizeof(argp->txnid->txnid);
201 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
202 	bp += sizeof(DB_LSN);
203 	memcpy(&argp->opcode, bp, sizeof(argp->opcode));
204 	bp += sizeof(argp->opcode);
205 	memcpy(&argp->fileid, bp, sizeof(argp->fileid));
206 	bp += sizeof(argp->fileid);
207 	memcpy(&argp->pgno, bp, sizeof(argp->pgno));
208 	bp += sizeof(argp->pgno);
209 	memcpy(&argp->indx, bp, sizeof(argp->indx));
210 	bp += sizeof(argp->indx);
211 	memcpy(&argp->nbytes, bp, sizeof(argp->nbytes));
212 	bp += sizeof(argp->nbytes);
213 	memcpy(&argp->hdr.size, bp, sizeof(u_int32_t));
214 	bp += sizeof(u_int32_t);
215 	argp->hdr.data = bp;
216 	bp += argp->hdr.size;
217 	memcpy(&argp->dbt.size, bp, sizeof(u_int32_t));
218 	bp += sizeof(u_int32_t);
219 	argp->dbt.data = bp;
220 	bp += argp->dbt.size;
221 	memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
222 	bp += sizeof(argp->pagelsn);
223 	*argpp = argp;
224 	return (0);
225 }
226 
227 /*
228  * PUBLIC: int __db_split_log
229  * PUBLIC:     __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t,
230  * PUBLIC:     u_int32_t, u_int32_t, db_pgno_t, const DBT *,
231  * PUBLIC:     DB_LSN *));
232  */
233 int __db_split_log(logp, txnid, ret_lsnp, flags,
234 	opcode, fileid, pgno, pageimage, pagelsn)
235 	DB_LOG *logp;
236 	DB_TXN *txnid;
237 	DB_LSN *ret_lsnp;
238 	u_int32_t flags;
239 	u_int32_t opcode;
240 	u_int32_t fileid;
241 	db_pgno_t pgno;
242 	const DBT *pageimage;
243 	DB_LSN * pagelsn;
244 {
245 	DBT logrec;
246 	DB_LSN *lsnp, null_lsn;
247 	u_int32_t zero;
248 	u_int32_t rectype, txn_num;
249 	int ret;
250 	u_int8_t *bp;
251 
252 	rectype = DB_db_split;
253 	txn_num = txnid == NULL ? 0 : txnid->txnid;
254 	if (txnid == NULL) {
255 		ZERO_LSN(null_lsn);
256 		lsnp = &null_lsn;
257 	} else
258 		lsnp = &txnid->last_lsn;
259 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
260 	    + sizeof(opcode)
261 	    + sizeof(fileid)
262 	    + sizeof(pgno)
263 	    + sizeof(u_int32_t) + (pageimage == NULL ? 0 : pageimage->size)
264 	    + sizeof(*pagelsn);
265 	if ((ret = __os_malloc(logrec.size, NULL, &logrec.data)) != 0)
266 		return (ret);
267 
268 	bp = logrec.data;
269 	memcpy(bp, &rectype, sizeof(rectype));
270 	bp += sizeof(rectype);
271 	memcpy(bp, &txn_num, sizeof(txn_num));
272 	bp += sizeof(txn_num);
273 	memcpy(bp, lsnp, sizeof(DB_LSN));
274 	bp += sizeof(DB_LSN);
275 	memcpy(bp, &opcode, sizeof(opcode));
276 	bp += sizeof(opcode);
277 	memcpy(bp, &fileid, sizeof(fileid));
278 	bp += sizeof(fileid);
279 	memcpy(bp, &pgno, sizeof(pgno));
280 	bp += sizeof(pgno);
281 	if (pageimage == NULL) {
282 		zero = 0;
283 		memcpy(bp, &zero, sizeof(u_int32_t));
284 		bp += sizeof(u_int32_t);
285 	} else {
286 		memcpy(bp, &pageimage->size, sizeof(pageimage->size));
287 		bp += sizeof(pageimage->size);
288 		memcpy(bp, pageimage->data, pageimage->size);
289 		bp += pageimage->size;
290 	}
291 	if (pagelsn != NULL)
292 		memcpy(bp, pagelsn, sizeof(*pagelsn));
293 	else
294 		memset(bp, 0, sizeof(*pagelsn));
295 	bp += sizeof(*pagelsn);
296 #ifdef DIAGNOSTIC
297 	if ((u_int32_t)(bp - (u_int8_t *)logrec.data) != logrec.size)
298 		fprintf(stderr, "Error in log record length");
299 #endif
300 	ret = log_put(logp, ret_lsnp, (DBT *)&logrec, flags);
301 	if (txnid != NULL)
302 		txnid->last_lsn = *ret_lsnp;
303 	__os_free(logrec.data, 0);
304 	return (ret);
305 }
306 
307 /*
308  * PUBLIC: int __db_split_print
309  * PUBLIC:    __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
310  */
311 int
312 __db_split_print(notused1, dbtp, lsnp, notused2, notused3)
313 	DB_LOG *notused1;
314 	DBT *dbtp;
315 	DB_LSN *lsnp;
316 	int notused2;
317 	void *notused3;
318 {
319 	__db_split_args *argp;
320 	u_int32_t i;
321 	u_int ch;
322 	int ret;
323 
324 	i = 0;
325 	ch = 0;
326 	notused1 = NULL;
327 	notused2 = 0;
328 	notused3 = NULL;
329 
330 	if ((ret = __db_split_read(dbtp->data, &argp)) != 0)
331 		return (ret);
332 	printf("[%lu][%lu]db_split: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
333 	    (u_long)lsnp->file,
334 	    (u_long)lsnp->offset,
335 	    (u_long)argp->type,
336 	    (u_long)argp->txnid->txnid,
337 	    (u_long)argp->prev_lsn.file,
338 	    (u_long)argp->prev_lsn.offset);
339 	printf("\topcode: %lu\n", (u_long)argp->opcode);
340 	printf("\tfileid: %lu\n", (u_long)argp->fileid);
341 	printf("\tpgno: %lu\n", (u_long)argp->pgno);
342 	printf("\tpageimage: ");
343 	for (i = 0; i < argp->pageimage.size; i++) {
344 		ch = ((u_int8_t *)argp->pageimage.data)[i];
345 		if (isprint(ch) || ch == 0xa)
346 			putchar(ch);
347 		else
348 			printf("%#x ", ch);
349 	}
350 	printf("\n");
351 	printf("\tpagelsn: [%lu][%lu]\n",
352 	    (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
353 	printf("\n");
354 	__os_free(argp, 0);
355 	return (0);
356 }
357 
358 /*
359  * PUBLIC: int __db_split_read __P((void *, __db_split_args **));
360  */
361 int
362 __db_split_read(recbuf, argpp)
363 	void *recbuf;
364 	__db_split_args **argpp;
365 {
366 	__db_split_args *argp;
367 	u_int8_t *bp;
368 	int ret;
369 
370 	ret = __os_malloc(sizeof(__db_split_args) +
371 	    sizeof(DB_TXN), NULL, &argp);
372 	if (ret != 0)
373 		return (ret);
374 	argp->txnid = (DB_TXN *)&argp[1];
375 	bp = recbuf;
376 	memcpy(&argp->type, bp, sizeof(argp->type));
377 	bp += sizeof(argp->type);
378 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
379 	bp += sizeof(argp->txnid->txnid);
380 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
381 	bp += sizeof(DB_LSN);
382 	memcpy(&argp->opcode, bp, sizeof(argp->opcode));
383 	bp += sizeof(argp->opcode);
384 	memcpy(&argp->fileid, bp, sizeof(argp->fileid));
385 	bp += sizeof(argp->fileid);
386 	memcpy(&argp->pgno, bp, sizeof(argp->pgno));
387 	bp += sizeof(argp->pgno);
388 	memcpy(&argp->pageimage.size, bp, sizeof(u_int32_t));
389 	bp += sizeof(u_int32_t);
390 	argp->pageimage.data = bp;
391 	bp += argp->pageimage.size;
392 	memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
393 	bp += sizeof(argp->pagelsn);
394 	*argpp = argp;
395 	return (0);
396 }
397 
398 /*
399  * PUBLIC: int __db_big_log
400  * PUBLIC:     __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t,
401  * PUBLIC:     u_int32_t, u_int32_t, db_pgno_t, db_pgno_t,
402  * PUBLIC:     db_pgno_t, const DBT *, DB_LSN *, DB_LSN *,
403  * PUBLIC:     DB_LSN *));
404  */
405 int __db_big_log(logp, txnid, ret_lsnp, flags,
406 	opcode, fileid, pgno, prev_pgno, next_pgno, dbt,
407 	pagelsn, prevlsn, nextlsn)
408 	DB_LOG *logp;
409 	DB_TXN *txnid;
410 	DB_LSN *ret_lsnp;
411 	u_int32_t flags;
412 	u_int32_t opcode;
413 	u_int32_t fileid;
414 	db_pgno_t pgno;
415 	db_pgno_t prev_pgno;
416 	db_pgno_t next_pgno;
417 	const DBT *dbt;
418 	DB_LSN * pagelsn;
419 	DB_LSN * prevlsn;
420 	DB_LSN * nextlsn;
421 {
422 	DBT logrec;
423 	DB_LSN *lsnp, null_lsn;
424 	u_int32_t zero;
425 	u_int32_t rectype, txn_num;
426 	int ret;
427 	u_int8_t *bp;
428 
429 	rectype = DB_db_big;
430 	txn_num = txnid == NULL ? 0 : txnid->txnid;
431 	if (txnid == NULL) {
432 		ZERO_LSN(null_lsn);
433 		lsnp = &null_lsn;
434 	} else
435 		lsnp = &txnid->last_lsn;
436 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
437 	    + sizeof(opcode)
438 	    + sizeof(fileid)
439 	    + sizeof(pgno)
440 	    + sizeof(prev_pgno)
441 	    + sizeof(next_pgno)
442 	    + sizeof(u_int32_t) + (dbt == NULL ? 0 : dbt->size)
443 	    + sizeof(*pagelsn)
444 	    + sizeof(*prevlsn)
445 	    + sizeof(*nextlsn);
446 	if ((ret = __os_malloc(logrec.size, NULL, &logrec.data)) != 0)
447 		return (ret);
448 
449 	bp = logrec.data;
450 	memcpy(bp, &rectype, sizeof(rectype));
451 	bp += sizeof(rectype);
452 	memcpy(bp, &txn_num, sizeof(txn_num));
453 	bp += sizeof(txn_num);
454 	memcpy(bp, lsnp, sizeof(DB_LSN));
455 	bp += sizeof(DB_LSN);
456 	memcpy(bp, &opcode, sizeof(opcode));
457 	bp += sizeof(opcode);
458 	memcpy(bp, &fileid, sizeof(fileid));
459 	bp += sizeof(fileid);
460 	memcpy(bp, &pgno, sizeof(pgno));
461 	bp += sizeof(pgno);
462 	memcpy(bp, &prev_pgno, sizeof(prev_pgno));
463 	bp += sizeof(prev_pgno);
464 	memcpy(bp, &next_pgno, sizeof(next_pgno));
465 	bp += sizeof(next_pgno);
466 	if (dbt == NULL) {
467 		zero = 0;
468 		memcpy(bp, &zero, sizeof(u_int32_t));
469 		bp += sizeof(u_int32_t);
470 	} else {
471 		memcpy(bp, &dbt->size, sizeof(dbt->size));
472 		bp += sizeof(dbt->size);
473 		memcpy(bp, dbt->data, dbt->size);
474 		bp += dbt->size;
475 	}
476 	if (pagelsn != NULL)
477 		memcpy(bp, pagelsn, sizeof(*pagelsn));
478 	else
479 		memset(bp, 0, sizeof(*pagelsn));
480 	bp += sizeof(*pagelsn);
481 	if (prevlsn != NULL)
482 		memcpy(bp, prevlsn, sizeof(*prevlsn));
483 	else
484 		memset(bp, 0, sizeof(*prevlsn));
485 	bp += sizeof(*prevlsn);
486 	if (nextlsn != NULL)
487 		memcpy(bp, nextlsn, sizeof(*nextlsn));
488 	else
489 		memset(bp, 0, sizeof(*nextlsn));
490 	bp += sizeof(*nextlsn);
491 #ifdef DIAGNOSTIC
492 	if ((u_int32_t)(bp - (u_int8_t *)logrec.data) != logrec.size)
493 		fprintf(stderr, "Error in log record length");
494 #endif
495 	ret = log_put(logp, ret_lsnp, (DBT *)&logrec, flags);
496 	if (txnid != NULL)
497 		txnid->last_lsn = *ret_lsnp;
498 	__os_free(logrec.data, 0);
499 	return (ret);
500 }
501 
502 /*
503  * PUBLIC: int __db_big_print
504  * PUBLIC:    __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
505  */
506 int
507 __db_big_print(notused1, dbtp, lsnp, notused2, notused3)
508 	DB_LOG *notused1;
509 	DBT *dbtp;
510 	DB_LSN *lsnp;
511 	int notused2;
512 	void *notused3;
513 {
514 	__db_big_args *argp;
515 	u_int32_t i;
516 	u_int ch;
517 	int ret;
518 
519 	i = 0;
520 	ch = 0;
521 	notused1 = NULL;
522 	notused2 = 0;
523 	notused3 = NULL;
524 
525 	if ((ret = __db_big_read(dbtp->data, &argp)) != 0)
526 		return (ret);
527 	printf("[%lu][%lu]db_big: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
528 	    (u_long)lsnp->file,
529 	    (u_long)lsnp->offset,
530 	    (u_long)argp->type,
531 	    (u_long)argp->txnid->txnid,
532 	    (u_long)argp->prev_lsn.file,
533 	    (u_long)argp->prev_lsn.offset);
534 	printf("\topcode: %lu\n", (u_long)argp->opcode);
535 	printf("\tfileid: %lu\n", (u_long)argp->fileid);
536 	printf("\tpgno: %lu\n", (u_long)argp->pgno);
537 	printf("\tprev_pgno: %lu\n", (u_long)argp->prev_pgno);
538 	printf("\tnext_pgno: %lu\n", (u_long)argp->next_pgno);
539 	printf("\tdbt: ");
540 	for (i = 0; i < argp->dbt.size; i++) {
541 		ch = ((u_int8_t *)argp->dbt.data)[i];
542 		if (isprint(ch) || ch == 0xa)
543 			putchar(ch);
544 		else
545 			printf("%#x ", ch);
546 	}
547 	printf("\n");
548 	printf("\tpagelsn: [%lu][%lu]\n",
549 	    (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
550 	printf("\tprevlsn: [%lu][%lu]\n",
551 	    (u_long)argp->prevlsn.file, (u_long)argp->prevlsn.offset);
552 	printf("\tnextlsn: [%lu][%lu]\n",
553 	    (u_long)argp->nextlsn.file, (u_long)argp->nextlsn.offset);
554 	printf("\n");
555 	__os_free(argp, 0);
556 	return (0);
557 }
558 
559 /*
560  * PUBLIC: int __db_big_read __P((void *, __db_big_args **));
561  */
562 int
563 __db_big_read(recbuf, argpp)
564 	void *recbuf;
565 	__db_big_args **argpp;
566 {
567 	__db_big_args *argp;
568 	u_int8_t *bp;
569 	int ret;
570 
571 	ret = __os_malloc(sizeof(__db_big_args) +
572 	    sizeof(DB_TXN), NULL, &argp);
573 	if (ret != 0)
574 		return (ret);
575 	argp->txnid = (DB_TXN *)&argp[1];
576 	bp = recbuf;
577 	memcpy(&argp->type, bp, sizeof(argp->type));
578 	bp += sizeof(argp->type);
579 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
580 	bp += sizeof(argp->txnid->txnid);
581 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
582 	bp += sizeof(DB_LSN);
583 	memcpy(&argp->opcode, bp, sizeof(argp->opcode));
584 	bp += sizeof(argp->opcode);
585 	memcpy(&argp->fileid, bp, sizeof(argp->fileid));
586 	bp += sizeof(argp->fileid);
587 	memcpy(&argp->pgno, bp, sizeof(argp->pgno));
588 	bp += sizeof(argp->pgno);
589 	memcpy(&argp->prev_pgno, bp, sizeof(argp->prev_pgno));
590 	bp += sizeof(argp->prev_pgno);
591 	memcpy(&argp->next_pgno, bp, sizeof(argp->next_pgno));
592 	bp += sizeof(argp->next_pgno);
593 	memcpy(&argp->dbt.size, bp, sizeof(u_int32_t));
594 	bp += sizeof(u_int32_t);
595 	argp->dbt.data = bp;
596 	bp += argp->dbt.size;
597 	memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
598 	bp += sizeof(argp->pagelsn);
599 	memcpy(&argp->prevlsn, bp,  sizeof(argp->prevlsn));
600 	bp += sizeof(argp->prevlsn);
601 	memcpy(&argp->nextlsn, bp,  sizeof(argp->nextlsn));
602 	bp += sizeof(argp->nextlsn);
603 	*argpp = argp;
604 	return (0);
605 }
606 
607 /*
608  * PUBLIC: int __db_ovref_log
609  * PUBLIC:     __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t,
610  * PUBLIC:     u_int32_t, db_pgno_t, int32_t, DB_LSN *));
611  */
612 int __db_ovref_log(logp, txnid, ret_lsnp, flags,
613 	fileid, pgno, adjust, lsn)
614 	DB_LOG *logp;
615 	DB_TXN *txnid;
616 	DB_LSN *ret_lsnp;
617 	u_int32_t flags;
618 	u_int32_t fileid;
619 	db_pgno_t pgno;
620 	int32_t adjust;
621 	DB_LSN * lsn;
622 {
623 	DBT logrec;
624 	DB_LSN *lsnp, null_lsn;
625 	u_int32_t rectype, txn_num;
626 	int ret;
627 	u_int8_t *bp;
628 
629 	rectype = DB_db_ovref;
630 	txn_num = txnid == NULL ? 0 : txnid->txnid;
631 	if (txnid == NULL) {
632 		ZERO_LSN(null_lsn);
633 		lsnp = &null_lsn;
634 	} else
635 		lsnp = &txnid->last_lsn;
636 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
637 	    + sizeof(fileid)
638 	    + sizeof(pgno)
639 	    + sizeof(adjust)
640 	    + sizeof(*lsn);
641 	if ((ret = __os_malloc(logrec.size, NULL, &logrec.data)) != 0)
642 		return (ret);
643 
644 	bp = logrec.data;
645 	memcpy(bp, &rectype, sizeof(rectype));
646 	bp += sizeof(rectype);
647 	memcpy(bp, &txn_num, sizeof(txn_num));
648 	bp += sizeof(txn_num);
649 	memcpy(bp, lsnp, sizeof(DB_LSN));
650 	bp += sizeof(DB_LSN);
651 	memcpy(bp, &fileid, sizeof(fileid));
652 	bp += sizeof(fileid);
653 	memcpy(bp, &pgno, sizeof(pgno));
654 	bp += sizeof(pgno);
655 	memcpy(bp, &adjust, sizeof(adjust));
656 	bp += sizeof(adjust);
657 	if (lsn != NULL)
658 		memcpy(bp, lsn, sizeof(*lsn));
659 	else
660 		memset(bp, 0, sizeof(*lsn));
661 	bp += sizeof(*lsn);
662 #ifdef DIAGNOSTIC
663 	if ((u_int32_t)(bp - (u_int8_t *)logrec.data) != logrec.size)
664 		fprintf(stderr, "Error in log record length");
665 #endif
666 	ret = log_put(logp, ret_lsnp, (DBT *)&logrec, flags);
667 	if (txnid != NULL)
668 		txnid->last_lsn = *ret_lsnp;
669 	__os_free(logrec.data, 0);
670 	return (ret);
671 }
672 
673 /*
674  * PUBLIC: int __db_ovref_print
675  * PUBLIC:    __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
676  */
677 int
678 __db_ovref_print(notused1, dbtp, lsnp, notused2, notused3)
679 	DB_LOG *notused1;
680 	DBT *dbtp;
681 	DB_LSN *lsnp;
682 	int notused2;
683 	void *notused3;
684 {
685 	__db_ovref_args *argp;
686 	u_int32_t i;
687 	u_int ch;
688 	int ret;
689 
690 	i = 0;
691 	ch = 0;
692 	notused1 = NULL;
693 	notused2 = 0;
694 	notused3 = NULL;
695 
696 	if ((ret = __db_ovref_read(dbtp->data, &argp)) != 0)
697 		return (ret);
698 	printf("[%lu][%lu]db_ovref: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
699 	    (u_long)lsnp->file,
700 	    (u_long)lsnp->offset,
701 	    (u_long)argp->type,
702 	    (u_long)argp->txnid->txnid,
703 	    (u_long)argp->prev_lsn.file,
704 	    (u_long)argp->prev_lsn.offset);
705 	printf("\tfileid: %lu\n", (u_long)argp->fileid);
706 	printf("\tpgno: %lu\n", (u_long)argp->pgno);
707 	printf("\tadjust: %ld\n", (long)argp->adjust);
708 	printf("\tlsn: [%lu][%lu]\n",
709 	    (u_long)argp->lsn.file, (u_long)argp->lsn.offset);
710 	printf("\n");
711 	__os_free(argp, 0);
712 	return (0);
713 }
714 
715 /*
716  * PUBLIC: int __db_ovref_read __P((void *, __db_ovref_args **));
717  */
718 int
719 __db_ovref_read(recbuf, argpp)
720 	void *recbuf;
721 	__db_ovref_args **argpp;
722 {
723 	__db_ovref_args *argp;
724 	u_int8_t *bp;
725 	int ret;
726 
727 	ret = __os_malloc(sizeof(__db_ovref_args) +
728 	    sizeof(DB_TXN), NULL, &argp);
729 	if (ret != 0)
730 		return (ret);
731 	argp->txnid = (DB_TXN *)&argp[1];
732 	bp = recbuf;
733 	memcpy(&argp->type, bp, sizeof(argp->type));
734 	bp += sizeof(argp->type);
735 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
736 	bp += sizeof(argp->txnid->txnid);
737 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
738 	bp += sizeof(DB_LSN);
739 	memcpy(&argp->fileid, bp, sizeof(argp->fileid));
740 	bp += sizeof(argp->fileid);
741 	memcpy(&argp->pgno, bp, sizeof(argp->pgno));
742 	bp += sizeof(argp->pgno);
743 	memcpy(&argp->adjust, bp, sizeof(argp->adjust));
744 	bp += sizeof(argp->adjust);
745 	memcpy(&argp->lsn, bp,  sizeof(argp->lsn));
746 	bp += sizeof(argp->lsn);
747 	*argpp = argp;
748 	return (0);
749 }
750 
751 /*
752  * PUBLIC: int __db_relink_log
753  * PUBLIC:     __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t,
754  * PUBLIC:     u_int32_t, u_int32_t, db_pgno_t, DB_LSN *,
755  * PUBLIC:     db_pgno_t, DB_LSN *, db_pgno_t, DB_LSN *));
756  */
757 int __db_relink_log(logp, txnid, ret_lsnp, flags,
758 	opcode, fileid, pgno, lsn, prev, lsn_prev,
759 	next, lsn_next)
760 	DB_LOG *logp;
761 	DB_TXN *txnid;
762 	DB_LSN *ret_lsnp;
763 	u_int32_t flags;
764 	u_int32_t opcode;
765 	u_int32_t fileid;
766 	db_pgno_t pgno;
767 	DB_LSN * lsn;
768 	db_pgno_t prev;
769 	DB_LSN * lsn_prev;
770 	db_pgno_t next;
771 	DB_LSN * lsn_next;
772 {
773 	DBT logrec;
774 	DB_LSN *lsnp, null_lsn;
775 	u_int32_t rectype, txn_num;
776 	int ret;
777 	u_int8_t *bp;
778 
779 	rectype = DB_db_relink;
780 	txn_num = txnid == NULL ? 0 : txnid->txnid;
781 	if (txnid == NULL) {
782 		ZERO_LSN(null_lsn);
783 		lsnp = &null_lsn;
784 	} else
785 		lsnp = &txnid->last_lsn;
786 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
787 	    + sizeof(opcode)
788 	    + sizeof(fileid)
789 	    + sizeof(pgno)
790 	    + sizeof(*lsn)
791 	    + sizeof(prev)
792 	    + sizeof(*lsn_prev)
793 	    + sizeof(next)
794 	    + sizeof(*lsn_next);
795 	if ((ret = __os_malloc(logrec.size, NULL, &logrec.data)) != 0)
796 		return (ret);
797 
798 	bp = logrec.data;
799 	memcpy(bp, &rectype, sizeof(rectype));
800 	bp += sizeof(rectype);
801 	memcpy(bp, &txn_num, sizeof(txn_num));
802 	bp += sizeof(txn_num);
803 	memcpy(bp, lsnp, sizeof(DB_LSN));
804 	bp += sizeof(DB_LSN);
805 	memcpy(bp, &opcode, sizeof(opcode));
806 	bp += sizeof(opcode);
807 	memcpy(bp, &fileid, sizeof(fileid));
808 	bp += sizeof(fileid);
809 	memcpy(bp, &pgno, sizeof(pgno));
810 	bp += sizeof(pgno);
811 	if (lsn != NULL)
812 		memcpy(bp, lsn, sizeof(*lsn));
813 	else
814 		memset(bp, 0, sizeof(*lsn));
815 	bp += sizeof(*lsn);
816 	memcpy(bp, &prev, sizeof(prev));
817 	bp += sizeof(prev);
818 	if (lsn_prev != NULL)
819 		memcpy(bp, lsn_prev, sizeof(*lsn_prev));
820 	else
821 		memset(bp, 0, sizeof(*lsn_prev));
822 	bp += sizeof(*lsn_prev);
823 	memcpy(bp, &next, sizeof(next));
824 	bp += sizeof(next);
825 	if (lsn_next != NULL)
826 		memcpy(bp, lsn_next, sizeof(*lsn_next));
827 	else
828 		memset(bp, 0, sizeof(*lsn_next));
829 	bp += sizeof(*lsn_next);
830 #ifdef DIAGNOSTIC
831 	if ((u_int32_t)(bp - (u_int8_t *)logrec.data) != logrec.size)
832 		fprintf(stderr, "Error in log record length");
833 #endif
834 	ret = log_put(logp, ret_lsnp, (DBT *)&logrec, flags);
835 	if (txnid != NULL)
836 		txnid->last_lsn = *ret_lsnp;
837 	__os_free(logrec.data, 0);
838 	return (ret);
839 }
840 
841 /*
842  * PUBLIC: int __db_relink_print
843  * PUBLIC:    __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
844  */
845 int
846 __db_relink_print(notused1, dbtp, lsnp, notused2, notused3)
847 	DB_LOG *notused1;
848 	DBT *dbtp;
849 	DB_LSN *lsnp;
850 	int notused2;
851 	void *notused3;
852 {
853 	__db_relink_args *argp;
854 	u_int32_t i;
855 	u_int ch;
856 	int ret;
857 
858 	i = 0;
859 	ch = 0;
860 	notused1 = NULL;
861 	notused2 = 0;
862 	notused3 = NULL;
863 
864 	if ((ret = __db_relink_read(dbtp->data, &argp)) != 0)
865 		return (ret);
866 	printf("[%lu][%lu]db_relink: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
867 	    (u_long)lsnp->file,
868 	    (u_long)lsnp->offset,
869 	    (u_long)argp->type,
870 	    (u_long)argp->txnid->txnid,
871 	    (u_long)argp->prev_lsn.file,
872 	    (u_long)argp->prev_lsn.offset);
873 	printf("\topcode: %lu\n", (u_long)argp->opcode);
874 	printf("\tfileid: %lu\n", (u_long)argp->fileid);
875 	printf("\tpgno: %lu\n", (u_long)argp->pgno);
876 	printf("\tlsn: [%lu][%lu]\n",
877 	    (u_long)argp->lsn.file, (u_long)argp->lsn.offset);
878 	printf("\tprev: %lu\n", (u_long)argp->prev);
879 	printf("\tlsn_prev: [%lu][%lu]\n",
880 	    (u_long)argp->lsn_prev.file, (u_long)argp->lsn_prev.offset);
881 	printf("\tnext: %lu\n", (u_long)argp->next);
882 	printf("\tlsn_next: [%lu][%lu]\n",
883 	    (u_long)argp->lsn_next.file, (u_long)argp->lsn_next.offset);
884 	printf("\n");
885 	__os_free(argp, 0);
886 	return (0);
887 }
888 
889 /*
890  * PUBLIC: int __db_relink_read __P((void *, __db_relink_args **));
891  */
892 int
893 __db_relink_read(recbuf, argpp)
894 	void *recbuf;
895 	__db_relink_args **argpp;
896 {
897 	__db_relink_args *argp;
898 	u_int8_t *bp;
899 	int ret;
900 
901 	ret = __os_malloc(sizeof(__db_relink_args) +
902 	    sizeof(DB_TXN), NULL, &argp);
903 	if (ret != 0)
904 		return (ret);
905 	argp->txnid = (DB_TXN *)&argp[1];
906 	bp = recbuf;
907 	memcpy(&argp->type, bp, sizeof(argp->type));
908 	bp += sizeof(argp->type);
909 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
910 	bp += sizeof(argp->txnid->txnid);
911 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
912 	bp += sizeof(DB_LSN);
913 	memcpy(&argp->opcode, bp, sizeof(argp->opcode));
914 	bp += sizeof(argp->opcode);
915 	memcpy(&argp->fileid, bp, sizeof(argp->fileid));
916 	bp += sizeof(argp->fileid);
917 	memcpy(&argp->pgno, bp, sizeof(argp->pgno));
918 	bp += sizeof(argp->pgno);
919 	memcpy(&argp->lsn, bp,  sizeof(argp->lsn));
920 	bp += sizeof(argp->lsn);
921 	memcpy(&argp->prev, bp, sizeof(argp->prev));
922 	bp += sizeof(argp->prev);
923 	memcpy(&argp->lsn_prev, bp,  sizeof(argp->lsn_prev));
924 	bp += sizeof(argp->lsn_prev);
925 	memcpy(&argp->next, bp, sizeof(argp->next));
926 	bp += sizeof(argp->next);
927 	memcpy(&argp->lsn_next, bp,  sizeof(argp->lsn_next));
928 	bp += sizeof(argp->lsn_next);
929 	*argpp = argp;
930 	return (0);
931 }
932 
933 /*
934  * PUBLIC: int __db_addpage_log
935  * PUBLIC:     __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t,
936  * PUBLIC:     u_int32_t, db_pgno_t, DB_LSN *, db_pgno_t,
937  * PUBLIC:     DB_LSN *));
938  */
939 int __db_addpage_log(logp, txnid, ret_lsnp, flags,
940 	fileid, pgno, lsn, nextpgno, nextlsn)
941 	DB_LOG *logp;
942 	DB_TXN *txnid;
943 	DB_LSN *ret_lsnp;
944 	u_int32_t flags;
945 	u_int32_t fileid;
946 	db_pgno_t pgno;
947 	DB_LSN * lsn;
948 	db_pgno_t nextpgno;
949 	DB_LSN * nextlsn;
950 {
951 	DBT logrec;
952 	DB_LSN *lsnp, null_lsn;
953 	u_int32_t rectype, txn_num;
954 	int ret;
955 	u_int8_t *bp;
956 
957 	rectype = DB_db_addpage;
958 	txn_num = txnid == NULL ? 0 : txnid->txnid;
959 	if (txnid == NULL) {
960 		ZERO_LSN(null_lsn);
961 		lsnp = &null_lsn;
962 	} else
963 		lsnp = &txnid->last_lsn;
964 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
965 	    + sizeof(fileid)
966 	    + sizeof(pgno)
967 	    + sizeof(*lsn)
968 	    + sizeof(nextpgno)
969 	    + sizeof(*nextlsn);
970 	if ((ret = __os_malloc(logrec.size, NULL, &logrec.data)) != 0)
971 		return (ret);
972 
973 	bp = logrec.data;
974 	memcpy(bp, &rectype, sizeof(rectype));
975 	bp += sizeof(rectype);
976 	memcpy(bp, &txn_num, sizeof(txn_num));
977 	bp += sizeof(txn_num);
978 	memcpy(bp, lsnp, sizeof(DB_LSN));
979 	bp += sizeof(DB_LSN);
980 	memcpy(bp, &fileid, sizeof(fileid));
981 	bp += sizeof(fileid);
982 	memcpy(bp, &pgno, sizeof(pgno));
983 	bp += sizeof(pgno);
984 	if (lsn != NULL)
985 		memcpy(bp, lsn, sizeof(*lsn));
986 	else
987 		memset(bp, 0, sizeof(*lsn));
988 	bp += sizeof(*lsn);
989 	memcpy(bp, &nextpgno, sizeof(nextpgno));
990 	bp += sizeof(nextpgno);
991 	if (nextlsn != NULL)
992 		memcpy(bp, nextlsn, sizeof(*nextlsn));
993 	else
994 		memset(bp, 0, sizeof(*nextlsn));
995 	bp += sizeof(*nextlsn);
996 #ifdef DIAGNOSTIC
997 	if ((u_int32_t)(bp - (u_int8_t *)logrec.data) != logrec.size)
998 		fprintf(stderr, "Error in log record length");
999 #endif
1000 	ret = log_put(logp, ret_lsnp, (DBT *)&logrec, flags);
1001 	if (txnid != NULL)
1002 		txnid->last_lsn = *ret_lsnp;
1003 	__os_free(logrec.data, 0);
1004 	return (ret);
1005 }
1006 
1007 /*
1008  * PUBLIC: int __db_addpage_print
1009  * PUBLIC:    __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
1010  */
1011 int
1012 __db_addpage_print(notused1, dbtp, lsnp, notused2, notused3)
1013 	DB_LOG *notused1;
1014 	DBT *dbtp;
1015 	DB_LSN *lsnp;
1016 	int notused2;
1017 	void *notused3;
1018 {
1019 	__db_addpage_args *argp;
1020 	u_int32_t i;
1021 	u_int ch;
1022 	int ret;
1023 
1024 	i = 0;
1025 	ch = 0;
1026 	notused1 = NULL;
1027 	notused2 = 0;
1028 	notused3 = NULL;
1029 
1030 	if ((ret = __db_addpage_read(dbtp->data, &argp)) != 0)
1031 		return (ret);
1032 	printf("[%lu][%lu]db_addpage: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
1033 	    (u_long)lsnp->file,
1034 	    (u_long)lsnp->offset,
1035 	    (u_long)argp->type,
1036 	    (u_long)argp->txnid->txnid,
1037 	    (u_long)argp->prev_lsn.file,
1038 	    (u_long)argp->prev_lsn.offset);
1039 	printf("\tfileid: %lu\n", (u_long)argp->fileid);
1040 	printf("\tpgno: %lu\n", (u_long)argp->pgno);
1041 	printf("\tlsn: [%lu][%lu]\n",
1042 	    (u_long)argp->lsn.file, (u_long)argp->lsn.offset);
1043 	printf("\tnextpgno: %lu\n", (u_long)argp->nextpgno);
1044 	printf("\tnextlsn: [%lu][%lu]\n",
1045 	    (u_long)argp->nextlsn.file, (u_long)argp->nextlsn.offset);
1046 	printf("\n");
1047 	__os_free(argp, 0);
1048 	return (0);
1049 }
1050 
1051 /*
1052  * PUBLIC: int __db_addpage_read __P((void *, __db_addpage_args **));
1053  */
1054 int
1055 __db_addpage_read(recbuf, argpp)
1056 	void *recbuf;
1057 	__db_addpage_args **argpp;
1058 {
1059 	__db_addpage_args *argp;
1060 	u_int8_t *bp;
1061 	int ret;
1062 
1063 	ret = __os_malloc(sizeof(__db_addpage_args) +
1064 	    sizeof(DB_TXN), NULL, &argp);
1065 	if (ret != 0)
1066 		return (ret);
1067 	argp->txnid = (DB_TXN *)&argp[1];
1068 	bp = recbuf;
1069 	memcpy(&argp->type, bp, sizeof(argp->type));
1070 	bp += sizeof(argp->type);
1071 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
1072 	bp += sizeof(argp->txnid->txnid);
1073 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
1074 	bp += sizeof(DB_LSN);
1075 	memcpy(&argp->fileid, bp, sizeof(argp->fileid));
1076 	bp += sizeof(argp->fileid);
1077 	memcpy(&argp->pgno, bp, sizeof(argp->pgno));
1078 	bp += sizeof(argp->pgno);
1079 	memcpy(&argp->lsn, bp,  sizeof(argp->lsn));
1080 	bp += sizeof(argp->lsn);
1081 	memcpy(&argp->nextpgno, bp, sizeof(argp->nextpgno));
1082 	bp += sizeof(argp->nextpgno);
1083 	memcpy(&argp->nextlsn, bp,  sizeof(argp->nextlsn));
1084 	bp += sizeof(argp->nextlsn);
1085 	*argpp = argp;
1086 	return (0);
1087 }
1088 
1089 /*
1090  * PUBLIC: int __db_debug_log
1091  * PUBLIC:     __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t,
1092  * PUBLIC:     const DBT *, u_int32_t, const DBT *, const DBT *,
1093  * PUBLIC:     u_int32_t));
1094  */
1095 int __db_debug_log(logp, txnid, ret_lsnp, flags,
1096 	op, fileid, key, data, arg_flags)
1097 	DB_LOG *logp;
1098 	DB_TXN *txnid;
1099 	DB_LSN *ret_lsnp;
1100 	u_int32_t flags;
1101 	const DBT *op;
1102 	u_int32_t fileid;
1103 	const DBT *key;
1104 	const DBT *data;
1105 	u_int32_t arg_flags;
1106 {
1107 	DBT logrec;
1108 	DB_LSN *lsnp, null_lsn;
1109 	u_int32_t zero;
1110 	u_int32_t rectype, txn_num;
1111 	int ret;
1112 	u_int8_t *bp;
1113 
1114 	rectype = DB_db_debug;
1115 	txn_num = txnid == NULL ? 0 : txnid->txnid;
1116 	if (txnid == NULL) {
1117 		ZERO_LSN(null_lsn);
1118 		lsnp = &null_lsn;
1119 	} else
1120 		lsnp = &txnid->last_lsn;
1121 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
1122 	    + sizeof(u_int32_t) + (op == NULL ? 0 : op->size)
1123 	    + sizeof(fileid)
1124 	    + sizeof(u_int32_t) + (key == NULL ? 0 : key->size)
1125 	    + sizeof(u_int32_t) + (data == NULL ? 0 : data->size)
1126 	    + sizeof(arg_flags);
1127 	if ((ret = __os_malloc(logrec.size, NULL, &logrec.data)) != 0)
1128 		return (ret);
1129 
1130 	bp = logrec.data;
1131 	memcpy(bp, &rectype, sizeof(rectype));
1132 	bp += sizeof(rectype);
1133 	memcpy(bp, &txn_num, sizeof(txn_num));
1134 	bp += sizeof(txn_num);
1135 	memcpy(bp, lsnp, sizeof(DB_LSN));
1136 	bp += sizeof(DB_LSN);
1137 	if (op == NULL) {
1138 		zero = 0;
1139 		memcpy(bp, &zero, sizeof(u_int32_t));
1140 		bp += sizeof(u_int32_t);
1141 	} else {
1142 		memcpy(bp, &op->size, sizeof(op->size));
1143 		bp += sizeof(op->size);
1144 		memcpy(bp, op->data, op->size);
1145 		bp += op->size;
1146 	}
1147 	memcpy(bp, &fileid, sizeof(fileid));
1148 	bp += sizeof(fileid);
1149 	if (key == NULL) {
1150 		zero = 0;
1151 		memcpy(bp, &zero, sizeof(u_int32_t));
1152 		bp += sizeof(u_int32_t);
1153 	} else {
1154 		memcpy(bp, &key->size, sizeof(key->size));
1155 		bp += sizeof(key->size);
1156 		memcpy(bp, key->data, key->size);
1157 		bp += key->size;
1158 	}
1159 	if (data == NULL) {
1160 		zero = 0;
1161 		memcpy(bp, &zero, sizeof(u_int32_t));
1162 		bp += sizeof(u_int32_t);
1163 	} else {
1164 		memcpy(bp, &data->size, sizeof(data->size));
1165 		bp += sizeof(data->size);
1166 		memcpy(bp, data->data, data->size);
1167 		bp += data->size;
1168 	}
1169 	memcpy(bp, &arg_flags, sizeof(arg_flags));
1170 	bp += sizeof(arg_flags);
1171 #ifdef DIAGNOSTIC
1172 	if ((u_int32_t)(bp - (u_int8_t *)logrec.data) != logrec.size)
1173 		fprintf(stderr, "Error in log record length");
1174 #endif
1175 	ret = log_put(logp, ret_lsnp, (DBT *)&logrec, flags);
1176 	if (txnid != NULL)
1177 		txnid->last_lsn = *ret_lsnp;
1178 	__os_free(logrec.data, 0);
1179 	return (ret);
1180 }
1181 
1182 /*
1183  * PUBLIC: int __db_debug_print
1184  * PUBLIC:    __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
1185  */
1186 int
1187 __db_debug_print(notused1, dbtp, lsnp, notused2, notused3)
1188 	DB_LOG *notused1;
1189 	DBT *dbtp;
1190 	DB_LSN *lsnp;
1191 	int notused2;
1192 	void *notused3;
1193 {
1194 	__db_debug_args *argp;
1195 	u_int32_t i;
1196 	u_int ch;
1197 	int ret;
1198 
1199 	i = 0;
1200 	ch = 0;
1201 	notused1 = NULL;
1202 	notused2 = 0;
1203 	notused3 = NULL;
1204 
1205 	if ((ret = __db_debug_read(dbtp->data, &argp)) != 0)
1206 		return (ret);
1207 	printf("[%lu][%lu]db_debug: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
1208 	    (u_long)lsnp->file,
1209 	    (u_long)lsnp->offset,
1210 	    (u_long)argp->type,
1211 	    (u_long)argp->txnid->txnid,
1212 	    (u_long)argp->prev_lsn.file,
1213 	    (u_long)argp->prev_lsn.offset);
1214 	printf("\top: ");
1215 	for (i = 0; i < argp->op.size; i++) {
1216 		ch = ((u_int8_t *)argp->op.data)[i];
1217 		if (isprint(ch) || ch == 0xa)
1218 			putchar(ch);
1219 		else
1220 			printf("%#x ", ch);
1221 	}
1222 	printf("\n");
1223 	printf("\tfileid: %lu\n", (u_long)argp->fileid);
1224 	printf("\tkey: ");
1225 	for (i = 0; i < argp->key.size; i++) {
1226 		ch = ((u_int8_t *)argp->key.data)[i];
1227 		if (isprint(ch) || ch == 0xa)
1228 			putchar(ch);
1229 		else
1230 			printf("%#x ", ch);
1231 	}
1232 	printf("\n");
1233 	printf("\tdata: ");
1234 	for (i = 0; i < argp->data.size; i++) {
1235 		ch = ((u_int8_t *)argp->data.data)[i];
1236 		if (isprint(ch) || ch == 0xa)
1237 			putchar(ch);
1238 		else
1239 			printf("%#x ", ch);
1240 	}
1241 	printf("\n");
1242 	printf("\targ_flags: %lu\n", (u_long)argp->arg_flags);
1243 	printf("\n");
1244 	__os_free(argp, 0);
1245 	return (0);
1246 }
1247 
1248 /*
1249  * PUBLIC: int __db_debug_read __P((void *, __db_debug_args **));
1250  */
1251 int
1252 __db_debug_read(recbuf, argpp)
1253 	void *recbuf;
1254 	__db_debug_args **argpp;
1255 {
1256 	__db_debug_args *argp;
1257 	u_int8_t *bp;
1258 	int ret;
1259 
1260 	ret = __os_malloc(sizeof(__db_debug_args) +
1261 	    sizeof(DB_TXN), NULL, &argp);
1262 	if (ret != 0)
1263 		return (ret);
1264 	argp->txnid = (DB_TXN *)&argp[1];
1265 	bp = recbuf;
1266 	memcpy(&argp->type, bp, sizeof(argp->type));
1267 	bp += sizeof(argp->type);
1268 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
1269 	bp += sizeof(argp->txnid->txnid);
1270 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
1271 	bp += sizeof(DB_LSN);
1272 	memcpy(&argp->op.size, bp, sizeof(u_int32_t));
1273 	bp += sizeof(u_int32_t);
1274 	argp->op.data = bp;
1275 	bp += argp->op.size;
1276 	memcpy(&argp->fileid, bp, sizeof(argp->fileid));
1277 	bp += sizeof(argp->fileid);
1278 	memcpy(&argp->key.size, bp, sizeof(u_int32_t));
1279 	bp += sizeof(u_int32_t);
1280 	argp->key.data = bp;
1281 	bp += argp->key.size;
1282 	memcpy(&argp->data.size, bp, sizeof(u_int32_t));
1283 	bp += sizeof(u_int32_t);
1284 	argp->data.data = bp;
1285 	bp += argp->data.size;
1286 	memcpy(&argp->arg_flags, bp, sizeof(argp->arg_flags));
1287 	bp += sizeof(argp->arg_flags);
1288 	*argpp = argp;
1289 	return (0);
1290 }
1291 
1292 /*
1293  * PUBLIC: int __db_init_print __P((DB_ENV *));
1294  */
1295 int
1296 __db_init_print(dbenv)
1297 	DB_ENV *dbenv;
1298 {
1299 	int ret;
1300 
1301 	if ((ret = __db_add_recovery(dbenv,
1302 	    __db_addrem_print, DB_db_addrem)) != 0)
1303 		return (ret);
1304 	if ((ret = __db_add_recovery(dbenv,
1305 	    __db_split_print, DB_db_split)) != 0)
1306 		return (ret);
1307 	if ((ret = __db_add_recovery(dbenv,
1308 	    __db_big_print, DB_db_big)) != 0)
1309 		return (ret);
1310 	if ((ret = __db_add_recovery(dbenv,
1311 	    __db_ovref_print, DB_db_ovref)) != 0)
1312 		return (ret);
1313 	if ((ret = __db_add_recovery(dbenv,
1314 	    __db_relink_print, DB_db_relink)) != 0)
1315 		return (ret);
1316 	if ((ret = __db_add_recovery(dbenv,
1317 	    __db_addpage_print, DB_db_addpage)) != 0)
1318 		return (ret);
1319 	if ((ret = __db_add_recovery(dbenv,
1320 	    __db_debug_print, DB_db_debug)) != 0)
1321 		return (ret);
1322 	return (0);
1323 }
1324 
1325 /*
1326  * PUBLIC: int __db_init_recover __P((DB_ENV *));
1327  */
1328 int
1329 __db_init_recover(dbenv)
1330 	DB_ENV *dbenv;
1331 {
1332 	int ret;
1333 
1334 	if ((ret = __db_add_recovery(dbenv,
1335 	    __db_addrem_recover, DB_db_addrem)) != 0)
1336 		return (ret);
1337 	if ((ret = __db_add_recovery(dbenv,
1338 	    __db_split_recover, DB_db_split)) != 0)
1339 		return (ret);
1340 	if ((ret = __db_add_recovery(dbenv,
1341 	    __db_big_recover, DB_db_big)) != 0)
1342 		return (ret);
1343 	if ((ret = __db_add_recovery(dbenv,
1344 	    __db_ovref_recover, DB_db_ovref)) != 0)
1345 		return (ret);
1346 	if ((ret = __db_add_recovery(dbenv,
1347 	    __db_relink_recover, DB_db_relink)) != 0)
1348 		return (ret);
1349 	if ((ret = __db_add_recovery(dbenv,
1350 	    __db_addpage_recover, DB_db_addpage)) != 0)
1351 		return (ret);
1352 	if ((ret = __db_add_recovery(dbenv,
1353 	    __db_debug_recover, DB_db_debug)) != 0)
1354 		return (ret);
1355 	return (0);
1356 }
1357 
1358