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

📄 options.c

📁 很小的linux下的upnp服务器端代码适合嵌入式系统
💻 C
字号:
/* $Id: options.c,v 1.11 2007/09/24 17:15:57 nanard Exp $ *//* MiniUPnP project * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * author: Ryan Wagoner * (c) 2006 Thomas Bernard  * This software is subject to the conditions detailed * in the LICENCE file provided within the distribution */#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>#include <syslog.h>#include "options.h"#include "upnppermissions.h"#include "upnpglobalvars.h"struct option * ary_options = NULL;int num_options = 0;static const struct {	enum upnpconfigoptions id;	const char * name;} optionids[] = {	{ UPNPEXT_IFNAME, "ext_ifname" },	{ UPNPEXT_IP,	"ext_ip" },	{ UPNPLISTENING_IP, "listening_ip" },	{ UPNPPORT, "port" },	{ UPNPBITRATE_UP, "bitrate_up" },	{ UPNPBITRATE_DOWN, "bitrate_down" },	{ UPNPPRESENTATIONURL, "presentation_url" },	{ UPNPNOTIFY_INTERVAL, "notify_interval" },	{ UPNPSYSTEM_UPTIME, "system_uptime" },	{ UPNPPACKET_LOG, "packet_log" },	{ UPNPUUID, "uuid"},	{ UPNPSERIAL, "serial"},	{ UPNPMODEL_NUMBER, "model_number"},	{ UPNPCLEANTHRESHOLD, "clean_ruleset_threshold"},	{ UPNPCLEANINTERVAL, "clean_ruleset_interval"}};intreadoptionsfile(const char * fname){	FILE *hfile = NULL;	char buffer[1024];	char *equals;	char *name;	char *value;	char *t;	int linenum = 0;	int i;	enum upnpconfigoptions id;	if(!fname || (strlen(fname) == 0))		return -1;	memset(buffer, 0, sizeof(buffer));#ifdef DEBUG	printf("Reading configuration from file %s\n", fname);#endif	if(!(hfile = fopen(fname, "r")))		return -1;	if(ary_options != NULL)	{		free(ary_options);		num_options = 0;	}	while(fgets(buffer, sizeof(buffer), hfile))	{		linenum++;		t = strchr(buffer, '\n'); 		if(t)		{			*t = '\0';			t--;			while(isspace(*t))			{				*t = '\0';				t--;			}		}       		/* skip leading whitespaces */		name = buffer;		while(isspace(*name))			name++;		/* check for comments or empty lines */		if(name[0] == '#' || name[0] == '\0') continue;		/* check for UPnP permissions rule */		if(0 == memcmp(name, "allow", 5) || 0 == memcmp(name, "deny", 4))		{			upnppermlist = realloc(upnppermlist,			                       sizeof(struct upnpperm) * (num_upnpperm+1));			/* parse the rule */			if(read_permission_line(upnppermlist + num_upnpperm, name) >= 0)			{				num_upnpperm++;			}			else			{				fprintf(stderr, "parsing error file %s line %d : %s\n",				        fname, linenum, name);			}			continue;		}		if(!(equals = strchr(name, '=')))		{			fprintf(stderr, "parsing error file %s line %d : %s\n",			        fname, linenum, name);			continue;		}		/* remove ending whitespaces */		for(t=equals-1; t>name && isspace(*t); t--)			*t = '\0';		*equals = '\0';		value = equals+1;		/* skip leading whitespaces */		while(isspace(*value))			value++;		id = UPNP_INVALID;		for(i=0; i<sizeof(optionids)/sizeof(optionids[0]); i++)		{			/*printf("%2d %2d %s %s\n", i, optionids[i].id, name,			       optionids[i].name); */			if(0 == strcmp(name, optionids[i].name))			{				id = optionids[i].id;				break;			}		}		if(id == UPNP_INVALID)		{			fprintf(stderr, "parsing error file %s line %d : %s=%s\n",			        fname, linenum, name, value);		}		else		{			num_options += 1;			ary_options = (struct option *) realloc(ary_options, num_options * sizeof(struct option));			ary_options[num_options-1].id = id;			strncpy(ary_options[num_options-1].value, value, MAX_OPTION_VALUE_LEN);		}	}		fclose(hfile);		return 0;}voidfreeoptions(void){	if(ary_options)	{		free(ary_options);		ary_options = NULL;		num_options = 0;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -