1#ifndef __KERNEL__
2#include <string.h>
3#include <stdlib.h>
4#include <stdio.h>
5#include <errno.h>
6#include <ctype.h>
7#include <time.h>
8#include <fcntl.h>
9#include <unistd.h>
10
11#include <sys/stat.h>
12#include <sys/ioctl.h>
13
14#include <linux/fs.h>
15#include <linux/types.h>
16#include <linux/hdreg.h>
17#include <linux/version.h>
18#include <asm/dasd.h>
19#endif
20
21
22#define LINE_LENGTH 80
23#define VTOC_START_CC 0x0
24#define VTOC_START_HH 0x1
25#define FIRST_USABLE_CYL 1
26#define FIRST_USABLE_TRK 2
27
28#define DASD_3380_TYPE 13148
29#define DASD_3390_TYPE 13200
30#define DASD_9345_TYPE 37701
31
32#define DASD_3380_VALUE 0xbb60
33#define DASD_3390_VALUE 0xe5a2
34#define DASD_9345_VALUE 0xbc98
35
36#define VOLSER_LENGTH 6
37#define BIG_DISK_SIZE 0x10000
38
39#define VTOC_ERROR "VTOC error:"
40
41
42typedef struct ttr
43{
44 __u16 tt;
45 __u8 r;
46} __attribute__ ((packed)) ttr_t;
47
48typedef struct cchhb
49{
50 __u16 cc;
51 __u16 hh;
52 __u8 b;
53} __attribute__ ((packed)) cchhb_t;
54
55typedef struct cchh
56{
57 __u16 cc;
58 __u16 hh;
59} __attribute__ ((packed)) cchh_t;
60
61typedef struct labeldate
62{
63 __u8 year;
64 __u16 day;
65} __attribute__ ((packed)) labeldate_t;
66
67
68typedef struct volume_label
69{
70 char volkey[4];
71 char vollbl[4];
72 char volid[6];
73 __u8 security;
74 cchhb_t vtoc;
75 char res1[5];
76 char cisize[4];
77
78 char blkperci[4];
79 char labperci[4];
80 char res2[4];
81 char lvtoc[14];
82 char res3[29];
83} __attribute__ ((packed)) volume_label_t;
84
85
86typedef struct extent
87{
88 __u8 typeind;
89 __u8 seqno;
90 cchh_t llimit;
91 cchh_t ulimit;
92} __attribute__ ((packed)) extent_t;
93
94
95typedef struct dev_const
96{
97 __u16 DS4DSCYL;
98 __u16 DS4DSTRK;
99 __u16 DS4DEVTK;
100 __u8 DS4DEVI;
101 __u8 DS4DEVL;
102 __u8 DS4DEVK;
103 __u8 DS4DEVFG;
104 __u16 DS4DEVTL;
105 __u8 DS4DEVDT;
106 __u8 DS4DEVDB;
107} __attribute__ ((packed)) dev_const_t;
108
109
110typedef struct format1_label
111{
112 char DS1DSNAM[44];
113 __u8 DS1FMTID;
114 char DS1DSSN[6];
115 __u16 DS1VOLSQ;
116 labeldate_t DS1CREDT;
117 labeldate_t DS1EXPDT;
118 __u8 DS1NOEPV;
119 __u8 DS1NOBDB;
120 __u8 DS1FLAG1;
121 char DS1SYSCD[13];
122 labeldate_t DS1REFD;
123 __u8 DS1SMSFG;
124 __u8 DS1SCXTF;
125 __u16 DS1SCXTV;
126 __u8 DS1DSRG1;
127 __u8 DS1DSRG2;
128 __u8 DS1RECFM;
129 __u8 DS1OPTCD;
130 __u16 DS1BLKL;
131 __u16 DS1LRECL;
132 __u8 DS1KEYL;
133 __u16 DS1RKP;
134 __u8 DS1DSIND;
135 __u8 DS1SCAL1;
136 char DS1SCAL3[3];
137 ttr_t DS1LSTAR;
138 __u16 DS1TRBAL;
139 __u16 res1;
140 extent_t DS1EXT1;
141 extent_t DS1EXT2;
142 extent_t DS1EXT3;
143 cchhb_t DS1PTRDS;
144} __attribute__ ((packed)) format1_label_t;
145
146
147typedef struct format4_label
148{
149 char DS4KEYCD[44];
150 __u8 DS4IDFMT;
151 cchhb_t DS4HPCHR;
152 __u16 DS4DSREC;
153 cchh_t DS4HCCHH;
154 __u16 DS4NOATK;
155 __u8 DS4VTOCI;
156 __u8 DS4NOEXT;
157 __u8 DS4SMSFG;
158 __u8 DS4DEVAC;
159
160
161
162
163 dev_const_t DS4DEVCT;
164 char DS4AMTIM[8];
165 char DS4AMCAT[3];
166 char DS4R2TIM[8];
167 char res1[5];
168 char DS4F6PTR[5];
169 extent_t DS4VTOCE;
170 char res2[10];
171 __u8 DS4EFLVL;
172 cchhb_t DS4EFPTR;
173 char res3[9];
174} __attribute__ ((packed)) format4_label_t;
175
176
177typedef struct ds5ext
178{
179 __u16 t;
180 __u16 fc;
181 __u8 ft;
182} __attribute__ ((packed)) ds5ext_t;
183
184
185typedef struct format5_label
186{
187 char DS5KEYID[4];
188 ds5ext_t DS5AVEXT;
189 ds5ext_t DS5EXTAV[7];
190 __u8 DS5FMTID;
191 ds5ext_t DS5MAVET[18];
192 cchhb_t DS5PTRDS;
193} __attribute__ ((packed)) format5_label_t;
194
195
196typedef struct ds7ext
197{
198 __u32 a;
199 __u32 b;
200} __attribute__ ((packed)) ds7ext_t;
201
202
203typedef struct format7_label
204{
205 char DS7KEYID[4];
206 ds7ext_t DS7EXTNT[5];
207 __u8 DS7FMTID;
208 ds7ext_t DS7ADEXT[11];
209 char res1[2];
210 cchhb_t DS7PTRDS;
211} __attribute__ ((packed)) format7_label_t;
212
213
214char * vtoc_ebcdic_enc (
215 unsigned char source[LINE_LENGTH],
216 unsigned char target[LINE_LENGTH],
217 int l);
218char * vtoc_ebcdic_dec (
219 unsigned char source[LINE_LENGTH],
220 unsigned char target[LINE_LENGTH],
221 int l);
222void vtoc_set_extent (
223 extent_t * ext,
224 __u8 typeind,
225 __u8 seqno,
226 cchh_t * lower,
227 cchh_t * upper);
228void vtoc_set_cchh (
229 cchh_t * addr,
230 __u16 cc,
231 __u16 hh);
232void vtoc_set_cchhb (
233 cchhb_t * addr,
234 __u16 cc,
235 __u16 hh,
236 __u8 b);
237void vtoc_set_date (
238 labeldate_t * d,
239 __u8 year,
240 __u16 day);
241
242void vtoc_volume_label_init (
243 volume_label_t *vlabel);
244
245int vtoc_read_volume_label (
246 char * device,
247 unsigned long vlabel_start,
248 volume_label_t * vlabel);
249
250int vtoc_write_volume_label (
251 char *device,
252 unsigned long vlabel_start,
253 volume_label_t *vlabel);
254
255void vtoc_volume_label_set_volser (
256 volume_label_t *vlabel,
257 char *volser);
258
259char *vtoc_volume_label_get_volser (
260 volume_label_t *vlabel,
261 char *volser);
262
263void vtoc_volume_label_set_key (
264 volume_label_t *vlabel,
265 char *key);
266
267void vtoc_volume_label_set_label (
268 volume_label_t *vlabel,
269 char *lbl);
270
271char *vtoc_volume_label_get_label (
272 volume_label_t *vlabel,
273 char *lbl);
274
275void vtoc_read_label (
276 char *device,
277 unsigned long position,
278 format1_label_t *f1,
279 format4_label_t *f4,
280 format5_label_t *f5,
281 format7_label_t *f7);
282
283void vtoc_write_label (
284 char *device,
285 unsigned long position,
286 format1_label_t *f1,
287 format4_label_t *f4,
288 format5_label_t *f5,
289 format7_label_t *f7);
290
291
292void vtoc_init_format1_label (
293 char *volid,
294 unsigned int blksize,
295 extent_t *part_extent,
296 format1_label_t *f1);
297
298
299void vtoc_init_format4_label (
300 format4_label_t *f4lbl,
301 unsigned int usable_partitions,
302 unsigned int cylinders,
303 unsigned int tracks,
304 unsigned int blocks,
305 unsigned int blksize,
306 __u16 dev_type);
307
308void vtoc_update_format4_label (
309 format4_label_t *f4,
310 cchhb_t *highest_f1,
311 __u16 unused_update);
312
313
314void vtoc_init_format5_label (
315 format5_label_t *f5);
316
317void vtoc_update_format5_label_add (
318 format5_label_t *f5,
319 int verbose,
320 int cyl,
321 int trk,
322 __u16 a,
323 __u16 b,
324 __u8 c);
325
326void vtoc_update_format5_label_del (
327 format5_label_t *f5,
328 int verbose,
329 int cyl,
330 int trk,
331 __u16 a,
332 __u16 b,
333 __u8 c);
334
335
336void vtoc_init_format7_label (
337 format7_label_t *f7);
338
339void vtoc_update_format7_label_add (
340 format7_label_t *f7,
341 int verbose,
342 __u32 a,
343 __u32 b);
344
345void vtoc_update_format7_label_del (
346 format7_label_t *f7,
347 int verbose,
348 __u32 a,
349 __u32 b);
350
351
352void vtoc_set_freespace(
353 format4_label_t *f4,
354 format5_label_t *f5,
355 format7_label_t *f7,
356 char ch,
357 int verbose,
358 __u32 start,
359 __u32 stop,
360 int cyl,
361 int trk);
362
363
364
365
366
367
368
369
370
371
372
373
374