-
Notifications
You must be signed in to change notification settings - Fork 71
/
Copy pathhetlib.h
199 lines (178 loc) · 8.81 KB
/
hetlib.h
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/* HETLIB.C (c) Copyright Leland Lucius, 2000-2012 */
/* Header for the Hercules Emulated Tape library */
/* */
/* Released under "The Q Public License Version 1" */
/* (http://www.hercules-390.org/herclic.html) as modifications to */
/* Hercules. */
#if !defined( _HETLIB_H_ )
#define _HETLIB_H_
/*
|| ----------------------------------------------------------------------------
||
|| HETLIB.H (c) Copyright Leland Lucius, 2000-2009
|| Released under terms of the Q Public License.
||
|| Header for the Hercules Emulated Tape library.
||
|| ----------------------------------------------------------------------------
*/
#ifndef _HETLIB_C_
#ifndef _HTAPE_DLL_
#define HET_DLL_IMPORT DLL_IMPORT
#else /* _HUTIL_DLL_ */
#define HET_DLL_IMPORT extern
#endif /* _HUTIL_DLL_ */
#else
#define HET_DLL_IMPORT DLL_EXPORT
#endif
#if !defined( TRUE )
#define TRUE (1L)
#endif
#if !defined( FALSE )
#define FALSE (0L)
#endif
/*
|| Chunk header for an HET. Physically compatable with AWSTAPE format.
*/
typedef struct _hethdr
{
uint8_t clen[ 2 ]; /* Length of current block */
uint8_t plen[ 2 ]; /* Length of previous block */
uint8_t flags1; /* Flags byte 1 */
uint8_t flags2; /* Flags byte 2 */
} HETHDR;
/*
|| Macros for accessing current and previous sizes - accept ptr to HETHDR
*/
#define HETHDR_CLEN( h ) ( ( (h)->chdr.clen[ 1 ] << 8 ) + (h)->chdr.clen[ 0 ] )
#define HETHDR_PLEN( h ) ( ( (h)->chdr.plen[ 1 ] << 8 ) + (h)->chdr.plen[ 0 ] )
/*
|| Definitions for HETHDR flags byte 1 (compression incompatable with AWSTAPE)
*/
#define HETHDR_FLAGS1_BOR 0x80 /* Start of new record */
#define HETHDR_FLAGS1_TAPEMARK 0x40 /* Tape mark */
#define HETHDR_FLAGS1_EOR 0x20 /* End of record */
#define HETHDR_FLAGS1_COMPRESS 0x03 /* Compression method mask */
#define HETHDR_FLAGS1_BZLIB 0x02 /* BZLIB compression */
#define HETHDR_FLAGS1_ZLIB 0x01 /* ZLIB compression */
/*
|| Definitions for HETHDR flags byte 2 (incompatable with AWSTAPE and HET)
*/
#define HETHDR_FLAGS2_COMPRESS 0x80 /* Compression method mask */
#define HETHDR_FLAGS2_ZLIB_BUSTECH 0x80 /* Bus-Tech ZLIB compression */
/*
|| Control block for Hercules Emulated Tape files
*/
typedef struct _hetb
{
FILE *fh; /* Tape file handle */
int fd; /* Tape file descriptor */
uint32_t chksize; /* Size of output chunks */
uint32_t ublksize; /* Current block compressed size */
uint32_t cblksize; /* Current block uncompressed size */
uint32_t cblk; /* Current block number */
HETHDR chdr; /* Current block header */
u_int writeprotect:1; /* TRUE=write protected */
u_int readlast:1; /* TRUE=last i/o was read */
u_int truncated:1; /* TRUE=file truncated */
u_int compress:1; /* TRUE=compress written data */
u_int decompress:1; /* TRUE=decompress read data */
u_int method:2; /* 1=ZLIB, 2=BZLIB compresion */
u_int level:4; /* 1=<n<=9 compression level */
u_int created:1; /* TRUE = CREATED */
} HETB;
/*
|| Compression methods
*/
#define HETMETH_ZLIB 1 /* ZLIB compression */
#define HETMETH_BZLIB 2 /* BZLIB compression */
/*
|| Limits
*/
#define HETMIN_METHOD 1 /* Minimum compression method */
#if defined( HET_BZIP2 )
#define HETMAX_METHOD 2 /* Maximum compression method */
#else
#define HETMAX_METHOD 1 /* Maximum compression method */
#endif /* defined( HET_BZIP2 ) */
#define HETMIN_LEVEL 1 /* Minimum compression level */
#define HETMAX_LEVEL 9 /* Maximum compression level */
#define HETMIN_CHUNKSIZE 4096 /* Minimum chunksize */
#define HETMAX_CHUNKSIZE 65535 /* Maximum chunksize */
#define HETMIN_BLOCKSIZE 1 /* Minimum blocksize */
#define HETMAX_BLOCKSIZE 2097152 /* Maximum blocksize = 2MB */
/*
|| Default settings
*/
#define HETDFLT_COMPRESS TRUE /* Compress written data */
#define HETDFLT_DECOMPRESS TRUE /* Decompress read data */
#define HETDFLT_METHOD HETMETH_ZLIB /* Use ZLIB compression */
#define HETDFLT_LEVEL 4 /* Middle of the road */
#define HETDFLT_CHKSIZE HETMAX_CHUNKSIZE /* As big as it gets */
/*
|| Flags for het_open()
*/
#define HETOPEN_CREATE 0x01 /* Create NL tape, if file missing */
#define HETOPEN_READONLY 0x02 /* Force the open read-only */
/*
|| Modes for het_cntl()
*/
#define HETCNTL_GET 0<<8 /* OR with func code to get value */
#define HETCNTL_SET 1<<8 /* OR with func code to set value */
/*
|| Function codes for het_cntl()
*/
#define HETCNTL_COMPRESS 1 /* TRUE=write compression on */
#define HETCNTL_DECOMPRESS 2 /* TRUE=read decomporession on */
#define HETCNTL_METHOD 3 /* Compression method */
#define HETCNTL_LEVEL 4 /* Compression level */
#define HETCNTL_CHUNKSIZE 5 /* Chunk size */
/*
|| Error definitions
*/
#define HETE_OK 0 /* No error */
#define HETE_ERROR -1 /* File error (check errno) */
#define HETE_TAPEMARK -2 /* Tapemark read */
#define HETE_BOT -3 /* Beginning of tape */
#define HETE_EOT -4 /* End of tape */
#define HETE_BADBOR -5 /* BOR not found */
#define HETE_BADEOR -6 /* EOR not found */
#define HETE_BADMARK -7 /* Unexpected tapemark */
#define HETE_OVERFLOW -8 /* Buffer not big enough */
#define HETE_PREMEOF -9 /* Premature EOF */
#define HETE_DECERR -10 /* Decompression error */
#define HETE_UNKMETH -11 /* Unknown compression method */
#define HETE_COMPERR -12 /* Compression error */
#define HETE_BADLEN -13 /* Specified length too big */
#define HETE_PROTECTED -14 /* Write protected */
#define HETE_BADFUNC -15 /* Bad function code passed */
#define HETE_BADMETHOD -16 /* Bad compression method */
#define HETE_BADLEVEL -17 /* Bad compression level */
#define HETE_BADSIZE -18 /* Bad write chunk size */
#define HETE_BADDIR -19 /* Invalid direction specified */
#define HETE_NOMEM -20 /* Insufficient memory */
#define HETE_BADHDR -21 /* Couldn't read block header */
#define HETE_BADCOMPRESS -22 /* Inconsistent compression flags */
#define HETE_BADBLOCK -23 // unused
#define HETE_BADLOC -24 // unused
/*
|| Public functions
*/
HET_DLL_IMPORT int het_open( HETB **hetb, char *filename, int flags );
HET_DLL_IMPORT int het_close( HETB **hetb );
HET_DLL_IMPORT int het_read_header( HETB *hetb );
HET_DLL_IMPORT int het_read( HETB *hetb, void *sbuf );
HET_DLL_IMPORT int het_write_header( HETB *hetb, int len, int flags1, int flags2 );
HET_DLL_IMPORT int het_write( HETB *hetb, void *sbuf, int slen );
HET_DLL_IMPORT int het_tapemark( HETB *hetb );
HET_DLL_IMPORT int het_sync( HETB *hetb );
HET_DLL_IMPORT int het_cntl( HETB *hetb, int func, unsigned long val );
HET_DLL_IMPORT int het_locate( HETB *hetb, int block );
HET_DLL_IMPORT int het_bsb( HETB *hetb );
HET_DLL_IMPORT int het_fsb( HETB *hetb );
HET_DLL_IMPORT int het_bsf( HETB *hetb );
HET_DLL_IMPORT int het_fsf( HETB *hetb );
HET_DLL_IMPORT int het_rewind( HETB *hetb );
HET_DLL_IMPORT const char *het_error( int rc );
HET_DLL_IMPORT off_t het_tell ( HETB *hetb );
#endif /* defined( _HETLIB_H_ ) */