http://gimel.esc.cam.ac.uk/james/rpld/src/rpld-1.7.tar.gz
[rpld.git] / config.c
1 /*************************************************
2 *     rpld - an IBM style RIPL server            *
3 *************************************************/
4
5 /* Copyright (c) 1999,2000, James McKenzie.
6  *                      All rights reserved
7  * Copyright (c) 1998,2000, Christopher Lightfoot.
8  *                      All rights reserved
9  *
10  * By using this file, you agree to the terms and conditions set
11  * forth in the LICENCE file which can be found at the top level of
12  * the rpld distribution.
13  *
14  * IBM is a trademark of IBM corp.
15  *
16  */
17
18
19 static char rcsid[] =
20   "$Id: config.c,v 1.22 2000/09/26 04:06:07 root Exp root $";
21
22 /*
23  * $Log: config.c,v $
24  * Revision 1.22  2000/09/26 04:06:07  root
25  * #
26  *
27  * Revision 1.21  2000/09/26 03:48:23  root
28  * #
29  *
30  * Revision 1.20  2000/09/26 03:44:29  root
31  * #
32  *
33  * Revision 1.19  2000/09/26 02:32:46  root
34  * #
35  *
36  * Revision 1.18  2000/09/26 01:42:24  root
37  * #
38  *
39  * Revision 1.17  2000/09/26 01:41:22  root
40  * #
41  *
42  * Revision 1.16  2000/09/26 01:41:08  root
43  * #
44  *
45  * Revision 1.15  2000/09/26 01:39:17  root
46  * #
47  *
48  * Revision 1.14  2000/07/29 23:25:58  root
49  * #
50  *
51  * Revision 1.13  2000/07/29 23:25:25  root
52  * #
53  *
54  * Revision 1.12  2000/07/23 19:14:19  root
55  * #
56  *
57  * Revision 1.11  2000/07/23 19:07:49  root
58  * #
59  *
60  * Revision 1.10  2000/07/17 10:49:20  root
61  * #
62  *
63  * Revision 1.9  2000/07/17 10:45:38  root
64  * #
65  *
66  * Revision 1.8  2000/07/17 10:43:54  root
67  * #
68  *
69  * Revision 1.7  2000/07/17 10:43:34  root
70  * #
71  *
72  * Revision 1.6  2000/07/16 14:05:28  root
73  * #
74  *
75  * Revision 1.5  2000/07/16 13:18:10  root
76  * #
77  *
78  * Revision 1.1  2000/07/16 13:16:33  root
79  * #
80  *
81  * Revision 1.4  1999/09/13 11:17:35  root
82  * \#
83  *
84  * Revision 1.3  1999/09/13 11:08:34  root
85  * \#
86  *
87  * Revision 1.2  1999/09/13 11:05:27  root
88  * \#
89  *
90  * Revision 1.1  1999/09/13 11:04:13  root
91  * \#
92  *
93  */
94
95 #include "project.h"
96
97 #include "rpld_conf.tab.h"
98
99 extern FILE *yyin;
100
101 void
102 do_linux_kernel (struct client *c, struct clfile *f)
103 {
104   struct clfile *bootsect, *kernel;
105   int loaderlen;
106
107 #define VMLINUZ_LOADLEN_OFFSET 497
108
109 /* The book says we should load top downwards so 
110  * we init bottom upwards ie fr is the second stage 
111  * bootloader at 0x92000 */
112
113 /* Firstly we need to load the bootsector to work out stuff */
114   bootsect = (struct clfile *) malloc (sizeof (struct clfile));
115   bzero (bootsect, sizeof (struct clfile));
116
117   bootsect->path = strdup (f->path);
118   bootsect->offset = 0;
119   bootsect->length = 0x200;
120   bootsect->load_addr = 0x90000;
121
122   cache_locally (bootsect);
123
124   if (!bootsect->data)
125     {
126       fprintf (stderr, "Couldn't open %s for reading\n", f->path);
127       exit (1);
128     }
129   if (bootsect->length < 0x200)
130     {
131       fprintf (stderr, "Only read %d bytes from %s\n", bootsect->length,
132                f->path);
133       exit (1);
134     }
135
136   /* FIXME: here we should add a pointer to the kernel parameter string */
137   /* and allocate a clfile structure to hold it */
138
139   loaderlen = (bootsect->data[VMLINUZ_LOADLEN_OFFSET]) ?
140     (0x200 * (bootsect->data[VMLINUZ_LOADLEN_OFFSET])) : 0x800;
141
142
143   kernel = (struct clfile *) malloc (sizeof (struct clfile));
144   bzero (kernel, sizeof (struct clfile));
145
146   kernel->path = strdup (f->path);
147   kernel->offset = loaderlen + 0x200;
148   kernel->length = -1;
149   kernel->load_addr = 0x10000;
150
151   kernel->next = c->files;
152   c->files = kernel;
153
154   /* Tag in the bootsector */
155   bootsect->next = kernel;
156   c->files = bootsect;
157
158
159   /* Now set up f the secondary bootloader */
160
161   f->offset = 0x200;
162   f->length = loaderlen;
163   f->load_addr = 0x90200;
164
165 }
166
167
168 void
169 parse_config (char *filename)
170 {
171   FILE *file;
172
173   file = fopen (filename, "r");
174
175   if (!file)
176     {
177       fprintf (stderr, "Cannot open config file %s\n", filename);
178       exit (1);
179     }
180
181   yyin = file;
182
183   yyparse ();
184
185   fclose (file);
186
187
188 }