forked from rbowler/spinhawk
-
Notifications
You must be signed in to change notification settings - Fork 3
/
cckdfix.c
116 lines (79 loc) · 3.28 KB
/
cckdfix.c
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
/* CCKDFIX.C (c) Copyright Greg Smith, 2000-2009 */
/* Correct compressed CKD file. */
#include "hercules.h"
int main ( int argc, char *argv[])
{
int fd;
CKDDASD_DEVHDR devhdr;
CCKDDASD_DEVHDR cdevhdr;
int heads, cyls, devt;
char pathname[MAX_PATH];
hostpath(pathname, argv[1], sizeof(pathname));
fd = hopen(pathname, O_RDWR|O_BINARY);
if (fd < 0) return 1;
read (fd, &devhdr, CKDDASD_DEVHDR_SIZE);
read (fd, &cdevhdr, CCKDDASD_DEVHDR_SIZE);
/* --------------------------------------- */
/* Device header updates */
/* --------------------------------------- */
/* device identifier */
// memcpy (devhdr.devid, "CKD_C370", 8);
/* number of heads per cylinder
must be in little-endian byte order */
// devhdr.heads[3] = (heads >> 24) & 0xFF;
// devhdr.heads[2] = (heads >> 16) & 0xFF;
// devhdr.heads[1] = (heads >> 8) & 0xFF;
// devhdr.heads[0] = heads & 0xFF;
/* device type -- last two digits */
// devhdr.devtype = devt; /* eg 0x90 for 3390 */
/* file sequence number; must be zero for
compressed ckd dasd emulation */
// devhdr.fileseq = 0;
/* highest cylinder on this file; must be zero for
compressed ckd dasd emulation */
// devhdr.highcyl[0] = 0;
// devhdr.highcyl[1] = 0;
// memset (&devhdr.resv, 0, 492);
/* --------------------------------------- */
/* Compressed device header updates */
/* --------------------------------------- */
/* version-release-modification level */
// cdevhdr.vrm[0] = CCKD_VERSION;
// cdevhdr.vrm[0] = CCKD_RELEASE;
// cdevhdr.vrm[0] = CCKD_MODLVL;
/* options byte */
// cdevhdr.options = 0;
// cdevhdr.options |= CCKD_NOFUDGE;
// cdevhdr.options |= CCKD_BIGENDIAN;
// cdevhdr.options |= CCKD_OPENED;
/* lookup table sizes*/
// cdevhdr.numl1tab = (cyls * heads) >> 8;
// if ((cyls * heads) & 0xff != 0)
// cdevhdr.numl1tab++;
// cdevhdr.numl2tab = 256;
/* free space header -- set to zeroes to force
cckdcdsk to rebuild the free space */
// cdevhdr.size = cdevhdr.used = cdevhdr.free =
// cdevhdr.free_total = cdevhdr.free_largest =
// cdevhdr.free_number = cdevhdr.free_imbed = 0;
/* number of cylinders on the emulated device
must be in little-endian byte order */
// cdevhdr.cyls[3] = (cyls >> 24) & 0xFF;
// cdevhdr.cyls[2] = (cyls >> 16) & 0xFF;
// cdevhdr.cyls[1] = (cyls >> 8) & 0xFF;
// cdevhdr.cyls[0] = cyls & 0xFF;
// cdevhdr.resv1 = 0;
/* compression algorithm and parameter */
// cdevhdr.compress = CCKD_COMPRESS_NONE;
// cdevhdr.compress_parm = 0;
// cdevhdr.compress = CCKD_COMPRESS_ZLIB;
// cdevhdr.compress_parm = Z_DEFAULT_COMPRESSION;
// cdevhdr.compress = CCKD_COMPRESS_BZIP2;
// cdevhdr.compress_parm = 5;
// memset (&cdevhdr.resv2, 0, 464);
lseek (fd, 0, SEEK_SET);
write (fd, &devhdr, CKDDASD_DEVHDR_SIZE);
write (fd, &cdevhdr, CCKDDASD_DEVHDR_SIZE);
close (fd);
return 0;
}