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