亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cli.c

?? unified configuration interface. small configuration library for programs written in c, can be used
?? C
字號:
/* * cli - Command Line Interface for the Unified Configuration Interface * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. */#include <strings.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include "uci.h"#define MAX_ARGS	4 /* max command line arguments for batch mode */static const char *delimiter = " ";static const char *appname;static enum {	CLI_FLAG_MERGE =    (1 << 0),	CLI_FLAG_QUIET =    (1 << 1),	CLI_FLAG_NOCOMMIT = (1 << 2),	CLI_FLAG_BATCH =    (1 << 3),	CLI_FLAG_SHOW_EXT = (1 << 4),} flags;static FILE *input;static struct uci_context *ctx;enum {	/* section cmds */	CMD_GET,	CMD_SET,	CMD_ADD_LIST,	CMD_DEL,	CMD_RENAME,	CMD_REVERT,	/* package cmds */	CMD_SHOW,	CMD_CHANGES,	CMD_EXPORT,	CMD_COMMIT,	/* other cmds */	CMD_ADD,	CMD_IMPORT,	CMD_HELP,};struct uci_type_list {	unsigned int idx;	const char *name;	struct uci_type_list *next;};static struct uci_type_list *type_list = NULL;static char *typestr = NULL;static const char *cur_section_ref = NULL;static int uci_cmd(int argc, char **argv);static voiduci_reset_typelist(void){	struct uci_type_list *type;	while (type_list != NULL) {			type = type_list;			type_list = type_list->next;			free(type);	}	if (typestr) {		free(typestr);		typestr = NULL;	}	cur_section_ref = NULL;}static char *uci_lookup_section_ref(struct uci_section *s){	struct uci_type_list *ti = type_list;	int maxlen;	if (!s->anonymous || !(flags & CLI_FLAG_SHOW_EXT))		return s->e.name;	/* look up in section type list */	while (ti) {		if (strcmp(ti->name, s->type) == 0)			break;		ti = ti->next;	}	if (!ti) {		ti = malloc(sizeof(struct uci_type_list));		memset(ti, 0, sizeof(struct uci_type_list));		ti->next = type_list;		type_list = ti;		ti->name = s->type;	}	maxlen = strlen(s->type) + 1 + 2 + 10;	if (!typestr) {		typestr = malloc(maxlen);	} else {		typestr = realloc(typestr, maxlen);	}	sprintf(typestr, "@%s[%d]", ti->name, ti->idx);	ti->idx++;	return typestr;}static void uci_usage(void){	fprintf(stderr,		"Usage: %s [<options>] <command> [<arguments>]\n\n"		"Commands:\n"		"\tbatch\n"		"\texport     [<config>]\n"		"\timport     [<config>]\n"		"\tchanges    [<config>]\n"		"\tcommit     [<config>]\n"		"\tadd        <config> <section-type>\n"		"\tadd_list   <config>.<section>.<option>=<string>\n"		"\tshow       [<config>[.<section>[.<option>]]]\n"		"\tget        <config>.<section>[.<option>]\n"		"\tset        <config>.<section>[.<option>]=<value>\n"		"\tdelete     <config>[.<section[.<option>]]\n"		"\trename     <config>.<section>[.<option>]=<name>\n"		"\trevert     <config>[.<section>[.<option>]]\n"		"\n"		"Options:\n"		"\t-c <path>  set the search path for config files (default: /etc/config)\n"		"\t-d <str>   set the delimiter for list values in uci show\n"		"\t-f <file>  use <file> as input instead of stdin\n"		"\t-m         when importing, merge data into an existing package\n"		"\t-n         name unnamed sections on export (default)\n"		"\t-N         don't name unnamed sections\n"		"\t-p <path>  add a search path for config change files\n"		"\t-P <path>  add a search path for config change files and use as default\n"		"\t-q         quiet mode (don't print error messages)\n"		"\t-s         force strict mode (stop on parser errors, default)\n"		"\t-S         disable strict mode\n"		"\t-X         do not use extended syntax on 'show'\n"		"\n",		appname	);}static void cli_perror(void){	if (flags & CLI_FLAG_QUIET)		return;	uci_perror(ctx, appname);}static void uci_show_value(struct uci_option *o){	struct uci_element *e;	bool sep = false;	switch(o->type) {	case UCI_TYPE_STRING:		printf("%s\n", o->v.string);		break;	case UCI_TYPE_LIST:		uci_foreach_element(&o->v.list, e) {			printf("%s%s", (sep ? delimiter : ""), e->name);			sep = true;		}		printf("\n");		break;	default:		printf("<unknown>\n");		break;	}}static void uci_show_option(struct uci_option *o){	printf("%s.%s.%s=",		o->section->package->e.name,		(cur_section_ref ? cur_section_ref : o->section->e.name),		o->e.name);	uci_show_value(o);}static void uci_show_section(struct uci_section *s){	struct uci_element *e;	const char *cname;	const char *sname;	cname = s->package->e.name;	sname = (cur_section_ref ? cur_section_ref : s->e.name);	printf("%s.%s=%s\n", cname, sname, s->type);	uci_foreach_element(&s->options, e) {		uci_show_option(uci_to_option(e));	}}static void uci_show_package(struct uci_package *p){	struct uci_element *e;	uci_reset_typelist();	uci_foreach_element( &p->sections, e) {		struct uci_section *s = uci_to_section(e);		cur_section_ref = uci_lookup_section_ref(s);		uci_show_section(s);	}	uci_reset_typelist();}static void uci_show_changes(struct uci_package *p){	struct uci_element *e;	uci_foreach_element(&p->saved_history, e) {		struct uci_history *h = uci_to_history(e);		char *prefix = "";		char *op = "=";		switch(h->cmd) {		case UCI_CMD_REMOVE:			prefix = "-";			break;		case UCI_CMD_LIST_ADD:			op = "+=";			break;		default:			break;		}		printf("%s%s.%s", prefix, p->e.name, h->section);		if (e->name)			printf(".%s", e->name);		if (h->cmd != UCI_CMD_REMOVE)			printf("%s%s", op, h->value);		printf("\n");	}}static int package_cmd(int cmd, char *tuple){	struct uci_element *e = NULL;	struct uci_ptr ptr;	if (uci_lookup_ptr(ctx, &ptr, tuple, true) != UCI_OK) {		cli_perror();		return 1;	}	e = ptr.last;	switch(cmd) {	case CMD_CHANGES:		uci_show_changes(ptr.p);		break;	case CMD_COMMIT:		if (flags & CLI_FLAG_NOCOMMIT)			return 0;		if (uci_commit(ctx, &ptr.p, false) != UCI_OK)			cli_perror();		break;	case CMD_EXPORT:		uci_export(ctx, stdout, ptr.p, true);		break;	case CMD_SHOW:		if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) {			ctx->err = UCI_ERR_NOTFOUND;			cli_perror();			return 1;		}		switch(e->type) {			case UCI_TYPE_PACKAGE:				uci_show_package(ptr.p);				break;			case UCI_TYPE_SECTION:				uci_show_section(ptr.s);				break;			case UCI_TYPE_OPTION:				uci_show_option(ptr.o);				break;			default:				/* should not happen */				return 1;		}		break;	}	uci_unload(ctx, ptr.p);	return 0;}static int uci_do_import(int argc, char **argv){	struct uci_package *package = NULL;	char *name = NULL;	int ret = UCI_OK;	bool merge = false;	if (argc > 2)		return 255;	if (argc == 2)		name = argv[1];	else if (flags & CLI_FLAG_MERGE)		/* need a package to merge */		return 255;	if (flags & CLI_FLAG_MERGE) {		if (uci_load(ctx, name, &package) != UCI_OK)			package = NULL;		else			merge = true;	}	ret = uci_import(ctx, input, name, &package, (name != NULL));	if (ret == UCI_OK) {		if (merge) {			ret = uci_save(ctx, package);		} else {			struct uci_element *e;			/* loop through all config sections and overwrite existing data */			uci_foreach_element(&ctx->root, e) {				struct uci_package *p = uci_to_package(e);				ret = uci_commit(ctx, &p, true);			}		}	}	if (ret != UCI_OK) {		cli_perror();		return 1;	}	return 0;}static int uci_do_package_cmd(int cmd, int argc, char **argv){	char **configs = NULL;	char **p;	if (argc > 2)		return 255;	if (argc == 2)		return package_cmd(cmd, argv[1]);	if ((uci_list_configs(ctx, &configs) != UCI_OK) || !configs) {		cli_perror();		return 1;	}	for (p = configs; *p; p++) {		package_cmd(cmd, *p);	}	return 0;}static int uci_do_add(int argc, char **argv){	struct uci_package *p = NULL;	struct uci_section *s = NULL;	int ret;	if (argc != 3)		return 255;	ret = uci_load(ctx, argv[1], &p);	if (ret != UCI_OK)		goto done;	ret = uci_add_section(ctx, p, argv[2], &s);	if (ret != UCI_OK)		goto done;	ret = uci_save(ctx, p);done:	if (ret != UCI_OK)		cli_perror();	else if (s)		fprintf(stdout, "%s\n", s->e.name);	return ret;}static int uci_do_section_cmd(int cmd, int argc, char **argv){	struct uci_element *e;	struct uci_ptr ptr;	int ret = UCI_OK;	if (argc != 2)		return 255;	if (uci_lookup_ptr(ctx, &ptr, argv[1], true) != UCI_OK) {		cli_perror();		return 1;	}	if (ptr.value && (cmd != CMD_SET) && (cmd != CMD_ADD_LIST) && (cmd != CMD_RENAME))		return 1;	e = ptr.last;	switch(cmd) {	case CMD_GET:		if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) {			ctx->err = UCI_ERR_NOTFOUND;			cli_perror();			return 1;		}		switch(e->type) {		case UCI_TYPE_SECTION:			printf("%s\n", ptr.s->type);			break;		case UCI_TYPE_OPTION:			uci_show_value(ptr.o);			break;		default:			break;		}		/* throw the value to stdout */		break;	case CMD_RENAME:		ret = uci_rename(ctx, &ptr);		break;	case CMD_REVERT:		ret = uci_revert(ctx, &ptr);		break;	case CMD_SET:		ret = uci_set(ctx, &ptr);		break;	case CMD_ADD_LIST:		ret = uci_add_list(ctx, &ptr);		break;	case CMD_DEL:		ret = uci_delete(ctx, &ptr);		break;	}	/* no save necessary for get */	if ((cmd == CMD_GET) || (cmd == CMD_REVERT))		return 0;	/* save changes, but don't commit them yet */	if (ret == UCI_OK)		ret = uci_save(ctx, ptr.p);	if (ret != UCI_OK) {		cli_perror();		return 1;	}	return 0;}static int uci_batch_cmd(void){	char *argv[MAX_ARGS];	char *str = NULL;	int ret = 0;	int i, j;	for(i = 0; i <= MAX_ARGS; i++) {		if (i == MAX_ARGS) {			fprintf(stderr, "Too many arguments\n");			return 1;		}		argv[i] = NULL;		if ((ret = uci_parse_argument(ctx, input, &str, &argv[i])) != UCI_OK) {			cli_perror();			i = 0;			break;		}		if (!argv[i][0])			break;		argv[i] = strdup(argv[i]);		if (!argv[i]) {			perror("uci");			return 1;		}	}	argv[i] = NULL;	if (i > 0) {		if (!strcasecmp(argv[0], "exit"))			return 254;		ret = uci_cmd(i, argv);	} else		return 0;	for (j = 0; j < i; j++) {		if (argv[j])			free(argv[j]);	}	return ret;}static int uci_batch(void){	int ret = 0;	flags |= CLI_FLAG_BATCH;	while (!feof(input)) {		struct uci_element *e, *tmp;		ret = uci_batch_cmd();		if (ret == 254)			return 0;		else if (ret == 255)			fprintf(stderr, "Unknown command\n");		/* clean up */		uci_foreach_element_safe(&ctx->root, tmp, e) {			uci_unload(ctx, uci_to_package(e));		}	}	flags &= ~CLI_FLAG_BATCH;	return 0;}static int uci_cmd(int argc, char **argv){	int cmd = 0;	if (!strcasecmp(argv[0], "batch") && !(flags & CLI_FLAG_BATCH))		return uci_batch();	else if (!strcasecmp(argv[0], "show"))		cmd = CMD_SHOW;	else if (!strcasecmp(argv[0], "changes"))		cmd = CMD_CHANGES;	else if (!strcasecmp(argv[0], "export"))		cmd = CMD_EXPORT;	else if (!strcasecmp(argv[0], "commit"))		cmd = CMD_COMMIT;	else if (!strcasecmp(argv[0], "get"))		cmd = CMD_GET;	else if (!strcasecmp(argv[0], "set"))		cmd = CMD_SET;	else if (!strcasecmp(argv[0], "ren") ||	         !strcasecmp(argv[0], "rename"))		cmd = CMD_RENAME;	else if (!strcasecmp(argv[0], "revert"))		cmd = CMD_REVERT;	else if (!strcasecmp(argv[0], "del") ||	         !strcasecmp(argv[0], "delete"))		cmd = CMD_DEL;	else if (!strcasecmp(argv[0], "import"))		cmd = CMD_IMPORT;	else if (!strcasecmp(argv[0], "help"))		cmd = CMD_HELP;	else if (!strcasecmp(argv[0], "add"))		cmd = CMD_ADD;	else if (!strcasecmp(argv[0], "add_list"))		cmd = CMD_ADD_LIST;	else		cmd = -1;	switch(cmd) {		case CMD_ADD_LIST:		case CMD_GET:		case CMD_SET:		case CMD_DEL:		case CMD_RENAME:		case CMD_REVERT:			return uci_do_section_cmd(cmd, argc, argv);		case CMD_SHOW:		case CMD_EXPORT:		case CMD_COMMIT:		case CMD_CHANGES:			return uci_do_package_cmd(cmd, argc, argv);		case CMD_IMPORT:			return uci_do_import(argc, argv);		case CMD_ADD:			return uci_do_add(argc, argv);		case CMD_HELP:			uci_usage();			return 0;		default:			return 255;	}}int main(int argc, char **argv){	int ret;	int c;	flags = CLI_FLAG_SHOW_EXT;	appname = argv[0];	input = stdin;	ctx = uci_alloc_context();	if (!ctx) {		fprintf(stderr, "Out of memory\n");		return 1;	}	while((c = getopt(argc, argv, "c:d:f:mnNp:P:sSqX")) != -1) {		switch(c) {			case 'c':				uci_set_confdir(ctx, optarg);				break;			case 'd':				delimiter = optarg;				break;			case 'f':				input = fopen(optarg, "r");				if (!input) {					perror("uci");					return 1;				}				break;			case 'm':				flags |= CLI_FLAG_MERGE;				break;			case 's':				ctx->flags |= UCI_FLAG_STRICT;				break;			case 'S':				ctx->flags &= ~UCI_FLAG_STRICT;				ctx->flags |= UCI_FLAG_PERROR;				break;			case 'n':				ctx->flags |= UCI_FLAG_EXPORT_NAME;				break;			case 'N':				ctx->flags &= ~UCI_FLAG_EXPORT_NAME;				break;			case 'p':				uci_add_history_path(ctx, optarg);				break;			case 'P':				uci_add_history_path(ctx, ctx->savedir);				uci_set_savedir(ctx, optarg);				flags |= CLI_FLAG_NOCOMMIT;				break;			case 'q':				flags |= CLI_FLAG_QUIET;				break;			case 'X':				flags &= ~CLI_FLAG_SHOW_EXT;				break;			default:				uci_usage();				return 0;		}	}	if (optind > 1)		argv[optind - 1] = argv[0];	argv += optind - 1;	argc -= optind - 1;	if (argc < 2) {		uci_usage();		return 0;	}	ret = uci_cmd(argc - 1, argv + 1);	if (input != stdin)		fclose(input);	if (ret == 255) {		uci_usage();		return 0;	}	uci_free_context(ctx);	return ret;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久久久香蕉网| 欧美精品丝袜久久久中文字幕| 久久亚洲精品国产精品紫薇| 国产真实乱偷精品视频免| 精品黑人一区二区三区久久| 国内成人精品2018免费看| 久久久久久久电影| 处破女av一区二区| 亚洲欧洲无码一区二区三区| 91久久香蕉国产日韩欧美9色| 一区二区三区精品久久久| 欧美日韩国产综合一区二区三区| 天天影视色香欲综合网老头| 91精品国产手机| 国产成人在线电影| 亚洲色图制服诱惑| 欧美群妇大交群的观看方式| 美女久久久精品| 中文一区一区三区高中清不卡| 91麻豆成人久久精品二区三区| 亚洲国产cao| 精品久久久久一区| 一本大道久久a久久综合婷婷| 亚洲18色成人| 国产日韩一级二级三级| 一本到不卡精品视频在线观看 | 久久久精品国产免大香伊| 丁香激情综合五月| 亚洲一区二区三区国产| 精品国产1区二区| 色域天天综合网| 国内精品视频一区二区三区八戒| √…a在线天堂一区| 日韩一区二区在线播放| 不卡一区二区在线| 免费高清在线视频一区·| 国产精品网曝门| 日韩免费在线观看| 日本高清无吗v一区| 国产精品一区2区| 午夜精品在线看| ...xxx性欧美| 久久综合狠狠综合久久激情| 欧美无砖专区一中文字| 国产91在线|亚洲| 日本成人在线电影网| 亚洲人成网站影音先锋播放| 欧美大片在线观看| 欧美日韩一区不卡| caoporen国产精品视频| 韩国精品主播一区二区在线观看| 亚洲制服丝袜av| 中文字幕在线不卡一区二区三区| 欧美成人一区二区三区在线观看 | 亚洲一区二区三区四区在线免费观看 | 国产精品久久久久三级| 日韩女优av电影| 欧美人体做爰大胆视频| 99精品视频在线播放观看| 国产麻豆日韩欧美久久| 蜜臀a∨国产成人精品| 亚洲国产精品麻豆| 亚洲日本护士毛茸茸| 欧美激情一区二区三区不卡| 精品国产一区二区三区av性色| 精品视频1区2区3区| 91精品福利在线| 色婷婷精品久久二区二区蜜臂av | 欧美一区二区成人| 欧美美女网站色| 欧美日韩成人综合天天影院| 91小视频在线免费看| 99精品视频一区二区三区| 成+人+亚洲+综合天堂| 成人av电影免费观看| 成人一道本在线| 成人h动漫精品| 99久久久国产精品| 色一情一伦一子一伦一区| 一本到不卡精品视频在线观看| 91亚洲精品乱码久久久久久蜜桃 | 一区二区三区国产| 亚洲另类在线视频| 一区二区三区加勒比av| 亚洲国产日产av| 日韩中文字幕av电影| 蜜桃视频一区二区| 国内精品不卡在线| 国产69精品久久久久毛片| 丁香激情综合五月| 91麻豆123| 欧美久久一二区| 日韩午夜激情视频| 国产亚洲综合在线| 亚洲欧洲一区二区在线播放| 一区二区视频在线| 亚洲午夜精品在线| 麻豆传媒一区二区三区| 国产一区二区三区美女| 成人精品视频一区二区三区| 91网站视频在线观看| 日本大香伊一区二区三区| 91精品国产美女浴室洗澡无遮挡| 欧美www视频| 国产精品美女视频| 亚洲一级二级在线| 国产一区激情在线| 99久久精品国产网站| 欧美日韩激情一区二区| 亚洲精品一线二线三线无人区| 国产精品私房写真福利视频| 亚洲精品乱码久久久久久| 日本视频中文字幕一区二区三区| 国产精品一区三区| 91久久久免费一区二区| 欧美videossexotv100| 国产精品成人免费| 日本欧美大码aⅴ在线播放| 丁香一区二区三区| 欧美群妇大交群中文字幕| 国产亚洲综合在线| 五月天激情小说综合| 岛国精品在线播放| 日韩一区二区三区电影在线观看 | xnxx国产精品| 成人欧美一区二区三区黑人麻豆| 日韩国产一区二| av不卡免费电影| 精品久久久久久无| 亚洲欧美另类图片小说| 狠狠色狠狠色综合日日91app| 91在线视频网址| 久久综合久久99| 视频一区免费在线观看| 不卡一二三区首页| 精品国产成人系列| 午夜天堂影视香蕉久久| 99热99精品| 国产调教视频一区| 久久精品国产一区二区三| 91黄色激情网站| 国产精品动漫网站| 国产乱子轮精品视频| 欧美午夜精品久久久久久孕妇| 欧美极品美女视频| 久久99精品久久只有精品| 欧美日韩一卡二卡三卡| 亚洲狼人国产精品| 成人动漫精品一区二区| 久久女同互慰一区二区三区| 日韩高清不卡在线| 欧美日韩日本视频| 亚洲精品乱码久久久久久久久| 成人午夜视频免费看| 久久久久国产精品人| 美女免费视频一区二区| 欧美一区日韩一区| 亚洲成人高清在线| 欧美三级电影一区| 亚洲午夜在线视频| 欧美系列亚洲系列| 一卡二卡欧美日韩| 在线亚洲一区二区| 一区二区视频免费在线观看| 色偷偷成人一区二区三区91| 亚洲欧洲日韩综合一区二区| 成人a级免费电影| 中文字幕电影一区| 99免费精品在线观看| 中文字幕中文字幕一区| 99麻豆久久久国产精品免费优播| 国产精品每日更新在线播放网址| 国产激情视频一区二区三区欧美 | 日韩欧美电影在线| 久久国内精品视频| 精品久久久影院| 国产精品亚洲成人| 国产精品久久久久久亚洲伦| 成人国产亚洲欧美成人综合网 | 色爱区综合激月婷婷| 一区二区欧美精品| 在线成人av影院| 麻豆成人91精品二区三区| 精品国产伦理网| 成人av午夜影院| 亚洲欧美国产77777| 欧美亚洲一区二区在线| 日日夜夜免费精品视频| 欧美一区二区三区人| 国产一区二区日韩精品| 国产精品另类一区| 91国模大尺度私拍在线视频| 午夜精品久久久久久久久久久 | 国产精品久久国产精麻豆99网站| 日韩视频免费直播| 91色婷婷久久久久合中文| 热久久免费视频| 精品国产一区二区精华| 日本视频在线一区| 亚洲美女淫视频|