#include <u.h>
#include <libc.h>
char *data;
uchar head[0x8c0];
void
usage(void)
{
fprint(2, "usage: %s file\n", argv0);
exits("usage");
}
void
u32(int n, u32int p)
{
head[n] = p;
head[n+1] = p >> 8;
head[n+2] = p >> 16;
head[n+3] = p >> 24;
}
u32int
gu32(int n)
{
return head[n] | head[n+1] << 8 | head[n+2] << 16 | head[n+3] << 24;
}
void
main(int argc, char **argv)
{
int fd, sz, i;
u32int ck;
ARGBEGIN {
default:
usage();
} ARGEND;
if(argc != 1)
usage();
fd = open(argv[0], OREAD);
if(fd < 0)
sysfatal("open: %r");
sz = seek(fd, 0, 2);
if(sz < 0)
sysfatal("seek: %r");
data = malloc(sz);
if(data == nil)
sysfatal("malloc: %r");
seek(fd, 0, 0);
if(readn(fd, data, sz) < sz)
sysfatal("read: %r");
close(fd);
memset(head, 0, sizeof(head));
u32(0x20, 0xaa995566);
u32(0x24, 0x584C4E58);
u32(0x30, sizeof(head));
u32(0x34, sz);
u32(0x40, sz);
ck = 0;
for(i = 0x20; i < 0x48; i += 4)
ck += gu32(i);
u32(0x48, ~ck);
u32(0xa0, -1);
write(1, head, sizeof(head));
write(1, data, sz);
exits(nil);
}