1 /* 2 * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of version 2 of the GNU General Public License as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it would be useful, but 9 * WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11 * 12 * Further, this software is distributed without any warranty that it is 13 * free of the rightful claim of any third person regarding infringement 14 * or the like. Any license provided herein, whether implied or 15 * otherwise, applies only to this software file. Patent licenses, if 16 * any, provided herein do not apply to combinations of this program with 17 * other software, or any other product whatsoever. 18 * 19 * You should have received a copy of the GNU General Public License along 20 * with this program; if not, write the Free Software Foundation, Inc., 21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 22 * 23 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, 24 * Mountain View, CA 94043, or: 25 * 26 * http://www.sgi.com 27 * 28 * For further information regarding this notice, see: 29 * 30 * http://oss.sgi.com/projects/GenInfo/NoticeExplan/ 31 */ 32 #ifndef _WRITE_LOG_H_ 33 #define _WRITE_LOG_H_ 34 35 /* 36 * Constants defining the max size of various wlog_rec fields. ANY SIZE 37 * CHANGES HERE MUST BE REFLECTED IN THE WLOG_REC_DISK STRUCTURE DEFINED 38 * BELOW. 39 */ 40 41 #define WLOG_MAX_PATH 128 42 #define WLOG_MAX_PATTERN 64 43 #define WLOG_MAX_HOST 8 44 #define WLOG_REC_MAX_SIZE (sizeof(struct wlog_rec)+WLOG_MAX_PATH+WLOG_MAX_PATTERN+WLOG_MAX_HOST+2) 45 46 /* 47 * User view of a write log record. Note that this is not necessiliary 48 * how the data is formatted on disk (signifigant compression occurrs), so 49 * don't expect to od the write log file and see things formatted this way. 50 */ 51 52 struct wlog_rec { 53 int w_pid; /* pid doing the write */ 54 int w_offset; /* file offset */ 55 int w_nbytes; /* # bytes written */ 56 int w_oflags; /* low-order open() flags */ 57 int w_done; /* 1 if io confirmed done */ 58 int w_async; /* 1 if async write (writea) */ 59 60 char w_host[WLOG_MAX_HOST+1]; /* host doing write - */ 61 /* null terminated */ 62 int w_hostlen; /* host name length */ 63 char w_path[WLOG_MAX_PATH+1]; /* file written to - */ 64 /* null terminated */ 65 int w_pathlen; /* file name length */ 66 char w_pattern[WLOG_MAX_PATTERN+1]; /* pattern written - */ 67 /* null terminated */ 68 int w_patternlen; /* pattern length */ 69 }; 70 71 #ifndef uint 72 #define uint unsigned int 73 #endif 74 75 /* 76 * On-disk structure of a wlog_rec. Actually, the record consists of 77 * 3 parts: [wlog_rec_disk structure][variable length data][length] 78 * where length is a 2 byte field containing the total record length 79 * (including the 2 bytes). It is used for scanning the logfile in reverse 80 * order. 81 * 82 * The variable length data includes the path, host, and pattern (in that 83 * order). The lengths of these pieces of data are held in the 84 * wlog_rec_disk structure. Thus, the actual on-disk record looks like 85 * this (top is lower byte offset): 86 * 87 * struct wlog_rec_disk 88 * path (w_pathlen bytes - not null terminated) 89 * host (w_hostlen bytes - not null terminated) 90 * pattern (w_patternlen bytes - not null terminated) 91 * 2-byte record length 92 * 93 * Another way of looking at it is: 94 * 95 * <struct wlog_rec_disk><path (wpathlen bytes)>--> 96 * --><host (w_hostlen bytes)><pattern (w_patternlen bytes)><length (2 bytes)> 97 * 98 * The maximum length of this record is defined by the WLOG_REC_MAX_SIZE 99 * record. Note that the 2-byte record length forces this to be 100 * <= 64k bytes. 101 * 102 * Note that there is lots of bit-masking done here. The w_pathlen, 103 * w_hostlen, and w_patternlen fields MUST have enough bits to hold 104 * WLOG_MAX_PATH, WLOG_MAX_HOST, and WLOG_MAX_PATTERN bytes respectivly. 105 */ 106 107 struct wlog_rec_disk { 108 #ifdef CRAY 109 uint w_offset : 44; /* file offset */ 110 uint w_extra0 : 20; /* EXTRA BITS IN WORD 0 */ 111 #else 112 /* NB: sgi is pissy about fields > 32 bit, even cc -mips3 */ 113 uint w_offset : 32; /* file offset */ 114 uint w_extra0 : 32; /* EXTRA BITS IN WORD 0 */ 115 #endif 116 117 uint w_nbytes : 32; /* # bytes written */ 118 uint w_oflags : 32; /* low-order open() flags */ 119 120 uint w_pid : 17; /* pid doing the write */ 121 uint w_pathlen : 7; /* length of file path */ 122 uint w_patternlen: 6; /* length of pattern */ 123 uint w_hostlen : 4; /* length of host */ 124 uint w_done : 1; /* 1 if io confirmed done */ 125 uint w_async : 1; /* 1 if async write (writea) */ 126 uint w_extra2 : 28; /* EXTRA BITS IN WORD 2 */ 127 }; 128 129 /* 130 * write log file datatype. wlog_open() initializes this structure 131 * which is then passed around to the various wlog_xxx routines. 132 */ 133 134 struct wlog_file { 135 int w_afd; /* append fd */ 136 int w_rfd; /* random-access fd */ 137 char w_file[1024]; /* name of the write_log */ 138 }; 139 140 /* 141 * return value defines for the user-supplied function to 142 * wlog_scan_backward(). 143 */ 144 145 #define WLOG_STOP_SCAN 0 146 #define WLOG_CONTINUE_SCAN 1 147 148 /* 149 * wlog prototypes 150 */ 151 152 #if __STDC__ 153 extern int wlog_open(struct wlog_file *wfile, int trunc, int mode); 154 extern int wlog_close(struct wlog_file *wfile); 155 extern int wlog_record_write(struct wlog_file *wfile, 156 struct wlog_rec *wrec, long offset); 157 extern int wlog_scan_backward(struct wlog_file *wfile, int nrecs, 158 int (*func)(struct wlog_rec *rec), 159 long data); 160 #else 161 int wlog_open(); 162 int wlog_close(); 163 int wlog_record_write(); 164 int wlog_scan_backward(); 165 #endif 166 167 extern char Wlog_Error_String[]; 168 169 #endif /* _WRITE_LOG_H_ */ 170 171