summaryrefslogtreecommitdiff
path: root/ltp_framework/include/write_log.h
blob: 84d6313bfe54e26908ec5cbe284b22b217063f62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/*
 * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it would be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * Further, this software is distributed without any warranty that it is
 * free of the rightful claim of any third person regarding infringement
 * or the like.  Any license provided herein, whether implied or
 * otherwise, applies only to this software file.  Patent licenses, if
 * any, provided herein do not apply to combinations of this program with
 * other software, or any other product whatsoever.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write the Free Software Foundation, Inc., 59
 * Temple Place - Suite 330, Boston MA 02111-1307, USA.
 *
 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
 * Mountain View, CA  94043, or:
 *
 * http://www.sgi.com
 *
 * For further information regarding this notice, see:
 *
 * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
 */
#ifndef _WRITE_LOG_H_
#define _WRITE_LOG_H_

/*
 * Constants defining the max size of various wlog_rec fields.  ANY SIZE
 * CHANGES HERE MUST BE REFLECTED IN THE WLOG_REC_DISK STRUCTURE DEFINED
 * BELOW.
 */

#define WLOG_MAX_PATH		128
#define WLOG_MAX_PATTERN	64
#define WLOG_MAX_HOST           8
#define WLOG_REC_MAX_SIZE	(sizeof(struct wlog_rec)+WLOG_MAX_PATH+WLOG_MAX_PATTERN+WLOG_MAX_HOST+2)

/*
 * User view of a write log record.  Note that this is not necessiliary
 * how the data is formatted on disk (signifigant compression occurrs), so
 * don't expect to od the write log file and see things formatted this way.
 */

struct wlog_rec {
    int	    w_pid;	    /* pid doing the write  	    */
    int	    w_offset;       /* file offset  	    	    */
    int	    w_nbytes;	    /* # bytes written	    	    */
    int	    w_oflags;       /* low-order open() flags	    */
    int	    w_done;	    /* 1 if io confirmed done	    */
    int	    w_async;	    /* 1 if async write	(writea)    */

    char    w_host[WLOG_MAX_HOST+1];		/* host doing write -	*/
						/* null terminated */
    int	    w_hostlen;				/* host name length	*/
    char    w_path[WLOG_MAX_PATH+1];		/* file written to -	*/
						/* null terminated */
    int	    w_pathlen;				/* file name length	*/
    char    w_pattern[WLOG_MAX_PATTERN+1];	/* pattern written -	*/
						/* null terminated */
    int	    w_patternlen;			/* pattern length	*/
};

#ifndef uint
#define uint	unsigned int
#endif

/*
 * On-disk structure of a wlog_rec.  Actually, the record consists of
 * 3 parts:  [wlog_rec_disk structure][variable length data][length]
 * where length is a 2 byte field containing the total record length
 * (including the 2 bytes).  It is used for scanning the logfile in reverse
 * order.
 *
 * The variable length data includes the path, host, and pattern (in that
 * order).  The lengths of these pieces of data are held in the
 * wlog_rec_disk structure.  Thus, the actual on-disk record looks like
 * this (top is lower byte offset):
 *
 *		struct wlog_rec_disk
 *		path    (w_pathlen bytes - not null terminated)
 *		host    (w_hostlen bytes - not null terminated)
 *		pattern (w_patternlen bytes - not null terminated)
 *		2-byte record length
 *
 * Another way of looking at it is:
 *
 * <struct wlog_rec_disk><path (wpathlen bytes)>-->
 * --><host (w_hostlen bytes)><pattern (w_patternlen bytes)><length (2 bytes)>
 *
 * The maximum length of this record is defined by the WLOG_REC_MAX_SIZE
 * record.  Note that the 2-byte record length forces this to be
 * <= 64k bytes.
 *
 * Note that there is lots of bit-masking done here.  The w_pathlen,
 * w_hostlen, and w_patternlen fields MUST have enough bits to hold
 * WLOG_MAX_PATH, WLOG_MAX_HOST, and WLOG_MAX_PATTERN bytes respectivly.
 */

struct wlog_rec_disk {
#ifdef CRAY
    uint    w_offset    : 44;	    /* file offset  	    	    */
    uint    w_extra0    : 20;       /* EXTRA BITS IN WORD 0         */
#else
    /* NB: sgi is pissy about fields > 32 bit, even cc -mips3 */
    uint    w_offset    : 32;	    /* file offset  	    	    */
    uint    w_extra0    : 32;       /* EXTRA BITS IN WORD 0         */
#endif

    uint    w_nbytes    : 32;	    /* # bytes written	    	    */
    uint    w_oflags	: 32;	    /* low-order open() flags	    */

    uint    w_pid       : 17;	    /* pid doing the write  	    */
    uint    w_pathlen	:  7;	    /* length of file path  	    */
    uint    w_patternlen:  6;	    /* length of pattern            */
    uint    w_hostlen   :  4;       /* length of host               */
    uint    w_done      :  1;	    /* 1 if io confirmed done	    */
    uint    w_async     :  1;	    /* 1 if async write	(writea)    */
    uint    w_extra2 	: 28;	    /* EXTRA BITS IN WORD 2 	    */
};

/*
 * write log file datatype.  wlog_open() initializes this structure
 * which is then passed around to the various wlog_xxx routines.
 */

struct wlog_file {
    int		w_afd;			/* append fd			*/
    int		w_rfd;			/* random-access fd		*/
    char	w_file[1024];		/* name of the write_log	*/
};

/*
 * return value defines for the user-supplied function to
 * wlog_scan_backward().
 */

#define WLOG_STOP_SCAN		0
#define WLOG_CONTINUE_SCAN	1

/*
 * wlog prototypes
 */

#if __STDC__
extern int	wlog_open(struct wlog_file *wfile, int trunc, int mode);
extern int	wlog_close(struct wlog_file *wfile);
extern int	wlog_record_write(struct wlog_file *wfile,
				  struct wlog_rec *wrec, long offset);
extern int	wlog_scan_backward(struct wlog_file *wfile, int nrecs,
				   int (*func)(struct wlog_rec *rec),
				   long data);
#else
int	wlog_open();
int	wlog_close();
int	wlog_record_write();
int	wlog_scan_backward();
#endif

extern char	Wlog_Error_String[];

#endif /* _WRITE_LOG_H_ */