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

VxWorks

开发平台:

C/C++

  1. /* wtxexch.c - wtx message exchange implementation */
  2. /* Copyright 1984-1996 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,28sep01,fle  SPR#28684 : added usePMap parameter to ExchangeCreate ()
  7.                  routines
  8. 01d,11may99,fle  modified wtxExchangeFree since wtxRpcExchangeFree has been
  9.  modified  SPR 67367
  10. 01c,30sep96,elp  put in share, adapted to be compiled on target side SPR# 6775.
  11. 01b,10jul96,pad  changed order of include files.
  12. 01a,15may95,s_w  written. 
  13. */
  14. /* includes */
  15. #ifdef HOST
  16. #include <stdlib.h>
  17. #else
  18. #include "stdlib.h"
  19. #endif /* HOST */
  20. #include "wtxexch.h"
  21. #include "private/wtxexchp.h"
  22. /* defines */
  23. #define CHECK_HANDLE(handle, retVal) 
  24. if (handle == NULL || handle->self != handle) 
  25.     return retVal;
  26. /* exported functions */
  27. /*******************************************************************************
  28. *
  29. * wtxExchangeInitialize - initialize an exchange id
  30. *
  31. * This routine initailizes a handle pointed to buy <pXid> for use in
  32. * further exchange requests.  When the handle is finished with is should be
  33. * passed to wtxExchangeTerminate() to free any internal resources allocated.
  34. * If this routine fails then the exchange id will not be set.
  35. *
  36. * RETURNS: WTX_OK, or WTX_ERROR
  37. *
  38. * NOMANUAL
  39. */
  40. STATUS wtxExchangeInitialize 
  41.     (
  42.     WTX_XID * pXid /* Pointer to exchange id to initialize */
  43.     )
  44.     {
  45.     WTX_XID newXid;
  46.     if (pXid == NULL)
  47. return WTX_ERROR;
  48.     /* Allocate the new exchange struct */
  49.     newXid = calloc (1, sizeof (_WTX_EXCHANGE));
  50.     if (newXid == NULL)
  51. return WTX_ERROR;
  52.     /* Set the self field for validation */
  53.     newXid->self = newXid;
  54.     newXid->timeout = 30000; /* Default 30 second timeout */
  55.     *pXid = newXid;
  56.     
  57.     return WTX_OK;
  58.     }
  59. /*******************************************************************************
  60. *
  61. * wtxExchangeInstall - install exchange marshalling functions for handle
  62. *
  63. * This routine sets the exchange marshalling functions that define how
  64. * the exchange mechanism behaves for that handle. The function pointer
  65. * parameters <xCreate>, <xDelete>, <xExchange>, <xFree> and <xControl> 
  66. * should have the same function prototype as wtxExchangeCreate(), 
  67. * wtxExchangeDelete(), wtxExchange(), wtxExchangeFree() and
  68. * wtxExchangeControl() respectively. 
  69. *
  70. * RETURNS: WTX_OK, or WTX_ERROR
  71. *
  72. * NOMANUAL
  73. */
  74. STATUS wtxExchangeInstall 
  75.     (
  76.     WTX_XID xid, /* exchange id */
  77.     STATUS (*xCreate) (WTX_XID, const char *, BOOL), /* create routine */
  78.     STATUS (*xDelete) (WTX_XID), /* delete routine */
  79.     STATUS (*xExchange) (WTX_XID, WTX_REQUEST, /* exchange routine */
  80. void *, void *), 
  81.     WTX_ERROR_T (*xFree) (WTX_REQUEST, void *), /* free routine */
  82.     STATUS (*xControl) (WTX_XID, UINT32, void *) /* control routine */
  83.     )
  84.     {
  85.     CHECK_HANDLE (xid, WTX_ERROR);
  86.     xid->xCreate = (FUNCPTR) xCreate;
  87.     xid->xDelete = (FUNCPTR) xDelete;
  88.     xid->xExchange = (FUNCPTR) xExchange;
  89.     xid->xFree = (FUNCPTR) xFree;
  90.     xid->xControl = (FUNCPTR) xControl;
  91.     return WTX_OK;
  92.     }
  93. /*******************************************************************************
  94. *
  95. * wtxExchangeErrGet - get the last error code reported for the exchange
  96. *
  97. * This routine returns the WTX error code corresponding to the last 
  98. * exchange call that returned a WTX_ERROR status.  The error code is not
  99. * valid if no routine has returned WTX_ERROR unless it has been cleared
  100. * using wtxExchangeErrClear().
  101. *
  102. * RETURNS: WTX error code for handle.
  103. *
  104. * NOMANUAL
  105. */
  106. WTX_ERROR_T wtxExchangeErrGet
  107.     (
  108.     WTX_XID xid /* exchange id */
  109.     )
  110.     {
  111.     CHECK_HANDLE (xid, WTX_ERR_EXCHANGE_INVALID_HANDLE);
  112.     return xid->error;
  113.     }
  114. /*******************************************************************************
  115. *
  116. * wtxExchangeErrClear - clear the error code associated with the exchange
  117. *
  118. * This routine clears the error code for the exchange id <xid> so that
  119. * wtxExchangeErrGet() will return WTX_ERR_NONE until an error occurs.
  120. *
  121. * RETURNS: WTX_OK, or WTX_ERROR
  122. *
  123. * NOMANUAL
  124. */
  125. STATUS wtxExchangeErrClear
  126.     (
  127.     WTX_XID xid /* exchange id */
  128.     )
  129.     {
  130.     CHECK_HANDLE (xid, WTX_ERROR);
  131.     xid->error = WTX_ERR_NONE;
  132.     return WTX_OK;
  133.     }
  134. /*******************************************************************************
  135. *
  136. * wtxExchangeTerminate - terminate use of exchange id
  137. *
  138. * This routine performs all necessary cleanups on the exchange id <xid>
  139. * and makes is invalid for further use.  This routine should always be 
  140. * called when a handle is no longer needed.  Further use of the handle 
  141. * after termination will probably result in WTX_ERR_EXCHANGE_INVALID_HANDLE
  142. * errors or unpredictable system behaviour.
  143. *
  144. * RETURNS: WTX_OK, or WTX_ERROR
  145. *
  146. * NOMANUAL
  147. */
  148. STATUS wtxExchangeTerminate
  149.     (
  150.     WTX_XID xid /* exchange id */
  151.     )
  152.     {
  153.     CHECK_HANDLE (xid, WTX_ERROR);
  154.     xid->self = 0;
  155.     free (xid);
  156.     return WTX_OK;
  157.     }
  158.     
  159. /*******************************************************************************
  160. *
  161. * wtxExchange - perform an exchange request
  162. *
  163. * This routine performs the exchange request <request> on the server that
  164. * <xid> has been connected to using wtxExchangeCreate(). <pIn> and <pOut>
  165. * point to message in and out args (ie. the request paramters and result)
  166. * that are used in the call which must contain the wtxCore structure.
  167. * During the exchange request memory may be internally allocated to the
  168. * result pointed to by <pOut> and this must be freed by the caller by
  169. * calling wtxExchangeFree() except if the result of the call is an error.
  170. * This is because the exchange mechanism detects transport and request
  171. * errors and does any necessary deallocation implicitly.
  172. *
  173. * RETURNS: WTX_OK, or WTX_ERROR
  174. *
  175. * NOMANUAL
  176. */
  177. STATUS wtxExchange 
  178.     (
  179.     WTX_XID xid, /* exchange id */
  180.     WTX_REQUEST request, /* exchange request number */
  181.     void * pIn, /* pointer to input arg message */
  182.     void * pOut /* pointer to output arg (result) message */
  183.     )
  184.     {
  185.     CHECK_HANDLE (xid, WTX_ERROR);
  186.     
  187.     if (xid->xExchange == NULL)
  188. WTX_EXCHANGE_RETURN (xid, WTX_ERR_EXCHANGE_MARSHALPTR, WTX_ERROR);
  189.     return (*xid->xExchange) (xid, request, pIn, pOut);
  190.     }
  191. /*******************************************************************************
  192. *
  193. * wtxExchangeFree - free result of exchange request
  194. *
  195. * This routine frees an memory *internally* allocated to a result during
  196. * an exchange request. It will not deallocate the message memory itself
  197. * which should be done by the user.  The parameter <request> must 
  198. * specify the exchange request number that the result was created by.
  199. *
  200. * RETURNS: WTX_OK, or WTX_ERROR
  201. *
  202. * NOMANUAL
  203. */
  204. STATUS wtxExchangeFree 
  205.     (
  206.     WTX_XID xid, /* exchange id               */
  207.     WTX_REQUEST request, /* WTX request number        */
  208.     void * pData /* pointer to result message */
  209.     )
  210.     {
  211.     WTX_ERROR_T freeErr = WTX_ERR_NONE; /* free function error code  */
  212.     CHECK_HANDLE (xid, WTX_ERROR);
  213.     /* check for the free function pointer */
  214.     if (xid->xFree == NULL)
  215. WTX_EXCHANGE_RETURN (xid, WTX_ERR_EXCHANGE_MARSHALPTR, WTX_ERROR);
  216.     freeErr = (*xid->xFree) (request, pData);
  217.     if (freeErr != WTX_ERR_NONE)
  218. {
  219. WTX_EXCHANGE_RETURN (xid, freeErr, WTX_ERROR);
  220. }
  221.     else
  222. {
  223. return (WTX_OK);
  224. }
  225.     }
  226. /*******************************************************************************
  227. *
  228. * wtxExchangeControl - perform miscellaneous control requests on exchange
  229. *
  230. * This routine performs control requests on an exchange id eg. setting
  231. * the exchange transport timeout.  Not all requests will be supported by 
  232. * all exchange implementations, eg. some transports may not support setting
  233. * of a timeout, in which case the error WTX_ERR_EXCHANGE_REQUEST_UNSUPPORTED
  234. * is reported.
  235. *
  236. * RETURNS: WTX_OK, or WTX_ERROR
  237. *
  238. * NOMANUAL
  239. */
  240. STATUS wtxExchangeControl 
  241.     (
  242.     WTX_XID xid, /* exchange id */
  243.     UINT32 ctlRequest, /* control request number */
  244.     void * pArg /* pointer to control request arg data */
  245.     )
  246.     {
  247.     CHECK_HANDLE (xid, WTX_ERROR);
  248.     if (xid->xControl == NULL)
  249. WTX_EXCHANGE_RETURN (xid, WTX_ERR_EXCHANGE_MARSHALPTR, WTX_ERROR);
  250.     return (*xid->xControl) (xid, ctlRequest, pArg);
  251.     }
  252. /*******************************************************************************
  253. *
  254. * wtxExchangeCreate - connect the exchange id to a WTX server
  255. *
  256. * This routine makes a connection between an unconnected exchange
  257. * handle and a WTX request server. The server is specified by the
  258. * service identification key <key> which specifies the transport,
  259. * server name and transport address for contacting it.  Server keys
  260. * are obtained from the WTX registry which is a server itself. To
  261. * avoid the user having to bootstrap the key mechanism the special
  262. * NULL key value can be supplied which means "the default key for the
  263. * registry service using the current transport mechanism". The current
  264. * transport mechanism is defined by the marshalling routines installed
  265. * by wtxExchangeInstall.
  266. *
  267. * RETURNS: WTX_OK, or WTX_ERROR
  268. *
  269. * NOMANUAL
  270. */
  271. STATUS wtxExchangeCreate 
  272.     (
  273.     WTX_XID xid, /* exchange id */
  274.     const char * key, /* server key string */
  275.     BOOL usePMap /* shall we use portmapper ? */
  276.     )
  277.     {
  278.     CHECK_HANDLE (xid, WTX_ERROR);
  279.     if (xid->xCreate == NULL)
  280. WTX_EXCHANGE_RETURN (xid, WTX_ERR_EXCHANGE_MARSHALPTR, WTX_ERROR);
  281.     return (*xid->xCreate) (xid, key, usePMap);
  282.     }
  283. /*******************************************************************************
  284. *
  285. * wtxExchangeDelete - disconnect the exchange id from a WTX server.
  286. *
  287. * This routine disconnects an exchange id from the currently
  288. * attached WTX server so no more requests can be made.
  289. *
  290. * RETURNS: WTX_OK, or WTX_ERROR
  291. *
  292. * NOMANUAL
  293. */
  294. STATUS wtxExchangeDelete 
  295.     (
  296.     WTX_XID xid /* exchange id */
  297.     )
  298.     {
  299.     CHECK_HANDLE (xid, WTX_ERROR);
  300.     if (xid->xDelete == NULL)
  301. WTX_EXCHANGE_RETURN (xid, WTX_ERR_EXCHANGE_MARSHALPTR, WTX_ERROR);
  302.     return (*xid->xDelete) (xid);
  303.     }