Esempio n. 1
0
sa_family_t AddressList_ConvertToAddressFromString(struct _Address *Out, const char *Addr_Port, int DefaultPort)
{
	sa_family_t	Family;

	memset(Out, 0, sizeof(struct _Address));

	Family = GetAddressFamily(Addr_Port);
	Out -> family = Family;

	switch( Family )
	{
		case AF_INET6:
			{
				char		Addr[LENGTH_OF_IPV6_ADDRESS_ASCII] = {0};
				in_port_t	Port;
				const char	*PortPos;

				memset(Addr, 0, sizeof(Addr));

				PortPos = strchr(Addr_Port, ']');
				if( PortPos == NULL )
				{
					return -1;
				}

				PortPos = strchr(PortPos, ':');
				if( PortPos == NULL )
				{
					sscanf(Addr_Port, "[%s]", Addr);
					Port = DefaultPort;
				} else {
					int	Port_warpper;

					sscanf(Addr_Port + 1, "%[^]]", Addr);
					sscanf(PortPos + 1, "%d", &Port_warpper);
					Port = Port_warpper;
				}

				Out -> Addr.Addr6.sin6_family = Family;
				Out -> Addr.Addr6.sin6_port = htons(Port);

				IPv6AddressToNum(Addr, &(Out -> Addr.Addr6.sin6_addr));

				return AF_INET6;
			}
			break;

		case AF_INET:
			{
				char		Addr[] = "xxx.xxx.xxx.xxx";
				in_port_t	Port;
				const char	*PortPos;

				memset(Addr, 0, sizeof(Addr));

				PortPos = strchr(Addr_Port, ':');
				if( PortPos == NULL )
				{
					sscanf(Addr_Port, "%s", Addr);
					Port = DefaultPort;
				} else {
					int Port_warpper;
					sscanf(Addr_Port, "%[^:]", Addr);
					sscanf(PortPos + 1, "%d", &Port_warpper);
					Port = Port_warpper;
				}
				FILL_ADDR4(Out -> Addr.Addr4, Family, Addr, Port);

				return AF_INET;
			}
			break;

		default:
			return AF_UNSPEC;
			break;
	}
}
Esempio n. 2
0
/* Functions */
int QueryDNSListenTCPInit(void)
{
	static struct _Address	ListenAddr;

	const char	*LocalAddr = ConfigGetString(&ConfigInfo, "LocalInterface");
	int			LocalPort = ConfigGetInt32(&ConfigInfo, "LocalPort");

	int			AddrLen;

	Family = GetAddressFamily(LocalAddr);

	ListenSocketTCP = socket(Family, SOCK_STREAM, IPPROTO_TCP);
	if(ListenSocketTCP == INVALID_SOCKET)
	{
		int		ErrorNum = GET_LAST_ERROR();
		char	ErrorMessage[320];
		ErrorMessage[0] = '\0';

		GetErrorMsg(ErrorNum, ErrorMessage, sizeof(ErrorMessage));

		ERRORMSG("Creating TCP socket failed. %d : %s\n", ErrorNum, ErrorMessage);
		return -1;
	}

	memset(&ListenAddr, 0, sizeof(ListenAddr));

	if( Family == AF_INET )
	{
		FILL_ADDR4(ListenAddr.Addr.Addr4, AF_INET, LocalAddr, LocalPort);

		AddrLen = sizeof(struct sockaddr);
	} else {
		char Addr[LENGTH_OF_IPV6_ADDRESS_ASCII] = {0};

		sscanf(LocalAddr, "[%s]", Addr);

		ListenAddr.Addr.Addr6.sin6_family = Family;
		ListenAddr.Addr.Addr6.sin6_port = htons(LocalPort);
		IPv6AddressToNum(Addr, &(ListenAddr.Addr.Addr6.sin6_addr));

		AddrLen = sizeof(struct sockaddr_in6);
	}

	if(	bind(ListenSocketTCP, (struct sockaddr*)&(ListenAddr.Addr), AddrLen) != 0 )
	{
		int		ErrorNum = GET_LAST_ERROR();
		char	ErrorMessage[320];
		ErrorMessage[0] = '\0';

		GetErrorMsg(ErrorNum, ErrorMessage, sizeof(ErrorMessage));

		ERRORMSG("Opening TCP socket failed. %d : %s\n", ErrorNum, ErrorMessage);
		return -2;
	}

	if( listen(ListenSocketTCP, 16) == SOCKET_ERROR )
	{
		int		ErrorNum = GET_LAST_ERROR();
		char	ErrorMessage[320];
		ErrorMessage[0] = '\0';

		GetErrorMsg(ErrorNum, ErrorMessage, sizeof(ErrorMessage));

		ERRORMSG("Opening TCP socket failed. %d : %s\n", ErrorNum, ErrorMessage);
		return -3;
	}

	Inited = TRUE;

	return 0;
}
Esempio n. 3
0
/* Functions */
int QueryDNSListenUDPInit(ConfigFileInfo *ConfigInfo)
{
	CompatibleAddr ListenAddr;

	const char	*LocalAddr = ConfigGetRawString(ConfigInfo, "LocalInterface");

	int			LocalPort = ConfigGetInt32(ConfigInfo, "LocalPort");

	int			AddrLen;

	RefusingResponseCode = ConfigGetInt32(ConfigInfo, "RefusingResponseCode");

	Family = GetAddressFamily(LocalAddr);

	ListenSocketUDP = socket(Family, SOCK_DGRAM, IPPROTO_UDP);

	if(ListenSocketUDP == INVALID_SOCKET)
	{
		int		ErrorNum = GET_LAST_ERROR();
		char	ErrorMessage[320];
		ErrorMessage[0] = '\0';

		GetErrorMsg(ErrorNum, ErrorMessage, sizeof(ErrorMessage));

		ERRORMSG("Creating UDP socket failed. %d : %s\n",
				 ErrorNum,
				 ErrorMessage
				 );
		return -1;
	}

	memset(&ListenAddr, 0, sizeof(ListenAddr));

	if( Family == AF_INET )
	{
		FILL_ADDR4(ListenAddr.Addr4, AF_INET, LocalAddr, LocalPort);

		AddrLen = sizeof(struct sockaddr);
	} else {
		char Addr[LENGTH_OF_IPV6_ADDRESS_ASCII] = {0};

		sscanf(LocalAddr, "[%s]", Addr);

		ListenAddr.Addr6.sin6_family = Family;
		ListenAddr.Addr6.sin6_port = htons(LocalPort);
		IPv6AddressToNum(Addr, &(ListenAddr.Addr6.sin6_addr));

		AddrLen = sizeof(struct sockaddr_in6);
	}

	if(	bind(ListenSocketUDP, (struct sockaddr*)&(ListenAddr), AddrLen)
			!= 0
		)
	{
		int		ErrorNum = GET_LAST_ERROR();
		char	ErrorMessage[320];
		ErrorMessage[0] = '\0';

		GetErrorMsg(ErrorNum, ErrorMessage, sizeof(ErrorMessage));

		ERRORMSG("Opening UDP socket failed. %d : %s\n",
				 ErrorNum,
				 ErrorMessage
				 );
		return -2;
	}

	CREATE_MUTEX(ListenMutex);
	EFFECTIVE_LOCK_INIT(LockOfSendBack);

	MaximumMessageSize = GetMaximumMessageSize(ListenSocketUDP);
	if(MaximumMessageSize < 0)
	{
		MaximumMessageSize = 1000;
	}
	Inited = TRUE;

	return 0;
}
Esempio n. 4
0
static HostsRecordType Hosts_AddToContainer(HostsContainer *Container, const char *IPOrCName, const char *Domain)
{
	OffsetOfHosts	r;
	char			NumericIP[16];

	switch( Hosts_DetermineIPTypes(IPOrCName) )
	{
		case HOSTS_TYPE_AAAA:
			if( StringChunk_Match_NoWildCard(&(Container -> Ipv6Hosts), Domain, NULL, NULL) == TRUE )
			{
				INFO("IPv6 Host is duplicated : %s, take only the first occurrence.\n", Domain);
				return HOSTS_TYPE_UNKNOWN;
			}

			IPv6AddressToNum(IPOrCName, NumericIP);

			r.Offset = Hosts_IdenticalToLast(Container, HOSTS_TYPE_AAAA, NumericIP, 16);

			if( r.Offset < 0 )
			{

				r.Offset = ExtendableBuffer_Add(&(Container -> IPs), NumericIP, 16);

				if( r.Offset < 0 )
				{
					return HOSTS_TYPE_UNKNOWN;
				}

			}

			StringChunk_Add(&(Container -> Ipv6Hosts), Domain, (const char *)&r, sizeof(OffsetOfHosts));

			return HOSTS_TYPE_AAAA;
			break;

		case HOSTS_TYPE_A:
			if( StringChunk_Match_NoWildCard(&(Container -> Ipv4Hosts), Domain, NULL, NULL) == TRUE )
			{
				INFO("IPv4 Host domain is duplicated : %s, take only the first occurrence.\n", Domain);
				return HOSTS_TYPE_UNKNOWN;
			}

			IPv4AddressToNum(IPOrCName, NumericIP);

			r.Offset = Hosts_IdenticalToLast(Container, HOSTS_TYPE_A, NumericIP, 4);

			if( r.Offset < 0 )
			{

				r.Offset = ExtendableBuffer_Add(&(Container -> IPs), NumericIP, 4);

				if( r.Offset < 0 )
				{
					return HOSTS_TYPE_UNKNOWN;
				}

			}

			StringChunk_Add(&(Container -> Ipv4Hosts), Domain, (const char *)&r, sizeof(OffsetOfHosts));

			return HOSTS_TYPE_A;
			break;

		case HOSTS_TYPE_CNAME:
			if( StringChunk_Match_NoWildCard(&(Container -> CNameHosts), Domain, NULL, NULL) == TRUE )
			{
				INFO("CName redirection domain is duplicated : %s, take only the first occurrence.\n", Domain);
				return HOSTS_TYPE_UNKNOWN;
			}

			r.Offset = Hosts_IdenticalToLast(Container, HOSTS_TYPE_CNAME, IPOrCName, strlen(IPOrCName) + 1);

			if( r.Offset < 0 )
			{

				r.Offset = ExtendableBuffer_Add(&(Container -> IPs), IPOrCName, strlen(IPOrCName) + 1);

				if( r.Offset < 0 )
				{
					return HOSTS_TYPE_UNKNOWN;
				}

			}

			StringChunk_Add(&(Container -> CNameHosts), Domain, (const char *)&r, sizeof(OffsetOfHosts));

			return HOSTS_TYPE_CNAME;
			break;

		case HOSTS_TYPE_EXCLUEDE:
			if( StringChunk_Match_NoWildCard(&(Container -> ExcludedDomains), Domain, NULL, NULL) == TRUE )
			{
				INFO("Excluded Host domain is duplicated : %s, take only the first occurrence.\n", Domain);
				return HOSTS_TYPE_UNKNOWN;
			}

			StringChunk_Add(&(Container -> ExcludedDomains), Domain, NULL, 0);

			return HOSTS_TYPE_EXCLUEDE;
			break;

		default:
			INFO("Unrecognisable hosts : %s %s\n", IPOrCName, Domain);
			return HOSTS_TYPE_UNKNOWN;
			break;
	}
}