m2SysLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:11k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* m2SysLib.c - MIB-II system-group API for SNMP agents */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01h,15oct01,rae  merge from truestack ver 01i, base 01g (VIRTUAL_STACK)
  8. 01g,30dec97,vin  fixed SPR 20090
  9. 01f,03apr96,rjc  set the m2SystemSem semaphore to NULL in m2SysDelete.
  10. 01d,25jan95,jdi  doc cleanup.
  11. 01c,11nov94,rhp  additional man-page corrections
  12. 01b,10nov94,rhp  edit man pages
  13. 01b,22feb94,elh  put in check for null parameters in m2SysInit. 
  14. 01a,08dec93,jag  written
  15. */
  16. /*
  17. DESCRIPTION
  18. This library provides MIB-II services for the system group.  It provides
  19. routines to initialize the group and to access the group scalar variables.
  20. For a broader description of MIB-II services, see the manual entry for m2Lib.
  21. To use this feature, include the following component:
  22. INCLUDE_MIB2_SYSTEM
  23. USING THIS LIBRARY
  24. This library can be initialized and deleted by calling m2SysInit() and
  25. m2SysDelete() respectively, if only the system group's services are
  26. needed.  If full MIB-II support is used, this group and all other groups
  27. can be initialized and deleted by calling m2Init() and m2Delete().
  28. The system group provides the option to set the system variables at the
  29. time m2Sysinit() is called.  The MIB-II variables `sysDescr' and `sysobjectId'
  30. are read-only, and can be set only by the system-group initialization routine.
  31. The variables `sysContact', `sysName' and `sysLocation' can be set through
  32. m2SysGroupInfoSet() at any time.
  33. The following is an example of system group initialization:
  34. .CS
  35.     M2_OBJECTID mySysObjectId = { 8, {1,3,6,1,4,1,731,1} };
  36.     if (m2SysInit ("VxWorks MIB-II library ",
  37.    "support@wrs.com",
  38.    "1010 Atlantic Avenue Alameda, California 94501",
  39.    &mySysObjectId) == OK)
  40. /@ System group initialized successfully @/
  41. .CE
  42. The system group variables can be accessed as follows:
  43. .CS
  44.     M2_SYSTEM   sysVars;
  45.     if (m2SysGroupInfoGet (&sysVars) == OK)
  46. /@ values in sysVars are valid @/
  47. .CE
  48. The system group variables can be set as follows:
  49. .CS
  50.     M2_SYSTEM    sysVars; 
  51.     unsigned int varToSet; /@ bit field of variables to set @/
  52.     /@ Set the new system Name @/
  53.     strcpy (m2SysVars.sysName, "New System Name");
  54.     varToSet |= M2SYSNAME;
  55.    /@ Set the new contact name @/
  56.     strcpy (m2SysVars.sysContact, "New Contact");
  57.     varToSet |= M2SYSCONTACT;
  58.     if (m2SysGroupInfoGet (varToSet, &sysVars) == OK)
  59. /@ values in sysVars set @/
  60. .CE
  61. INCLUDE FILES: m2Lib.h
  62.  
  63. SEE ALSO:
  64. m2Lib, m2IfLib, m2IpLib, m2IcmpLib, m2UdpLib, m2TcpLib
  65. */
  66. /* includes */
  67. #include <vxWorks.h>
  68. #include "m2Lib.h"
  69. #include "netLib.h"
  70. #include <netinet/in_systm.h>
  71. #include <netinet/in.h>
  72. #include <netinet/ip.h>
  73. #include <netinet/ip_var.h>
  74. #include "hostLib.h"
  75. #include "string.h"
  76. #include "semLib.h"
  77. #include "tickLib.h"
  78. #include "sysLib.h"
  79. #include "errnoLib.h"
  80. #ifdef VIRTUAL_STACK
  81. #include "netinet/vsLib.h"
  82. #endif /* VIRTUAL_STACK */
  83. #ifndef VIRTUAL_STACK
  84. /* externs */
  85. IMPORT int  _ipCfgFlags; 
  86. /* globals */
  87. /* 
  88.  * The system group is supported by the structure defined below.  All changes to
  89.  * the system group are reflected in this structure.
  90.  */
  91. LOCAL M2_SYSTEM m2SystemVars;
  92. /* This semaphore protects the m2SystemVars from multiple readers and writers */
  93.  
  94. LOCAL SEM_ID m2SystemSem;
  95. LOCAL unsigned long startCentiSecs; /* Hundred of Seconds at start */
  96. #endif /* VIRTUAL_STACK */
  97. /*
  98.  * The zero object id is used throught out the MIB-II library to fill OID 
  99.  * requests when an object ID is not provided by a group variable.
  100.  */
  101. LOCAL M2_OBJECTID sysZeroObjectId = { 2, {0,0} };
  102. /******************************************************************************
  103. *
  104. * centiSecsGet - get hundreds of a second
  105. *
  106. * The number of hundreds of a second that have passed since this routine was
  107. * first called.
  108. *
  109. * RETURNS: Hundreds of a second since the group was initialized.
  110. *
  111. * SEE ALSO: N/A
  112. */
  113. LOCAL unsigned long centiSecsGet (void)
  114.     {
  115.     unsigned long currCentiSecs;
  116.     unsigned long clkRate = sysClkRateGet ();
  117. #ifdef VIRTUAL_STACK
  118.     if (sysStartCentiSecs == 0)
  119. sysStartCentiSecs = (tickGet () * 100) / clkRate;
  120.     currCentiSecs = (tickGet () * 100) / clkRate;
  121.     return (currCentiSecs - sysStartCentiSecs);
  122. #else    /* VIRTUAL_STACK */
  123.     if (startCentiSecs == 0)
  124. startCentiSecs = (tickGet () * 100) / clkRate;
  125.     currCentiSecs = (tickGet () * 100) / clkRate;
  126.     return (currCentiSecs - startCentiSecs);
  127. #endif   /* VIRTUAL_STACK */
  128.     }
  129. /******************************************************************************
  130. *
  131. * m2SysInit - initialize MIB-II system-group routines
  132. *
  133. * This routine allocates the resources needed to allow access to the
  134. * system-group MIB-II variables.  This routine must be called before
  135. * any system-group variables can be accessed.  The input parameters
  136. * <pMib2SysDescr>, <pMib2SysContact>, <pMib2SysLocation>, and
  137. * <pObjectId> are optional.  The parameters <pMib2SysDescr>,
  138. * <pObjectId> are read only, as specified by MIB-II, and can be set
  139. * only by this routine.
  140. *
  141. * RETURNS: OK, always.
  142. *
  143. * ERRNO:
  144. * S_m2Lib_CANT_CREATE_SYS_SEM
  145. *
  146. * SEE ALSO: m2SysGroupInfoGet(), m2SysGroupInfoSet(), m2SysDelete() 
  147. */
  148. STATUS m2SysInit
  149.     (
  150.     char * pMib2SysDescr,       /* pointer to MIB-2 sysDescr */
  151.     char * pMib2SysContact,      /* pointer to MIB-2 sysContact */
  152.     char * pMib2SysLocation,     /* pointer to MIB-2 sysLocation */
  153.     M2_OBJECTID * pObjectId        /* pointer to MIB-2 ObjectId */
  154.     )
  155.     {
  156.     /* Initialize System Group with defaults */
  157.     if ((pMib2SysDescr != NULL) && (pMib2SysDescr [0] != ''))
  158. strcpy ((char *) m2SystemVars.sysDescr, pMib2SysDescr);
  159.     if ((pMib2SysContact != NULL) && (pMib2SysContact [0] != ''))
  160. strcpy ((char *) m2SystemVars.sysContact, pMib2SysContact);
  161.     if ((pMib2SysLocation != NULL) && (pMib2SysLocation [0] != ''))
  162. strcpy ((char *) m2SystemVars.sysLocation, pMib2SysLocation);
  163.     
  164.     /* Use targets host name as a the system name */
  165.     gethostname ((char *) m2SystemVars.sysName, sizeof(m2SystemVars.sysName));
  166.     if ((pObjectId != NULL) && (pObjectId->idLength > 0))
  167.      { 
  168.      bcopy (((char *) (pObjectId->idArray)), 
  169.        ((char *) (m2SystemVars.sysObjectID.idArray)), 
  170.        pObjectId->idLength * sizeof(long));
  171. m2SystemVars.sysObjectID.idLength = pObjectId->idLength;
  172. }
  173.     else
  174. {
  175. /* Initialize System group OID with the Zero OID */
  176.      bcopy (((char *) (sysZeroObjectId.idArray)), 
  177.        ((char *) (m2SystemVars.sysObjectID.idArray)), 
  178.        sysZeroObjectId.idLength * sizeof(long));
  179. m2SystemVars.sysObjectID.idLength = sysZeroObjectId.idLength;
  180. }
  181.     /* Create semaphore */
  182.     if (m2SystemSem == NULL)
  183.         {
  184.         m2SystemSem = semMCreate (SEM_Q_PRIORITY | SEM_INVERSION_SAFE |
  185.                                 SEM_DELETE_SAFE);
  186.         if (m2SystemSem == NULL)
  187.             {
  188.     errnoSet (S_m2Lib_CANT_CREATE_SYS_SEM);
  189.             return (ERROR);
  190.             }
  191.         }
  192.     (void) centiSecsGet ();     /* Initialize group time reference */
  193.  
  194.     return (OK);
  195.     }
  196. /******************************************************************************
  197. *
  198. * m2SysGroupInfoGet -  get system-group MIB-II variables
  199. *
  200. * This routine fills in the structure at <pSysInfo> with the values of MIB-II
  201. * system-group variables.
  202. *
  203. *
  204. * RETURNS: OK, or ERROR if <pSysInfo> is not a valid pointer.
  205. *
  206. * ERRNO:
  207. * S_m2Lib_INVALID_PARAMETER
  208. *
  209. * SEE ALSO: m2SysInit(), m2SysGroupInfoSet(), m2SysDelete()
  210. */
  211. STATUS m2SysGroupInfoGet
  212.     (
  213.     M2_SYSTEM * pSysInfo /* pointer to MIB-II system group structure */
  214.     )
  215.     {
  216.  
  217.     /* Validate Pointer to the requested System structure */
  218.  
  219.     if (pSysInfo == NULL)
  220. {
  221. errnoSet (S_m2Lib_INVALID_PARAMETER);
  222.         return (ERROR);
  223. }
  224.  
  225.     pSysInfo->sysUpTime = centiSecsGet ();
  226.  
  227.     /* Take the System semaphore before reading the system variables */
  228.     semTake (m2SystemSem, WAIT_FOREVER);
  229.  
  230.     strcpy ((char *) pSysInfo->sysDescr,    (char *) m2SystemVars.sysDescr);
  231.     strcpy ((char *) pSysInfo->sysContact,  (char *) m2SystemVars.sysContact);
  232.     strcpy ((char *) pSysInfo->sysName,     (char *) m2SystemVars.sysName);
  233.     strcpy ((char *) pSysInfo->sysLocation, (char *) m2SystemVars.sysLocation);
  234.  
  235.     bcopy (((char *) m2SystemVars.sysObjectID.idArray), 
  236.    ((char *) pSysInfo->sysObjectID.idArray),
  237.    m2SystemVars.sysObjectID.idLength * sizeof (long));
  238.     pSysInfo->sysObjectID.idLength = m2SystemVars.sysObjectID.idLength;
  239.  
  240.     semGive (m2SystemSem);
  241.  
  242.     /* Compute type of targets service based on the IP forwarding variables */
  243.     if (_ipCfgFlags & IP_DO_FORWARDING)
  244.         pSysInfo->sysServices |= (1 << (3 - 1));
  245.     else
  246.         pSysInfo->sysServices &= ~(1 << (3 - 1));
  247.  
  248.     return (OK);
  249.     }
  250. /******************************************************************************
  251. *
  252. * m2SysGroupInfoSet - set system-group MIB-II variables to new values
  253. *
  254. * This routine sets one or more variables in the system group as specified in
  255. * the input structure at <pSysInfo> and the bit field parameter <varToSet>.
  256. *
  257. * RETURNS: 
  258. * OK, or ERROR if <pSysInfo> is not a valid pointer, or <varToSet> has an 
  259. * invalid bit field.
  260. *
  261. * ERRNO:
  262. *  S_m2Lib_INVALID_PARAMETER
  263. *  S_m2Lib_INVALID_VAR_TO_SET
  264. *
  265. * SEE ALSO: m2SysInit(), m2SysGroupInfoGet(), m2SysDelete()
  266. */
  267. STATUS m2SysGroupInfoSet
  268.     (
  269.     unsigned int varToSet, /* bit field of variables to set */
  270.     M2_SYSTEM * pSysInfo /* pointer to the system structure */
  271.     )
  272.     {
  273.  
  274.     /* Validate Pointer to System structure and bit field in varToSet */
  275.  
  276.     if (pSysInfo == NULL ||
  277.         (varToSet & (M2SYSNAME | M2SYSCONTACT | M2SYSLOCATION)) == 0)
  278. {
  279. if (pSysInfo == NULL)
  280.     errnoSet (S_m2Lib_INVALID_PARAMETER);
  281. else
  282.     errnoSet (S_m2Lib_INVALID_VAR_TO_SET);
  283.         return (ERROR);
  284. }
  285.  
  286.     /* Set requested variables */
  287.  
  288.     semTake (m2SystemSem, WAIT_FOREVER);
  289.  
  290.     if (varToSet & M2SYSNAME)
  291.         strcpy ((char *) m2SystemVars.sysName, (char *) pSysInfo->sysName);
  292.  
  293.     if (varToSet & M2SYSCONTACT)
  294.         strcpy ((char *) m2SystemVars.sysContact, (char *)pSysInfo->sysContact);
  295.  
  296.     if (varToSet & M2SYSLOCATION)
  297.         strcpy ((char *) m2SystemVars.sysLocation, 
  298. (char *) pSysInfo->sysLocation);
  299.  
  300.     semGive (m2SystemSem);
  301.  
  302.     return (OK);
  303.     }
  304. /*******************************************************************************
  305. *
  306. * m2SysDelete - delete resources used to access the MIB-II system group
  307. *
  308. * This routine frees all the resources allocated at the time the group was
  309. * initialized.  Do not access the system group after calling this routine.
  310. *
  311. * RETURNS: OK, always.
  312. *
  313. * SEE ALSO: m2SysInit(), m2SysGroupInfoGet(), m2SysGroupInfoSet().
  314. */
  315. STATUS m2SysDelete (void)
  316.     {
  317.     if (m2SystemSem != NULL)
  318.         {
  319.         semDelete (m2SystemSem);
  320.         m2SystemSem = NULL;
  321.         }
  322.     return (OK);
  323.     }