This source file includes following definitions.
- die
- usage
- main
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6
7 #define MINIX_HEADER 32
8 #define GCC_HEADER 1024
9
10 void die(char * str)
11 {
12 fprintf(stderr,"%s\n",str);
13 exit(1);
14 }
15
16 void usage(void)
17 {
18 die("Usage: build boot system [> image]");
19 }
20
21 int main(int argc, char ** argv)
22 {
23 int i,c,id;
24 char buf[1024];
25
26 if (argc != 3)
27 usage();
28 for (i=0;i<sizeof buf; i++) buf[i]=0;
29 if ((id=open(argv[1],O_RDONLY,0))<0)
30 die("Unable to open 'boot'");
31 if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
32 die("Unable to read header of 'boot'");
33 if (((long *) buf)[0]!=0x04100301)
34 die("Non-Minix header of 'boot'");
35 if (((long *) buf)[1]!=MINIX_HEADER)
36 die("Non-Minix header of 'boot'");
37 if (((long *) buf)[3]!=0)
38 die("Illegal data segment in 'boot'");
39 if (((long *) buf)[4]!=0)
40 die("Illegal bss in 'boot'");
41 if (((long *) buf)[5] != 0)
42 die("Non-Minix header of 'boot'");
43 if (((long *) buf)[7] != 0)
44 die("Illegal symbol table in 'boot'");
45 i=read(id,buf,sizeof buf);
46 fprintf(stderr,"Boot sector %d bytes.\n",i);
47 if (i>510)
48 die("Boot block may not exceed 510 bytes");
49 buf[510]=0x55;
50 buf[511]=0xAA;
51 i=write(1,buf,512);
52 if (i!=512)
53 die("Write call failed");
54 close (id);
55
56 if ((id=open(argv[2],O_RDONLY,0))<0)
57 die("Unable to open 'system'");
58 if (read(id,buf,GCC_HEADER) != GCC_HEADER)
59 die("Unable to read header of 'system'");
60 if (((long *) buf)[5] != 0)
61 die("Non-GCC header of 'system'");
62 for (i=0 ; (c=read(id,buf,sizeof buf))>0 ; i+=c )
63 if (write(1,buf,c)!=c)
64 die("Write call failed");
65 close(id);
66 fprintf(stderr,"System %d bytes.\n",i);
67 return(0);
68 }