📄 statbufm.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 <maxmem.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <message.h>#include <mibsup.h>#include <dmath.h>#include "statbufd.h"#include "statbufe.h"#include "statbufc.h"#include "statbuf.h"IMPORT BOOLEAN BeholderStrictRMON;#define CONTROLINDEXSIZE 1#define ENTRYINDEXSIZE 2extern SHORT StatBufMaxNrEntries;static MIB_LOCAL *StatBufControlInstance = NULL;static BOOLEAN RmonNext(SNMP_OBJECT *obj, MIB_LOCAL **local, WORD idlen, WORD indexsize, StatBuf **elem);BOOLEAN StatBufMInit(VOID){ MessageConfig(STATBUF_ERROR, "StatBuffer"); return StatBufConfigInit();}BOOLEAN RmonNext(SNMP_OBJECT *obj, MIB_LOCAL **local, WORD idlen, WORD indexsize, StatBuf **elem){StatBufControl *data; if (*local == NULL || indexsize < 1) return FALSE; switch (indexsize) { case ENTRYINDEXSIZE: if (obj->IdLen >= idlen + indexsize) { data = (StatBufControl*)(*local)->Data; if ((data->BufferWrapped == TRUE && obj->Id[idlen+1] < data->GrantedSize) || (data->BufferWrapped == FALSE && obj->Id[idlen+1] < data->BufferPos)) { /* BufferWrapped == FALSE and BufferPos == 0 if Status != VALID */ obj->Id[idlen] = (*local)->Index; obj->Id[idlen+1]++; obj->IdLen = idlen + ENTRYINDEXSIZE; *elem = StatBufSearch((StatBufControl*)(*local)->Data, obj, idlen); break; } *local = (*local)->Next; } while (*local != NULL && (((StatBufControl*)(*local)->Data)->GrantedSize == 0 || (((StatBufControl*)(*local)->Data)->BufferWrapped == FALSE && ((StatBufControl*)(*local)->Data)->BufferPos == 0))) *local = (*local)->Next; if (*local == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; obj->Id[idlen+1] = 1; obj->IdLen = idlen + ENTRYINDEXSIZE; *elem = StatBufSearch((StatBufControl*)(*local)->Data, obj, idlen); break; case CONTROLINDEXSIZE: if (obj->IdLen >= idlen + indexsize) { /* only go to next collector if requested index was higher or equal */ if (obj->Id[idlen] >= (*local)->Index) *local = (*local)->Next; if (*local == NULL) return FALSE; } obj->Id[idlen] = (*local)->Index; obj->IdLen = idlen + CONTROLINDEXSIZE; break; } return TRUE;}WORD StatBufControlIndex(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL; if ((local = MibRmon (obj, StatBufControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: obj->Syntax.LngInt = local->Index; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD StatBufControlVariable(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;StatBufControl* data = NULL; if ((local = MibRmon(obj, StatBufControlInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (StatBufControl*)local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, STATBUF_BOOLEAN_VARIABLE)) return SNMP_NOSUCHNAME; memcpy(obj->Syntax.BufInt, data->Variable, (obj->SyntaxLen = data->VariableLen)*sizeof(data->Variable[0])); return SNMP_NOERROR; case SNMP_PDU_SET: data = (StatBufControl*)local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; memcpy(data->Variable, obj->Syntax.BufInt, (data->VariableLen = obj->SyntaxLen)*sizeof(data->Variable[0])); BooleanSetTrue(data->ObjectSet, STATBUF_BOOLEAN_VARIABLE); return SNMP_NOERROR; } return SNMP_GENERROR;}WORD StatBufControlRequestedSize(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;StatBufControl *data;StatBuf *buffer;LONG i, ni, j; if ((local = MibRmon(obj, StatBufControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (StatBufControl*) local->Data; obj->Syntax.LngInt = data->RequestedSize; return SNMP_NOERROR; case SNMP_PDU_SET: data = (StatBufControl*) local->Data; if (obj->Syntax.LngInt < 1) return SNMP_BADVALUE; data->GrantedSize = LongMin(MemoryGetAvail(), MemoryGetMaxChunk())/sizeof(StatBuf); if (data->GrantedSize > LongMin(obj->Syntax.LngInt, StatBufMaxNrEntries)) data->GrantedSize = LongMin(obj->Syntax.LngInt, StatBufMaxNrEntries); if (data->GrantedSize == data->BufferAllocated) { data->RequestedSize = obj->Syntax.LngInt; return SNMP_NOERROR; } if ((buffer = NewStatBuf(data->GrantedSize)) == NULL) { DelStatBuf(data->Buffer); data->Buffer = NULL; data->BufferPos = 0; data->GrantedSize = 0; data->BufferAllocated = 0; data->BufferWrapped = FALSE; } else { if (data->BufferWrapped == TRUE) ni = LongMin(data->GrantedSize, data->BufferAllocated); else ni = LongMin(data->GrantedSize, data->BufferPos); for (i = 0; i < ni; i++) { j = data->BufferPos - ni + i; if (j < 0) j = j + data->BufferAllocated; memcpy(buffer+i, data->Buffer+j, sizeof(StatBuf)); } DelStatBuf(data->Buffer); data->Buffer = buffer; data->BufferPos = ni; data->BufferAllocated = data->GrantedSize; data->BufferWrapped = FALSE; } data->RequestedSize = obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD StatBufControlGrantedSize(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;StatBufControl *data; if ((local = MibRmon(obj, StatBufControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (StatBufControl*)local->Data; obj->Syntax.LngInt = data->GrantedSize; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD StatBufControlInterval(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;StatBufControl* data = NULL; if ((local = MibRmon(obj, StatBufControlInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (StatBufControl*)local->Data; obj->Syntax.LngInt = data->Interval; return SNMP_NOERROR; case SNMP_PDU_SET: data = (StatBufControl*)local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (obj->Syntax.LngInt <= 0 || obj->Syntax.LngInt > 2000000L) return SNMP_BADVALUE; data->Interval = obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD StatBufControlSampleType(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;StatBufControl* data = NULL; if ((local = MibRmon(obj, StatBufControlInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (StatBufControl*)local->Data; obj->Syntax.LngInt = data->SampleType; return SNMP_NOERROR; case SNMP_PDU_SET: data = (StatBufControl*)local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (obj->Syntax.LngInt != STATBUF_ABSOLUTE && obj->Syntax.LngInt != STATBUF_DELTA) return SNMP_BADVALUE; data->SampleType = obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD StatBufControlFullStatus(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;StatBufControl *data; if ((local = MibRmon(obj, StatBufControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (StatBufControl*)local->Data; obj->Syntax.LngInt = data->FullStatus; return SNMP_NOERROR; case SNMP_PDU_SET:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -