⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfg.c

📁 LINUX lilo-22.7.1 源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* cfg.c  -  Configuration file parser *//*Copyright 1992-1997 Werner Almesberger.Copyright 1999-2005 John Coffman.All rights reserved.Licensed under the terms contained in the file 'COPYING' in the source directory.*/#define _GNU_SOURCE#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 },#ifdef LCF_VIRTUAL  { cft_strg, "vmdefault",	NULL,		NULL,NULL },#endif#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 },#ifdef LCF_VIRTUAL  { cft_flag, "vmdisable",	NULL,		NULL,NULL },  { cft_flag, "vmwarn",		NULL,		NULL,NULL },#endif  { 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 + -