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; } }
/* 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; }
/* 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; }
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; } }