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

VxWorks

开发平台:

C/C++

  1. case WTX_EVENT_SYM_REMOVED:
  2.     return WTX_EVT_SYM_REMOVED;
  3. case WTX_EVENT_OBJ_LOADED:
  4.     return WTX_EVT_OBJ_LOADED;
  5. case WTX_EVENT_OBJ_UNLOADED:
  6.     return WTX_EVT_OBJ_UNLOADED;
  7. case WTX_EVENT_CTX_START:
  8.     return WTX_EVT_CTX_START;
  9. case WTX_EVENT_CTX_EXIT:
  10.     return WTX_EVT_CTX_EXIT;
  11. case WTX_EVENT_EXCEPTION:
  12.     return WTX_EVT_EXCEPTION;
  13. case WTX_EVENT_VIO_WRITE:
  14.     return WTX_EVT_VIO_WRITE;
  15. case WTX_EVENT_TOOL_ATTACH:
  16.     return WTX_EVT_TOOL_ATTACH;
  17. case WTX_EVENT_TOOL_DETACH:
  18.     return WTX_EVT_TOOL_DETACH;
  19. case WTX_EVENT_TOOL_MSG:
  20.     return WTX_EVT_TOOL_MSG;
  21. case WTX_EVENT_TEXT_ACCESS:
  22.     return WTX_EVT_TEXT_ACCESS;
  23. case WTX_EVENT_DATA_ACCESS:
  24.     return WTX_EVT_DATA_ACCESS;
  25. case WTX_EVENT_CALL_RETURN:
  26.     return WTX_EVT_CALL_RETURN;
  27. case WTX_EVENT_USER:
  28.     return WTX_EVT_USER;
  29. case WTX_EVENT_NONE:
  30.     return WTX_EVT_NONE;
  31.         case WTX_EVENT_HW_BP:
  32.             return WTX_EVT_HW_BP;
  33. case WTX_EVENT_OTHER:
  34.     return WTX_EVT_OTHER;
  35. case WTX_EVENT_INVALID:
  36.     return WTX_EVT_INVALID;
  37. case WTX_EVENT_TS_KILLED:
  38.     return WTX_EVT_TS_KILLED;
  39. case WTX_EVENT_EVTPT_ADDED:
  40.     return WTX_EVT_EVTPT_ADDED;
  41. case WTX_EVENT_EVTPT_DELETED:
  42.     return WTX_EVT_EVTPT_DELETED;
  43. default:
  44.     return WTX_EVT_UNKNOWN;
  45. }
  46.     return WTX_EVT_UNKNOWN;
  47.     }
  48. /******************************************************************************
  49. *
  50. * wtxServiceAdd - add a new service to the agent
  51. *
  52. * This command adds a new service to the target server. The service is 
  53. * provided in WDB- and WTX-level object modules. The WDB object module is 
  54. * downloaded to the target, and the WTX object module is dynamically linked
  55. * to the target server. 
  56. * The <wtxInProcName> and <wtxOutProcName> arguments are the names of 
  57. * known structure filter procedures used to exchange data with the new
  58. * service.
  59. *
  60. * <wtxObjFile> is the name of a dynamically loadable library file that
  61. * contain the WTX service routine, the service initialization routine, and
  62. * XDR filters code for the service input and output parameters.
  63. * Upon success the service number to be used for future requests to the newly
  64. * added service is returned in <mySvcNumber>.
  65. *
  66. * Example:
  67. * .CS
  68. *
  69. *   /@ 
  70. *    * Add a WTX service called mySvc and get the service number in 
  71. *    * mySvcNumber.
  72. *    @/
  73. *
  74. *   if (wtxServiceAdd 
  75. *           (
  76. *           wtxh,         /@ our tool handle @/
  77. *           &mySvcNumber,         /@ where to return service num. @/
  78. *           NULL, NULL, NULL, NULL,    /@ no WDB items @/
  79. *           "mySvc.so",         /@ new service DLL @/
  80. *           "mySvcName",         /@ service routine name @/
  81. *           "xdr_WTX_MY_SVC_IN_PARAM", /@ input param XDR filter @/
  82. *           "xdr_WTX_MY_SVC_OUT_PARAM" /@ output param XDR filter @/
  83. *           ) != OK)
  84. *       {
  85. *       printf("Error: cannot add mySvc service:%sn",wtxErrMsgGet(wtxh));
  86. *       wtxTerminate (wtxh); /@ terminate tool connection @/
  87. *       exit(0);
  88. *       }
  89. *
  90. *     ...
  91. *
  92. *   /@ get our client handle in order to call the newly added service @/
  93. *
  94. *   pClient = (CLIENT *) wtxh->server->transport;
  95. *
  96. *   /@ set client call timeout @/
  97. *
  98. *   timeout.tv_sec = 10;
  99. *   timeout.tv_usec = 0;
  100. *
  101. *   /@ Call the newly added service @/
  102. *
  103. *   rpcStat = clnt_call (           
  104. *       pClient,                                /@ client handle @/
  105. *       mySvcNumber,                            /@ service number @/
  106. *       xdr_WTX_MY_SVC_IN_PARAM,                /@ request XDR filter @/
  107. *       (char *) pIn,                           /@ ptr to input data @/
  108. *       xdr_WTX_MY_SVC_OUT_PARAM,               /@ reply XDR filter @/
  109. *       (char *) pOut,                          /@ ptr to result @/
  110. *       timeout                                 /@ request timeout value @/
  111. *       );
  112. *
  113. * .CE
  114. *
  115. * WARNING: In the Tornado 1.0 release, wtxServiceAdd() can only add WTX 
  116. * services that do not require an additional WDB service.  The <wdbSvcNum>,
  117. * <wdbName>, <wdbObjFile> and <wdbSvcInitRtn> parameters must be set to NULL.
  118. * RETURNS: WTX_OK or WTX_ERROR.
  119. *
  120. * SEE ALSO: WTX_SERVICE_ADD
  121. */
  122. STATUS wtxServiceAdd
  123.     (
  124.     HWTX hWtx, /* WTX API handle                         */
  125.     UINT32 * wtxSvcNum, /* where to return WTX RPC service number */
  126.     UINT32 wdbSvcNum, /* WDB RPC service number                 */
  127.     char * wdbName, /* WDB service name                       */
  128.     char * wdbObjFile, /* WDB service object module              */
  129.     char * wdbSvcInitRtn, /* WDB svc initialization routine name    */
  130.     char * wtxObjFile, /* WTX xdr/service DLL file               */
  131.     char * wtxName, /* WTX service routine name               */
  132.     char * wtxInProcName, /* WTX service input xdr procedure name   */
  133.     char * wtxOutProcName /* WTX service output xdr procedure name  */
  134.     )
  135.     {
  136.     WTX_MSG_SERVICE_DESC in; /* exch input desc  */
  137.     WTX_MSG_RESULT out; /* exch result desc */
  138.     WTX_ERROR_T callStat; /* exch error code  */
  139.     STATUS status = WTX_ERROR; /* returned status  */
  140.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  141.     /* first of all, check that all the WTX given parameters are not NULL */
  142.     if ( (wtxObjFile == NULL) || (wtxName == NULL) || (wtxInProcName == NULL) ||
  143.  (wtxOutProcName == NULL))
  144. {
  145. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  146. }
  147.     /* clean in and out items */
  148.     memset (&in, 0, sizeof (in));
  149.     memset (&out, 0, sizeof (out));
  150.     in.pWtxServiceDesc = (WTX_WTX_SERVICE_DESC *)
  151.                          malloc (sizeof (WTX_WTX_SERVICE_DESC));
  152.     if (in.pWtxServiceDesc == NULL)
  153. {
  154. wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  155. goto error1;
  156. }
  157.     /*
  158.      * allocate memory for the WDB service desc only if one of the WDB
  159.      * parameters is not NULL
  160.      */
  161.     if ( (wdbSvcNum != 0) || (wdbName != NULL) || (wdbObjFile != NULL) ||
  162.  (wdbSvcInitRtn != NULL))
  163. {
  164. in.pWdbServiceDesc = (WTX_WDB_SERVICE_DESC *)
  165.      malloc (sizeof (WTX_WDB_SERVICE_DESC));
  166. if (in.pWdbServiceDesc == NULL)
  167.     {
  168.     wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  169.     goto error2;
  170.     }
  171. /* initialize the WDB service description */
  172. in.pWdbServiceDesc->rpcNum = wdbSvcNum;
  173. in.pWdbServiceDesc->name = wdbName;
  174. in.pWdbServiceDesc->svcObjFile = wdbObjFile;
  175. in.pWdbServiceDesc->initRtnName = wdbSvcInitRtn;
  176. }
  177.     in.pWtxServiceDesc->svcObjFile = wtxObjFile;
  178.     in.pWtxServiceDesc->svcProcName = wtxName;
  179.     in.pWtxServiceDesc->inProcName = wtxInProcName;
  180.     in.pWtxServiceDesc->outProcName = wtxOutProcName;
  181.     callStat = exchange (hWtx, WTX_SERVICE_ADD, &in, &out);
  182.     if (callStat != WTX_ERR_NONE)
  183. {
  184. wtxErrSet (hWtx, callStat);
  185. goto error3;
  186. }
  187.     status = WTX_OK;
  188.     *wtxSvcNum = out.val.value_u.v_uint32;
  189.     wtxExchangeFree (hWtx->server, WTX_SERVICE_ADD, &out);
  190. error3:
  191.     /* free the input descriptions */
  192.     if (in.pWdbServiceDesc != NULL)
  193. free (in.pWdbServiceDesc);
  194. error2:
  195.     if (in.pWtxServiceDesc != NULL)
  196. free (in.pWtxServiceDesc);
  197. error1:
  198.     return status;
  199.     }
  200. /******************************************************************************
  201. *
  202. * wtxSymAdd - add a symbol with the given name, value, and type
  203. *
  204. * This routine adds a new symbol with the specified name, value, and type to 
  205. * the target server symbol table.
  206. *
  207. * RETURNS: WTX_OK or WTX_ERROR.
  208. *
  209. * SEE ALSO: WTX_SYM_ADD, wtxSymFind(), wtxSymListGet(), wtxSymRemove()
  210. */
  211. STATUS wtxSymAdd
  212.     (
  213.     HWTX hWtx, /* WTX API handle */
  214.     const char * name, /* name of symbol to add */
  215.     TGT_ADDR_T value, /* value of symbol to add */
  216.     UINT8  type /* type of symbol to add */
  217.     )
  218.     {
  219.     WTX_MSG_SYMBOL_DESC in; /* input to WTX call */
  220.     WTX_MSG_RESULT  out;
  221.     UINT32  result;
  222.     WTX_ERROR_T callStat; /* client status */
  223.     
  224.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  225.     memset (&in, 0, sizeof (in));
  226.     memset (&out, 0, sizeof (out));
  227.     in.symbol.name = (char *) name;
  228.     in.symbol.value = value;
  229.     in.symbol.type = type;
  230.     callStat = exchange (hWtx, WTX_SYM_ADD, &in, &out);
  231.     if (callStat != WTX_ERR_NONE)
  232. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  233.     result = out.val.value_u.v_uint32;
  234.     wtxExchangeFree (hWtx->server, WTX_SYM_ADD, &out);
  235.     return (result);
  236.     }
  237. /******************************************************************************
  238. *
  239. * wtxSymAddWithGroup - add a symbol with the given name, value, type and group
  240. *
  241. * This routine adds a new symbol with the specified name, value, type and 
  242. * group to the target server symbol table.
  243. *
  244. * RETURNS: WTX_OK or WTX_ERROR.
  245. *
  246. * SEE ALSO: WTX_SYM_ADD, wtxSymFind(), wtxSymListGet(), wtxSymRemove()
  247. */
  248. STATUS wtxSymAddWithGroup
  249.     (
  250.     HWTX hWtx, /* WTX API handle */
  251.     const char * name, /* name of symbol to add */
  252.     TGT_ADDR_T value, /* value of symbol to add */
  253.     UINT8  type, /* type of symbol to add */
  254.     UINT16 group /* group of symbol to add */
  255.     )
  256.     {
  257.     WTX_MSG_SYMBOL_DESC in; /* input to WTX call */
  258.     WTX_MSG_RESULT  out;
  259.     UINT32  result;
  260.     WTX_ERROR_T callStat; /* client status */
  261.     
  262.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  263.     memset (&in, 0, sizeof (in));
  264.     memset (&out, 0, sizeof (out));
  265.     in.symbol.name = (char *) name;
  266.     in.symbol.value = value;
  267.     in.symbol.type = type;
  268.     in.symbol.group = group;
  269.     callStat = exchange (hWtx, WTX_SYM_ADD, &in, &out);
  270.     if (callStat != WTX_ERR_NONE)
  271. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  272.     result = out.val.value_u.v_uint32;
  273.     wtxExchangeFree (hWtx->server, WTX_SYM_ADD, &out);
  274.     return (result);
  275.     }
  276. /*******************************************************************************
  277. * wtxSymFind - find information on a symbol given its name or value
  278. *
  279. * This routine searches for a symbol which matches the supplied
  280. * search criteria.  If <symName> is non-NULL, the search is for a symbol
  281. * whose name matches <symName>.  If <symName> is NULL, the 
  282. * search is for one with value <symValue>.  When searching by name,
  283. * the <exactName> flag is used to control whether the name must exactly
  284. * match <symName> or only partially.  In both value and name searches,
  285. * a symbol type <symType> can be supplied to further refine the search.
  286. * Valid symbol types are defined in a_out.h.  To prevent the type being
  287. * considered in the search set <typeMask> to 0.
  288. *
  289. * The result of the search is a pointer to a symbol which 
  290. * must be freed by the user calling wtxResultFree().
  291. *
  292. * EXPAND ../../../include/wtxmsg.h WTX_SYMBOL
  293. *
  294. * RETURNS: A pointer to the symbol or NULL on error.
  295. *
  296. * SEE ALSO: WTX_SYM_FIND, wtxResultFree().
  297. */
  298. WTX_SYMBOL * wtxSymFind
  299.     (
  300.     HWTX hWtx, /* WTX API handle */
  301.     const char * symName, /* name of symbol */
  302.     TGT_ADDR_T symValue, /* value of symbol */
  303.     BOOL32 exactName, /* must match name exactly */
  304.     UINT8 symType, /* type of symbol */
  305.     UINT8 typeMask /* mask to select type bits */
  306.     )
  307.     {
  308.     WTX_MSG_SYMBOL_DESC in; /* input to WTX call */
  309.     WTX_MSG_SYMBOL_DESC * pOut; /* result pointer */
  310.     WTX_ERROR_T callStat; /* client status */
  311.     
  312.     WTX_CHECK_CONNECTED (hWtx, NULL);
  313.     pOut = calloc (1, sizeof (WTX_MSG_SYMBOL_DESC));
  314.     if (pOut == NULL)
  315. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  316.     memset (&in, 0, sizeof (in));
  317.     in.symbol.name = (char *) symName;
  318.     in.symbol.exactName = exactName;
  319.     in.symbol.value = symValue;
  320.     in.symbol.type = symType;
  321.     in.symbol.typeMask = typeMask;
  322.     callStat = exchange (hWtx, WTX_SYM_FIND, &in, pOut);
  323.     if (callStat != WTX_ERR_NONE)
  324. {
  325. free (pOut); /* Free allocated message */
  326. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  327. }
  328.     /* add pointer to the wtxResultFree () list */
  329.     if (wtxFreeAdd (hWtx, (void *) &pOut->symbol, NULL, pOut, WTX_SYM_FIND,
  330.     hWtx->server, WTX_SVR_SERVER) != WTX_OK)
  331. {
  332. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  333. }
  334.     return (&pOut->symbol);
  335.     }    
  336. /*******************************************************************************
  337. *
  338. * wtxSymListGet - get a list of symbols matching the given search criteria
  339. *
  340. * This routine gets a list of symbols matching given search criteria.
  341. * <substring> is a symbol substring to match and <value> is a target symbol
  342. * address value to search around.  Either <string> or <value> should be set
  343. * to a non-NULL value, but not both. In addition, if <listUnknown> is set to
  344. * TRUE then only unknown symbols are listed and <substring> and <value> are
  345. * ignored.  If <moduleName> is non-NULL, it specifies the module to search.
  346. * Even if no symbols match the search parameters, the pointer returned is
  347. * not NULL. It points to a WTX_SYM_LIST with a NULL `pSymbol' field.
  348. *
  349. * The return value must be freed by the caller using wtxResultFree().
  350. *
  351. * EXPAND ../../../include/wtxmsg.h WTX_SYM_LIST
  352. *
  353. * EXPAND ../../../include/wtxmsg.h WTX_SYMBOL
  354. *
  355. * NOTE : The symbols allocated by wtxSymListGet() should be freed by caller.
  356. *
  357. * RETURNS: A pointer to a list of symbols or NULL on error.
  358. * SEE ALSO: WTX_SYM_LIST_GET, wtxResultFree()
  359. */
  360. WTX_SYM_LIST * wtxSymListGet 
  361.     (
  362.     HWTX hWtx, /* WTX API handle */
  363.     const char * substring, /* Symbol name substring to match */
  364.     const char * moduleName, /* Module name to search in */
  365.     TGT_ADDR_T value, /* Symbol value to match */
  366.     BOOL32 listUnknown /* List unknown symbols only flag */
  367.     )
  368.     {
  369.     return (wtxSymListByModuleNameGet (hWtx, substring, moduleName, 
  370.        value, listUnknown));
  371.     }
  372. /*******************************************************************************
  373. *
  374. * wtxSymListByModuleIdGet - get a list of symbols given a module Id
  375. *
  376. * This routine gets a list of symbols matching given search criteria.
  377. * <substring> is a symbol substring to match and <value> is a target symbol
  378. * address value to search around.  Either <string> or <value> should be set
  379. * to a non-NULL value, but not both. In addition, if <listUnknown> is set to
  380. * TRUE then only unknown symbols are listed and <substring> and <value> are
  381. * ignored.  If <moduleId> is non-zero, it specifies the module to search.
  382. * Even if no symbols match the search parameters, the pointer returned is
  383. * not NULL. It points to a WTX_SYM_LIST with a NULL `pSymbol' field.
  384. *
  385. * The return value must be freed by the caller using wtxResultFree().
  386. *
  387. * EXPAND ../../../include/wtxmsg.h WTX_SYM_LIST
  388. *
  389. * EXPAND ../../../include/wtxmsg.h WTX_SYMBOL
  390. *
  391. * NOTE : The symbols allocated by wtxSymListGet() should be freed by caller.
  392. *
  393. * RETURNS: A pointer to a list of symbols or NULL on error.
  394. * SEE ALSO: WTX_SYM_LIST_GET, wtxSymListGet(), wtxSymListByModuleNameGet(),
  395. * wtxResultFree()
  396. */
  397. WTX_SYM_LIST * wtxSymListByModuleIdGet
  398.     (
  399.     HWTX hWtx, /* WTX API handle                     */
  400.     const char * substring, /* Symbol name substring to match     */
  401.     UINT32 moduleId, /* Module Id to search in             */
  402.     TGT_ADDR_T value, /* Symbol value to match              */
  403.     BOOL32 listUnknown /* List unknown symbols only flag     */
  404.     )
  405.     {
  406.     WTX_MSG_SYM_MATCH_DESC in; /* query parameters           */
  407.     WTX_MSG_SYM_LIST * pOut; /* output message             */
  408.     WTX_MSG_SYM_LIST out; /* local message              */
  409.     WTX_SYMBOL * firstSym = NULL;/* first symbol of list       */
  410.     WTX_SYMBOL * lastSym; /* last symbol of list        */
  411.     WTX_SYMBOL * newSymbol; /* new symbol in list         */
  412.     WTX_SYMBOL * precSymbol = NULL;/* preceding symbol in list */
  413.     WTX_ERROR_T callStat; /* exchange result            */
  414.     STATUS status; /* wtxResultFree() status     */
  415.     int stringLength; /* string length for calloc   */
  416.     
  417.     WTX_CHECK_CONNECTED (hWtx, NULL); /* checking fot connection */
  418.     /* checking for variables incompatibility */
  419.     if ( (value != 0) && ( (substring != NULL) || (moduleId != 0)))
  420.         {
  421.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, NULL);
  422.         }
  423.     if ( (listUnknown && (moduleId == 0)) ||
  424.          (listUnknown && (substring != NULL)) ||
  425.          (listUnknown && (value != 0)))
  426.         {
  427.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, NULL);
  428.         }
  429.     /* list get parameters initialization */
  430.     memset (&in, 0, sizeof (in));
  431.     in.wtxCore.objId = hWtx->msgToolId.wtxCore.objId;
  432.     in.symTblId = 0; /* Use default target symbol table */
  433.     in.matchString = (substring != NULL);
  434.     in.adrs = value;
  435.     in.stringToMatch = (char *) substring;
  436.     in.byModuleName = FALSE;
  437.     in.module.moduleId = moduleId;
  438.     in.listUnknownSym = listUnknown;
  439.     in.giveMeNext = FALSE;
  440.     pOut = (WTX_MSG_SYM_LIST *)calloc (1, sizeof (WTX_MSG_SYM_LIST));
  441.     if (pOut == NULL)
  442.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  443.     lastSym = NULL;
  444.     do
  445. {
  446. memset (&out, 0, sizeof (out)); /* Zero output */
  447.         /* call for target server routine */
  448. callStat = exchange (hWtx, WTX_SYM_LIST_GET, &in, &out);
  449. if (callStat != WTX_ERR_NONE)
  450.     {
  451.     pOut->symList.pSymbol = firstSym;
  452.     wtxSymListFree (&pOut->symList);
  453.     free (pOut);
  454.     WTX_ERROR_RETURN (hWtx, callStat, NULL);
  455.     }
  456.         lastSym = out.symList.pSymbol;
  457.         if ((firstSym == NULL) && (lastSym != NULL)) /* first query */
  458.             {
  459.             if ((newSymbol = (WTX_SYMBOL *) calloc (1, sizeof (WTX_SYMBOL)))
  460.                  == NULL)
  461.                 WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  462.             *newSymbol = *lastSym;
  463.             if (lastSym->name != NULL)
  464.                 {
  465.                 stringLength = strlen (lastSym->name);
  466.                 if ((newSymbol->name = (char *)calloc (stringLength + 1,
  467.                                                         sizeof (char))) == NULL)
  468.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  469.                 strcpy (newSymbol->name, lastSym->name);
  470.                 }
  471.             if (lastSym->moduleName != NULL)
  472.                 {
  473.                 stringLength = (int) strlen (lastSym->moduleName);
  474.                 if ( (newSymbol->moduleName = (char *)calloc (stringLength + 1, 
  475.                                                               sizeof (char)))
  476.                      == NULL)
  477.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  478.                 strcpy (newSymbol->moduleName, lastSym->moduleName);
  479.                 }
  480.             firstSym = newSymbol;
  481.             precSymbol = newSymbol;
  482.             lastSym = lastSym->next;
  483.             }
  484. while (lastSym != NULL)
  485.             {
  486.             newSymbol = (WTX_SYMBOL *)calloc (1, sizeof (WTX_SYMBOL));
  487.             /* this should copy all fields, even a NULL for next */
  488.             *newSymbol = *lastSym;
  489.             /* allocating memory for string fields, then copy them */
  490.             if (lastSym->name != NULL)
  491.                 {
  492.                 stringLength = strlen (lastSym->name);
  493.                 if ((newSymbol->name = (char *)calloc (stringLength + 1,
  494.        sizeof (char))) == NULL)
  495.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  496.                 strcpy (newSymbol->name, lastSym->name);
  497.                 }
  498.             if (lastSym->moduleName != NULL)
  499.                 {
  500.                 stringLength = (int) strlen (lastSym->moduleName);
  501.                 if ( (newSymbol->moduleName = (char *)calloc (stringLength + 1, 
  502.                                                               sizeof (char)))
  503.                      == NULL)
  504.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  505.                 strcpy (newSymbol->moduleName, lastSym->moduleName);
  506.                 }
  507.             /* updating local symbol list */
  508.             precSymbol->next = newSymbol;
  509.             precSymbol = precSymbol->next;
  510.             lastSym = lastSym->next;
  511.             }
  512. /* Ensure next time around, if any gets the remainng symbols */
  513. in.giveMeNext = out.moreToCome;
  514.         wtxExchangeFree (hWtx->server, WTX_SYM_LIST_GET, &out);
  515. } while (in.giveMeNext);
  516.     /* Set up pOut so that it can be freed by wtxResultFree() */
  517.     pOut->wtxCore.protVersion = (UINT32) pOut;
  518.     pOut->wtxCore.objId = WTX_SYM_LIST_GET;
  519.  
  520.     /* Then set the symbol pointer to the first symbol in the list */
  521.     pOut->symList.pSymbol = firstSym;
  522.     
  523.     /* add the pointer description to the list of pointer to free */
  524.     if ( (status = wtxFreeAdd (hWtx,  (void *) &pOut->symList,
  525.        (FUNCPTR) wtxSymListFree, pOut, 0, NULL,
  526.        WTX_SVR_NONE)) != WTX_OK)
  527. {
  528. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  529. }
  530.     return &pOut->symList;
  531.     }
  532. /*******************************************************************************
  533. *
  534. * wtxSymListByModuleNameGet - get a list of symbols given a module name
  535. *
  536. * This routine gets a list of symbols matching given search criteria.
  537. * <substring> is a symbol substring to match and <value> is a target symbol
  538. * address value to search around.  Either <string> or <value> should be set
  539. * to a non-NULL value, but not both. In addition, if <listUnknown> is set to
  540. * TRUE then only unknown symbols are listed and <substring> and <value> are
  541. * ignored.  If <moduleName> is non-NULL, it specifies the module to search.
  542. * Even if no symbols match the search parameters, the pointer returned is
  543. * not NULL. It points to a WTX_SYM_LIST with a NULL `pSymbol' field.
  544. *
  545. * The return value must be freed by the caller using wtxResultFree().
  546. *
  547. * EXPAND ../../../include/wtxmsg.h WTX_SYM_LIST
  548. *
  549. * EXPAND ../../../include/wtxmsg.h WTX_SYMBOL
  550. *
  551. * NOTE : The symbols allocated by wtxSymListGet() should be freed by caller.
  552. *
  553. * RETURNS: A pointer to a list of symbols or NULL on error.
  554. * SEE ALSO: WTX_SYM_LIST_GET, wtxSymListGet(), wtxSymListByModuleIdGet(),
  555. * wtxResultFree()
  556. */
  557. WTX_SYM_LIST * wtxSymListByModuleNameGet 
  558.     (
  559.     HWTX hWtx, /* WTX API handle */
  560.     const char * substring, /* Symbol name substring to match */
  561.     const char * moduleName, /* Module name to search in */
  562.     TGT_ADDR_T value, /* Symbol value to match */
  563.     BOOL32 listUnknown /* List unknown symbols only flag */
  564.     )
  565.     {
  566.     WTX_MSG_SYM_MATCH_DESC in; /* query parameters */
  567.     WTX_MSG_SYM_LIST * pOut; /* output message */
  568.     WTX_MSG_SYM_LIST out; /* local message */
  569.     WTX_SYMBOL * firstSym = NULL; /* first sym of list */
  570.     WTX_SYMBOL * lastSym; /* last sym of list */
  571.     WTX_SYMBOL * newSymbol; /* new symbol in list */
  572.     WTX_SYMBOL * precSymbol = NULL; /* prev sym in list */
  573.     WTX_ERROR_T callStat; /* exchange result */
  574.     STATUS status = WTX_ERROR; /* routine status */
  575.     int stringLength; /* str len for calloc */
  576.     
  577.     WTX_CHECK_CONNECTED (hWtx, NULL); /* checking fot connection */
  578.     /* checking for variables incompatibility */
  579.     if ((value != 0) && ((substring != NULL) || (moduleName != NULL)))
  580.         {
  581.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, NULL);
  582.         }
  583.     if ( (listUnknown && (moduleName == NULL)) ||
  584.          (listUnknown && (substring != NULL)) ||
  585.          (listUnknown && (value != 0)))
  586.         {
  587.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, NULL);
  588.         }
  589.     /* list get parameters initialization */
  590.     memset (&in, 0, sizeof (in));
  591.     in.wtxCore.objId = hWtx->msgToolId.wtxCore.objId;
  592.     in.symTblId = 0; /* Use default target symbol table */
  593.     in.matchString = (substring != NULL);
  594.     in.adrs = value;
  595.     in.stringToMatch = (char *) substring;
  596.     in.byModuleName = TRUE;
  597.     in.module.moduleName = (char *) moduleName;
  598.     in.listUnknownSym = listUnknown;
  599.     in.giveMeNext = FALSE;
  600.     pOut = (WTX_MSG_SYM_LIST *)calloc (1, sizeof (WTX_MSG_SYM_LIST));
  601.     if (pOut == NULL)
  602.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  603.     lastSym = NULL;
  604.     do
  605. {
  606. memset (&out, 0, sizeof (out)); /* Zero output */
  607.         /* call for target server routine */
  608. callStat = exchange (hWtx, WTX_SYM_LIST_GET, &in, &out);
  609. if (callStat != WTX_ERR_NONE)
  610.     {
  611.     pOut->symList.pSymbol = firstSym;
  612.     wtxSymListFree (&pOut->symList);
  613.     free (pOut);
  614.     WTX_ERROR_RETURN (hWtx, callStat, NULL);
  615.     }
  616.         lastSym = out.symList.pSymbol;
  617.         if ( (firstSym == NULL) && (lastSym != NULL)) /* first query */
  618.             {
  619.             if ( (newSymbol = (WTX_SYMBOL *)calloc (1, sizeof (WTX_SYMBOL)))
  620.                  == NULL)
  621.                 WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  622.             *newSymbol = *lastSym;
  623.             if (lastSym->name != NULL)
  624.                 {
  625.                 stringLength = strlen (lastSym->name);
  626.                 if ( (newSymbol->name = (char *)calloc (stringLength + 1,
  627.                                                         sizeof (char))) == NULL)
  628.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  629.                 strcpy (newSymbol->name, lastSym->name);
  630.                 }
  631.             if (lastSym->moduleName != NULL)
  632.                 {
  633.                 stringLength = (int) strlen (lastSym->moduleName);
  634.                 if ( (newSymbol->moduleName = (char *)calloc (stringLength + 1, 
  635.                                                               sizeof (char)))
  636.                      == NULL)
  637.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  638.                 strcpy (newSymbol->moduleName, lastSym->moduleName);
  639.                 }
  640.             firstSym = newSymbol;
  641.             precSymbol = newSymbol;
  642.             lastSym = lastSym->next;
  643.             }
  644. while (lastSym != NULL)
  645.             {
  646.             newSymbol = (WTX_SYMBOL *)calloc (1, sizeof (WTX_SYMBOL));
  647.             /* this should copy all fields, even a NULL for next */
  648.             *newSymbol = *lastSym;
  649.             /* allocating mempry for string fields, then copy them */
  650.             if (lastSym->name != NULL)
  651.                 {
  652.                 stringLength = strlen (lastSym->name);
  653.                 if ( (newSymbol->name = (char *)calloc (stringLength + 1,
  654.                                                         sizeof (char))) == NULL)
  655.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  656.                 strcpy (newSymbol->name, lastSym->name);
  657.                 }
  658.             if (lastSym->moduleName != NULL)
  659.                 {
  660.                 stringLength = (int) strlen (lastSym->moduleName);
  661.                 if ( (newSymbol->moduleName = (char *)calloc (stringLength + 1, 
  662.                                                               sizeof (char)))
  663.                      == NULL)
  664.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  665.                 strcpy (newSymbol->moduleName, lastSym->moduleName);
  666.                 }
  667.             /* updating local symbol list */
  668.             precSymbol->next = newSymbol;
  669.             precSymbol = precSymbol->next;
  670.             lastSym = lastSym->next;
  671.             }
  672. /* Ensure next time around, if any gets the remainng symbols */
  673. in.giveMeNext = out.moreToCome;
  674.         wtxExchangeFree (hWtx->server, WTX_SYM_LIST_GET, &out);
  675. } while (in.giveMeNext);
  676.     /* Set up pOut so that it can be freed by wtxResultFree() */
  677.     pOut->wtxCore.protVersion = (UINT32) pOut;
  678.     pOut->wtxCore.objId = WTX_SYM_LIST_GET;
  679.  
  680.     /* Then set the symbol pointer to the first symbol in the list */
  681.     pOut->symList.pSymbol = firstSym;
  682.     /* add pointer to the wtxResultFree(0 list */
  683.     if ( (status = wtxFreeAdd (hWtx,  (void *) &pOut->symList,
  684.        (FUNCPTR) wtxSymListFree, pOut, 0, NULL,
  685.        WTX_SVR_NONE)) != WTX_OK)
  686. {
  687. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  688. }
  689.     return &pOut->symList;
  690.     }
  691. /*******************************************************************************
  692. *
  693. * wtxSymRemove - remove a symbol from the default target server symbol table
  694. *
  695. * This routine removes a symbol from the default target server symbol table.
  696. * <symName> and <symType> identify the symbol to remove.
  697. *
  698. * RETURNS: WTX_OK or WTX_ERROR.
  699. *
  700. * SEE ALSO: WTX_SYM_REMOVE, wtxSymAdd(), wtxSymFind(), wtxSymListGet()
  701. */
  702. STATUS wtxSymRemove 
  703.     (
  704.     HWTX hWtx, /* WTX API handle */
  705.     const char *symName, /* Name of symbol to remove */
  706.     UINT8 symType /* Type of symbol to remove */
  707.     )
  708.     {
  709.     WTX_MSG_SYMBOL_DESC in; /* input to WTX call */
  710.     WTX_MSG_RESULT out; /* result pointer */
  711.     WTX_ERROR_T callStat; /* client status */
  712.     
  713.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  714.     memset (&in, 0, sizeof (in));
  715.     memset (&out, 0, sizeof (out));
  716.     in.symbol.name = (char *) symName;
  717.     in.symbol.type = symType;
  718.     callStat = exchange (hWtx, WTX_SYM_REMOVE, &in, &out);
  719.     if (callStat != WTX_ERR_NONE)
  720. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  721.     wtxExchangeFree (hWtx->server, WTX_SYM_REMOVE, &out);
  722.     return WTX_OK;
  723.     }
  724. /*******************************************************************************
  725. *
  726. * wtxSymTblInfoGet - return information about the target server symbol table
  727. *
  728. * This routine queries the target server to find out information about its
  729. * symbol table. The return value must be freed by the caller using
  730. * wtxResultFree().
  731. *
  732. * EXPAND ../../../include/wtxmsg.h WTX_SYM_TBL_INFO
  733. *
  734. * RETURNS: A pointer to the target server symbol-table information structure
  735. * or NULL on error.
  736. *
  737. * SEE ALSO: WTX_SYM_TBL_INFO_GET
  738. */
  739. WTX_SYM_TBL_INFO * wtxSymTblInfoGet
  740.     (
  741.     HWTX        hWtx    /* WTX API handle */
  742.     )
  743.     {
  744.     WTX_MSG_SYM_TBL_INFO *      pOut;
  745.     WTX_ERROR_T                 callStat;
  746.     WTX_CHECK_CONNECTED (hWtx, NULL);
  747.     pOut = calloc (1, sizeof (WTX_MSG_SYM_TBL_INFO));
  748.     if (pOut == NULL)
  749.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  750.     callStat = exchange (hWtx, WTX_SYM_TBL_INFO_GET, &hWtx->msgToolId, pOut);
  751.     if (callStat != WTX_ERR_NONE)
  752.         {
  753.         free (pOut);
  754.         WTX_ERROR_RETURN (hWtx, callStat, NULL);
  755.         }
  756.     /* add pointer to the wtxResultFree () list */
  757.     if (wtxFreeAdd (hWtx, (void *) &pOut->symTblId, NULL, pOut,
  758.     WTX_SYM_TBL_INFO_GET, hWtx->server, WTX_SVR_SERVER)
  759. != WTX_OK)
  760. {
  761. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  762. }
  763.     return ((WTX_SYM_TBL_INFO *) &(pOut->symTblId));
  764.     }
  765. /*******************************************************************************
  766. *
  767. * wtxTargetReset - reset the target 
  768. *
  769. * This routine resets the target as if it was manually rebooted.
  770. * The target server restarts itself and if the reboot is successful,
  771. * it reconnects to the target. If the call is successful a target
  772. * reset event, TGT_RESET, is generated and sent to all clients
  773. * registered to receive them. 
  774. *
  775. * NOTE: The client making the request must reconnect to the target
  776. * server as restarting the server causes the server connection to
  777. * be broken.
  778. *
  779. * RETURNS: WTX_OK or WTX_ERROR on failure.
  780. *
  781. * SEE ALSO: WTX_TARGET_RESET
  782. */
  783. STATUS wtxTargetReset 
  784.     (
  785.     HWTX hWtx /* WTX API handle */
  786.     )
  787.     {
  788.     WTX_ERROR_T callStat;
  789.     WTX_MSG_RESULT out;
  790.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  791.     memset (&out, 0, sizeof (out));
  792.     callStat = exchange (hWtx, WTX_TARGET_RESET, &hWtx->msgToolId, &out);
  793.     if (callStat != WTX_ERR_NONE)
  794. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  795.     wtxExchangeFree (hWtx->server, WTX_TARGET_RESET, &out);
  796.     return (WTX_OK);
  797.     }
  798. /******************************************************************************
  799. *
  800. * wtxTsNameGet - get the full name of the currently attached target server
  801. *
  802. * This routine returns the full name of the target server to which the
  803. * handle <hWtx> is attached (if any).  The string is an internal one and
  804. * must not be freed by the caller.
  805. *
  806. * RETURNS: The target server name string or NULL if not connected.
  807. */
  808. const char * wtxTsNameGet
  809.     (
  810.     HWTX hWtx /* WTX API handle */
  811.     )
  812.     {
  813.     WTX_CHECK_HANDLE (hWtx, NULL);
  814.     if (wtxToolConnected (hWtx))
  815. return hWtx->pServerDesc->wpwrName;
  816.     else
  817. return NULL;
  818.     }
  819. /*******************************************************************************
  820. *
  821. * wtxTargetRtTypeGet - get the target-runtime-type information
  822. *
  823. * This routine returns a numeric value indicating the runtime type
  824. * as returned by the target agent.  
  825. *
  826. * RETURNS: The runtime type code as a INT32 or WTX_ERROR on error.
  827. */
  828. INT32 wtxTargetRtTypeGet 
  829.     (
  830.     HWTX hWtx /* WTX API handle */
  831.     )
  832.     {
  833.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  834.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  835. /* Error has already been dispatched, just return WTX_ERROR */
  836. return WTX_ERROR;
  837.     
  838.     return hWtx->pTsInfo->tgtInfo.rtInfo.rtType;
  839.     }
  840. /*******************************************************************************
  841. *
  842. * wtxTargetRtVersionGet - get the target-runtime-version information
  843. *
  844. * This routine returns a string containing the version information for
  845. * the runtime of the current target.  The return value is a pointer to the
  846. * string in temporary memory; the string must be copied if its value is to be 
  847. * stored.
  848. *
  849. * RETURNS: The version string or NULL on error.
  850. */
  851. const char * wtxTargetRtVersionGet 
  852.     (
  853.     HWTX hWtx /* WTX API handle */
  854.     )
  855.     {
  856.     WTX_CHECK_CONNECTED (hWtx, NULL);
  857.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  858. /* Error has already been dispatched, just return NULL */
  859. return NULL;
  860.     
  861.     return hWtx->pTsInfo->tgtInfo.rtInfo.rtVersion;
  862.     }
  863. /*******************************************************************************
  864. *
  865. * wtxTargetCpuTypeGet - get the target CPU type code
  866. *
  867. * This routine returns a numeric value indicating the type of the CPU
  868. * as returned by the target agent.  
  869. *
  870. * RETURNS: The CPU type code as a INT32 or WTX_ERROR on error.
  871. */
  872. INT32 wtxTargetCpuTypeGet 
  873.     (
  874.     HWTX hWtx /* WTX API handle */
  875.     )
  876.     {
  877.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  878.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  879. /* Error has already been dispatched, just return WTX_ERROR */
  880. return WTX_ERROR;
  881.     
  882.     return hWtx->pTsInfo->tgtInfo.rtInfo.cpuType;
  883.     }
  884. /*******************************************************************************
  885. *
  886. * wtxTargetHasFppGet - check if the target has a floating point processor
  887. *
  888. * This routine returns a boolean indicating whether the current target has a
  889. * floating point processor available. Errors must be detected using
  890. * wtxErrClear() and wtxErrGet().
  891. *
  892. * RETURNS: TRUE if it has a floating point processor or FALSE if not or if 
  893. * there was an error.
  894. */
  895. BOOL32 wtxTargetHasFppGet 
  896.     (
  897.     HWTX hWtx /* WTX API handle */
  898.     )
  899.     {
  900.     WTX_CHECK_CONNECTED (hWtx, FALSE);
  901.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  902. /* Error has already been dispatched, just return WTX_ERROR */
  903. return FALSE;
  904.     
  905.     return ((hWtx->pTsInfo->tgtInfo.rtInfo.hasCoprocessor & WTX_FPP_MASK) >>
  906.     WTX_FPP_BITSHIFT);
  907.     }
  908. /*******************************************************************************
  909. *
  910. * wtxTargetHasAltivecGet - check if the target has an altivec unit
  911. *
  912. * This routine returns a boolean indicating whether the current target has a
  913. * altivec coprocessor available. Errors must be detected using
  914. * wtxErrClear() and wtxErrGet().
  915. *
  916. * RETURNS: TRUE if it has an Altivec unit  or FALSE if not or if 
  917. * there was an error.
  918. */
  919. BOOL32 wtxTargetHasAltivecGet 
  920.     (
  921.     HWTX hWtx /* WTX API handle */
  922.     )
  923.     {
  924.     WTX_CHECK_CONNECTED (hWtx, FALSE);
  925.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  926. /* Error has already been dispatched, just return WTX_ERROR */
  927. return FALSE;
  928.     
  929.     return ((hWtx->pTsInfo->tgtInfo.rtInfo.hasCoprocessor & WTX_ALTIVEC_MASK) >>
  930.     WTX_ALTIVEC_BITSHIFT);
  931.     }
  932. /*******************************************************************************
  933. *
  934. * wtxTargetHasDspGet - check if the target has a DSP unit
  935. *
  936. * This routine returns a boolean indicating whether the current target has a
  937. * DSP coprocessor available. Errors must be detected using
  938. * wtxErrClear() and wtxErrGet().
  939. *
  940. * RETURNS: TRUE if it has an DSP unit  or FALSE if not or if 
  941. * there was an error.
  942. */
  943. BOOL32 wtxTargetHasDspGet 
  944.     (
  945.     HWTX hWtx /* WTX API handle */
  946.     )
  947.     {
  948.     WTX_CHECK_CONNECTED (hWtx, FALSE);
  949.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  950. /* Error has already been dispatched, just return WTX_ERROR */
  951. return FALSE;
  952.     
  953.     return (hWtx->pTsInfo->tgtInfo.rtInfo.hasCoprocessor & WTX_DSP_MASK) >> WTX_DSP_BITSHIFT;
  954.     }
  955. /*******************************************************************************
  956. *
  957. * wtxTargetEndianGet - get the endianness of the target CPU
  958. *
  959. * This routine returns WTX_ENDIAN_BIG if the target has a CPU that uses
  960. * big-endian byte storage ordering (the most significant byte first) or 
  961. * WTX_ENDIAN_LITTLE if it uses little-endian ordering (the least significant
  962. * byte first).  If an error occurs, the routine returns WTX_ENDIAN_UNKNOWN.
  963. *
  964. * EXPAND ../../../include/wtx.h WTX_ENDIAN_T
  965. *
  966. * RETURNS: The CPU endian value or WTX_ENDIAN_UNKNOWN.
  967. */
  968. WTX_ENDIAN_T wtxTargetEndianGet 
  969.     (
  970.     HWTX hWtx /* WTX API handle */
  971.     )
  972.     {
  973.     WTX_CHECK_CONNECTED (hWtx, WTX_ENDIAN_UNKNOWN);
  974.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  975. /* Error has already been dispatched, just return error value */
  976. return WTX_ENDIAN_UNKNOWN;
  977.     
  978.     switch (hWtx->pTsInfo->tgtInfo.rtInfo.endian)
  979. {
  980. case 1234:
  981.     return WTX_ENDIAN_BIG;
  982. case 4321:
  983.     return WTX_ENDIAN_LITTLE;
  984. default:
  985.     return WTX_ENDIAN_UNKNOWN;
  986. }
  987.     }
  988. /*******************************************************************************
  989. *
  990. * wtxTargetBootlineGet - get the target bootline information string
  991. *
  992. * This routine returns a string containing the target bootline.  The
  993. * return value is a pointer to the string in temporary memory; the string
  994. * must be copied if it is to be stored.
  995. *
  996. * RETURNS: The bootline string or NULL on error.  
  997. */
  998. const char * wtxTargetBootlineGet 
  999.     (
  1000.     HWTX hWtx /* WTX API handle */
  1001.     )
  1002.     {
  1003.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1004.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  1005. /* Error has already been dispatched, just return NULL */
  1006. return NULL;
  1007.     
  1008.     return hWtx->pTsInfo->tgtInfo.rtInfo.bootline;
  1009.     }
  1010. /*******************************************************************************
  1011. *
  1012. * wtxTargetBspNameGet - get the target board-support-package name string
  1013. *
  1014. * This routine returns a string containing the board-support-package name for
  1015. * the runtime of the current target.  The return value is a pointer to 
  1016. * the string in temporary memory; the string must be copied if it is to be 
  1017. * stored.
  1018. *
  1019. * RETURNS: The BSP name string or NULL on error.
  1020. */
  1021. const char * wtxTargetBspNameGet 
  1022.     (
  1023.     HWTX hWtx /* WTX API handle */
  1024.     )
  1025.     {
  1026.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1027.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  1028. /* Error has already been dispatched, just return NULL */
  1029. return NULL;
  1030.     
  1031.     return hWtx->pTsInfo->tgtInfo.rtInfo.bspName;
  1032.     }
  1033. /*******************************************************************************
  1034. *
  1035. * wtxToolNameGet - return the name of the current tool
  1036. *
  1037. * This function gets a string representing the name of the current tool.
  1038. * The return value is a pointer to the string in temporary memory; the string
  1039. * must be copied if it is to be stored.
  1040. *
  1041. * RETURNS: The tool name string or NULL on error.
  1042. */
  1043. char * wtxToolNameGet
  1044.     (
  1045.     HWTX        hWtx /* WTX API handle */
  1046.     )
  1047.     {
  1048.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1049.     if (hWtx->pToolDesc != NULL)
  1050.         return hWtx->pToolDesc->toolName;
  1051.     else
  1052.         return NULL;
  1053.     }
  1054. /******************************************************************************
  1055. *
  1056. * wtxTsVersionGet - return the Tornado version
  1057. *
  1058. * This function gets a string representing the Tornado version.
  1059. * The return value is a pointer to temporary memory and must be copied if it is
  1060. * to be stored.
  1061. *
  1062. * RETURNS: A pointer to the Tornado version string or NULL on error.
  1063. */
  1064. char * wtxTsVersionGet
  1065.     (
  1066.     HWTX        hWtx /* WTX API handle */
  1067.     )
  1068.     {
  1069.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1070.     if (hWtx->pTsInfo == NULL && wtxTsInfoGet (hWtx) == NULL)
  1071.         /* Error has already been dispatched, just return NULL */
  1072.         return NULL;
  1073.     return hWtx->pTsInfo->version;
  1074.     }
  1075. /******************************************************************************
  1076. *
  1077. * wtxTsKill - kill the target server
  1078. *
  1079. * This routine kills the target server.  The client detaches from the
  1080. * target server at this time.  Another attachment can subsequently be
  1081. * made.
  1082. *
  1083. * RETURNS: WTX_OK or WTX_ERROR.
  1084. *
  1085. * SEE ALSO: WTX_OBJ_KILL, wtxToolAttach()
  1086. */
  1087. STATUS wtxTsKill
  1088.     (
  1089.     HWTX hWtx /* WTX API handle */
  1090.     )
  1091.     {
  1092.     WTX_ERROR_T callStat; /* WTX RPC status */
  1093.     WTX_MSG_KILL_DESC in; /* WTX kill message */
  1094.     WTX_MSG_RESULT out; /* WTX result message */
  1095.     
  1096.     WTX_CHECK_CONNECTED (hWtx, 0);
  1097.     memset (&in, 0, sizeof (in));
  1098.     memset (&out, 0, sizeof (out));
  1099.     in.request = WTX_OBJ_KILL_DESTROY;
  1100.     callStat = exchange (hWtx, WTX_OBJ_KILL, &in, &out);
  1101.     if (callStat != WTX_ERR_NONE)
  1102. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1103.     wtxExchangeFree (hWtx->server, WTX_OBJ_KILL, &out);
  1104.     toolCleanup(hWtx);
  1105.     return (WTX_OK);
  1106.     }
  1107. /******************************************************************************
  1108. *
  1109. * wtxTsRestart - restart the target server
  1110. *
  1111. * This routine restarts the target server.  The client detaches from the
  1112. * target server at this time.  Another attachment can subsequently be
  1113. * made.
  1114. *
  1115. * RETURNS: WTX_OK or WTX_ERROR.
  1116. *
  1117. * SEE ALSO: WTX_OBJ_KILL, wtxToolAttach()
  1118. */
  1119. STATUS wtxTsRestart
  1120.     (
  1121.     HWTX hWtx /* WTX API handle */
  1122.     )
  1123.     {
  1124.     WTX_ERROR_T callStat; /* WTX RPC status */
  1125.     WTX_MSG_KILL_DESC in; /* WTX kill message */
  1126.     WTX_MSG_RESULT out; /* WTX result message */
  1127.     
  1128.     WTX_CHECK_CONNECTED (hWtx, 0);
  1129.     memset (&in, 0, sizeof (in));
  1130.     memset (&out, 0, sizeof (out));
  1131.     in.request = WTX_OBJ_KILL_RESTART;
  1132.     callStat = exchange (hWtx, WTX_OBJ_KILL, &in, &out);
  1133.     if (callStat != WTX_ERR_NONE)
  1134. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1135.     wtxExchangeFree (hWtx->server, WTX_OBJ_KILL, &out);
  1136.     toolCleanup(hWtx);
  1137.     return (WTX_OK);
  1138.     }
  1139. /*******************************************************************************
  1140. *
  1141. * wtxUnregisterForEvent - ask the target server to not send events matching
  1142. * a regexp
  1143. *
  1144. * This routine registers which events are unwanted. Usually, if we want to
  1145. * filter events notification we have to give the regular expression to
  1146. * WTX_REGISTER_FOR_EVENT. A more simple way to do this is to be registered
  1147. * for all the events and to be registered for only those which are unwanted.
  1148. *
  1149. * RETURNS: WTX_OK or WTX_ERROR if exchange failed
  1150. *
  1151. * SEE ALSO: WTX_UNREGISTER_FOR_EVENT, wtxRegisterForEvent(), wtxEventGet(),
  1152. * wtxEventListGet().
  1153. */
  1154. STATUS wtxUnregisterForEvent
  1155.     (
  1156.     HWTX         hWtx,          /* WTX API handle */
  1157.     char *       regExp         /* Regular expression to select events */
  1158.     )
  1159.     {
  1160.     WTX_ERROR_T                 callStat;
  1161.     WTX_MSG_EVENT_REG_DESC      in;
  1162.     WTX_MSG_RESULT              out;
  1163.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1164.     memset (&out, 0, sizeof (out));
  1165.     memset (&in, 0, sizeof (in));
  1166.     in.evtRegExp = (char *) regExp;
  1167.     callStat = exchange (hWtx, WTX_UNREGISTER_FOR_EVENT, &in, &out);
  1168.     if (callStat != WTX_ERR_NONE)
  1169.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1170.     wtxExchangeFree (hWtx->server, WTX_UNREGISTER_FOR_EVENT, &out);
  1171.     return (WTX_OK);
  1172.     }
  1173. /******************************************************************************
  1174. *
  1175. * wtxFuncCall - call a function on the target
  1176. *
  1177. * This routine calls the function identified by WTX_CONTEXT_DESC.
  1178. * EXPAND ../../../include/wtx.h WTX_CONTEXT_DESC
  1179. *
  1180. * Execution starts at `entry', with up to 10 integer arguments specified in
  1181. * the array `args[]'.  The return type is specified by setting `returnType'
  1182. * to WTX_RETURN_TYPE_INT or WTX_RETURN_TYPE_DOUBLE.
  1183. *
  1184. * NOTE: Because calling a function creates a task context on the target
  1185. * system, it cannot be used when the target agent is in external mode.
  1186. * ERRORS:
  1187. * .iP WTX_ERR_API_INVALID_ARG 12
  1188. * <pContextDesc> is invalid.
  1189. *
  1190. * RETURNS: The ID of the function call or WTX_ERROR.  When the called
  1191. * function terminates, a CALL_RETURN event is generated which
  1192. * references this ID and contains the return value.
  1193. *
  1194. * SEE ALSO: WTX_FUNC_CALL, wtxEventGet(), wtxDirectCall(),
  1195. * .I API Reference Manual: WTX Protocol WTX_FUNC_CALL
  1196. */
  1197. WTX_CONTEXT_ID_T wtxFuncCall
  1198.     (
  1199.     HWTX hWtx, /* WTX API handle */
  1200.     WTX_CONTEXT_DESC *  pContextDesc /* pointer to call descriptor */
  1201.     )
  1202.     {
  1203.     WTX_ERROR_T callStat; /* status of RPC */
  1204.     WTX_MSG_CONTEXT_DESC in; /* params to WTX call */
  1205.     WTX_MSG_RESULT out; /* result of WTX call */
  1206.     WTX_CONTEXT_ID_T callId;
  1207.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1208.     if (pContextDesc == NULL)
  1209. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  1210.     memset (&in, 0, sizeof (in));
  1211.     memset (&out, 0, sizeof (out));
  1212.     /* Fill in the context create descriptor message. */
  1213.     /*
  1214.      * XXX - must have WTX_CONTEXT_DESC fields identical to those
  1215.      * WTX_MSG_CONTEXT_DESC from contextType onwards. Awaits change to
  1216.      * message definitions on wtxmsg.h so this hack will go away.
  1217.      */
  1218.     memcpy (&in.contextType, pContextDesc, sizeof (WTX_CONTEXT_DESC));
  1219.     
  1220.     callStat = exchange (hWtx, WTX_FUNC_CALL, &in, &out);
  1221.     if (callStat != WTX_ERR_NONE)
  1222. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1223.     callId = out.val.value_u.v_uint32; 
  1224.     wtxExchangeFree (hWtx->server, WTX_FUNC_CALL, &out);
  1225.     return callId;
  1226.     }
  1227. /******************************************************************************
  1228. *
  1229. * wtxDirectCall - call a function on the target within the agent
  1230. *
  1231. * This routine calls the function at <entry>, with up to 10 integer 
  1232. * arguments <arg0>... <arg9>, in the context of the target agent.  
  1233. *
  1234. * The return value of the function called on the target is returned at
  1235. * the address pointed to by <pRetVal>.
  1236. *
  1237. * NOTE: The called function is executed within the target agent allowing
  1238. * tools to call functions when the agent is running in both task and external
  1239. * mode.  This service should only be used to call simple functions that 
  1240. * return immediately in order to avoid locking access to the target for other
  1241. * tools.  It is preferable to use wtxFuncCall() to call functions that may take
  1242. * longer to return.  If the function called from wtxDirectCall() gets an 
  1243. * exception, the agent stops and communication with the target board is
  1244. * lost.
  1245. *
  1246. * CAVEAT: This service cannot be used to call functions that return a double.
  1247. * RETURNS: WTX_OK or WTX_ERROR if cannot call the function or if <pRetVal>
  1248. * is NULL.  
  1249. *
  1250. * SEE ALSO: WTX_DIRECT_CALL, wtxFuncCall()
  1251. */
  1252. STATUS wtxDirectCall
  1253.     (
  1254.     HWTX hWtx, /* WTX API handle */
  1255.     TGT_ADDR_T entry, /* function address */
  1256.     void * pRetVal, /* pointer to return value */
  1257.     TGT_ARG_T arg0, /* function arguments */
  1258.     TGT_ARG_T arg1,
  1259.     TGT_ARG_T arg2,
  1260.     TGT_ARG_T arg3,
  1261.     TGT_ARG_T arg4,
  1262.     TGT_ARG_T arg5,
  1263.     TGT_ARG_T arg6,
  1264.     TGT_ARG_T arg7,
  1265.     TGT_ARG_T arg8,
  1266.     TGT_ARG_T arg9
  1267.     )
  1268.     {
  1269.     WTX_ERROR_T callStat; /* status of RPC */
  1270.     WTX_MSG_CONTEXT_DESC in; /* params to WTX call */
  1271.     WTX_MSG_RESULT out; /* result of WTX call */
  1272.     /* check for invalid parameter */
  1273.     if (pRetVal == NULL)
  1274. return (WTX_ERROR);
  1275.     /* check tool connection */
  1276.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1277.     memset (&in, 0, sizeof (in));
  1278.     memset (&out, 0, sizeof (out));
  1279.     /* Fill in the context create descriptor message */
  1280.     in.entry = entry;
  1281.     in.args[0] = arg0;
  1282.     in.args[1] = arg1;
  1283.     in.args[2] = arg2;
  1284.     in.args[3] = arg3;
  1285.     in.args[4] = arg4;
  1286.     in.args[5] = arg5;
  1287.     in.args[6] = arg6;
  1288.     in.args[7] = arg7;
  1289.     in.args[8] = arg8;
  1290.     in.args[9] = arg9;
  1291.     
  1292.     /* perform the call */
  1293.     callStat = exchange (hWtx, WTX_DIRECT_CALL, &in, &out);
  1294.     if (callStat != WTX_ERR_NONE)
  1295. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1296.     /* set target function return value */
  1297.     *(UINT32 *)pRetVal = out.val.value_u.v_uint32; 
  1298.     wtxExchangeFree (hWtx->server, WTX_DIRECT_CALL, &out);
  1299.     return WTX_OK;
  1300.     }
  1301. /*******************************************************************************
  1302. * wtxTsInfoGet - get information about the target server, target, and its link
  1303. *
  1304. * This routine queries the target server to find out information about
  1305. * the currently connected target and target server.  The result is a pointer
  1306. * to internal memory that must not be freed by the user.  The value in
  1307. * memory may change after any subsequent WTX API calls so it must be copied 
  1308. * if the values are to be saved.
  1309. *
  1310. * EXPAND ../../../include/wtx.h WTX_TS_INFO
  1311. *
  1312. * where WTX_TGT_LINK_DESC is:
  1313. *
  1314. * EXPAND ../../../include/wtxmsg.h WTX_TGT_LINK_DESC
  1315. *
  1316. * and WTX_TGT_INFO is:
  1317. *
  1318. * EXPAND ../../../include/wtxmsg.h WTX_TGT_INFO
  1319. *
  1320. * WTX_TOOL_DESC is:
  1321. *
  1322. * EXPAND ../../../include/wtxmsg.h WTX_TOOL_DESC
  1323. *
  1324. * with WTX_AGENT_INFO:
  1325. *
  1326. * EXPAND ../../../include/wtxmsg.h WTX_AGENT_INFO
  1327. *
  1328. * and WTX_RT_INFO:
  1329. *
  1330. * EXPAND ../../../include/wtxmsg.h WTX_RT_INFO
  1331. *
  1332. * NOTE: This call actively queries the target server for information.
  1333. * Each successful call returns the latest information. 
  1334. *
  1335. * RETURNS: A pointer to the target server information structure or NULL on 
  1336. * error.
  1337. *
  1338. * SEE ALSO: WTX_TS_INFO_GET
  1339. */
  1340. WTX_TS_INFO * wtxTsInfoGet 
  1341.     (
  1342.     HWTX hWtx /* WTX API handle */
  1343.     )
  1344.     {
  1345.     WTX_MSG_TS_INFO * pOut;
  1346.     WTX_ERROR_T callStat; /* WTX status */
  1347.     UINT32 infoMsgVer = WTX_TS_INFO_GET_V2;
  1348.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1349.     pOut = calloc (1, sizeof (WTX_MSG_TS_INFO));
  1350.     if (pOut == NULL)
  1351. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1352.     /*
  1353.      * For description of WTX_TS_INFO_GET_V1 vs WTX_TS_INFO_GET_V2
  1354.      * and the two calls to exchange(), see comments in wtxmsg.h
  1355.      */
  1356.     callStat = exchange (hWtx, infoMsgVer, &hWtx->msgToolId, pOut);
  1357.     if (callStat != WTX_ERR_NONE)
  1358. {
  1359. infoMsgVer = WTX_TS_INFO_GET_V1;
  1360. callStat = exchange (hWtx, infoMsgVer, &hWtx->msgToolId, pOut);
  1361. }
  1362.     if (callStat != WTX_ERR_NONE)
  1363. {
  1364. free (pOut); /* Free allocated message */
  1365. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1366. }
  1367.     /* Free the old target server info stored in the handle */
  1368.     if (hWtx->pTsInfo != NULL)
  1369. {
  1370. wtxResultFree (hWtx, hWtx->pTsInfo);
  1371. }
  1372.     hWtx->pTsInfo = (WTX_TS_INFO *) &pOut->tgtLinkDesc;
  1373.     /* add pointer to the wtxResultFree () list */
  1374.     if (wtxFreeAdd (hWtx, (void *) &pOut->tgtLinkDesc, NULL,
  1375.     pOut, infoMsgVer, hWtx->server, WTX_SVR_SERVER)
  1376. != WTX_OK)
  1377. {
  1378. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1379. }
  1380.     return (hWtx->pTsInfo);
  1381.     }
  1382. /*******************************************************************************
  1383. * wtxTsLock - lock the connected target server for exclusive access
  1384. *
  1385. * This routine locks the target server that the client is connected to
  1386. * so it can only be used by this user and no others.  Other clients
  1387. * already connected can continue to use the target server 
  1388. * until they disconnect.  When a target server is locked the only
  1389. * operations another user may perform are connecting, getting the
  1390. * target server information, and disconnecting.
  1391. * RETURNS: WTX_OK or WTX_ERROR.
  1392. *
  1393. * SEE ALSO: WTX_TS_LOCK, wtxTsUnlock()
  1394. */
  1395. STATUS wtxTsLock 
  1396.     (
  1397.     HWTX hWtx  /* WTX API handle */
  1398.     )
  1399.     {
  1400.     WTX_ERROR_T callStat; /* WTX status */
  1401.     WTX_MSG_TS_LOCK in;
  1402.     WTX_MSG_RESULT out;
  1403.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1404.     memset (&in, 0, sizeof (in));
  1405.     memset (&out, 0, sizeof (out));
  1406.     in.lockType = 0;    /* ??? Is the lock type documented anywhere ??? */
  1407.     callStat = exchange (hWtx, WTX_TS_LOCK, &in, &out);
  1408.     if (callStat != WTX_ERR_NONE)
  1409. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1410.     wtxExchangeFree (hWtx->server, WTX_TS_LOCK, &out);
  1411.     return (WTX_OK);
  1412.     }
  1413. /*******************************************************************************
  1414. * wtxTsTimedLock - lock the connected target server a limited time
  1415. *
  1416. * This routine locks the target server that the client is connected to so it 
  1417. * can only be used by this user and no others.  Other clients already connected
  1418. * can continue to use the target server until they disconnect.  When a target 
  1419. * server is locked the only operations another user may perform are connecting,
  1420. * getting the target server information, and disconnecting.
  1421. * The target server may be locked indefinitely (<seconds> = WTX_LOCK_FOREVER),
  1422. * otherwise if the target server must be locked only for a fixed time, then the
  1423. * duration must be set in <seconds>.
  1424. *
  1425. * RETURNS: WTX_OK or WTX_ERROR.
  1426. *
  1427. * SEE ALSO: WTX_TS_LOCK, wtxTsLock(), wtxTsUnlock()
  1428. */
  1429. STATUS wtxTsTimedLock 
  1430.     (
  1431.     HWTX hWtx, /* WTX API handle */
  1432.     UINT32 seconds /* duration of lock */
  1433.     )
  1434.     {
  1435.     WTX_ERROR_T callStat; /* WTX status */
  1436.     WTX_MSG_TS_LOCK in;
  1437.     WTX_MSG_RESULT out;
  1438.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1439.     memset (&in, 0, sizeof (in));
  1440.     memset (&out, 0, sizeof (out));
  1441.     if (seconds > 0)
  1442.         in.lockType = seconds;
  1443.     else
  1444.         in.lockType = 0;
  1445.     callStat = exchange (hWtx, WTX_TS_LOCK, &in, &out);
  1446.     if (callStat != WTX_ERR_NONE)
  1447. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1448.     wtxExchangeFree (hWtx->server, WTX_TS_LOCK, &out);
  1449.     return (WTX_OK);
  1450.     }
  1451. /*******************************************************************************
  1452. * wtxTsUnlock - unlock the connected target server
  1453. *
  1454. * This routine unlocks the target server that the client is connected to
  1455. * so it can be accessed by any user on its access list.  The unlock will
  1456. * only succeed if it is being unlocked by the same user that locked it.
  1457. *
  1458. * RETURNS: WTX_OK or WTX_ERROR.
  1459. *
  1460. * SEE ALSO: WTX_TS_UNLOCK, wtxTsLock()
  1461. */
  1462. STATUS wtxTsUnlock 
  1463.     (
  1464.     HWTX hWtx /* WTX API handle */
  1465.     )
  1466.     {
  1467.     WTX_ERROR_T callStat; /* WTX status */
  1468.     WTX_MSG_TS_UNLOCK in;
  1469.     WTX_MSG_RESULT out;
  1470.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1471.     memset (&in, 0, sizeof (in));
  1472.     memset (&out, 0, sizeof (out));
  1473.     in.force = FALSE; /* ??? Is this documented anywhere ??? */
  1474.     callStat = exchange (hWtx, WTX_TS_UNLOCK, &in, &out);
  1475.     if (callStat != WTX_ERR_NONE)
  1476. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1477.     wtxExchangeFree (hWtx->server, WTX_TS_UNLOCK, &out);
  1478.     return (WTX_OK);
  1479.     }
  1480. /*******************************************************************************
  1481. *
  1482. * wtxVerify - verify that a WTX handle is valid for use
  1483. *
  1484. * This routine returns WTX_OK if the WTX handle <hWtx> is valid. If an
  1485. * invalid handle is passed to a WTX routine, the error
  1486. * WTX_ERR_API_INVALID_HANDLE occurs. A handle that has been released using
  1487. * wtxTerminate() is invalid.
  1488. *
  1489. * RETURNS: TRUE if the handle is valid or FALSE if not.
  1490. *
  1491. * SEE ALSO: wtxInitialize(), wtxTerminate()
  1492. */
  1493. BOOL32 wtxVerify
  1494.     (
  1495.     HWTX hWtx /* WTX API handle */
  1496.     )
  1497.     {
  1498.     return (hWtx != NULL && hWtx->self == hWtx);
  1499.     }
  1500. /*******************************************************************************
  1501. * wtxVioChanGet - get a virtual I/O channel number
  1502. *
  1503. * This routine returns a free virtual I/O channel number to be
  1504. * used for redirection of target I/O to the host.  The returned
  1505. * channel number is an INT32 between 1 and 255.  (Channel 0 is
  1506. * reserved for the default console.) When no longer required, the
  1507. * channel number is released using wtxVioChanRelease().
  1508. *
  1509. * RETURNS: The new channel number or WTX_ERROR on failure.
  1510. *
  1511. * SEE ALSO: WTX_VIO_CHAN_GET, wtxVioChanRelease()
  1512. */
  1513. INT32 wtxVioChanGet
  1514.     (
  1515.     HWTX hWtx /* WTX API handle */
  1516.     )
  1517.     {
  1518.     WTX_ERROR_T callStat;
  1519.     WTX_MSG_RESULT out;
  1520.     INT32 result;
  1521.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1522.     memset (&out, 0, sizeof (out));
  1523.     callStat = exchange (hWtx, WTX_VIO_CHAN_GET, &hWtx->msgToolId, &out);
  1524.     if (callStat != WTX_ERR_NONE)
  1525. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1526.     result = out.val.value_u.v_int32;
  1527.     wtxExchangeFree (hWtx->server, WTX_VIO_CHAN_GET, &out);
  1528.     return result;
  1529.     }
  1530. /*******************************************************************************
  1531. *
  1532. * wtxVioChanRelease - release a virtual I/O channel
  1533. *
  1534. * This request releases a virtual I/O channel number previously obtained
  1535. * using wtxVioChanGet() and returns it to the free-channel-number pool of
  1536. * the target server.  Valid channel numbers are in the range 1 to 255.
  1537. *
  1538. * RETURNS: WTX_OK or WTX_ERROR.
  1539. *
  1540. * SEE ALSO: WTX_VIO_CHAN_RELEASE, wtxVioChanGet()
  1541. */
  1542. STATUS wtxVioChanRelease 
  1543.     (
  1544.     HWTX hWtx, /* WTX API handle */
  1545.     INT32 channel /* the channel number to release */
  1546.     )
  1547.     {
  1548.     WTX_ERROR_T callStat;
  1549.     WTX_MSG_PARAM in;
  1550.     WTX_MSG_RESULT out;
  1551.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1552.     memset (&in, 0, sizeof (in));
  1553.     memset (&out, 0, sizeof (out));
  1554.     in.param.valueType = V_INT32;
  1555.     in.param.value_u.v_int32 = channel;
  1556.     callStat = exchange (hWtx, WTX_VIO_CHAN_RELEASE, &in, &out);
  1557.     if (callStat != WTX_ERR_NONE)
  1558. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1559.     wtxExchangeFree (hWtx->server, WTX_VIO_CHAN_RELEASE, &out);
  1560.     return (WTX_OK);
  1561.     }
  1562. /*******************************************************************************
  1563. *
  1564. * wtxVioCtl - perform a control operation on a virtual I/O channel
  1565. *
  1566. * This routine performs the special I/O operation specified by <request>
  1567. * on the virtual I/O channel <channel>. An operation-specific
  1568. * parameter is supplied to the operation by <arg>.
  1569. * RETURNS: WTX_OK or WTX_ERROR.
  1570. *
  1571. * SEE ALSO: WTX_VIO_CTL, wtxVioChanGet()
  1572. */
  1573. STATUS wtxVioCtl
  1574.     (
  1575.     HWTX hWtx, /* WTX API handle */
  1576.     INT32 channel, /* channel to do control operation on */
  1577.     UINT32 request, /* control operation to perform */
  1578.     UINT32 arg /* arg for call */
  1579.     )
  1580.     {
  1581.     WTX_ERROR_T callStat; /* WTX status */
  1582.     WTX_MSG_VIO_CTL_DESC in;
  1583.     WTX_MSG_RESULT out;
  1584.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1585.     memset (&in, 0, sizeof (in));
  1586.     memset (&out, 0, sizeof (out));
  1587.     in.channel = channel;
  1588.     in.request = request;
  1589.     in.arg = arg;
  1590.     callStat = exchange (hWtx, WTX_VIO_CTL, &in, &out);
  1591.     if (callStat != WTX_ERR_NONE)
  1592. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1593.     wtxExchangeFree (hWtx->server, WTX_VIO_CTL, &out);
  1594.     return (WTX_OK);
  1595.     }
  1596. /*******************************************************************************
  1597. *
  1598. * wtxVioFileList - list the files managed by the target server
  1599. *
  1600. * This routine returns a list of all the target-server-managed files along
  1601. * with information about each file including its name, state, and associated
  1602. * virtual I/O channel redirection.  The result is a pointer to a pointer to
  1603. * the first item in a linked list of file descriptors. It must be freed by
  1604. * the caller using wtxResultFree(). If the list is empty (no files are
  1605. * managed by the target server), the result points to a NULL value.
  1606. *
  1607. * EXPAND ../../../include/wtxmsg.h WTX_VIO_FILE_DESC
  1608. *
  1609. * RETURNS: A pointer to a pointer to the file list or NULL on error.
  1610. * SEE ALSO: WTX_VIO_FILE_LIST, wtxFileOpen(), wtxFileClose()
  1611. */
  1612. WTX_VIO_FILE_DESC ** wtxVioFileList 
  1613.     (
  1614.     HWTX hWtx /* WTX API handle */
  1615.     )
  1616.     {
  1617.     WTX_ERROR_T callStat;
  1618.     WTX_MSG_VIO_FILE_LIST * pOut;
  1619.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1620.     pOut = calloc (1, sizeof (WTX_MSG_VIO_FILE_LIST));
  1621.     if (pOut == NULL)
  1622. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1623.     callStat = exchange (hWtx, WTX_VIO_FILE_LIST, &hWtx->msgToolId, pOut);
  1624.     if (callStat != WTX_ERR_NONE)
  1625. {
  1626. free (pOut); /* Free allocated message */
  1627. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1628. }
  1629.     /* add pointer to the wtxResultFree() list */
  1630.     if (wtxFreeAdd (hWtx, (void *) &pOut->pVioFileList, NULL, pOut,
  1631.     WTX_VIO_FILE_LIST, hWtx->server, WTX_SVR_SERVER) != WTX_OK)
  1632. {
  1633. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1634. }
  1635.     return &pOut->pVioFileList;
  1636.     }
  1637. /*******************************************************************************
  1638. *
  1639. * wtxVioWrite - write data to a VIO channel
  1640. *
  1641. * This routine writes at most <numBytes> of data starting at <pData>
  1642. * to the virtual I/O channel number <channel>.  The buffer size is 512 bytes;
  1643. * if <numBytes> is greater than 512, the extra bytes are discarded.
  1644. *
  1645. * RETURNS: The number of bytes actually written or WTX_ERROR.
  1646. *
  1647. * SEE ALSO: WTX_VIO_WRITE, wtxEventGet(), wtxVioChanGet()
  1648. */
  1649. UINT32 wtxVioWrite
  1650.     (
  1651.     HWTX hWtx, /* WTX API handle */
  1652.     INT32 channel, /* channel to write to */
  1653.     void * pData, /* pointer to data to write */
  1654.     UINT32 numBytes /* number of bytes of data to write */
  1655.     )
  1656.     {
  1657.     WTX_ERROR_T callStat; /* WTX status */
  1658.     WTX_MSG_VIO_COPY_DESC in;
  1659.     WTX_MSG_RESULT out;
  1660.     UINT32 bytesWritten;
  1661.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1662.     memset (&in, 0, sizeof (in));
  1663.     memset (&out, 0, sizeof (out));
  1664.     in.channel = channel;
  1665.     in.maxBytes = numBytes;
  1666.     in.baseAddr = pData;
  1667.     callStat = exchange (hWtx, WTX_VIO_WRITE, &in, &out);
  1668.     if (callStat != WTX_ERR_NONE)
  1669. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1670.     bytesWritten = out.val.value_u.v_uint32;
  1671.     wtxExchangeFree (hWtx->server, WTX_VIO_WRITE, &out);
  1672.     return bytesWritten;
  1673.     }
  1674. /*******************************************************************************
  1675. *
  1676. * wtxTargetAttach - reattach to the target
  1677. *
  1678. * This routine reattaches the client to a target that has been disconnected
  1679. * or for which the target server is waiting to connect. 
  1680. * RETURNS: WTX_OK if the target is successfully attached or WTX_ERROR 
  1681. * if the target is still unavailable.
  1682. *
  1683. * SEE ALSO: WTX_TARGET_ATTACH
  1684. */
  1685. STATUS wtxTargetAttach
  1686.     (
  1687.     HWTX hWtx /* WTX API handle */
  1688.     )
  1689.     {
  1690.     WTX_ERROR_T callStat;
  1691.     WTX_MSG_RESULT out;
  1692.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1693.     memset (&out, 0, sizeof (out));
  1694.     callStat = exchange (hWtx, WTX_TARGET_ATTACH, &hWtx->msgToolId, &out);
  1695.     if (callStat != WTX_ERR_NONE)
  1696. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1697.     wtxExchangeFree (hWtx->server, WTX_TARGET_ATTACH, &out);
  1698.     return (WTX_OK);
  1699.     }
  1700. /*******************************************************************************
  1701. *
  1702. * wtxProbe - probe to see if the registry service is running
  1703. *
  1704. * This routine returns WTX_OK if the registry service is running. Otherwise
  1705. * it returns WTX_ERROR.
  1706. *
  1707. * RETURNS: WTX_OK or WTX_ERROR.
  1708. */
  1709. STATUS wtxProbe 
  1710.     (
  1711.     HWTX hWtx /* WTX API handle */
  1712.     )
  1713.     {
  1714.     WTX_ERROR_T callStat;
  1715.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  1716.     if (registryConnect (hWtx) != WTX_OK)
  1717. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_REGISTRY_UNREACHABLE, WTX_ERROR);
  1718.     callStat = wtxExchange (hWtx->registry, NULLPROC, NULL, NULL);
  1719.     /* close registry connection now since we don't need it anymore */
  1720.     registryDisconnect (hWtx);
  1721.     if (callStat != WTX_ERR_NONE)
  1722. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1723.     return (WTX_OK);
  1724.     }
  1725. /*******************************************************************************
  1726. *
  1727. * wtxRegister - register the target server with the Tornado registry service
  1728. *
  1729. * This routine registers the named target server with the WTX registry daemon.
  1730. * If the specified name does not conflict with any other registered server,
  1731. * the registry allocates, initializes, and adds a WTX descriptor structure
  1732. * containing a unique RPC program number to its internal tables.  If
  1733. * specified, <name> must be unique for the whole system, and by convention
  1734. * it is a legal C identifier.  If <name> is NULL, a unique name is allocated
  1735. * by the registry and returned to the caller. Only one server can be
  1736. * registered per WTX handle.
  1737. *
  1738. * The return value is a pointer to internal data and must not be freed
  1739. * by the user.
  1740. *
  1741. * EXPAND ../../../include/wtxtypes.h WTX_DESC
  1742. *
  1743. * RETURNS: A pointer to a WTX_DESC or NULL if the registration failed.
  1744. *
  1745. * ERRORS:
  1746. * .iP WTX_ERR_API_SERVICE_ALREADY_REGISTERED 12
  1747. * The server has already registered itself.
  1748. * .iP WTX_ERR_API_REGISTRY_UNREACHABLE 
  1749. * The registry service is not reachable (in other words, the registry 
  1750. * daemon is not running).
  1751. * .iP WTX_ERR_API_MEMALLOC 
  1752. * There are insufficient resources to allocate a new WTX descriptor for 
  1753. * the server.
  1754. * .iP WTX_ERR_REGISTRY_NAME_CLASH
  1755. * Name already exists in Tornado registry database.
  1756. *
  1757. * SEE ALSO: WTX_REGISTER, wtxUnregister(), wtxInfo()
  1758. */
  1759. WTX_DESC * wtxRegister
  1760.     (
  1761.     HWTX hWtx, /* WTX API handle                     */
  1762.     const char * name, /* service name, NULL to be named     */
  1763.     const char * type, /* service type, NULL for unspecified */
  1764.     const char * key /* unique service key                 */
  1765.     )
  1766.     {
  1767.     WTX_DESC * pDesc = NULL; /* copy of the retrned description    */
  1768.     WTX_ERROR_T callStat;
  1769.     WTX_MSG_SVR_DESC in;
  1770.     WTX_MSG_SVR_DESC * pOut;
  1771.     if (hWtx->pSelfDesc != NULL)
  1772. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_SERVICE_ALREADY_REGISTERED, NULL);
  1773.     if (registryConnect (hWtx) != WTX_OK)
  1774. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_REGISTRY_UNREACHABLE, NULL);
  1775.     /* allocate a new descriptor */
  1776.     pOut = calloc (1, sizeof (WTX_MSG_SVR_DESC));
  1777.     if (pOut == NULL)
  1778. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1779.     /* fill in our particulars */
  1780.     memset (&in, 0, sizeof (in));
  1781.     in.wtxSvrDesc.wpwrName = (char *) name; /* send our name */
  1782.     in.wtxSvrDesc.wpwrType = (char *) type; /* send our type */
  1783.     in.wtxSvrDesc.wpwrKey  = (char *) key; /* send our key */
  1784.     callStat = exchange (hWtx, WTX_REGISTER, &in, pOut);
  1785.     if (callStat != WTX_ERR_NONE)
  1786. {
  1787. free (pOut); /* free allocated message */
  1788. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1789. }
  1790.     /*
  1791.      * let's copy the returned structure field by field and add it to the
  1792.      * wtxResultFree List
  1793.      */
  1794.     if ((pDesc = wtxDescDuplicate ( hWtx, (WTX_DESC *) &pOut->wtxSvrDesc))
  1795.  == NULL)
  1796. {
  1797. wtxExchangeFree (hWtx->registry, WTX_REGISTER, pOut);
  1798. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1799. }
  1800.     /* add pointer description to the wtxResultFree() list */
  1801.     if (wtxFreeAdd (hWtx, (void *) pDesc, (FUNCPTR) wtxDescFree,
  1802.     NULL, 0, NULL, WTX_SVR_NONE)!= WTX_OK)
  1803. {
  1804. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1805. }
  1806.     /* close registry connection now since we don't need it anymore */
  1807.     wtxExchangeFree (hWtx->registry, WTX_REGISTER, pOut);
  1808.     free (pOut);
  1809.     registryDisconnect (hWtx);
  1810.     hWtx->pSelfDesc = pDesc;
  1811.     return (pDesc);
  1812.     }
  1813. /*******************************************************************************
  1814. *
  1815. * wtxDescFree - frees a WTX_DESC structure ans all its fields
  1816. *
  1817. * This routine frees the given WTX_DESC, and all the fields it contains.
  1818. *
  1819. * RETURN: N/A
  1820. *
  1821. * ERRNO: N/A
  1822. *
  1823. */
  1824. LOCAL void wtxDescFree
  1825.     (
  1826.     WTX_DESC * pDescToFree /* WTX_DESC pointer to free */
  1827.     )
  1828.     {
  1829.     if (pDescToFree == NULL)
  1830. goto error;
  1831.     if (pDescToFree->wpwrName != NULL)
  1832. free (pDescToFree->wpwrName);
  1833.     if (pDescToFree->wpwrType != NULL)
  1834. free (pDescToFree->wpwrType);
  1835.     if (pDescToFree->wpwrKey != NULL)
  1836. free (pDescToFree->wpwrKey);
  1837.     free (pDescToFree);
  1838. error:
  1839.     return;
  1840.     }
  1841. /*******************************************************************************
  1842. *
  1843. * wtxUnregister - unregister the server with the Tornado registry
  1844. *
  1845. * This routine removes the specified descriptor from the Tornado-registry
  1846. * internal table. The name of the server is no longer reserved. Passing
  1847. * NULL for <name> means unregister the server already registered against
  1848. * the handle <hWtx> using wtxRegister().
  1849. *
  1850. * RETURNS: WTX_OK or WTX_ERROR if the server could not be unregistered.
  1851. *
  1852. * ERRORS:
  1853. * .iP WTX_ERR_API_SERVICE_NOT_REGISTERED 12
  1854. * The server is trying to unregister itself when it has not registered or
  1855. * has already unregistered.
  1856. * .iP WTX_ERR_API_REGISTRY_UNREACHABLE
  1857. * The registry service is not reachable (in other words, the registry 
  1858. * daemon is not running).
  1859. *
  1860. * SEE ALSO: WTX_UNREGISTER, wtxRegister()
  1861. */
  1862. STATUS wtxUnregister 
  1863.     (
  1864.     HWTX hWtx, /* WTX API handle */
  1865.     const char *name /* service to unregister, NULL for self */
  1866.     )
  1867.     {
  1868.     WTX_MSG_PARAM in;
  1869.     WTX_MSG_RESULT out;
  1870.     WTX_ERROR_T callStat;
  1871.     
  1872.     if ((name == NULL) && /* self? */
  1873.         (hWtx->pSelfDesc == NULL || 
  1874.  (name = hWtx->pSelfDesc->wpwrName) == NULL))
  1875. /*  Unregistering self when not registered */
  1876. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_SERVICE_NOT_REGISTERED, WTX_ERROR);
  1877.     if (registryConnect (hWtx) != WTX_OK)
  1878. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_REGISTRY_UNREACHABLE, WTX_ERROR);
  1879.     memset (&in, 0, sizeof (in));
  1880.     in.param.valueType = V_PCHAR;
  1881.     in.param.value_u.v_pchar = (char *) name;
  1882.     memset (&out, 0, sizeof (out));
  1883.     callStat = exchange (hWtx, WTX_UNREGISTER, &in, &out);
  1884.     /* close registry connection now since we don't need it anymore */
  1885.     registryDisconnect (hWtx);
  1886.     if (callStat != WTX_ERR_NONE)
  1887. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1888.     /* if unregistering ourself, destroy our descriptor */
  1889.     if (hWtx->pSelfDesc &&
  1890. hWtx->pSelfDesc->wpwrName &&
  1891. STREQ (hWtx->pSelfDesc->wpwrName, name))
  1892. {
  1893. wtxResultFree (hWtx, hWtx->pSelfDesc);
  1894. hWtx->pSelfDesc = NULL;
  1895. }
  1896.     wtxExchangeFree (hWtx->registry, WTX_UNREGISTER, &out);
  1897.     return (WTX_OK);
  1898.     }
  1899. /*******************************************************************************
  1900. *
  1901. * wtxInfo - allocate and return a descriptor for the named service
  1902. *
  1903. * This routine allocates and fills in a descriptor corresponding to the
  1904. * named service.  This routine always queries the WTX registry daemon for
  1905. * the named service and allocates and fills a WTX descriptor structure with
  1906. * the results.  The descriptor must be deallocated with wtxResultFree()
  1907. * when it is no longer needed. Passing NULL for <name> means to get
  1908. * information on the server already registered against the handle <hWtx>
  1909. * using wtxRegister().
  1910. *
  1911. * EXPAND ../../../include/wtxtypes.h WTX_DESC
  1912. *
  1913. * RETURNS: A pointer to a WTX_DESC or NULL if the service could not be found.
  1914. *
  1915. * ERRORS:
  1916. * .iP WTX_ERR_API_SERVICE_NOT_REGISTERED 12
  1917. * <name> is NULL and no service is registered against the handle.
  1918. * .iP WTX_ERR_API_REGISTRY_UNREACHABLE 
  1919. * The registry service is not reachable (in other words, the registry daemon
  1920. * is not running).
  1921. *
  1922. * SEE ALSO: WTX_INFO_GET, wtxInfoQ()
  1923. */
  1924. WTX_DESC * wtxInfo 
  1925.     (
  1926.     HWTX  hWtx, /* WTX API handle          */
  1927.     const char * name /* service name to lookup  */
  1928.     )
  1929.     {
  1930.     WTX_MSG_SVR_DESC * pOut; /* exchange returned value */
  1931.     WTX_MSG_PARAM in; /* input parameters desc   */
  1932.     WTX_ERROR_T callStat; /* exchange result values  */
  1933.     if ((name == NULL) && /* self? */
  1934.         (hWtx->pSelfDesc == NULL || 
  1935.  (name = hWtx->pSelfDesc->wpwrName) == NULL))
  1936. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_SERVICE_NOT_REGISTERED, NULL);
  1937.     if (registryConnect (hWtx) != WTX_OK)
  1938. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_REGISTRY_UNREACHABLE, NULL);
  1939.     /* allocate and initialize registry response */
  1940.     pOut = (WTX_MSG_SVR_DESC *) calloc (1, sizeof (WTX_MSG_SVR_DESC));
  1941.     if (pOut == NULL)
  1942. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1943.     memset (&in, 0, sizeof (in));
  1944.     in.param.valueType = V_PCHAR;
  1945.     in.param.value_u.v_pchar = (char *) name;
  1946.     /* ask daemon for information */
  1947.     callStat = exchange (hWtx, WTX_INFO_GET, &in, pOut);
  1948.     if (callStat != WTX_ERR_NONE)
  1949. {
  1950. free (pOut); /* Free allocated message */
  1951. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1952. }
  1953.     /* add pointer to the wtxResultFree() list */
  1954.     if (wtxFreeAdd (hWtx, (void *) &pOut->wtxSvrDesc, NULL, pOut, WTX_INFO_GET,
  1955.     hWtx->registry, WTX_SVR_REGISTRY) != WTX_OK)
  1956. {
  1957. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1958. }
  1959.     return ( (WTX_DESC *) &pOut->wtxSvrDesc);
  1960.     }
  1961. /*******************************************************************************
  1962. *
  1963. * wtxDescDuplicate - duplicates a WTX_DESC structure
  1964. *
  1965. * This routine just duplicates a WTX_DESC structure and all the fields it
  1966. * contains.
  1967. *
  1968. * RETURNS: a pointer on the duplicated WTX_DESC
  1969. *
  1970. * ERRNO:
  1971. * .iP
  1972. * WTX_ERR_API_MEMALLOC
  1973. * .lE
  1974. */
  1975. LOCAL WTX_DESC * wtxDescDuplicate
  1976.     (
  1977.     HWTX hWtx, /* current WTX session handler */
  1978.     WTX_DESC * pDesc /* WTX_DESC to duplicate       */
  1979.     )
  1980.     {
  1981.     WTX_DESC * pDuplicate = NULL; /* duplicated WTX_DESC pointer */
  1982.     /* allocate the WTX_DESC itself */
  1983.     if ( (pDuplicate = (WTX_DESC *) calloc (1, sizeof (WTX_DESC))) == NULL)
  1984. {
  1985. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1986. }
  1987.     /* item name memory allocation */
  1988.     if ((pDesc->wpwrName != NULL) &&
  1989. ((pDuplicate->wpwrName = strdup (pDesc->wpwrName)) == NULL))
  1990. {
  1991. free (pDuplicate);
  1992. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1993. }
  1994.     /* item type memory allocation */
  1995.     if ((pDesc->wpwrType != NULL) &&
  1996. ((pDuplicate->wpwrType = strdup (pDesc->wpwrType)) == NULL))
  1997. {
  1998. free (pDuplicate->wpwrName);
  1999. free (pDuplicate);
  2000. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  2001. }
  2002.     /* item key memory allocation */
  2003.     if ((pDesc->wpwrKey != NULL) &&
  2004. ((pDuplicate->wpwrKey = strdup (pDesc->wpwrKey)) == NULL))
  2005. {
  2006. free (pDuplicate->wpwrType);
  2007. free (pDuplicate->wpwrName);
  2008. free (pDuplicate);
  2009. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  2010. }
  2011.     return (pDuplicate);
  2012.     }
  2013. /*******************************************************************************
  2014. *
  2015. * wtxInfoQ - return a list of all services registered with the Tornado registry
  2016. *
  2017. * This routine provides the caller with a table of descriptors corresponding 
  2018. * to all services registered with the Tornado registry.  An unsorted table
  2019. * of descriptors is allocated and returned.  There is no guarantee that 
  2020. * the table is valid by the time it is inspected.  Services may come and go
  2021. * at any time.
  2022. *
  2023. * EXPAND ../../../include/wtxtypes.h WTX_DESC_Q
  2024. *
  2025. * The table of descriptors should be deallocated with wtxResultFree().
  2026. *
  2027. * RETURNS: A pointer to a table of descriptors or NULL if error.
  2028. *
  2029. * ERRORS:
  2030. * .iP WTX_ERR_API_REGISTRY_UNREACHABLE 12
  2031. * The registry service is not reachable (in other words, the registry
  2032. * daemon is not running).
  2033. * .iP WTX_ERR_API_MEMALLOC 
  2034. * There are insufficient resources to allocate the WTX_DESC_Q structure for
  2035. * the result value.
  2036. * .iP WTX_ERR_REGISTRY_BAD_PATTERN
  2037. * One of the given patterns (<namePattern>, <typePattern> or <keyPattern>) is
  2038. * not a valid regular expression.
  2039. * .iP WTX_ERR_REGISTRY_NAME_NOT_FOUND
  2040. * Info required is not in the registry database.
  2041. *
  2042. * SEE ALSO: WTX_INFO_Q_GET, wtxInfo()
  2043. */
  2044. WTX_DESC_Q * wtxInfoQ
  2045.     (
  2046.     HWTX hWtx, /* WTX API handle           */
  2047.     const char * namePattern, /* regexp to match svc name */
  2048.     const char * typePattern, /* regexp to match svc type */
  2049.     const char * keyPattern /* regexp to match svc key  */
  2050.     )
  2051.     {
  2052.     WTX_MSG_WTXREGD_PATTERN in; /* input pattern desc       */
  2053.     WTX_MSG_SVR_DESC_Q * pOut = NULL; /* output message           */
  2054.     WTX_ERROR_T callStat; /* exchange result values   */
  2055.     if (registryConnect (hWtx) != WTX_OK)
  2056. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_REGISTRY_UNREACHABLE, NULL);
  2057.     /* allocate and initialize registry response */
  2058.     pOut = calloc (1, sizeof (WTX_MSG_SVR_DESC_Q));
  2059.     if (pOut == NULL)
  2060. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  2061.     /* fill in patterns for query */
  2062.     in.name = (char *) namePattern;
  2063.     in.type = (char *) typePattern;
  2064.     in.key  = (char *) keyPattern;
  2065.     /* get list of registered services */
  2066.     callStat = exchange (hWtx, WTX_INFO_Q_GET, &in, pOut);
  2067.     if (callStat != WTX_ERR_NONE)
  2068. {
  2069. free (pOut);
  2070. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  2071. }
  2072.     if (wtxFreeAdd (hWtx, (void *) &pOut->wtxSvrDescQ, NULL, pOut,
  2073.     WTX_INFO_Q_GET, hWtx->registry, WTX_SVR_REGISTRY) != WTX_OK)
  2074. {
  2075. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  2076. }
  2077.     return ( (WTX_DESC_Q *) &pOut->wtxSvrDescQ);
  2078.     }
  2079. /*******************************************************************************
  2080. *
  2081. * wtxEach - call a routine to examine each WTX-registered service
  2082. *
  2083. * This routine calls a user-supplied routine to examine each WTX-registered
  2084. * service; it calls the specified routine once for each service.  The
  2085. * routine should be declared as follows:
  2086. * .CS
  2087. *   BOOL32 routine
  2088. * (
  2089. * WTX_DESC_Q * pDesc, /@ entry name @/
  2090. * int           arg /@ arbitrary user-supplied arg @/
  2091. * )
  2092. * .CE
  2093. * The user-supplied routine should return TRUE if wtxEach() is
  2094. * to  continue  calling  it  for each entry, or FALSE if it is
  2095. * done and wtxEach() can exit.  
  2096. *
  2097. * Note that all descriptors are deallocated upon exit.
  2098. *
  2099. * RETURNS: WTX_OK or WTX_ERROR if the table of descriptors could not be 
  2100. * obtained.
  2101. * ERRORS:
  2102. * .iP WTX_ERR_API_REGISTRY_UNREACHABLE 12 
  2103. * The registry service is not reachable (in other words, the registry daemon
  2104. * is not running).
  2105. * .iP WTX_ERR_API_MEMALLOC
  2106. * There are insufficient resources to allocate the WTX_DESC_Q structure for
  2107. * the result value.
  2108. *
  2109. * SEE ALSO: wtxInfoQ()
  2110. */
  2111. STATUS wtxEach
  2112.     (
  2113.     HWTX hWtx, /* WTX API handle */
  2114.     const char *namePattern, /* regular expression to match svc name */
  2115.     const char *typePattern, /* regular expression to match svc type */
  2116.     const char *keyPattern, /* regular expression to match svc key */
  2117.     FUNCPTR routine, /* func to call for each svc entry */
  2118.     void * routineArg /* arbitrary user-supplied arg */
  2119.     )
  2120.     {
  2121.     WTX_DESC_Q * pWtxDescQ;
  2122.     WTX_DESC_Q * pDescQ;
  2123.     pWtxDescQ = wtxInfoQ (hWtx, namePattern, typePattern, keyPattern);
  2124.     if (pWtxDescQ == NULL)
  2125. /* Note: error has already been dispatched so just return */
  2126. return  WTX_ERROR;
  2127.     pDescQ = pWtxDescQ;
  2128.     /* traverse descriptor queue and call the routine */
  2129.     while (pDescQ != NULL)
  2130. {
  2131. if (!((* routine) (pDescQ, routineArg)))
  2132.     break;
  2133. pDescQ = (WTX_DESC_Q *) pWtxDescQ->pNext;
  2134. }
  2135.     wtxResultFree (hWtx, pWtxDescQ);
  2136.     return (WTX_OK);
  2137.     }
  2138. /*******************************************************************************
  2139. *
  2140. * wtxTimeoutSet - set the timeout for completion of WTX calls
  2141. *
  2142. * This routine changes the timeout value for making WTX API calls.
  2143. * When a call takes longer than the value specified by <msec> (in
  2144. * milliseconds), the call aborts with an error status and the
  2145. * error code is set to WTX_ERR_API_REQUEST_TIMED_OUT.
  2146. *
  2147. * NOTE: The timeout for WTX registry calls is unaffected.
  2148. *
  2149. * RETURNS: WTX_OK or WTX_ERROR.
  2150. *
  2151. * SEE ALSO: wtxTimeoutGet()
  2152. */
  2153. STATUS wtxTimeoutSet 
  2154.     (
  2155.     HWTX hWtx, /* WTX API handle */
  2156.     UINT32 msec /* New timeout value in milliseconds */
  2157.     )
  2158.     {
  2159.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2160.     if (wtxExchangeControl (hWtx->server, 
  2161.     WTX_EXCHANGE_CTL_TIMEOUT_SET, &msec) == WTX_OK)
  2162. return WTX_OK;
  2163.     else
  2164. WTX_ERROR_RETURN (hWtx, wtxExchangeErrGet (hWtx->server), WTX_ERROR);
  2165.     }
  2166. /*******************************************************************************
  2167. *
  2168. * wtxTimeoutGet - get the current timeout for completion of WTX calls
  2169. *
  2170. * This routine gets the current timeout value for making WTX API calls.
  2171. * The value is returned in the UINT32 pointed to by <pMsec>.
  2172. *
  2173. * RETURNS: WTX_OK or WTX_ERROR.
  2174. *
  2175. * SEE ALSO: wtxTimeoutSet()
  2176. */
  2177. STATUS wtxTimeoutGet 
  2178.     (
  2179.     HWTX hWtx, /* WTX API handle */
  2180.     UINT32 * pMsec /* Pointer to timeout value in milliseconds */
  2181.     )
  2182.     {
  2183.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2184.     if (pMsec == NULL)
  2185. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  2186.     if (wtxExchangeControl (hWtx->server, 
  2187.     WTX_EXCHANGE_CTL_TIMEOUT_GET, pMsec) == WTX_OK)
  2188. return WTX_OK;
  2189.     else
  2190. WTX_ERROR_RETURN (hWtx, wtxExchangeErrGet (hWtx->server), WTX_ERROR);
  2191.     }
  2192. /*******************************************************************************
  2193. *
  2194. * exchange - wrapper for calling exchange mechanism
  2195. *
  2196. * This routine performs a WTX call selecting the correct exchange handle
  2197. * and doing some additional error checking.
  2198. *
  2199. * RETURNS: WTX_ERR_NONE or error code
  2200. *
  2201. * NOMANUAL
  2202. */
  2203. LOCAL WTX_ERROR_T exchange
  2204.     (
  2205.     HWTX hWtx, /* handle to use for exchange */
  2206.     UINT32 svcNum, /* service number to call */
  2207.     void * pIn, /* pointer to in (argument) data */
  2208.     void * pOut /* pointer to out (result) data */
  2209.     )
  2210.     {
  2211.     WTX_ERROR_T retVal; /* value to return */
  2212.     STATUS status; /* status of exchange call */
  2213.     WTX_XID  xid; /* exchange handle to use for call */
  2214.     /* Figure out which exchange handle to use based on the API service num */
  2215.     switch (svcNum)
  2216. {
  2217. case WTX_REGISTER:
  2218. case WTX_UNREGISTER:
  2219. case WTX_INFO_GET:
  2220. case WTX_INFO_Q_GET:
  2221.     xid = hWtx->registry;
  2222.     break;
  2223. default:
  2224.     xid = hWtx->server;
  2225.     break;
  2226. }
  2227.     /* Fill in the objId field required by some API requests */
  2228.     ((WTX_MSG_DUMMY *) pIn)->wtxCore.objId = hWtx->msgToolId.wtxCore.objId;
  2229.     /* Do the call */
  2230.     status = wtxExchange (xid, svcNum, pIn, pOut);
  2231.     /*
  2232.      * Stamp the result with the service number so that it can be freed
  2233.      * by the free function without knowing its object type. The protVersion
  2234.      * field is used to store the address of the result to help identify
  2235.      * (not foolproof but fairly good) bogus pointers passed to free.
  2236.      */
  2237.     if (status == WTX_OK)
  2238. {
  2239. ((WTX_MSG_DUMMY *) pOut)->wtxCore.objId = svcNum;
  2240. ((WTX_MSG_DUMMY *) pOut)->wtxCore.protVersion = (UINT32) pOut;
  2241. return WTX_ERR_NONE;
  2242. }
  2243.     /* Analyze the result and see if it requires any special action */
  2244.     switch (wtxExchangeErrGet (xid))
  2245. {
  2246. case WTX_ERR_EXCHANGE_TRANSPORT_DISCONNECT:
  2247.     /*
  2248.      * This exchange transport mechanism has broken down and
  2249.      * disconnected us. The error is reported to the caller as
  2250.      * WTX_ERR_API_TOOL_DISCONECTED or
  2251.      * WTX_ERR_API_REGISTRY_UNREACHABLE (depending on the
  2252.      * connection) so the user can tell there is no point in
  2253.      * making further calls (which would return 
  2254.      * WTX_ERR_API_NOT_CONNECTED 
  2255.      */
  2256.     if (xid == hWtx->registry)
  2257. {
  2258.         wtxExchangeDelete (xid);
  2259.         wtxExchangeTerminate (xid);
  2260. hWtx->registry = NULL;
  2261. retVal = WTX_ERR_API_REGISTRY_UNREACHABLE;
  2262. }
  2263.     else
  2264. {
  2265.      toolCleanup (hWtx);
  2266. retVal = WTX_ERR_API_TOOL_DISCONNECTED;
  2267. }
  2268.     break;
  2269. case WTX_ERR_EXCHANGE_TIMEOUT:
  2270.     retVal = WTX_ERR_API_REQUEST_TIMED_OUT;
  2271.     break;
  2272. case WTX_ERR_EXCHANGE:
  2273. case WTX_ERR_EXCHANGE_INVALID_HANDLE:
  2274. case WTX_ERR_EXCHANGE_DATA:
  2275. case WTX_ERR_EXCHANGE_MEMALLOC:
  2276. case WTX_ERR_EXCHANGE_NO_SERVER:
  2277. case WTX_ERR_EXCHANGE_INVALID_ARG:
  2278. case WTX_ERR_EXCHANGE_MARSHALPTR:
  2279. case WTX_ERR_EXCHANGE_BAD_KEY:
  2280. case WTX_ERR_EXCHANGE_REQUEST_UNSUPPORTED:
  2281. case WTX_ERR_EXCHANGE_TRANSPORT_UNSUPPORTED:
  2282. case WTX_ERR_EXCHANGE_TRANSPORT_ERROR:
  2283. case WTX_ERR_EXCHANGE_NO_TRANSPORT:
  2284.     retVal = WTX_ERR_API_REQUEST_FAILED;
  2285.     break;
  2286. default:
  2287.     /* some other API error - return error unchanged */
  2288.     retVal = wtxExchangeErrGet (xid);
  2289.     break;
  2290. }
  2291.     return retVal;
  2292.     }
  2293. /*******************************************************************************
  2294. *
  2295. * registryConnect - wrapper for setting up registry exchange
  2296. *
  2297. * This routine tries to set up the exchange handle for the registry
  2298. * and connect to the registry service.
  2299. *
  2300. * RETURNS: WTX_ERR_NONE or error code
  2301. *
  2302. * NOMANUAL
  2303. */
  2304. LOCAL WTX_ERROR_T registryConnect
  2305.     (
  2306.     HWTX hWtx /* handle to connect to registry */
  2307.     )
  2308.     {
  2309.     BOOL usePMap = FALSE; /* use portmapper to connect ? */
  2310.     WTX_CHECK_HANDLE (hWtx, WTX_ERR_API_INVALID_HANDLE);
  2311.     if ((WTX_XID) hWtx->registry != NULL)
  2312. return WTX_OK;
  2313.     /* first initialise the connection */
  2314.     if (wtxExchangeInitialize ((WTX_XID *) &hWtx->registry) != WTX_OK ||
  2315. wtxExchangeInstall ((WTX_XID) hWtx->registry, 
  2316.     wtxRpcExchangeCreate, 
  2317.     wtxRpcExchangeDelete, 
  2318.     wtxRpcExchange, 
  2319.     wtxRpcExchangeFree, 
  2320.     wtxRpcExchangeControl) != WTX_OK)
  2321. {
  2322. wtxExchangeTerminate ((WTX_XID) hWtx->registry);
  2323. hWtx->registry = (WTX_XID) NULL;
  2324. return WTX_ERROR;
  2325. }
  2326.     /* now create th connection */
  2327. use_pmap:
  2328.     if (wtxExchangeCreate ((WTX_XID) hWtx->registry, NULL, usePMap) != WTX_OK)
  2329. {
  2330. if (! usePMap)
  2331.     {
  2332.     /* well, let's try with the port mapper ... */
  2333.     usePMap = TRUE;
  2334.     goto use_pmap;
  2335.     }
  2336. wtxExchangeTerminate ((WTX_XID) hWtx->registry);
  2337. hWtx->registry = (WTX_XID) NULL;
  2338. return WTX_ERROR;
  2339. }
  2340.     return WTX_OK;
  2341.     }
  2342. /*******************************************************************************
  2343. *
  2344. * registryDisconnect - wrapper for closing registry exchange
  2345. *
  2346. * This routine terminates the exchange handle for the registry
  2347. * and clears the registry field in the WTX handle.
  2348. *
  2349. * RETURNS: WTX_ERR_NONE or error code
  2350. *
  2351. * NOMANUAL
  2352. */
  2353. LOCAL void registryDisconnect
  2354.     (
  2355.     HWTX hWtx /* handle to disconnect registry */
  2356.     )
  2357.     {
  2358.     if (hWtx->registry == NULL) /* check if not already disconnected */
  2359. return; 
  2360.     wtxExchangeDelete (hWtx->registry); /* close registry connection */
  2361.     wtxExchangeTerminate (hWtx->registry); /* cleanup */
  2362.     hWtx->registry = NULL; /* clear handle */
  2363.     return;
  2364.     }
  2365. /*******************************************************************************
  2366. *
  2367. * toolCleanup - do the cleanups necessary when a tool detaches
  2368. *
  2369. * RETURNS: N/A
  2370. *
  2371. * NOMANUAL
  2372. */
  2373. LOCAL void toolCleanup
  2374.     (
  2375.     HWTX hWtx  /* handle to connect to server */
  2376.     )
  2377.     {
  2378.     if (hWtx == NULL)
  2379. return;
  2380.     /* Free up the target server info before deleting the exchange handle */
  2381.     if (hWtx->pTsInfo)
  2382. {
  2383. wtxResultFree (hWtx, hWtx->pTsInfo);
  2384. hWtx->pTsInfo = NULL;
  2385. }
  2386.     /* Free Target tool name */
  2387.     if (hWtx->targetToolName != NULL)
  2388. {
  2389. free (hWtx->targetToolName);
  2390. hWtx->targetToolName = 0;
  2391. }
  2392.     /* Free up the tool descriptor */
  2393.     if (hWtx->pToolDesc)
  2394. {
  2395. wtxResultFree (hWtx, hWtx->pToolDesc);
  2396. hWtx->pToolDesc = NULL;
  2397. }
  2398.     /*
  2399.      * as we exit the WTX session, all the pointers from the wtxResultFree()
  2400.      * pointers list should be freed.
  2401.      */
  2402.     if (hWtx->pWtxFreeList != NULL)
  2403. {
  2404. if (sllCount (hWtx->pWtxFreeList) > 0)
  2405.     {
  2406.     sllEach (hWtx->pWtxFreeList, wtxResultFreeServerListTerminate,
  2407.      (int) &hWtx);
  2408.     }
  2409. /* don't delete the free list, it has to be done in wtxTerminate() */
  2410. }
  2411.     if (hWtx->server != NULL)
  2412. {
  2413. wtxExchangeDelete (hWtx->server);
  2414. wtxExchangeTerminate (hWtx->server); 
  2415. }
  2416.     hWtx->server = NULL;
  2417.     }
  2418. /*******************************************************************************
  2419. *
  2420. * serverDescFree - de-allocate server descriptor
  2421. *
  2422. * RETURNS: N/A
  2423. *
  2424. * NOMANUAL
  2425. */
  2426. LOCAL void serverDescFree
  2427.     (
  2428.     HWTX hWtx  /* handle to connect to server */
  2429.     )
  2430.     {
  2431.     if ((hWtx != NULL) && (hWtx->pServerDesc != NULL))
  2432. {
  2433. free (hWtx->pServerDesc->wpwrName);
  2434. free (hWtx->pServerDesc->wpwrKey);
  2435. free (hWtx->pServerDesc->wpwrType);
  2436. free (hWtx->pServerDesc);
  2437. hWtx->pServerDesc = NULL;
  2438. }
  2439.     }
  2440. #ifndef HOST
  2441. /*******************************************************************************
  2442. *
  2443. * stringDup - duplicates a sting
  2444. *
  2445. * This routine just duplicates a string, an strdup() call can not be made as far
  2446. * as the target has no strdup(), and wtx.c should be compiled on both host and
  2447. * target sides.
  2448. *
  2449. * RETURNS: A char pointer to the allocated/ duplicated string
  2450. *
  2451. * ERRORS:
  2452. * .iP
  2453. * WTX_ERR_API_MEM_ALLOC
  2454. * .LE
  2455. *
  2456. */
  2457. LOCAL char * stringDup
  2458.     (
  2459.     const char * strToDup /* string to duplicate */
  2460.     )
  2461.     {
  2462.     char * duplicatedStr = NULL; /* duplicated string   */
  2463.     if (strToDup == NULL)
  2464. goto error;
  2465.     if ( (duplicatedStr = (char *) calloc (strlen (strToDup) + 1,
  2466.    sizeof (char))) == NULL)
  2467. {
  2468. goto error;
  2469. }
  2470.     if ( strcpy (duplicatedStr, strToDup) == NULL)
  2471. {
  2472. free (duplicatedStr);
  2473. duplicatedStr = NULL;
  2474. }
  2475. error:
  2476.     return (duplicatedStr);
  2477.     }
  2478. #endif /* ! HOST */
  2479. /******************************************************************************
  2480. *
  2481. * wtxToolIdGet - return the tool identifier of the current tool
  2482. *
  2483. * This function returns the tool identifier associated with the given
  2484. * handle <hWtx>.
  2485. *
  2486. * RETURNS: The tool identifier or WTX_ERROR on error.
  2487. */
  2488. UINT32 wtxToolIdGet
  2489.     (
  2490.     HWTX hWtx /* WTX API handle */
  2491.     )
  2492.     {
  2493.     WTX_CHECK_CONNECTED (hWtx, 0);
  2494.     if (hWtx->pToolDesc != NULL)
  2495. return (hWtx->pToolDesc->id);
  2496.     else
  2497. return (WTX_ERROR);
  2498.     }
  2499. /*******************************************************************************
  2500. *
  2501. * wtxMemDisassemble - get disassembled instructions matching the given address
  2502. *
  2503. * This routine gets a list of disassembled instructions matching given address.
  2504. * <startAddr> indicates where to begin disassembly, while <nInst> fixes the
  2505. * number of instructions to disassemble.
  2506. *
  2507. * If <endAddr> is set, <nInst> has no matter, and only instructions between
  2508. * <startAddr> and <endAddr> are returned.
  2509. *
  2510. * Formatting options are <printAddr> to print instruction's address, 
  2511. * <printOpcodes> to print instruction's opcodes, and <hexAddr> to turn off the
  2512. * "symbolic + offset" address representation.
  2513. *
  2514. * The returned structure is a WTX_DASM_INST_LIST described below :
  2515. *
  2516. * EXPAND ../../../include/wtxmsg.h WTX_DASM_INST_LIST
  2517. *
  2518. * Each disassembled instruction has the following format :
  2519. *
  2520. * .CS
  2521. *   {<symbolName>} <size> {<address>} {<opcodes>} {<disassembledInstruction>}
  2522. * .CE
  2523. *
  2524. * The <symbolname> value is set to the symbol name corresponding to the current
  2525. * address, or to {} if no symbol name matches current instruction address.
  2526. *
  2527. * <size> represents the instruction size in bytes of memory
  2528. *
  2529. * <address> field is set only if `prependAddress' is set to TRUE. Else an empty
  2530. * list member is returned : {}
  2531. *
  2532. * <opcodes> of disassembled instructions are returned if the `prependOpcode',
  2533. * else an empty list member is returned : {}.
  2534. *
  2535. * The <disassembledInstruction> member is also quoted into curled braces to
  2536. * be easier to reach. The disassembled instruction contains the instruction
  2537. * mnemonic and adress, registers, ... as displayed by the board disassembler.
  2538. *
  2539. * NOTE :
  2540. * All the fields are always returned, even if empty, so a disassembled
  2541. * instruction always have the same number of members whatever are the options.
  2542. *
  2543. * NOTE : The instruction list allocated by wtxMemDisassemble should be freed by
  2544. * caller with wtxResultFree().
  2545. *
  2546. * RETURNS: A pointer to a list of disassembled instructions or NULL on error.
  2547. *
  2548. * EXAMPLES:
  2549. *
  2550. * Getting disassembled instuctions from address 12345 to address 15432, with
  2551. * instruction's address and instruction's opcode prepended :
  2552. *
  2553. * .CS
  2554. *   startAddress = 12345; /@ first instruction's address         @/
  2555. *   endAddress = 15432; /@ last instruction's address          @/
  2556. *   nInst = 0; /@ unhandled when endAddress is set    @/
  2557. *   prependAddress = TRUE; /@ instruction's address prepended     @/
  2558. *   prependOpcode = TRUE; /@ opcodes joined to instruction       @/
  2559. *   hexAddr = FALSE; /@ "symbolic + offset" mode turned on  @/
  2560. *
  2561. *   pWtxDasmInstList = wtxMemDisassemble (hWtx, startAddress, nInst, endAddress,
  2562. *                                         prependAddress, prependOpcode,
  2563. *                                         hexAddr);
  2564. *   ...
  2565. *
  2566. *   wtxResultFree (hWtx, pWtxDasmInstList);
  2567. * .CE
  2568. *
  2569. * Getting 25 instructions, starting from address 54321. Address in disassembled
  2570. * instruction are only hexadecimal (not represented by a symbol name + offset).
  2571. * No instruction's addresses, no opcodes.
  2572. *
  2573. * .CS
  2574. *   startAddress = 54321; /@ first instruction's address         @/
  2575. *   endAddress = 0; /@ get a known number of instructions  @/
  2576. *   nInst = 25; /@ get 25 disassembled instructions    @/
  2577. *   prependAddress = FALSE; /@ don't join addresses                @/
  2578. *   prependOpcode = FALSE; /@ don't join opcodes                  @/
  2579. *   hexAddr = TRUE; /@ "symbolic + offset" mode turned off @/
  2580. *
  2581. *   pWtxDasmInstList = wtxMemDisassemble (hWtx, startAddress, nInst, endAddress,
  2582. *                                         prependAddress, prependOpcode,
  2583. *                                         hexAddr);
  2584. *   ...
  2585. *
  2586. *   wtxResultFree (hWtx, pWtxDasmInstList);
  2587. * .CE
  2588. *
  2589. * SEE ALSO: WTX_MEM_DISASSEMBLE, wtxSymListGet(), wtxResultFree().
  2590. */
  2591. WTX_DASM_INST_LIST * wtxMemDisassemble 
  2592.     (
  2593.     HWTX hWtx, /* WTX API handle                     */
  2594.     TGT_ADDR_T startAddr, /* Inst address to match              */
  2595.     UINT32 nInst, /* number of instructions to get      */
  2596.     TGT_ADDR_T endAddr, /* Last address to match              */
  2597.     BOOL32 printAddr, /* if instruction's address appended  */
  2598.     BOOL32 printOpcodes, /* if instruction's opcodes appended  */
  2599.     BOOL32 hexAddr /* for hex  adress representation     */
  2600.     )
  2601.     {
  2602.     WTX_MSG_DASM_DESC in; /* disassembling parameters   */
  2603.     WTX_MSG_DASM_INST_LIST *  pOut; /* disassembled message       */
  2604.     WTX_MSG_DASM_INST_LIST out; /* local disassembled message */
  2605.     WTX_ERROR_T callStat; /* error message              */
  2606.     UINT32 listSize = 0; /* list size in bytes         */
  2607.     char * instList = NULL;/* list of instructions       */
  2608.     BOOL32 firstExchange; /* first exchange indicator   */
  2609.     /* check for connection */
  2610.     WTX_CHECK_CONNECTED (hWtx, NULL);
  2611.     pOut = (WTX_MSG_DASM_INST_LIST *)calloc (1, sizeof(WTX_MSG_DASM_INST_LIST));
  2612.     if (pOut == NULL)
  2613. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  2614.     /* initialize disassembling parameters */
  2615.     memset (&in, 0, sizeof (in));
  2616.     in.wtxCore.objId = hWtx->msgToolId.wtxCore.objId;
  2617.     in.startAddr = startAddr;
  2618.     in.endAddr = endAddr;
  2619.     if ((endAddr == 0) && (nInst == 0))
  2620. in.nInst = N_DASM_INST_DEFAULT;
  2621.     else
  2622. in.nInst = nInst;
  2623.     in.printAddr = printAddr;
  2624.     in.printOpcodes = printOpcodes;
  2625.     in.hexAddr = hexAddr;
  2626.     in.giveMeNext = FALSE;
  2627.     firstExchange = TRUE;
  2628.     do
  2629. {
  2630. memset (&out, 0, sizeof (out));
  2631. /* call for target server routines */
  2632. callStat = exchange (hWtx, WTX_MEM_DISASSEMBLE, &in, &out);
  2633. if (callStat != WTX_ERR_NONE)
  2634.     {
  2635.     if (instList != NULL)
  2636. free (instList);
  2637.             free (pOut);
  2638.     WTX_ERROR_RETURN (hWtx, callStat, NULL);
  2639.     }
  2640.         /* copy first part of message */
  2641.        
  2642.         if (firstExchange)
  2643.     {
  2644.     listSize = out.instList.listSize;
  2645.     instList = (char *) calloc (listSize + 1, sizeof (char));
  2646.             firstExchange = FALSE;
  2647.             }
  2648.         strcat (instList, out.instList.pInst);
  2649.         /* ensure next message is to come */
  2650. in.giveMeNext = out.moreToCome;
  2651. wtxExchangeFree (hWtx->server, WTX_MEM_DISASSEMBLE, &out);
  2652. } while (in.giveMeNext);
  2653.     /* Set up pOut so that it can be freed by wtxResultFree() */
  2654.     pOut->wtxCore.protVersion = (UINT32) pOut;
  2655.     pOut->wtxCore.objId = WTX_MEM_DISASSEMBLE;
  2656.  
  2657.     /* set the disassembled instructions data */
  2658.     pOut->instList.pInst = (char *)calloc (listSize + 1, sizeof (char));
  2659.     strcpy (pOut->instList.pInst, instList);
  2660.     pOut->instList.nextInst = out.instList.nextInst;
  2661.     pOut->instList.listSize = out.instList.listSize;
  2662.     free (instList);
  2663.     /* add pointer to the wtxResultFree() list */
  2664.     if (wtxFreeAdd (hWtx, (void *) &pOut->instList,
  2665.     (FUNCPTR) wtxMemDisassembleFree, pOut, 0, NULL,
  2666.     WTX_SVR_NONE) != WTX_OK)
  2667. {
  2668. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  2669. }
  2670.     return (&pOut->instList);
  2671.     }
  2672. /*******************************************************************************
  2673. *
  2674. * wtxMemDisassembleFree - frees memory allocated by wtxMemDisassemble()
  2675. *
  2676. * As wtxMemDisasssmble() routine is not stateless, it allocates memory, and the
  2677. * RPC buffers are not holding the disassembled lists. This routine frees the
  2678. * memory allocated by the (sucessive ?) cals to wtxMemDisassemble without
  2679. * calling to the RPC stuff.
  2680. *
  2681. * RETURNS: WTX_OK or WTX_ERROR if free operation failed
  2682. *
  2683. * NOMANUAL
  2684. */
  2685. LOCAL STATUS wtxMemDisassembleFree
  2686.     (
  2687.     WTX_DASM_INST_LIST * pDasmInstList /* disassembled list to free */
  2688.     )
  2689.     {
  2690.     if (pDasmInstList->pInst != NULL)
  2691.  free (pDasmInstList->pInst);
  2692.     return (WTX_OK);
  2693.     }
  2694. #ifdef HOST
  2695. /*******************************************************************************
  2696. *
  2697. * wtxAsyncEventGet - get an event from the asynchronous event list
  2698. *
  2699. * When the asynchronous event notification is started without user defined
  2700. * function, the only way to get events is to use wtxAsyncEventGet.
  2701. * This routine polls the asynchronous event list for any events sent
  2702. * to this client tool. It only returns one event at a time.  The event
  2703. * descriptor returned is a string containing the primary event data,
  2704. * a length count of additional binary data and a pointer to the
  2705. * additional data. The memory allocated for the event-descriptor
  2706. * result must be freed by the user using wtxAsyncResultFree().
  2707. *
  2708. * NOTE: If the asynchronous event notification is started with a user defined
  2709. * function, then wtxAsyncEventGet() will always return a NULL pointer.
  2710. *
  2711. * EXPAND ../../../include/wtxmsg.h WTX_EVENT_DESC
  2712. *
  2713. * RETURN: A pointer to the descriptor for the event received or NULL.
  2714. *
  2715. * SEE ALSO: wtxAsyncNotifyEnable(), wtxAsyncNotifyDisable(), wtxAsyncResultFree(), wtxEventGet()
  2716. */
  2717. WTX_EVENT_DESC * wtxAsyncEventGet
  2718.     (
  2719.     HWTX hWtx /* WTX API handle */
  2720.     )
  2721.     {
  2722.     WTX_EVENT_DESC * pEventList = NULL;
  2723.     /* check for connection */
  2724.     WTX_CHECK_CONNECTED (hWtx, NULL);
  2725.     pEventList = (wtxAsyncEventDescGet(hWtx->asyncHandle));
  2726.     /* XXX - pai:
  2727.      * Note that if this mod is accepted, it changes the API
  2728.      * and breaks code which uses this routine as documented
  2729.      * in the comment header.  Expect runtime errors if the
  2730.      * following mod is compiled in.
  2731.      *
  2732.      * /@ add pointer to the wtxResultFree() list @/
  2733.      *
  2734.      * if (pEventList != NULL)
  2735.      *     {
  2736.      *     if (wtxFreeAdd (hWtx, (void *) pEventList,
  2737.      *                    (FUNCPTR) wtxAsyncResultFree_2, NULL, 0, NULL,
  2738.      *                    WTX_SVR_NONE) != WTX_OK)
  2739.      *         {
  2740.      *         WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  2741.      *         }
  2742.      *     }
  2743.      */
  2744.     return (pEventList);
  2745.     }
  2746. /*******************************************************************************
  2747. *
  2748. * wtxAsyncResultFree - free memory used by a wtxAsyncEventGet() call result
  2749. *
  2750. * This routine frees the memory allocated for the result of a
  2751. * wtxAsyncEventGet() call. eventDesc must point to the WTX_EVENT_DESC
  2752. * structure that was returned by wtxAsyncEventGet() call.
  2753. *
  2754. * NOTE: result should be freed calling wtxResultFree() routine
  2755. *
  2756. * RETURNS: WTX_OK
  2757. *
  2758. * SEE ALSO: wtxAsyncEventGet(), wtxAsyncNotifyEnable(), wtxAsyncNotifyDisable()
  2759. */
  2760.  
  2761. STATUS wtxAsyncResultFree
  2762.     (
  2763.     HWTX hWtx,
  2764.     WTX_EVENT_DESC * eventDesc /* pointer to structure to free */
  2765.     )
  2766.     {
  2767.     /* if eventDesc is NULL: nothing to free */
  2768.     if (eventDesc != NULL)
  2769. {
  2770. /* is there additional data to free */
  2771. if (eventDesc->addlDataLen != 0)
  2772.     free (eventDesc->addlData);
  2773. free (eventDesc->event);
  2774. free (eventDesc);
  2775. }
  2776.     return (WTX_OK);
  2777.     }
  2778. #if 0
  2779. /* XXX : fle : for SRP#67326 */
  2780. /*******************************************************************************
  2781. *
  2782. * wtxAsyncResultFree_2 - free memory used by a wtxAsyncEventGet() call result
  2783. *
  2784. * This routine is the routine that should be used by wtxResultFree(). It is
  2785. * different from the wtxAsyncResultFree which was also using an hWtx WTX
  2786. * handler.
  2787. *
  2788. * This routine frees the memory allocated for the result of a
  2789. * wtxAsyncEventGet() call. eventDesc must point to the WTX_EVENT_DESC
  2790. * structure that was returned by wtxAsyncEventGet() call.
  2791. *
  2792. * RETURNS: WTX_OK
  2793. *
  2794. * SEE ALSO: wtxAsyncEventGet(), wtxAsyncNotifyEnable(), wtxAsyncNotifyDisable()
  2795. * wtxResultFree()
  2796. *
  2797. * NOMANUAL
  2798. */
  2799.  
  2800. LOCAL STATUS wtxAsyncResultFree_2
  2801.     (
  2802.     WTX_EVENT_DESC * eventDesc /* pointer to structure to free */
  2803.     )
  2804.     {
  2805.     /* if eventDesc is NULL: nothing to free */
  2806.     if (eventDesc != NULL)
  2807. {
  2808. /* is there additional data to free */
  2809. if (eventDesc->addlDataLen != 0)
  2810.     free (eventDesc->addlData);
  2811. free (eventDesc->event);
  2812. free (eventDesc);
  2813. }
  2814.     return (WTX_OK);
  2815.     }
  2816. #endif /* 0 */
  2817. #endif /* HOST */
  2818. #ifdef HOST
  2819. /*******************************************************************************
  2820. *
  2821. * wtxDefaultDemanglerStyle - appropriate demangling style for target tool
  2822. *
  2823. * This routine returns an appropriate demangling style based on the current 
  2824. * target tool. For example if the kernel was built with the Diab toolchain,
  2825. * the routine returns DMGL_STYLE_DIAB. If the target is not connected,
  2826. * or the tool is not recognized, the routine defaults to returning the GNU 
  2827. * demangling style (DMGL_STYLE_GNU).
  2828. *
  2829. * Typically this routine will be used in conjunction with the demangle
  2830. * function:
  2831. *
  2832. * .CS
  2833. *   dmgl = demangle(symbolName, wtxDefaultDemanglerStyle(hWtx), demangleMode);
  2834. * .CE
  2835. * RETURNS: a DEMANGLER_STYLE
  2836. *
  2837. * ERRORS: N/A
  2838. *
  2839. * INCLUDE FILES: demangle.h
  2840. */
  2841. DEMANGLER_STYLE wtxDefaultDemanglerStyle
  2842.     (
  2843.     HWTX hWtx
  2844.     )
  2845.     {
  2846.     const char * tool = wtxTargetToolFamilyGet(hWtx);
  2847.     if (tool)
  2848.       {
  2849. if (strcmp(tool, "diab") == 0)
  2850.   return DMGL_STYLE_DIAB;
  2851. /* add additional tools here */
  2852.       }
  2853.     /* default to GNU */
  2854.     return DMGL_STYLE_GNU;
  2855.     }
  2856. /*******************************************************************************
  2857. *
  2858. * wtxTargetToolFamilyGet - extract the tool family (e.g. "gnu" or "diab")
  2859. *
  2860. * RETURNS: a string
  2861. *
  2862. * ERRORS: N/A
  2863. *
  2864. */
  2865. const char * wtxTargetToolFamilyGet
  2866.     (
  2867.     HWTX hWtx                           /* WTX API handle */
  2868.     )
  2869.     {
  2870.     static const char * toolFamilies[] = 
  2871.         {
  2872. "gnu",
  2873. "diab"
  2874. };
  2875.     int i;        /* index into toolFamilies */
  2876.     const char * result = "gnu";
  2877.     const char * tool = wtxTargetToolNameGet(hWtx);
  2878.     /* fixme; we should query the target for TOOL_FAMILY
  2879.      * rather than relying on the tool being "gnu" or "diab" */
  2880.     for (i = 0; i != sizeof(toolFamilies) / sizeof(const char *); ++i)
  2881.         {
  2882.   if (strstr(tool, toolFamilies[i]))
  2883.       {
  2884.               result = toolFamilies[i];
  2885.       break;
  2886.       }
  2887.         }
  2888.     return result;
  2889. }
  2890. #endif /* HOST */