📄 cfg.c
字号:
/* cfg.c - Configuration file parser *//*Copyright 1992-1997 Werner Almesberger.Copyright 1999-2004 John Coffman.All rights reserved.Licensed under the terms contained in the file 'COPYING' in the source directory.*/#define _GNU_SOURCE#include <sys/stat.h>#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <errno.h>#include <stdarg.h>#include <ctype.h>#include <string.h>#include "lilo.h"#include "common.h"#include "temp.h"#include "cfg.h"#define NEW_PARSE !__MSDOS__#define MAX_VAR_NAME MAX_TOKEN#if !__MSDOS__extern void do_image(void);extern void do_other(void);extern void do_disk(void);extern void do_partition(void);extern void id_image(void);extern void id_other(void);extern void do_map_drive(void);extern void do_cr(void);extern void do_change(void);extern void do_cr_type(void);extern void do_cr_reset(void);extern void do_cr_part(void);extern void do_cr_auto(void);CONFIG cf_top[] = { { cft_strg, "image", do_image, NULL,NULL }, { cft_strg, "other", do_other, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_identify[] = { { cft_strg, "image", id_image, NULL,NULL }, { cft_strg, "other", id_other, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};#endif /* !__MSDOS__ */CONFIG cf_options[] = {#if !__MSDOS__ { cft_strg, "append", NULL, NULL,NULL },/*#ifdef LCF_ATARAID*/#if 0 { cft_flag, "ataraid", NULL, NULL,NULL },#endif { cft_strg, "backup", NULL, NULL,NULL }, { cft_strg, "bios-passes-dl", NULL, NULL,NULL }, { cft_strg, "bitmap", NULL, NULL,NULL }, { cft_strg, "bmp-colors", NULL, NULL,NULL }, { cft_flag, "bmp-retain", NULL, NULL,NULL }, { cft_strg, "bmp-table", NULL, NULL,NULL }, { cft_strg, "bmp-timer", NULL, NULL,NULL }, { cft_strg, "boot", NULL, NULL,NULL }, { cft_strg, "boot-as", NULL, NULL,NULL }, { cft_flag, "change-rules", do_cr, NULL,NULL }, { cft_flag, "compact", NULL, NULL,NULL }, { cft_strg, "default", NULL, NULL,NULL }, { cft_strg, "delay", NULL, NULL,NULL }, { cft_strg, "disk", do_disk, NULL,NULL }, { cft_strg, "disktab", NULL, NULL,NULL }, { cft_flag, "el-torito-bootable-cd", NULL, NULL,NULL }, { cft_strg, "fallback", NULL, NULL,NULL }, { cft_flag, "fix-table", NULL, NULL,NULL }, { cft_strg, "force-backup", NULL, NULL,NULL }, { cft_flag, "geometric", NULL, NULL,NULL }, { cft_flag, "ignore-table", NULL, NULL,NULL }, { cft_strg, "initrd", NULL, NULL,NULL }, { cft_strg, "install", NULL, NULL,NULL }, { cft_strg, "keytable", NULL, NULL,NULL }, { cft_flag, "large-memory", NULL, NULL,NULL }, { cft_flag, "lba32", NULL, NULL,NULL }, { cft_flag, "linear", NULL, NULL,NULL }, { cft_strg, "loader", NULL, NULL,NULL }, { cft_flag, "lock", NULL, NULL,NULL }, { cft_flag, "mandatory", NULL, NULL,NULL },#endif /* !__MSDOS__ */ { cft_strg, "map", NULL, NULL,NULL },#if !__MSDOS__ { cft_flag, "master-boot", NULL, NULL,NULL }, { cft_strg, "menu-scheme", NULL, NULL,NULL }, { cft_strg, "menu-title", NULL, NULL,NULL }, { cft_strg, "message", NULL, NULL,NULL }, { cft_flag, "nowarn", NULL, NULL,NULL }, { cft_flag, "optional", NULL, NULL,NULL }, { cft_strg, "password", NULL, NULL,NULL }, { cft_flag, "prompt", NULL, NULL,NULL }, { cft_strg, RAID_EXTRA_BOOT, NULL, NULL,NULL }, { cft_strg, "ramdisk", NULL, NULL,NULL }, { cft_flag, "read-only", NULL, NULL,NULL }, { cft_flag, "read-write", NULL, NULL,NULL }, { cft_flag, "restricted", NULL, NULL,NULL }, { cft_strg, "root", NULL, NULL,NULL }, { cft_strg, "serial", NULL, NULL,NULL }, { cft_flag, "single-key", NULL, NULL,NULL }, { cft_flag, "static-bios-codes", NULL, NULL,NULL }, { cft_flag, "suppress-boot-time-BIOS-data", NULL, NULL,NULL }, { cft_strg, "timeout", NULL, NULL,NULL }, { cft_flag, "unattended", NULL, NULL,NULL }, { cft_strg, "verbose", NULL, NULL,NULL }, { cft_strg, "vga", NULL, NULL,NULL }, { cft_strg, "vmdefault", NULL, NULL,NULL },#endif /* !__MSDOS__ */ { cft_end, NULL, NULL, NULL,NULL }};#if !__MSDOS__CONFIG cf_all[] = { { cft_strg, "alias", NULL, NULL,NULL }, { cft_flag, "bmp-retain", NULL, NULL,NULL }, { cft_flag, "bypass", NULL, NULL,NULL }, { cft_strg, "fallback", NULL, NULL,NULL }, { cft_strg, "label", NULL, NULL,NULL }, { cft_strg, "literal", NULL, NULL,NULL }, { cft_flag, "lock", NULL, NULL,NULL }, { cft_flag, "mandatory", NULL, NULL,NULL }, { cft_flag, "optional", NULL, NULL,NULL }, { cft_strg, "password", NULL, NULL,NULL }, { cft_flag, "restricted", NULL, NULL,NULL }, { cft_flag, "single-key", NULL, NULL,NULL }, { cft_flag, "vmdisable", NULL, NULL,NULL }, { cft_flag, "vmwarn", NULL, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_kernel[] = { { cft_strg, "addappend", NULL, NULL,NULL }, { cft_strg, "append", NULL, NULL,NULL }, { cft_strg, "initrd", NULL, NULL,NULL }, { cft_strg, "ramdisk", NULL, NULL,NULL }, { cft_flag, "read-only", NULL, NULL,NULL }, { cft_flag, "read-write", NULL, NULL,NULL }, { cft_strg, "root", NULL, NULL,NULL }, { cft_strg, "vga", NULL, NULL,NULL }, { cft_link, NULL, &cf_all, NULL,NULL }};CONFIG cf_image[] = { { cft_strg, "range", NULL, NULL,NULL }, { cft_link, NULL, &cf_kernel, NULL,NULL }};CONFIG cf_other[] = { { cft_strg, "boot-as", NULL, NULL,NULL }, { cft_flag, "change", do_change, NULL,NULL }, { cft_strg, "loader", NULL, NULL,NULL }, { cft_strg, "map-drive", do_map_drive, NULL,NULL }, { cft_flag, "master-boot", NULL, NULL,NULL }, { cft_strg, "table", NULL, NULL,NULL }, { cft_flag, "unsafe", NULL, NULL,NULL }, { cft_link, NULL, &cf_all, NULL,NULL }};CONFIG cf_disk[] = { { cft_strg, "bios", NULL, NULL,NULL }, { cft_strg, "cylinders", NULL, NULL,NULL }, { cft_strg, "heads", NULL, NULL,NULL }, { cft_flag, "inaccessible", NULL, NULL,NULL }, { cft_strg, "max-partitions", NULL, NULL,NULL }, { cft_strg, "sectors", NULL, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_partitions[] = { { cft_strg, "partition", do_partition, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_partition[] = { { cft_strg, "start", NULL, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_map_drive[] = { { cft_strg, "to", NULL, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_change_rules[] = { { cft_flag, "reset", do_cr_reset, NULL,NULL }, { cft_strg, "type", do_cr_type, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_change_rule[] = { { cft_strg, "hidden", NULL, NULL,NULL }, { cft_strg, "normal", NULL, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_change[] = { { cft_flag, "automatic", do_cr_auto, NULL,NULL }, { cft_strg, "partition", do_cr_part, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_change_dsc[] = { { cft_flag, "activate", NULL, NULL,NULL }, { cft_flag, "deactivate", NULL, NULL,NULL }, { cft_strg, "set", NULL, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};CONFIG cf_bitmap[] = { { cft_strg, "bitmap", NULL, NULL,NULL }, { cft_strg, "bmp-colors", NULL, NULL,NULL }, { cft_strg, "bmp-table", NULL, NULL,NULL }, { cft_strg, "bmp-timer", NULL, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL }};#endif /* !__MSDOS__ */#if NEW_PARSEstatic CONFIG *keywords[] = {cf_top, cf_identify, cf_options, cf_all, cf_kernel, cf_image, cf_other, cf_disk, cf_partitions, cf_partition, cf_map_drive, cf_change_rules, cf_change_rule, cf_change, cf_change_dsc, cf_bitmap, NULL };#endif static FILE *file;static char flag_set;static char *last_token = NULL,*last_item = NULL,*last_value = NULL;static int line_num;static char *file_name = NULL;static int back = 0; /* can go back by one char */int cfg_open(char *name){ line_num = 1; if (!strcmp(name,"-")) file = stdin;#if __MSDOS__ else if (!strcasecmp(name,"none")) return -1;#endif /* __MSDOS__ */ else if (!(file = fopen(file_name = name,"r"))) {#if !__MSDOS__ die("Cannot open: %s", name);#else /* __MSDOS__ */ fprintf(errstd,"No configuration file: %s\n", name); return -1;#endif /* __MSDOS__ */ } return fileno(file);}void cfg_error(char *msg,...){ va_list ap; fflush(stdout); va_start(ap,msg); vfprintf(errstd,msg,ap); va_end(ap); if (!file_name) fputc('\n',errstd); else fprintf(errstd," at or above line %d in file '%s'\n",line_num,file_name); exit(1);}static int next_raw(void){ int ch; if (!back) return getc(file); ch = back; back = 0; return ch;}static int next(void){ static char *var; char buffer[MAX_VAR_NAME+1]; int ch,braced; char *put; if (back) { ch = back; back = 0; return ch; } if (var && *var) return *var++; ch = getc(file); if (ch == '\r') /* strip DOS <cr> */ ch = getc(file); if (ch == '\\') { ch = getc(file); if (ch == '$') return ch; ungetc(ch,file); return '\\'; } if (ch != '$') return ch; ch = getc(file); braced = ch == '{'; put = buffer; if (!braced) *put++ = ch; while (1) { ch = getc(file);#if 0 if (!braced && ch < ' ') { ungetc(ch,file); break; }#endif if (ch == EOF) cfg_error("EOF in variable name"); if (ch < ' ') cfg_error("control character in variable name"); if (braced && ch == '}') break; if (!braced && !isalpha(ch) && !isdigit(ch) && ch != '_') { ungetc(ch,file); break; } if (put-buffer == MAX_VAR_NAME) cfg_error("variable name too long"); *put++ = ch; } *put = 0;#if !__MSDOS__ if (!(var = getenv(buffer))) cfg_error("unknown variable \"%s\"",buffer);#endif /* !__MSDOS__ */ return next();}static void again(int ch){ if (back) die("internal error: again invoked twice"); back = ch;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -