#include <stdlib.h> #include <string.h> #include <os/os.h> #include <os/filesys.h> #include <ctype.h> #include <stdio.h> #include "config.h" config_t cfg_builtin = { NULL, NULL, L"System Default", config_t::dispText, 5000 }; config_t *cfg_current = &cfg_builtin, *cfg_first = &cfg_builtin, *cfg_last; void ProcessKernelRcLine(const wchar_t* line, const wchar_t* setting, config_t* cfg) { wprintf(L"[%s] %s = %s\n", cfg->name, line, setting); if (wcscmp(line, L"display") == 0) { if (wcsicmp(setting, L"gui") == 0) cfg->display = config_t::dispGui; else cfg->display = config_t::dispText; } else if (wcscmp(line, L"timeout") == 0) cfg->timeout = wcstol(setting, NULL, 10); } bool ProcessKernelRcSection(IStream* strm, config_t* cfg) { char ch; wchar_t line[256], *buf, *setting; bool comment = false; buf = line; while (strm->Read(&ch, sizeof(ch))) { switch (ch) { case '\r': break; case '\n': *buf = '\0'; buf = wcschr(line, '#'); if (buf) *buf = '\0'; if (*line) { setting = wcschr(line, '='); if (setting) { *setting = '\0'; setting++; } else setting = L"1"; for (buf = line; *buf; buf++) if (iswupper(*buf)) *buf = towlower(*buf); ProcessKernelRcLine(line, setting, cfg); } buf = line; comment = false; break; case '#': comment = true; default: if (buf < line + countof(line)) { *buf = ch; buf++; } break; case '[': if (!comment) return true; } } return false; } void ProcessKernelRc() { IStream* strm; wchar_t line[256], *buf; char ch; config_t *cfg, common; bool finished = false, has_common = false; strm = (IStream*) fsOpen(L"/boot/kernelrc", IID_IStream); if (!strm) return; strm->SetIoMode(ioAnsi); //finished = !ProcessKernelRcSection(strm, &config); buf = line; while (!finished && strm->Read(&ch, sizeof(ch))) { switch (ch) { case '\r': case '[': case ']': break; case '\n': *buf = '\0'; buf = wcschr(line, '#'); if (buf) *buf = '\0'; buf = line; if (line[0]) { if (!has_common) { //memset(&common, 0, sizeof(common)); common = cfg_builtin; wcscpy(common.name, line); if (!ProcessKernelRcSection(strm, &common)) finished = true; has_common = true; } else { cfg = (config_t*) malloc(sizeof(config_t)); *cfg = common; wcsncpy(cfg->name, line, countof(cfg->name)); cfg->next = NULL; cfg->prev = cfg_last; if (cfg_last) cfg_last->next = cfg; if (cfg_first == NULL) cfg_current = cfg_first = cfg; cfg_last = cfg; if (!ProcessKernelRcSection(strm, cfg)) finished = true; } } break; default: if (buf < line + countof(line)) { *buf = ch; buf++; } break; } } strm->Release(); }