1 /* 2 * Copyright (c) 2004,2005 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Matthew Dillon <dillon@backplane.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 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 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 3. Neither the name of The DragonFly Project nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific, prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * $DragonFly: src/sbin/jscan/jscan.h,v 1.5 2005/07/06 06:06:44 dillon Exp $ 35 */ 36 37 #include <sys/types.h> 38 #include <sys/time.h> 39 #include <sys/journal.h> 40 #include <sys/stat.h> 41 #include <stdio.h> 42 #include <stdarg.h> 43 #include <stdlib.h> 44 #include <stddef.h> 45 #include <unistd.h> 46 #include <string.h> 47 #include <time.h> 48 #include <fcntl.h> 49 #include <errno.h> 50 #include <ctype.h> 51 #include <assert.h> 52 #include "jattr.h" 53 54 enum jdirection { JF_FORWARDS, JF_BACKWARDS}; 55 56 struct jfile { 57 off_t jf_pos; /* current seek position */ 58 off_t jf_setpt; /* saved seek position */ 59 struct jdata *jf_saved; /* saved data */ 60 FILE *jf_fp; 61 enum jdirection jf_direction; 62 int jf_error; 63 int jf_flags; 64 }; 65 66 #define JF_FULL_DUPLEX 0x0001 67 68 struct jdata { 69 struct jdata *jd_next; 70 int jd_size; 71 off_t jd_pos; 72 char jd_data[4]; /* must be last field */ 73 }; 74 75 struct jstream { 76 struct jstream *js_next; /* linked list / same transaction */ 77 int js_size; /* amount of data, in bytes */ 78 char *js_alloc_buf; 79 int js_alloc_size; 80 81 /* 82 * Normalized fields strip all rawrecbeg, rawrecend, and deadspace except 83 * for the initial rawrecbeg header. 84 */ 85 char *js_normalized_base; 86 int js_normalized_size; 87 off_t js_normalized_off; 88 off_t js_normalized_total; 89 90 /* 91 * This is used by the first js record only to cache other records in the 92 * chain. 93 */ 94 struct jstream *js_cache; 95 96 char js_data[4]; /* variable length (original data) */ 97 }; 98 99 struct jhash { 100 struct jhash *jh_hash; 101 struct jstream *jh_first; 102 struct jstream *jh_last; 103 int16_t jh_transid; 104 }; 105 106 #define JHASH_SIZE 1024 107 #define JHASH_MASK (JHASH_SIZE - 1) 108 109 extern int debug_opt; 110 111 const char *type_to_name(int16_t rectype); 112 void stringout(FILE *fp, char c, int exact); 113 void jattr_reset(struct jattr *jattr); 114 int64_t buf_to_int64(const void *buf, int bytes); 115 void *dupdata(const void *buf, int bytes); 116 char *dupdatastr(const void *buf, int bytes); 117 char *dupdatapath(const void *buf, int bytes); 118 119 120 struct jstream *jscan_stream(struct jfile *jf); 121 void jscan_dispose(struct jstream *js); 122 struct jfile *jopen_stream(const char *path, enum jdirection jdir, int flags); 123 struct jfile *jopen_fp(FILE *fp, enum jdirection jdir, int flags); 124 void jclose_stream(struct jfile *jf); 125 void jalign(struct jfile *jf); 126 int jread(struct jfile *jf, void *buf, int bytes); 127 int jwrite(struct jfile *jf, void *buf, int bytes); 128 void jset(struct jfile *jf); 129 void jreturn(struct jfile *jf); 130 void jflush(struct jfile *jf); 131 void jf_warn(struct jfile *jf, const char *ctl, ...); 132 133 void dump_debug(struct jfile *jf); 134 void dump_mirror(struct jfile *jf); 135 int dump_debug_payload(int16_t rectype, struct jstream *js, off_t off, 136 int recsize, int level); 137 138 int jsreadany(struct jstream *js, off_t off, const void **bufp); 139 int jsreadp(struct jstream *js, off_t off, const void **bufp, int bytes); 140 int jsread(struct jstream *js, off_t off, void *buf, int bytes); 141 int jsreadcallback(struct jstream *js, ssize_t (*func)(int, const void *, size_t), int fd, off_t off, int bytes); 142 143 144