📄 dtopn_c.c
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details */#include <dnpap.h>#include <memory.h>#include <dmath.h>#include <mibsup.h>#include <stdlib.h>#include <sysmib.h>#include <timer.h>#include "dtopn_d.h"#include "dtopn_e.h"#include "dtopn_c.h"IMPORT BOOLEAN BeholderStrictRMON;static LONG TopNMaxNrEntries = 100;static VOID DelEntries(DNPAP_TOPN_CONTROL *topncontrol);static VOID TopNTimerCallback(TIMER_DESCR *timer, ULONG now, VOID *param);BOOLEAN DnpapTopNCInit(DNPAP_TOPN_CONTROL *topncontrol){ topncontrol->HostIndex = 1; topncontrol->RateBase = 1; topncontrol->TimeRemaining = 0; topncontrol->Duration = 0; topncontrol->RequestedSize = 10; topncontrol->StartTime = 0; topncontrol->Owner[0] = '\0'; topncontrol->OwnerLen = 0; topncontrol->Status = SNMP_INVALID; topncontrol->TableSize = 0; topncontrol->Table = NULL; topncontrol->TopNEntries = NULL; topncontrol->TopNLast = NULL; topncontrol->TopNArray = NULL; topncontrol->Timer = NULL; BooleanSetAllTrue(topncontrol->ObjectSet); BooleanSetFalse(topncontrol->ObjectSet, TOPN_BOOLEAN_DATASOURCE); BooleanSetFalse(topncontrol->ObjectSet, TOPN_BOOLEAN_OWNER); return TRUE;}BOOLEAN DnpapTopNCStart(DNPAP_TOPN_CONTROL *topncontrol){ if (BeholderStrictRMON && !BooleanCheckAllTrue(topncontrol->ObjectSet)) return FALSE; if (topncontrol->TimeRemaining > 0) { if ((topncontrol->Table = NewHash(TopNMaxNrEntries/2+11, NULL)) == NULL) { DnpapMessage(DMC_ERROR, DTOPN_TIMER, "dtopN: can not create hashtable"); return FALSE; } if ((topncontrol->Timer = TimerRegister(TopNTimerCallback, topncontrol, 1000, TIMER_FOREVER, TIMER_TYPE_RECOVER)) == NULL) { DnpapMessage(DMC_ERROR, DTOPN_TIMER, "dtopN: can not register a timer"); return FALSE; } topncontrol->StartTime = SysTime(); } return TRUE;}BOOLEAN DnpapTopNCStop(DNPAP_TOPN_CONTROL *topncontrol){ TimerRemove(topncontrol->Timer); DelHash(topncontrol->Table); DelEntries(topncontrol); DnpapFree(topncontrol->TopNArray); topncontrol->TopNArray = NULL; return TRUE;}VOID TopNTimerCallback(TIMER_DESCR *timer, ULONG now, VOID *param){DNPAP_TOPN_CONTROL *topncontrol = param; topncontrol->TimeRemaining--; if (topncontrol->TimeRemaining <= 0) { if (DnpapFillEntryTable(topncontrol, topncontrol->RequestedSize) != TRUE) DnpapMessage(DMC_WARNING, DTOPN_FILLFAIL, "dtopN: creation of entry array failed"); TimerRemove(topncontrol->Timer); topncontrol->Timer = NULL; }}DNPAP_TOPN_ENTRY* DnpapTopNEntrySearch(DNPAP_TOPN_CONTROL *topncontrol, SNMP_OBJECT *obj, WORD idlen){ if (topncontrol->Status == SNMP_VALID && topncontrol->TimeRemaining == 0 && topncontrol->TopNArray != NULL) return topncontrol->TopNArray[obj->Id[idlen+1]-1]; return NULL;}BOOLEAN DnpapFillEntryTable(DNPAP_TOPN_CONTROL *topncontrol, LONG reqsize){DNPAP_TOPN_ENTRY *entry;DNPAP_TOPN_ENTRY **array;LONG count;LONG arraysize = min(reqsize, topncontrol->TableSize); if (arraysize == 0) { DnpapMessage(DMC_MESSAGE, DTOPN_ARRAY, "topN: table is empty"); return TRUE; } if ((array = (DNPAP_TOPN_ENTRY**)DnpapRealloc(topncontrol->TopNArray, arraysize*sizeof(DNPAP_TOPN_ENTRY*))) == NULL) { DnpapMessage(DMC_ERROR, DTOPN_ARRAY, "dtopN: can not create entry array"); return FALSE; } memset(topncontrol->TopNArray = array, 0, (size_t)arraysize*sizeof(DNPAP_TOPN_ENTRY*)); for (entry = topncontrol->TopNEntries, count = 0; entry != NULL && count < arraysize; entry = entry->Next, count++) topncontrol->TopNArray[count] = entry; return TRUE;}VOID DelEntries(DNPAP_TOPN_CONTROL *topncontrol){DNPAP_TOPN_ENTRY *entry1, *entry2; for (entry2 = topncontrol->TopNEntries; entry2 != NULL; entry2 = entry1) { entry1 = entry2->Next; DnpapFree(entry2); topncontrol->TableSize--; } topncontrol->TopNEntries = NULL; topncontrol->TopNLast = NULL;}BOOLEAN DnpapEntryAddList(DNPAP_TOPN_CONTROL *topncontrol, DNPAP_TOPN_ENTRY *entry){ if (topncontrol->TopNEntries == NULL) { topncontrol->TopNEntries = entry; topncontrol->TopNLast = entry; entry->Prev = NULL; entry->Next = NULL; return TRUE; } entry->Prev = topncontrol->TopNLast; entry->Next = NULL; topncontrol->TopNLast->Next = entry; topncontrol->TopNLast = entry; return DnpapEntryUpdateList(topncontrol, entry);}BOOLEAN DnpapEntryUpdateList(DNPAP_TOPN_CONTROL *topncontrol, DNPAP_TOPN_ENTRY *entry){DNPAP_TOPN_ENTRY *p;BOOLEAN update = FALSE; if (topncontrol->TopNEntries == entry) return TRUE; for (p = entry->Prev; p != NULL; p = p->Prev) { if (p->Rate >= entry->Rate) break; update = TRUE; } if (update == FALSE) return TRUE; entry->Prev->Next = entry->Next; if (entry->Next != NULL) entry->Next->Prev = entry->Prev; else topncontrol->TopNLast = entry->Prev; if (p != NULL) { entry->Prev = p; entry->Next = p->Next; p->Next->Prev = entry; p->Next = entry; } else { entry->Prev = p; entry->Next = topncontrol->TopNEntries; topncontrol->TopNEntries->Prev = entry; topncontrol->TopNEntries = entry; } return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -