3 * Architecture Independent System Init
9 extern int Modules_LoadBuiltins();
10 extern int PCI_Install();
13 void System_Init(char *ArgString);
14 void System_ParseCommandLine(char *ArgString);
15 void System_ParseVFS(char *Arg);
16 void System_ParseSetting(char *Arg);
17 void System_ExecuteScript();
18 int System_Int_GetString(char *Str, char **Dest);
21 char *gsInitPath = "/Acess/Bin/init";
22 char *gsConfigScript = "/Acess/BootConf.cfg";
25 void System_Init(char *ArgString)
27 // - Start Builtin Drivers & Filesystems
30 Modules_LoadBuiltins();
32 // - Parse Kernel's Command Line
33 System_ParseCommandLine(ArgString);
35 // - Execute the Config Script
36 Log("Executing config script...");
37 System_ExecuteScript();
41 * \fn void System_ParseCommandLine(char *ArgString)
42 * \brief Parses the kernel's command line and sets the environment
44 void System_ParseCommandLine(char *ArgString)
51 Log("Kernel Command Line: \"%s\"", ArgString);
53 // --- Get Arguments ---
55 for( argc = 0; argc < 32; argc++ )
57 while(*str == ' ') str++; // Eat Whitespace
58 if(*str == '\0') { argc--; break;} // End of string
60 while(*str && *str != ' ')
63 while(*str && !(*str == '"' && str[-1] != '\\'))
68 if(*str == '\0') break; // End of string
69 *str = '\0'; // Cap off argument string
70 str ++; // and increment the string pointer
73 argc ++; // Count last argument
75 // --- Parse Arguments ---
76 for( i = 1; i < argc; i++ )
78 if( argv[i][0] == '/' )
79 System_ParseVFS( argv[i] );
81 System_ParseSetting( argv[i] );
86 * \fn void System_ParseVFS(char *Arg)
88 void System_ParseVFS(char *Arg)
94 // Search for the '=' token
95 while( *value && *value != '=' )
98 // Check if the equals was found
99 if( *value == '\0' ) {
100 Warning("Expected '=' in the string '%s'", Arg);
105 *value = '\0'; value ++;
107 // Check assignment type
108 // - Symbolic Link <link>=<destination>
111 Log("Symbolic link '%s' pointing to '%s'", Arg, value);
112 VFS_Symlink(Arg, value);
114 // - Mount <mountpoint>=<fs>:<device>
119 while(*dev && *dev != ':') dev++;
125 if( (fd = VFS_Open(Arg, 0)) == -1 ) {
126 Log("Creating directory '%s'", Arg, value);
132 Log("Mounting '%s' to '%s' ('%s')", dev, Arg, value);
133 VFS_Mount(dev, Arg, value, "");
138 * \fn void System_ParseSetting(char *Arg)
140 void System_ParseSetting(char *Arg)
145 // Search for the '=' token
146 while( *value && *value != '=' )
149 // Check for boolean/flag (no '=')
152 if(strcmp(Arg, "") == 0) {
154 Warning("Kernel flag '%s' is not recognised", Arg);
159 *value = '\0'; // Remove '='
160 value ++; // and eat it's position
162 if(strcmp(Arg, "SCRIPT") == 0) {
163 Log("Config Script: '%s'", value);
164 gsConfigScript = value;
166 Warning("Kernel config setting '%s' is not recognised", Arg);
173 * \fn void System_ExecuteScript()
175 void System_ExecuteScript()
179 int i = 0, lineStart;
180 char *sArg1, *sArg2, *sArg3;
184 fp = VFS_Open(gsConfigScript, VFS_OPENFLAG_READ);
186 Warning("[CFG] Passed script '%s' does not exist", gsConfigScript);
190 // Read into memory buffer
191 VFS_Seek(fp, 0, SEEK_END);
193 VFS_Seek(fp, 0, SEEK_SET);
194 fData = malloc(fLen+1);
195 VFS_Read(fp, fLen, fData);
202 sArg1 = sArg2 = sArg3 = NULL;
205 // Clear leading whitespace and find empty lines
206 while(i < fLen && (fData[i] == ' ' || fData[i]=='\t')) i ++;
208 if(fData[i] == '\n') {
214 if(fData[i] == ';' || fData[i] == '#') {
215 while(i < fLen && fData[i] != '\n') i ++;
222 if(strncmp("mount ", fData+i, 6) == 0) {
224 i += System_Int_GetString(fData+i, &sArg1);
225 if(!sArg1) goto read2eol;
226 i += System_Int_GetString(fData+i, &sArg2);
227 if(!sArg2) goto read2eol;
228 i += System_Int_GetString(fData+i, &sArg3);
229 if(!sArg3) goto read2eol;
230 //Log("[CFG ] Mount '%s' to '%s' (%s)\n", sArg1, sArg2, sArg3);
231 VFS_Mount(sArg1, sArg2, sArg3, "");
234 else if(strncmp("module ", fData+i, 6) == 0) {
236 i += System_Int_GetString(fData+i, &sArg1);
237 if(!sArg1) goto read2eol;
238 //Log("[CFG ] Load Module '%s'\n", sArg1);
239 Module_LoadFile(sArg1, ""); //!\todo Use the rest of the line as the argument string
242 else if(strncmp("edimod ", fData+i, 6) == 0) {
244 i += System_Int_GetString(fData+i, &sArg1);
245 if(!sArg1) goto read2eol;
246 Log("[CFG ] Load EDI Module '%s'\n", sArg1);
247 Module_LoadFile(sArg1, "");
250 else if(strncmp("symlink ", fData+i, 7) == 0) {
252 i += System_Int_GetString(fData+i, &sArg1);
253 if(!sArg1) goto read2eol;
254 i += System_Int_GetString(fData+i, &sArg2);
255 if(!sArg2) goto read2eol;
256 Log("[CFG ] Symlink '%s' pointing to '%s'\n", sArg1, sArg2);
257 VFS_Symlink(sArg1, sArg2);
260 else if(strncmp("mkdir ", fData+i, 5) == 0) {
262 i += System_Int_GetString(fData+i, &sArg1);
263 if(!sArg1) goto read2eol;
264 Log("[CFG ] New Directory '%s'\n", sArg1);
268 else if(strncmp("spawn ", fData+i, 5) == 0) {
270 i += System_Int_GetString(fData+i, &sArg1);
271 if(!sArg1) goto read2eol;
272 Log("[CFG ] Starting '%s' as a new task\n", sArg1);
276 Warning("Unknown configuration command, Line: '%s'", fData+i);
280 if(sArg1) free(sArg1);
281 if(sArg2) free(sArg2);
282 if(sArg3) free(sArg3);
284 while(i < fLen && fData[i] != '\n') i++;
291 * \fn int System_Int_GetString(char *Str, char **Dest)
292 * \brief Gets a string from another
294 * \param Str Input String
295 * \param Dest Pointer to output pointer
296 * \return Characters eaten from input
298 int System_Int_GetString(char *Str, char **Dest)
304 //LogF("GetString: (Str='%s', Dest=0x%x)\n", Str, Dest);
306 while(Str[pos] == ' ' || Str[pos] == '\t') pos++;
307 if(Str[pos] == '\n' || Str[pos] == '\0') {
317 while(Str[pos] != '"') pos++;
320 *Dest = malloc( len + 1 );
321 memcpy( *Dest, Str+start, len );
324 //LogF("GetString: RETURN *Dest = '%s'\n", *Dest);
330 // Non-Quoted String - Whitespace deliminated
332 while(Str[pos] != ' ' && Str[pos] != '\t' && Str[pos] != '\n') pos++;
335 //LogF(" GetString: len = %i\n", len);
336 *Dest = malloc( len + 1 );
337 memcpy( *Dest, Str+start, len );
340 //LogF("GetString: RETURN *Dest = '%s'\n", *Dest);