Esempio n. 1
0
static int CacheHT_CreateNewNode(CacheHT *h, uint32_t ChunkSize, Cht_Node **Out, void *Boundary)
{
	int			NewNode_i;
	Cht_Node	*NewNode;

	Array		*NodeChunk = &(h -> NodeChunk);

	NewNode_i = Array_PushBack(NodeChunk, NULL, Boundary);
	if( NewNode_i < 0 )
	{
		return -1;
	}

	NewNode = (Cht_Node *)Array_GetBySubscript(NodeChunk, NewNode_i);
	NewNode -> Next = -1;

	NewNode -> Length = ChunkSize;

	if( Out != NULL )
	{
		*Out = NewNode;
	}

	return NewNode_i;
}
Esempio n. 2
0
int StringChunk_Add(StringChunk *dl,
					const char *Str,
					const char *AdditionalData,
					int LengthOfAdditionalData /* The length will not be stored. */
					)
{
	EntryForString NewEntry;

	if( AdditionalData != NULL && LengthOfAdditionalData > 0 )
	{
		_32BIT_INT OffsetOfStoredTo;

		char *DataStoredTo =
						ExtendableBuffer_Expand(&(dl -> AdditionalDataChunk),
						LengthOfAdditionalData,
						&OffsetOfStoredTo
						);

		if( DataStoredTo == NULL )
		{
			return -1;
		}

		NewEntry.OffsetOfData = OffsetOfStoredTo;

		memcpy(DataStoredTo, AdditionalData, LengthOfAdditionalData);

	} else {
		NewEntry.OffsetOfData = -1;
	}

	if( ContainWildCard(Str) )
	{
		NewEntry.OffsetOfString = StringList_Add(&(dl -> List_W), Str, ',');

		if( NewEntry.OffsetOfString >= 0 )
		{
			Array_PushBack(&(dl -> List_W_Pos), &NewEntry, NULL);
		} else {
			return -1;
		}
	} else {
		NewEntry.OffsetOfString = StringList_Add(&(dl -> List), Str, ',');

		if( NewEntry.OffsetOfString >= 0 )
		{
			HashTable_Add(&(dl -> List_Pos), Str, 0, &NewEntry, NULL);
		} else {
			return -2;
		}
	}

	return 0;

}
Esempio n. 3
0
int AddressList_Add(AddressList *a, struct _Address	*Addr)
{
	if( a == NULL )
	{
		return -1;
	}

	if( Array_PushBack(&(a -> AddressList), Addr, NULL) < 0 )
	{
		return -1;
	} else {
		return 0;
	}

}
Esempio n. 4
0
static int32_t GetUnusedNode(Bst *t)
{
	if( t -> FreeList > 0 )
	{
		int32_t ReturnValue = t -> FreeList;
		const Bst_NodeHead *NextNode;

		NextNode = Array_GetBySubscript(t -> Nodes, t -> FreeList);

		t -> FreeList = NextNode -> Right;

		return ReturnValue;
	} else {
		return Array_PushBack(t -> Nodes, NULL, NULL);
	}
}
Esempio n. 5
0
int InitAddress(void)
{
	StringList	*tcpaddrs	=	ConfigGetStringList(&ConfigInfo, "TCPServer");
	StringList	*udpaddrs	=	ConfigGetStringList(&ConfigInfo, "UDPServer");

	const char	*Itr	=	NULL;

	if( AddressChunk_Init(&Addresses) != 0 )
	{
		return -1;
	}

	Itr = StringList_GetNext(tcpaddrs, NULL);
	while( Itr != NULL )
	{
		if( AddressChunk_AddATCPAddress_FromString(&Addresses, Itr) != 0 )
		{
			INFO("Bad address : %s\n", Itr);
		} else {
			DEBUG_FILE("Add TCP address : %s\n", Itr);
		}

		Itr = StringList_GetNext(tcpaddrs, Itr);
	}

	Itr = StringList_GetNext(udpaddrs, NULL);
	while( Itr != NULL )
	{
		if( AddressChunk_AddAUDPAddress_FromString(&Addresses, Itr) != 0 )
		{
			INFO("Bad address : %s\n", Itr);
		} else {
			DEBUG_FILE("Add UDP address : %s\n", Itr);
		}

		Itr = StringList_GetNext(udpaddrs, Itr);
	}

	ParallelQuery = ConfigGetBoolean(&ConfigInfo, "ParallelQuery");
	if( ParallelQuery == TRUE )
	{
		int NumberOfAddr;

		int AddrLen;

		sa_family_t SubFamily;

		struct sockaddr *OneAddr;

		NumberOfAddr = StringList_Count(udpaddrs);
		if( NumberOfAddr <= 0 )
		{
			ERRORMSG("No UDP server specified, cannot use parallel query.\n")
			ParallelQuery = FALSE;
		} else {
			DEBUG_FILE("Enable parallel query.\n");

			AddressChunk_GetOneUDPBySubscript(&Addresses, &MainFamily, 0);

			if( MainFamily == AF_INET )
			{
				AddrLen = sizeof(struct sockaddr);

				DEBUG_FILE("Parallel query servers family IPv4.\n");

			} else {
				AddrLen = sizeof(struct sockaddr_in6);

				DEBUG_FILE("Parallel query servers family IPv6.\n");
			}

			Array_Init(&Addresses_Array, AddrLen, NumberOfAddr, FALSE, NULL);

			while( NumberOfAddr != 0 )
			{
				OneAddr = AddressChunk_GetOneUDPBySubscript(&Addresses, &SubFamily, NumberOfAddr - 1);
				if( OneAddr != NULL && SubFamily == MainFamily )
				{
					Array_PushBack(&Addresses_Array, OneAddr, NULL);
				}

				--NumberOfAddr;
			}
		}
	}

	StringList_Free(tcpaddrs);
	StringList_Free(udpaddrs);

	return LoadDedicatedServer();

}