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

📄 upnppermissions.c

📁 很小的linux下的upnp服务器端代码适合嵌入式系统
💻 C
字号:
/* $Id: upnppermissions.c,v 1.12 2007/10/24 17:34:17 nanard Exp $ *//* MiniUPnP project * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * (c) 2006 Thomas Bernard * This software is subject to the conditions detailed * in the LICENCE file provided within the distribution */#include <ctype.h>#include <string.h>#include <stdlib.h>#include <stdio.h>#include <syslog.h>#include <arpa/inet.h>#include <unistd.h>#include "config.h"#include "upnppermissions.h"intread_permission_line(struct upnpperm * perm,                     char * p){	char * q;	int n_bits;	/* first token: (allow|deny) */	while(isspace(*p))		p++;	if(0 == memcmp(p, "allow", 5))	{		perm->type = UPNPPERM_ALLOW;		p += 5;	}	else if(0 == memcmp(p, "deny", 4))	{		perm->type = UPNPPERM_DENY;		p += 4;	}	else	{		return -1;	}	/* second token: eport or eport_min-eport_max */	while(isspace(*p))		p++;	if(!isdigit(*p))		return -1;	for(q = p; isdigit(*q); q++);	if(*q=='-')	{		*q = '\0';		perm->eport_min = (u_short)atoi(p);		q++;		p = q;		while(isdigit(*q))			q++;		*q = '\0';		perm->eport_max = (u_short)atoi(p);	}	else	{		*q = '\0';		perm->eport_min = perm->eport_max = (u_short)atoi(p);	}	p = q + 1;	while(isspace(*p))		p++;	/* third token:  ip/mask */	if(!isdigit(*p))		return -1;	for(q = p; isdigit(*q) || (*q == '.'); q++);	if(*q=='/')	{		*q = '\0';		if(!inet_aton(p, &perm->address))			return -1;		q++;		p = q;		while(isdigit(*q))			q++;		*q = '\0';		n_bits = atoi(p);		perm->mask.s_addr = htonl(n_bits ? (0xffffffff << (32 - n_bits)) : 0);	}	else	{		*q = '\0';		if(!inet_aton(p, &perm->address))			return -1;		perm->mask.s_addr = 0xffffffff;	}	p = q + 1;	/* fourth token: iport or iport_min-iport_max */	while(isspace(*p))		p++;	if(!isdigit(*p))		return -1;	for(q = p; isdigit(*q); q++);	if(*q=='-')	{		*q = '\0';		perm->iport_min = (u_short)atoi(p);		q++;		p = q;		while(isdigit(*q))			q++;		*q = '\0';		perm->iport_max = (u_short)atoi(p);	}	else	{		*q = '\0';		perm->iport_min = perm->iport_max = (u_short)atoi(p);	}#ifdef DEBUG	printf("perm rule added : %s %hu-%hu %08x/%08x %hu-%hu\n",	       (perm->type==UPNPPERM_ALLOW)?"allow":"deny",	       perm->eport_min, perm->eport_max, ntohl(perm->address.s_addr),	       ntohl(perm->mask.s_addr), perm->iport_min, perm->iport_max);#endif	return 0;}#ifdef USE_MINIUPNPDCTLvoidwrite_permlist(int fd, const struct upnpperm * permary,               int nperms){	int l;	const struct upnpperm * perm;	int i;	char buf[128];	for(i = 0; i<nperms; i++)	{		perm = permary + i;		l = snprintf(buf, sizeof(buf), "%02d %s %hu-%hu %08x/%08x %hu-%hu\n",	       i,    	   (perm->type==UPNPPERM_ALLOW)?"allow":"deny",	       perm->eport_min, perm->eport_max, ntohl(perm->address.s_addr),	       ntohl(perm->mask.s_addr), perm->iport_min, perm->iport_max);		if(l<0)			return;		write(fd, buf, l);	}}#endif/* match_permission() * returns: 1 if eport, address, iport matches the permission rule *          0 if no match */static intmatch_permission(const struct upnpperm * perm,                 u_short eport, struct in_addr address, u_short iport){	if( (eport < perm->eport_min) || (perm->eport_max < eport))		return 0;	if( (iport < perm->iport_min) || (perm->iport_max < iport))		return 0;	if( (address.s_addr & perm->mask.s_addr)	   != (perm->address.s_addr & perm->mask.s_addr) )		return 0;	return 1;}intcheck_upnp_rule_against_permissions(const struct upnpperm * permary,                                    int n_perms,                                    u_short eport, struct in_addr address,                                    u_short iport){	int i;	for(i=0; i<n_perms; i++)	{		if(match_permission(permary + i, eport, address, iport))		{			syslog(LOG_DEBUG,			       "UPnP permission rule %d matched : port mapping %s",			       i, (permary[i].type == UPNPPERM_ALLOW)?"accepted":"rejected"			       );			return (permary[i].type == UPNPPERM_ALLOW);		}	}	syslog(LOG_DEBUG, "no permission rule matched : accept by default (n_perms=%d)", n_perms);	return 1;	/* Default : accept */}

⌨️ 快捷键说明

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