http://gimel.esc.cam.ac.uk/james/rpld/src/rpld-1.4.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[] = "$Id: config.c,v 1.10 2000/07/17 10:49:20 root Exp $";
20
21 /*
22  * $Log: config.c,v $
23  * Revision 1.10  2000/07/17 10:49:20  root
24  * #
25  *
26  * Revision 1.9  2000/07/17 10:45:38  root
27  * #
28  *
29  * Revision 1.8  2000/07/17 10:43:54  root
30  * #
31  *
32  * Revision 1.7  2000/07/17 10:43:34  root
33  * #
34  *
35  * Revision 1.6  2000/07/16 14:05:28  root
36  * #
37  *
38  * Revision 1.5  2000/07/16 13:18:10  root
39  * #
40  *
41  * Revision 1.1  2000/07/16 13:16:33  root
42  * #
43  *
44  * Revision 1.4  1999/09/13 11:17:35  root
45  * \#
46  *
47  * Revision 1.3  1999/09/13 11:08:34  root
48  * \#
49  *
50  * Revision 1.2  1999/09/13 11:05:27  root
51  * \#
52  *
53  * Revision 1.1  1999/09/13 11:04:13  root
54  * \#
55  *
56  */
57
58 #include "project.h"
59
60 #include "rpld_conf.tab.h"
61
62 extern FILE *yyin;
63
64 void
65 do_linux_kernel (struct client *c, struct clfile *f)
66 {
67   struct clfile *bootsect, *kernel;
68   int loaderlen;
69
70 #define VMLINUZ_LOADLEN_OFFSET 497
71
72 /* The book says we should load top downwards so 
73  * we init bottom upwards ie fr is the second stage 
74  * bootloader at 0x92000 */
75
76 /* Firstly we need to load the bootsector to work out stuff */
77   bootsect = (struct clfile *) malloc (sizeof (struct clfile));
78   bzero (bootsect, sizeof (struct clfile));
79
80   bootsect->path = strdup (f->path);
81   bootsect->offset = 0;
82   bootsect->length = 0x200;
83   bootsect->load_addr = 0x90000;
84
85   cache_locally (bootsect);
86
87   if (!bootsect->data)
88     {
89       fprintf (stderr, "Couldn't open %s for reading\n", f->path);
90       exit (1);
91     }
92   if (bootsect->length < 0x200)
93     {
94       fprintf (stderr, "Only read %d bytes from %s\n", bootsect->length,
95                f->path);
96       exit (1);
97     }
98
99   /* FIXME: here we should add a pointer to the kernel parameter string */
100   /* and allocate a clfile structure to hold it */
101
102   loaderlen = (bootsect->data[VMLINUZ_LOADLEN_OFFSET]) ?
103     (0x200 * (bootsect->data[VMLINUZ_LOADLEN_OFFSET])) : 0x800;
104
105
106   kernel = (struct clfile *) malloc (sizeof (struct clfile));
107   bzero (kernel, sizeof (struct clfile));
108
109   kernel->path = strdup (f->path);
110   kernel->offset = loaderlen + 0x200;
111   kernel->length = -1;
112   kernel->load_addr = 0x10000;
113
114   kernel->next = c->files;
115   c->files = kernel;
116
117   /* Tag in the bootsector */
118   bootsect->next = kernel;
119   c->files = bootsect;
120
121
122   /* Now set up f the secondary bootloader */
123
124   f->offset = 0x200;
125   f->length = loaderlen;
126   f->load_addr = 0x90200;
127
128 }
129
130
131 void
132 parse_config ()
133 {
134   FILE *file;
135
136   file = fopen (CONFIG_FILE, "r");
137
138   if (!file)
139     {
140       fprintf (stderr, "Cannot open config file %s\n", CONFIG_FILE);
141       exit (1);
142     }
143
144   yyin = file;
145
146   yyparse ();
147
148   fclose (file);
149
150
151 }