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

📄 ip_filter.c

📁 API
💻 C
字号:
/*=============================================================
功能: 		
作者:		
王永忠:2001/03/29:规范程序设计
王永忠:	2001/09/26:修改$(WORKDIR)/etc/IP_FILTER为以联行技术表的
	方式存储. 以便在网间处理时不再查询数据库系统, 并且不需要
	人工维护该文件.
===============================================================*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "all.h"
#ifdef wyz_mod_010926
#else
#include "db_struct_c.h"
#endif

/***************************************************************
功能:
在地址配置文件中查询指定IP地址是否存在
ENTRY:
	IP地址
RETURN:
	-1	FAIL
	>=0	FOUND
	1-- NAS6.0 OR above
	2-- NAS5.x
	-2	NOT FOUND
****************************************************************/
int ip_filter ( struct in_addr sin_addr )
{
FILE *fp;
char path[128];

#ifdef wyz_mod_010926
struct in_addr sin_addr2;
#else
S_bank_base	t_bnk_base;
struct in_addr sin_addr1;
struct in_addr sin_addr2;
#endif

	sprintf ( path , "%s/etc/IP_FILTER" , getenv("WORKDIR") );
	
	if ( ( fp = fopen ( path , "r" ) ) == NULL ) {
//		errcall ( ERROR , "Unable open etc/IP_FILTER !" );
		return -1;
	}

	while ( !feof(fp) ) {
#ifdef wyz_mod_010926
		fscanf ( fp , "%s\n" , path );
	
		inet_aton ( path , &sin_addr2 );	
		if ( !memcmp ( &sin_addr, &sin_addr2, sizeof(struct in_addr)) ) {
			fclose ( fp );
			return 0;
		}
#else
		fread (&t_bnk_base, sizeof(S_bank_base), 1, fp);

		inet_aton ( t_bnk_base.tran_ip_addr1, &sin_addr1 );
		inet_aton ( t_bnk_base.tran_ip_addr2, &sin_addr2 );

		if ( !memcmp(&sin_addr, &sin_addr1, sizeof(struct in_addr)) ||
		     !memcmp(&sin_addr, &sin_addr2, sizeof(struct in_addr))){
			fclose ( fp );
			if (memcmp(t_bnk_base.nas_version, "060", 3)>=0) 
				return 1;
			else
				return 2;
		}
#endif
	}

	fclose ( fp );
	return -2;
}

/***************************************************************
功能:
根据socket ID 取socket地址,在配置文件中查找

ENTRY:
	socket ID
RETURN:
	-1	FAIL
	>0	FOUND
	1-- NAS6.0 OR above
	2-- NAS5.x
	-2	NOT FOUND
****************************************************************/
int sock_filter ( int sock  )
{
struct sockaddr_in sin;
int namelen;
	
	namelen=sizeof(struct sockaddr_in);
	
	if ( getpeername ( sock , (struct sockaddr *)&sin , &namelen ) < 0 ) {
		errcall ( ERROR , "Unable getpeername !" );
		return -1;
	}

	if ( sin.sin_family != AF_INET ) {
		errcall ( ERROR , "getpeername's sa_family isn't AF_INET" );
		return -1;
	}
	
	return ip_filter ( sin.sin_addr );
}

⌨️ 快捷键说明

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