1*529c1f20SDavid du Colombier #include <u.h>
2*529c1f20SDavid du Colombier #include <libc.h>
3*529c1f20SDavid du Colombier
4*529c1f20SDavid du Colombier char *data;
5*529c1f20SDavid du Colombier uchar head[0x8c0];
6*529c1f20SDavid du Colombier
7*529c1f20SDavid du Colombier void
usage(void)8*529c1f20SDavid du Colombier usage(void)
9*529c1f20SDavid du Colombier {
10*529c1f20SDavid du Colombier fprint(2, "usage: %s file\n", argv0);
11*529c1f20SDavid du Colombier exits("usage");
12*529c1f20SDavid du Colombier }
13*529c1f20SDavid du Colombier
14*529c1f20SDavid du Colombier void
u32(int n,u32int p)15*529c1f20SDavid du Colombier u32(int n, u32int p)
16*529c1f20SDavid du Colombier {
17*529c1f20SDavid du Colombier head[n] = p;
18*529c1f20SDavid du Colombier head[n+1] = p >> 8;
19*529c1f20SDavid du Colombier head[n+2] = p >> 16;
20*529c1f20SDavid du Colombier head[n+3] = p >> 24;
21*529c1f20SDavid du Colombier }
22*529c1f20SDavid du Colombier
23*529c1f20SDavid du Colombier u32int
gu32(int n)24*529c1f20SDavid du Colombier gu32(int n)
25*529c1f20SDavid du Colombier {
26*529c1f20SDavid du Colombier return head[n] | head[n+1] << 8 | head[n+2] << 16 | head[n+3] << 24;
27*529c1f20SDavid du Colombier }
28*529c1f20SDavid du Colombier
29*529c1f20SDavid du Colombier void
main(int argc,char ** argv)30*529c1f20SDavid du Colombier main(int argc, char **argv)
31*529c1f20SDavid du Colombier {
32*529c1f20SDavid du Colombier int fd, sz, i;
33*529c1f20SDavid du Colombier u32int ck;
34*529c1f20SDavid du Colombier
35*529c1f20SDavid du Colombier ARGBEGIN {
36*529c1f20SDavid du Colombier default:
37*529c1f20SDavid du Colombier usage();
38*529c1f20SDavid du Colombier } ARGEND;
39*529c1f20SDavid du Colombier
40*529c1f20SDavid du Colombier if(argc != 1)
41*529c1f20SDavid du Colombier usage();
42*529c1f20SDavid du Colombier fd = open(argv[0], OREAD);
43*529c1f20SDavid du Colombier if(fd < 0)
44*529c1f20SDavid du Colombier sysfatal("open: %r");
45*529c1f20SDavid du Colombier sz = seek(fd, 0, 2);
46*529c1f20SDavid du Colombier if(sz < 0)
47*529c1f20SDavid du Colombier sysfatal("seek: %r");
48*529c1f20SDavid du Colombier data = malloc(sz);
49*529c1f20SDavid du Colombier if(data == nil)
50*529c1f20SDavid du Colombier sysfatal("malloc: %r");
51*529c1f20SDavid du Colombier seek(fd, 0, 0);
52*529c1f20SDavid du Colombier if(readn(fd, data, sz) < sz)
53*529c1f20SDavid du Colombier sysfatal("read: %r");
54*529c1f20SDavid du Colombier close(fd);
55*529c1f20SDavid du Colombier memset(head, 0, sizeof(head));
56*529c1f20SDavid du Colombier
57*529c1f20SDavid du Colombier u32(0x20, 0xaa995566);
58*529c1f20SDavid du Colombier u32(0x24, 0x584C4E58);
59*529c1f20SDavid du Colombier u32(0x30, sizeof(head));
60*529c1f20SDavid du Colombier u32(0x34, sz);
61*529c1f20SDavid du Colombier u32(0x40, sz);
62*529c1f20SDavid du Colombier ck = 0;
63*529c1f20SDavid du Colombier for(i = 0x20; i < 0x48; i += 4)
64*529c1f20SDavid du Colombier ck += gu32(i);
65*529c1f20SDavid du Colombier u32(0x48, ~ck);
66*529c1f20SDavid du Colombier u32(0xa0, -1);
67*529c1f20SDavid du Colombier
68*529c1f20SDavid du Colombier write(1, head, sizeof(head));
69*529c1f20SDavid du Colombier write(1, data, sz);
70*529c1f20SDavid du Colombier exits(nil);
71*529c1f20SDavid du Colombier }
72