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; }
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; }
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; } }
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); } }
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(); }