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