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

VxWorks

开发平台:

C/C++

  1. /* rpcLib.c - Remote Procedure Call (RPC) support library */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 02v,07may02,kbw  man page edits
  8. 02u,15apr02,wap  change portmapd task priority from 100 to 54
  9. 02t,15oct01,rae  merge from truestack ver 02y base 02r (AE/5.X)
  10. 02s,24may01,mil  Bump up portmapper task stack size to 10000.
  11. 02r,14mar99,jdi  doc: removed refs to config.h and/or configAll.h (SPR 25663).
  12. 02q,16oct96,dgp  doc: modify rpcLib to show correct location of sprites demo
  13.       SPR #7221
  14. 02p,22oct95,jdi  doc: removed references to dbxtool/dbxTask (SPR 4378).
  15. 02o,11nov94,jag  Changed rpcTaskDeleteHook to fix SPR# 3269
  16. 02n,05may93,caf  tweaked for ansi.
  17. 02m,17jul94,ms   jacked up stack size for VxSim/HPPA
  18. 02l,23sep94,rhp  doc: clarify which RPC data structures auto-deleted (SPR3148)
  19. 02k,15sep94,rhp  documentation: delete obsolete ref to dbxLib (SPR#3446).
  20. 02j,02feb93,jdi  documentation tweak on configuration.
  21. 02i,20jan93,jdi  documentation cleanup for 5.1.
  22. 02h,19jul92,smb  removed abort to ANSI stdlib library.
  23. 02g,18jul92,smb  Changed errno.h to errnoLib.h.
  24. 02f,26may92,rrr  the tree shuffle
  25. 02e,13dec91,gae  ANSI cleanup.
  26. 02d,04oct91,rrr  passed through the ansification filter
  27.                   -changed functions to ansi style
  28.   -changed includes to have absolute path from h/
  29.   -fixed #else and #endif
  30.   -changed VOID to void
  31.   -changed copyright notice
  32. 02c,13may91,jdi  documentation tweak.
  33. 02b,05apr91,jdi  documentation -- removed header parens and x-ref numbers;
  34.  doc review by dnw.
  35. 02a,01mar91,elh  made references to include the rpc library routines.
  36. 01z,24mar91,del  made tPortmapd stack larger for i960ca (no change for 68k).
  37. 01y,11mar91,jaa  documentation cleanup.
  38. 01x,02oct90,hjb  added code to clean up raw rpc and errBuf properly in
  39.    rpcTaskDeleteHook().
  40. 01w,10may90,dnw  removed calls to individual rpc module init and delete routines
  41.  changed to do init/delete of statics in rpcTaskInit and
  42.    rpcTaskDeleteHook
  43.  added rpcErrnoGet()
  44. 01v,19apr90,hjb  deleted references to bindresvportInit and associated module
  45.  statics.
  46. 01u,15apr90,jcf  changed portmapd name to tPortmapd
  47.  made module statics referenced via macro thru taskIdCurrent.
  48. 01t,07mar90,jdi  documentation cleanup.
  49. 01s,27oct89,hjb  added bindresvport handling to the rpcTaskInit () and
  50.  rpcTaskDeleteHook ().
  51. 01r,23jul89,gae  removed explicit NFS cleanup -- now done with taskDeleteHook.
  52. 01q,23apr89,gae  rpcDeleteHook now invokes each rpc facility's cleanup routine.
  53.  Removed documentation on callrpc's failings -- fixed.
  54.  changed rpcTaskInit to not bother passing the module list.
  55. 01p,08apr89,dnw  changed rpcInit() to call taskVarInit().
  56.  changed rpcInit() to remember if init has already been done.
  57. 01o,26mar89,llk  added a call to nfsClientCacheCleanUp in rpcTaskDeleteHook.
  58. 01n,30jun88,llk  moved rpcClntErrnoSet() here from nfsLib.
  59. 01m,22jun88,dnw  name tweaks.
  60. 01l,06jun88,dnw  changed taskSpawn/taskCreate args.
  61. 01k,30may88,dnw  changed to v4 names.
  62. 01j,13apr88,gae  lint, documentation, changed parm. to taskVar{Add,Del}().
  63.  fixed portmapd to run at priority 100.  Made rpcTaskExit()
  64.  local and made it become automatic as a task delete hook.
  65.  checked for valid nfsClientCache in rpcTaskExit().
  66. 01j,19apr88,llk  added nfsClientCache field to taskModuleList.
  67. 01i,30mar88,rdc  beefed up documentation.
  68. 01h,22feb88,jcf  made kernel independent.
  69. 01g,29dec87,rdc  rpcTaskInit now checks to see if it has already been called.
  70. 01f,13dec87,rdc  added rpcTaskExit.
  71. 01e,04dec87,rdc  removed perror (now in unixLib.c).
  72. 01d,05nov87,dnw  moved definition of taskModuleList here from rpcGbl.h.
  73. 01c,23oct87,dnw  changed rpcInit to rpcTaskInit.
  74.  added new rpcInit that initializes overall rpc facilities.
  75. 01b,14oct87,rdc  added perror and abort.
  76. 01a,04oct87,rdc  written.
  77. */
  78. /*
  79. This library supports Sun Microsystems' Remote Procedure Call (RPC)
  80. facility.  RPC provides facilities for implementing distributed
  81. client/server-based architectures.  The underlying communication mechanism
  82. can be completely hidden, permitting applications to be written without
  83. any reference to network sockets.  The package is structured such that
  84. lower-level routines can optionally be accessed, allowing greater control
  85. of the communication protocols.
  86. For more information and a tutorial on RPC, see Sun Microsystems'
  87. .I "Remote Procedure Call Programming Guide."
  88. For an example of RPC usage, see `/target/unsupported/demo/sprites'.
  89. The RPC facility is enabled when INCLUDE_RPC is defined.
  90. VxWorks supports Network File System (NFS), which is built
  91. on top of RPC.  If NFS is configured into the VxWorks system,
  92. RPC is automatically included as well.
  93. IMPLEMENTATION
  94. A task must call rpcTaskInit() before making any calls to other
  95. routines in the RPC library.  This routine creates task-specific data
  96. structures required by RPC.  These task-specific data structures are
  97. automatically deleted when the task exits.
  98. Because each task has its own RPC context, RPC-related objects (such as
  99. SVCXPRTs and CLIENTs) cannot be shared among tasks; objects created by one
  100. task cannot be passed to another for use.  Such additional objects must
  101. be explicitly deleted (for example, using task deletion hooks).
  102. INCLUDE FILES: rpc.h
  103. SEE ALSO: nfsLib, nfsDrv, Sun Microsystems'
  104. .I "Remote Procedure Call Programming Guide"
  105. */
  106. #include "vxWorks.h"
  107. #include "rpc/rpctypes.h"
  108. #include "rpc/rpcGbl.h"
  109. #include "taskLib.h"
  110. #include "taskHookLib.h"
  111. #include "stdlib.h"
  112. #include "unistd.h"
  113. #include "string.h"
  114. #include "stdio.h"
  115. #include "errnoLib.h"
  116. #include "rpc/portmap.h"
  117. #include "memPartLib.h"
  118. int portmapdId;
  119. int portmapdPriority  = 54;
  120. int portmapdOptions   = VX_SUPERVISOR_MODE | VX_UNBREAKABLE;
  121. #if       (CPU_FAMILY!=I960) && (CPU_FAMILY!=SIMHPPA)
  122. int portmapdStackSize = 10000;
  123. #else /* CPU_FAMILY!=I960 */
  124. int portmapdStackSize = 30000;
  125. #endif /* CPU_FAMILY!=I960 */
  126. /* forward static functions */
  127. static void rpcTaskDeleteHook (WIND_TCB *pTcb);
  128. /*******************************************************************************
  129. *
  130. * rpcInit - initialize the RPC package
  131. *
  132. * This routine must be called before any task can use the RPC facility; 
  133. * it spawns the portmap daemon.  It is called automatically if INCLUDE_RPC
  134. * is defined.
  135. *
  136. * VXWORKS AE PROTECTION DOMAINS
  137. * Under VxWorks AE, you can call this function from within the kernel 
  138. * protection domain only.  This restriction does not apply under non-AE 
  139. * versions of VxWorks.  
  140. *
  141. * RETURNS: OK, or ERROR if the portmap daemon cannot be spawned.
  142. */
  143. STATUS rpcInit (void)
  144.     {
  145.     static BOOL rpcInitialized = FALSE; /* TRUE = rpc inited */
  146.     if (!rpcInitialized)
  147. {
  148. /* spawn the portmap daemon */
  149. portmapdId = taskSpawn ("tPortmapd", portmapdPriority,
  150. portmapdOptions, portmapdStackSize,
  151. (FUNCPTR)portmapd, 0, 0, 0, 0, 0, 0,
  152.                                 0, 0, 0, 0);
  153. if (portmapdId == ERROR)
  154.     return (ERROR);
  155. rpcInitialized = TRUE;
  156. }
  157.     /*
  158.      * the following is to drag in the rest of rpc
  159.      */
  160.     clnt_genericInclude ();
  161.     clnt_rawInclude ();
  162.     clnt_simpleInclude ();
  163.     pmap_getmapsInclude ();
  164.     svc_rawInclude ();
  165.     svc_simpleInclude ();
  166.     xdr_floatInclude ();
  167.     return (OK);
  168.     }
  169. /*******************************************************************************
  170. *
  171. * rpcTaskInit - initialize a task's access to the RPC package
  172. *
  173. * This routine must be called by a task before it makes any calls to
  174. * other routines in the RPC package.
  175. *
  176. * VXWORKS AE PROTECTION DOMAINS
  177. * Under VxWorks AE, you can call this function from within the kernel 
  178. * protection domain only.  This restriction does not apply under non-AE 
  179. * versions of VxWorks.  
  180. *
  181. * RETURNS: OK, or ERROR if there is insufficient memory or the routine is
  182. * unable to add a task delete hook.
  183. */
  184. STATUS rpcTaskInit (void)
  185.     {
  186.     static BOOL rpcInstalled = FALSE;
  187.     FAST RPC_STATICS *pRpcStatics;
  188.     if (!rpcInstalled)
  189. {
  190. if (taskDeleteHookAdd ((FUNCPTR)rpcTaskDeleteHook) == ERROR)
  191.     return (ERROR);
  192. rpcInstalled = TRUE;
  193. }
  194.     /* if rpcTaskInit has already been called for this task,
  195.      * the RpcStatics pointer will already be filled in
  196.      */
  197.    if (taskRpcStatics != NULL)
  198. return (OK);
  199.     /* allocate the structure of rpc statics */
  200.     pRpcStatics = (RPC_STATICS *) KHEAP_ALLOC(sizeof(RPC_STATICS));
  201.     if (pRpcStatics == NULL)
  202. return (ERROR);
  203.     bzero ((char *)pRpcStatics, sizeof(RPC_STATICS));
  204.     taskRpcStatics = pRpcStatics; /* set pointer in tcb */
  205.     /* initialize clnt_simple statics */
  206.     pRpcStatics->clnt_simple.socket = RPC_ANYSOCK;
  207.     return (OK);
  208.     }
  209. /*******************************************************************************
  210. *
  211. * rpcTaskDeleteHook - deallocate RPC resources of exiting task
  212. *
  213. * This routine is the task delete hook for tasks using the RPC package.
  214. * It is installed by rpcTaskInit.
  215. */
  216. LOCAL void rpcTaskDeleteHook
  217.     (
  218.     WIND_TCB *pTcb      /* pointer to control block of exiting task */
  219.     )
  220.     {
  221. #ifdef _WRS_VXWORKS_5_X
  222.     FAST RPC_STATICS *pRpcStatics = pTcb->pRPCModList;
  223. #else
  224.     FAST RPC_STATICS *pRpcStatics = pTcb->pLcb->pRPCModList;
  225. #endif /* _WRS_VXWORKS_5_X */
  226.     
  227.     FAST int sock;
  228.     RPC_STATICS      *pDeleterStatics;
  229.     if (pRpcStatics == NULL)
  230. return; /* task didn't use RPC */
  231.     pDeleterStatics = taskRpcStatics; /* Save deleters RPC vars pointer */
  232.     taskRpcStatics  = pRpcStatics;      /* Use victims RPC vars pointer */
  233.     /* clnt_simple.c cleanup */
  234.     if (pRpcStatics->clnt_simple.client != NULL)
  235. clnt_destroy (pRpcStatics->clnt_simple.client);
  236.     if (pRpcStatics->clnt_simple.socket > 0)
  237. close (pRpcStatics->clnt_simple.socket);
  238.     /* svc.c cleanup */
  239.     /* close open sockets and allocated memory space for
  240.      * this server transport since VxWorks doesn't close
  241.      * the descriptors automatically when a task is terminated.
  242.      */
  243.     for (sock = 0; sock < FD_SETSIZE; sock++)
  244. {
  245. SVCXPRT *xprt = pRpcStatics->svc.xports [sock];
  246. /* is the socket registered? */
  247. if (xprt != NULL)
  248.     svc_destroy (xprt);
  249. }
  250.     /* raw cleanup */
  251.     if (pRpcStatics->clnt_raw != NULL)
  252.         (*(pRpcStatics->clnt_rawExit)) ();
  253.     if (pRpcStatics->svc_raw != NULL)
  254.         (*(pRpcStatics->svc_rawExit)) ();
  255.     /* error buffer cleanup */
  256.     if (pRpcStatics->errBuf != NULL)
  257.         KHEAP_FREE(pRpcStatics->errBuf);
  258.     /* free the rpc statics */
  259.     KHEAP_FREE((char *) pRpcStatics);
  260.     taskRpcStatics = pDeleterStatics;  /* Restore deleters RPC vars pointer */
  261.     }
  262. /******************************************************************************
  263. *
  264. * rpcClntErrnoSet - set RPC client status
  265. *
  266. * rpcClntErrnoSet calls errnoSet with the given "rpc stat" or'd with the
  267. * rpc status prefix.
  268. *
  269. * NOMANUAL
  270. */
  271. void rpcClntErrnoSet
  272.     (
  273.     enum clnt_stat status
  274.     )
  275.     {
  276.     errnoSet (M_rpcClntStat | (int) status);
  277.     }
  278. /******************************************************************************
  279. *
  280. * rpcErrnoGet - get RPC errno status
  281. *
  282. * This function returns the errno the way rpc code expects to see it, namely
  283. * without the rpc status prefix in the upper word.
  284. *
  285. * NOMANUAL
  286. */
  287. int rpcErrnoGet (void)
  288.     {
  289.     return (errnoGet () & 0xffff);
  290.     }