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

VxWorks

开发平台:

C/C++

  1. /* pppHookLib.c - PPP hook library */
  2. /* Copyright 1995 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01d,14mar99,jdi  doc: removed refs to config.h and/or configAll.h (SPR 25663).
  8. 01c,20aug98,fle  doc : removed tab from func headers
  9. 01b,19dec95,vin  doc changes.
  10. 01a,29nov95,vin  written.
  11. */
  12. /*
  13. DESCRIPTION
  14. This library provides routines to add and delete connect and disconnect
  15. routines. The connect routine, added on a unit basis, is called before the 
  16. initial phase of link option negotiation. The disconnect routine, added on
  17. a unit basis is called before the PPP connection is closed. These connect 
  18. and disconnect routines can be used to hook up additional software.
  19. If either connect or disconnect hook returns ERROR, the connection is 
  20. terminated immediately.
  21. This library is automatically linked into the VxWorks system image when
  22. the configuration macro INCLUDE_PPP is defined.
  23. INCLUDE FILES: pppLib.h
  24. SEE ALSO: pppLib,
  25. .pG "Network"
  26. */
  27. /* includes */
  28. #include "vxWorks.h"
  29. #include "string.h"
  30. #include "stdlib.h"
  31. #include "stdio.h"
  32. #include "errnoLib.h"
  33. #include "semLib.h"
  34. #include "pppLib.h"
  35. /* externs */
  36. IMPORT PPP_HOOK_RTNS * pppHookRtns []; /* declared in pppLib.c */
  37. /* locals */
  38. LOCAL SEM_ID  pppHookSemId = NULL; /* protect access to table */
  39. /*******************************************************************************
  40. *
  41. * pppHookLibInit - initialize the PPP hook connect and disconnect facility
  42. *
  43. * This routine is initilaizes the connect and disconnect facility
  44. * It is called from usrNetwork.c when the configuration macro INCLUDE_PPP
  45. * is defined.
  46. *
  47. * RETURNS: N/A
  48. *
  49. * NOMANUAL
  50. */
  51. STATUS pppHookLibInit (void)
  52.     {
  53.     int ix; /* index variable */
  54.     if (pppHookSemId == NULL) /* already initialized? */
  55. {
  56. for (ix = 0; ix < NPPP; ix++)
  57.     pppHookRtns [ix] = NULL;
  58.         if ((pppHookSemId = semMCreate (SEM_Q_PRIORITY | SEM_INVERSION_SAFE))
  59.     == NULL)
  60.             return (ERROR);
  61. }
  62.     return (OK);
  63.     }
  64. /*******************************************************************************
  65. *
  66. * pppHookAdd - add a hook routine on a unit basis
  67. *
  68. * This routine adds a hook to the Point-to-Point Protocol (PPP) channel. 
  69. * The parameters to this routine specify the unit number (<unit>) of the
  70. * PPP interface, the hook routine (<hookRtn>), and the type of hook
  71. * specifying either a connect hook or a disconnect hook (<hookType>).
  72. * The following hook types can be specified for the <hookType> parameter:
  73. * .iP PPP_HOOK_CONNECT
  74. * Specify a connect hook.
  75. * .iP PPP_HOOK_DISCONNECT
  76. * Specify a disconnect hook.
  77. * RETURNS: OK, or ERROR if the hook cannot be added to the unit.
  78. *
  79. * SEE ALSO: pppHookDelete()
  80. */
  81. STATUS pppHookAdd
  82.     (
  83.     int unit, /* unit number */
  84.     FUNCPTR hookRtn, /* hook routine */
  85.     int hookType /* hook type connect/disconnect */
  86.     )
  87.     {
  88.     PPP_HOOK_RTNS * pPPPHookRtns;
  89.     if (pppHookSemId == NULL)
  90. {
  91.         errno = S_pppHookLib_NOT_INITIALIZED;
  92. return (ERROR);
  93. }
  94.     if (unit < 0 || unit > NPPP)
  95. {
  96. errno = S_pppHookLib_INVALID_UNIT;
  97.         return (ERROR);
  98. }
  99.     if ((hookType != PPP_HOOK_CONNECT) && (hookType != PPP_HOOK_DISCONNECT))
  100. {
  101. errno = S_pppHookLib_HOOK_UNKNOWN;
  102. return (ERROR);
  103. }
  104.     if ((pPPPHookRtns = pppHookRtns[unit]) == NULL)
  105. {
  106. /* allocate it, the first time it is called. */
  107. if ((pPPPHookRtns = 
  108.      (PPP_HOOK_RTNS *) calloc (1, sizeof (PPP_HOOK_RTNS))) == NULL)
  109.     return (ERROR);
  110. }
  111.     else /* check for adding the hook over again */
  112.      {
  113. if (((hookType == PPP_HOOK_CONNECT) && 
  114.      (pppHookRtns[unit]->connectHook != NULL)) ||
  115.     ((hookType == PPP_HOOK_DISCONNECT) && 
  116.      (pppHookRtns[unit]->disconnectHook != NULL)))
  117.     {
  118.     errno = S_pppHookLib_HOOK_ADDED;
  119.     return (ERROR);
  120.     }
  121. }
  122.     semTake (pppHookSemId, WAIT_FOREVER); /* exclusive access to list */
  123.     
  124.     pppHookRtns [unit] = pPPPHookRtns;
  125.     if (hookType == PPP_HOOK_CONNECT)
  126. pPPPHookRtns->connectHook = hookRtn;
  127.     else 
  128. pPPPHookRtns->disconnectHook = hookRtn;
  129.         
  130.     semGive (pppHookSemId); /* give up access */
  131.     return (OK);
  132.     }
  133. /*******************************************************************************
  134. *
  135. * pppHookDelete - delete a hook routine on a unit basis
  136. *
  137. * This routine deletes a hook added previously to the 
  138. * Point-to-Point Protocol (PPP) channel. The parameters to this routine 
  139. * specify the unit number (<unit>) of the PPP interface and the type of 
  140. * hook specifying either a connect hook or a disconnect hook (<hookType>).
  141. * The following hook types can be specified for the <hookType> parameter:
  142. * .iP PPP_HOOK_CONNECT
  143. * Specify a connect hook.
  144. * .iP PPP_HOOK_DISCONNECT
  145. * Specify a disconnect hook.
  146. * RETURNS: OK, or ERROR if the hook cannot be deleted for the unit.
  147. *
  148. * SEE ALSO: pppHookAdd()
  149. */
  150. STATUS pppHookDelete
  151.     (
  152.     int unit, /* unit number */
  153.     int hookType /* hook type connect/disconnect */
  154.     )
  155.     {
  156.     if (pppHookSemId == NULL)
  157. {
  158.         errno = S_pppHookLib_NOT_INITIALIZED;
  159. return (ERROR);
  160. }
  161.     if (unit < 0 || unit > NPPP)
  162. {
  163. errno = S_pppHookLib_INVALID_UNIT;
  164.         return (ERROR);
  165. }
  166.     if ((hookType != PPP_HOOK_CONNECT) && (hookType != PPP_HOOK_DISCONNECT))
  167. {
  168. errno = S_pppHookLib_HOOK_UNKNOWN;
  169. return (ERROR);
  170. }
  171.     if ((pppHookRtns[unit] == NULL) || (((hookType == PPP_HOOK_CONNECT) && 
  172.  (pppHookRtns[unit]->connectHook 
  173.   == NULL)) ||
  174. ((hookType == PPP_HOOK_DISCONNECT) && 
  175.  (pppHookRtns[unit]->disconnectHook
  176.   == NULL))))
  177.      {
  178. errno = S_pppHookLib_HOOK_DELETED;
  179. return (ERROR);
  180. }
  181.     else 
  182. {
  183. semTake (pppHookSemId, WAIT_FOREVER); /* exclusive access to list */
  184. if (hookType == PPP_HOOK_CONNECT)
  185.     pppHookRtns[unit]->connectHook = NULL;
  186. else
  187.     pppHookRtns[unit]->disconnectHook = NULL;
  188. if ((pppHookRtns[unit]->connectHook == NULL) && 
  189.     (pppHookRtns[unit]->disconnectHook == NULL))
  190.     {
  191.     free (pppHookRtns[unit]); /* free if both hooks are deleted */
  192.     pppHookRtns [unit] = NULL;
  193.     }
  194. semGive (pppHookSemId); /* give up access */
  195. }
  196.     return (OK);
  197.     }