This source file includes following definitions.
- die
- usage
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include <stdio.h>
24 #include <string.h>
25 #include <stdlib.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <sys/sysmacros.h>
29 #include <unistd.h>
30 #include <fcntl.h>
31
32 #define MINIX_HEADER 32
33 #define GCC_HEADER 1024
34
35 #define SYS_SIZE 0x7000
36
37 #define DEFAULT_MAJOR_ROOT 0
38 #define DEFAULT_MINOR_ROOT 0
39
40
41
42 #define SETUP_SECTS 4
43
44 #define STRINGIFY(x) #x
45
46 void die(char * str)
47 {
48 fprintf(stderr,"%s\n",str);
49 exit(1);
50 }
51
52 void usage(void)
53 {
54 die("Usage: build bootsect setup system [rootdev] [> image]");
55 }
56
57 int main(int argc, char ** argv)
58 {
59 int i,c,id;
60 char buf[1024];
61 char major_root, minor_root;
62 struct stat sb;
63
64 if ((argc < 4) || (argc > 5))
65 usage();
66 if (argc > 4) {
67 if (strcmp(argv[4], "FLOPPY")) {
68 if (stat(argv[4], &sb)) {
69 perror(argv[4]);
70 die("Couldn't stat root device.");
71 }
72 major_root = major(sb.st_rdev);
73 minor_root = minor(sb.st_rdev);
74 } else {
75 major_root = 0;
76 minor_root = 0;
77 }
78 } else {
79 major_root = DEFAULT_MAJOR_ROOT;
80 minor_root = DEFAULT_MINOR_ROOT;
81 }
82 fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
83 for (i=0;i<sizeof buf; i++) buf[i]=0;
84 if ((id=open(argv[1],O_RDONLY,0))<0)
85 die("Unable to open 'boot'");
86 if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
87 die("Unable to read header of 'boot'");
88 if (((long *) buf)[0]!=0x04100301)
89 die("Non-Minix header of 'boot'");
90 if (((long *) buf)[1]!=MINIX_HEADER)
91 die("Non-Minix header of 'boot'");
92 if (((long *) buf)[3]!=0)
93 die("Illegal data segment in 'boot'");
94 if (((long *) buf)[4]!=0)
95 die("Illegal bss in 'boot'");
96 if (((long *) buf)[5] != 0)
97 die("Non-Minix header of 'boot'");
98 if (((long *) buf)[7] != 0)
99 die("Illegal symbol table in 'boot'");
100 i=read(id,buf,sizeof buf);
101 fprintf(stderr,"Boot sector %d bytes.\n",i);
102 if (i != 512)
103 die("Boot block must be exactly 512 bytes");
104 if ((*(unsigned short *)(buf+510)) != 0xAA55)
105 die("Boot block hasn't got boot flag (0xAA55)");
106 buf[508] = (char) minor_root;
107 buf[509] = (char) major_root;
108 i=write(1,buf,512);
109 if (i!=512)
110 die("Write call failed");
111 close (id);
112
113 if ((id=open(argv[2],O_RDONLY,0))<0)
114 die("Unable to open 'setup'");
115 if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
116 die("Unable to read header of 'setup'");
117 if (((long *) buf)[0]!=0x04100301)
118 die("Non-Minix header of 'setup'");
119 if (((long *) buf)[1]!=MINIX_HEADER)
120 die("Non-Minix header of 'setup'");
121 if (((long *) buf)[3]!=0)
122 die("Illegal data segment in 'setup'");
123 if (((long *) buf)[4]!=0)
124 die("Illegal bss in 'setup'");
125 if (((long *) buf)[5] != 0)
126 die("Non-Minix header of 'setup'");
127 if (((long *) buf)[7] != 0)
128 die("Illegal symbol table in 'setup'");
129 for (i=0 ; (c=read(id,buf,sizeof buf))>0 ; i+=c )
130 if (write(1,buf,c)!=c)
131 die("Write call failed");
132 close (id);
133 if (i > SETUP_SECTS*512)
134 die("Setup exceeds " STRINGIFY(SETUP_SECTS)
135 " sectors - rewrite build/boot/setup");
136 fprintf(stderr,"Setup is %d bytes.\n",i);
137 for (c=0 ; c<sizeof(buf) ; c++)
138 buf[c] = '\0';
139 while (i<SETUP_SECTS*512) {
140 c = SETUP_SECTS*512-i;
141 if (c > sizeof(buf))
142 c = sizeof(buf);
143 if (write(1,buf,c) != c)
144 die("Write call failed");
145 i += c;
146 }
147
148 if ((id=open(argv[3],O_RDONLY,0))<0)
149 die("Unable to open 'system'");
150 if (read(id,buf,GCC_HEADER) != GCC_HEADER)
151 die("Unable to read header of 'system'");
152 if (((long *) buf)[5] != 0)
153 die("Non-GCC header of 'system'");
154 for (i=0 ; (c=read(id,buf,sizeof buf))>0 ; i+=c )
155 if (write(1,buf,c)!=c)
156 die("Write call failed");
157 close(id);
158 fprintf(stderr,"System is %d bytes.\n",i);
159 if (i > SYS_SIZE*16)
160 die("System is too big");
161 return(0);
162 }