⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servergrp.c

📁 非常不错的网管开发包
💻 C
字号:
/* ==================================================================== * The Vovida Software License, Version 1.0  *  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. *  * 3. The names "VOCAL", "Vovida Open Communication Application Library", *    and "Vovida Open Communication Application Library (VOCAL)" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact vocal\@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor *    may "VOCAL" appear in their name, without prior written *    permission of Vovida Networks, Inc. *  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *  * ==================================================================== *  * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc.  For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */#include <config.h>#include <sys/types.h>#include <sys/socket.h>#include <time.h>#include <sys/param.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <netdb.h>/* minimal include directives */#include "mibincl.h"#include "util_funcs.h"#include <AgentApi.hxx>#include <Common.h>#include "VovidaSnmpUtil.h"#include "serverGrp.h"#include "TrapAgentC.hxx"#include "TrapAgent.hxx"#include "ServerTable.hxx"#include "Common.h"/*  * serverGrp_variables_oid: *   this is the top level oid that we want to register under.  This *   is essentially a prefix, with the suffix appearing in the *   variable below. */oid serverGrp_variables_oid[] = { 1,3,6,1,4,1,5738,1,1,3 };oid serverTable_oid[] = { 1,3,6,1,4,1,5738,1,1,3,1,1 };struct timeval serverCacheTime;/*  * variable4 serverGrp_variables: *   this variable defines function callbacks and type return information  *   for the serverGrp mib section  */#define   SERVERINDEX           3#define   SERVERDISPLAYNAME     5#define   SERVERPORT            6#define   SERVERTYPE            7#define   SERVEROPERSTATUS      8#define INDEX_POSITION	13struct variable4 serverGrp_variables[] = {/*  magic number        , variable type , ro/rw , callback fn  , L, oidsuffix */    { SERVERINDEX         , ASN_UNSIGNED  , RONLY , var_serverTable, 3, { 1,1,1 } },    { SERVERDISPLAYNAME   , ASN_OCTET_STR , RONLY , var_serverTable, 3, { 1,1,2 } },    { SERVERPORT          , ASN_INTEGER   , RONLY , var_serverTable, 3, { 1,1,3 } },    { SERVERTYPE          , ASN_INTEGER   , RONLY , var_serverTable, 3, { 1,1,4 } },    { SERVEROPERSTATUS    , ASN_INTEGER   , RONLY , var_serverTable, 3, { 1,1,5 } },};/* * init_serverGrp(): *   Initialization routine.  This is called when the agent starts up. *   At a minimum, registration of your variables should take place here. */void init_serverGrp(void) {    /* register ourselves with the agent to handle our mib tree */    REGISTER_MIB("serverGrp", serverGrp_variables, variable4,		 serverGrp_variables_oid);    TrapAgent_ClearServerCache((void *) trapAgent);    timerclear(&serverCacheTime);    /* place any other initialization junk you need here */}/* * var_serverGrp(): *   This function is called every time the agent gets a request for *   a scalar variable that might be found within your mib section *   registered above.  It is up to you to do the right thing and *   return the correct value. *     You should also correct the value of "var_len" if necessary. * *   Please see the documentation for more information about writing *   module extensions, and check out the examples in the examples *   and mibII directories. */unsigned char *var_serverGrp(struct variable *vp, 	      oid     *name, 	      size_t  *length, 	      int     exact, 	      size_t  *var_len, 	      WriteMethod **write_method){    /* variables we may use later */    static long long_ret;    static unsigned char string[SPRINT_MAX_LEN];    static oid objid[MAX_OID_LEN];    static struct counter64 c64;    if (header_generic(vp,name,length,exact,var_len,write_method)	== MATCH_FAILED )	return 0;    /*      * this is where we do the value assignments for the mib results.     */    switch(vp->magic) {    default:	ERROR_MSG("");    }    return 0;}// hash function assumes the ipAddress is in network byte order// 192.168.16.110 is represented as 6E10A8C0  // the port is comming from short so the first 2 bytes are 0.// we want the 2 least significant bytes of the ipaddress // followed by the port.ulonghashIpPort(const ulong ipAddress, const int port){// after Asaigo we will go with the second version only.// no time to fully verify on linux.#ifdef __linux__    return ((ipAddress & 0xFFFF0000) | (port & 0x0000FFFF));#else    ulong nIpAddress = htonl(ipAddress);    ushort nPort = htons((ushort)port);    return ( (nIpAddress & 0x0000FFFF) << 16 | nPort ); #endif}/*  header_serverTable(...  Arguments:  vp	  IN      - pointer to variable entry that points here  name    IN/OUT  - IN/name requested, OUT/name found  length  IN/OUT  - length of IN/OUT oid's   exact   IN      - TRUE if an exact match was requested (Get)                    FALSE if we want GETNEXT  var_len OUT     - length of variable or 0 if function returned  write_method  */#define NOTFOUND 0xFFFFFFFFstatic ulongheader_serverTable(struct variable *vp,		   oid *name,		   size_t *length,		   int exact,		   size_t *var_len,		   WriteMethod **write_method){    oid newname[MAX_OID_LEN];    int result;    serverInfoT aServer;    ulong foundIndex = NOTFOUND;    if (exact) {	if ((*length == INDEX_POSITION + 1) && 	    (snmp_oid_compare(serverTable_oid, INDEX_POSITION - 1, name, *length) <= 0 )) {	    foundIndex = name[INDEX_POSITION];	    aServer = TrapAgent_GetServerFromIndex((void *)trapAgent, foundIndex);	    if (aServer.index != 0) {	      *var_len = sizeof(long);	/* default to 'long' results */	      return foundIndex;	    }	}	return MATCH_FAILED;    }    memcpy( (char *)newname,(char *)vp->name, (int)vp->namelen * sizeof(oid));    if (*length > INDEX_POSITION) // already within the table	result = snmp_oid_compare(name,  *length - 1, newname, (int)vp->namelen);    else // before/after the table	result = snmp_oid_compare(name,  *length, newname, (int)vp->namelen - 1);	    if (result > 0) // past end of table	return MATCH_FAILED;    // first entry into table || first of new oid    if (result < 0) {	foundIndex = TrapAgent_GetNextServerIndex((void *)trapAgent, 0);    } else {	foundIndex = TrapAgent_GetNextServerIndex((void *)trapAgent, name[INDEX_POSITION]);    }    // The index is the last of this row.  Go onto next row    if (foundIndex == NOTFOUND) {	    return MATCH_FAILED;    }    memcpy( (char *)name,(char *)newname, ((int)vp->namelen) * sizeof(oid));    *length = vp->namelen + 1;    name[INDEX_POSITION] = foundIndex;    *write_method = 0;    *var_len = sizeof(long);	/* default to 'long' results */    return foundIndex;}/* * var_serverTable(): *   Handle this table separately from the scalar value case. *   The workings of this are basically the same as for var_serverGrp above. */unsigned char *var_serverTable(struct variable *vp,		oid     *name,		size_t  *length,		int     exact,		size_t  *var_len,		WriteMethod **write_method){    /* variables we may use later */    static long long_ret;    static unsigned char string[SPRINT_MAX_LEN];    static oid objid[MAX_OID_LEN];    static struct counter64 c64;    ipcMessage rxMessage;    int NumOfServers = 0, i, table_size, hsPort;    ulong oidIndex = 0;    int *cfgStatus;    serverInfoT aServer;    struct in_addr tmpIn_addr;    struct hostent *tmpHostent;    struct timezone tz;    struct timeval tvNow;    // determine how long since the last request of this table.  We don't want to    // query the RSAgent on every element if the client is doing a mib walk.  If     // the table hasn't been accessed in a while we will get a new version of the    // server Cache.  Otherwise we will use the current one.    tz.tz_minuteswest = 0;    tz.tz_dsttime = 0;    timerclear(&tvNow);    if (gettimeofday(&tvNow,&tz) > 0 ) {	perror("serverGrp:gettimeofday 2 failed:");	timerclear(&tvNow);    }    if (tvNow.tv_sec == 0 || (tvNow.tv_sec - serverCacheTime.tv_sec >= (SERVERCACHEAGESECONDS))) {	hsPort = TrapAgent_GetApplPortFromIndex((void *)trapAgent, TrapAgent_GetNextIndex((void *)trapAgent, 0, SERVER_HB));	if (!hsPort || ipcRequest((actionT)Get,		       AllServerInfo,		       hsPort,		       &rxMessage) != voSuccess) {	    printf("serverGrp:serverTable: ipc failed request\n");	    return 0;	} 	// delete old tree here 	TrapAgent_ClearServerCache((void *) trapAgent);	tz.tz_minuteswest = 0;	tz.tz_dsttime = 0;	timerclear(&serverCacheTime);	if (gettimeofday(&serverCacheTime,&tz) > 0 ) {	    perror("serverGrp:gettimeofday failed:");	    timerclear(&serverCacheTime);	}	// put information into cache	cfgStatus = (int *)&rxMessage.parm2;	memcpy(&NumOfServers, cfgStatus, sizeof (int));	for (i = 0;  i < (NumOfServers); i++) {	    memset(&aServer, 0, sizeof(serverInfoT));	    aServer.index = hashIpPort((ulong)cfgStatus[i*4+1], cfgStatus[i*4+2]);	    tmpIn_addr.s_addr = (ulong)cfgStatus[i*4+1];	    tmpHostent = gethostbyaddr((char *)&tmpIn_addr, sizeof(struct in_addr), AF_INET);	    if (tmpHostent)		strcpy(aServer.hostName,tmpHostent->h_name); 	    aServer.port = cfgStatus[i*4+2];	    aServer.type = cfgStatus[i*4+3];	    aServer.status = cfgStatus[i*4+4];		    TrapAgent_InsertServer((void *)trapAgent, aServer);	}        } // end of getting the server cache    oidIndex = header_serverTable(vp,name,length,exact,var_len,write_method);    if (oidIndex == MATCH_FAILED)	return 0;    aServer = TrapAgent_GetServerFromIndex((void *)trapAgent, oidIndex);    if (aServer.index == 0)	return 0;    /*      * this is where we do the value assignments for the mib results.     */    switch(vp->magic) {    case SERVERINDEX :	long_ret = oidIndex;	return (unsigned char *) &long_ret;    case SERVERDISPLAYNAME :	*string = 0;	strcpy(string, aServer.hostName);	*var_len = strlen(string);	return (unsigned char *)string;    case SERVERPORT :	long_ret = (ulong)aServer.port;	return (unsigned char *) &long_ret;    case SERVERTYPE :	long_ret = (ulong)aServer.type;	return (unsigned char *) &long_ret;    case SERVEROPERSTATUS :        	long_ret = (ulong)aServer.status;	return (unsigned char *) &long_ret;    default :	ERROR_MSG("");    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -