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

VxWorks

开发平台:

C/C++

  1. /* wtx.c - WTX C library */
  2. /* Copyright 1994-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 06k,08mar02,c_c  Reworked license management.
  8. 06j,04mar02,fle  SPR#73615 fix : wtxResultFree () may free already freed
  9.                  memory
  10. 06i,17dec01,c_c  Fixed LM file descriptor leak problem.
  11. 06h,04dec01,sn   Added wtxDefaultDemanglerStyle
  12. 06g,05dec01,fle  added Object directory retirving to wtxCpuInfoGet ()
  13. 06f,18oct01,c_c  Updated feature name in license check.
  14. 06e,11oct01,c_c  Added license bypass.
  15. 06d,03oct01,c_c  Added license check. Added wtxTargetToolNameGet API.
  16. 06c,28sep01,fle  Fixed wtxResultFree () to not return WTX_ERROR
  17. 06b,15jun01,pch  Add new WTX_TS_INFO_GET_V2 service to handle WTX_RT_INFO
  18.                  change (from BOOL32 hasFpp to UINT32 hasCoprocessor) without
  19.                  breaking existing clients.
  20. 06a,30may01,kab  Fixed wtxTgtHasDsp comment
  21. 05z,09may01,dtr  Changing wtxTgtHasFpp , altivec for new format introduced by
  22.  hasCoprocessor.  Also adding in wtxTgtHasDsp.
  23. 05y,21mar01,dtr  Updating comments in code.
  24. 05x,06feb01,dtr  Adding check for altivec support.
  25. 05w,18jan01,dtr  Adding altivec register support.
  26. 05v,24nov99,fle  SPR#28684 fix : made wtxToolAttach() update the target server
  27.  key if the first adapter is not the good one
  28. 05u,22jun99,fle  made wtx compile on target side
  29. 05t,02apr99,fle  fixed a problem with wtxServiceAdd that was always allocating
  30.  wdb service description even if all the wdb parameters were
  31.  set to NULL  SPR 67367
  32. 05s,31mar99,fle  doc : specified that wtxFileOpen does not support RDONLY flag
  33.  under WIN32
  34. 05r,23feb99,c_c  Implemented an API to get the target IP address (SPR #25044).
  35. 05q,11feb99,c_c  Authorize accesses to target's address 0 (SPR #25049).
  36. 05p,18jan99,c_c  documented WTX_CONSOLE_LINES setting (SPR 6209).
  37. 05o,08jan99,fle  doc : added REGISTRY_NAME_CLASH to wtxRegister possible
  38.  errors
  39. 05n,01dec98,pcn  SPR #22867: complete the fix: in wtxObjModuleLoad(), copy the
  40.  address fields of the input parameter in the protocol input
  41.  value.
  42. 05m,30nov98,pcn  Moved a badly placed #ifdef HOST for the symbol table
  43.  synchronization (SPR #22867).
  44. 05l,05nov98,fle  doc : made wtxLogging been linked correctly
  45. 05k,02nov98,c_c  Modified WTX_ERR_SVR_EINVAL error explanation for Load
  46.  requests.
  47. 05j,16sep98,fle  Modified wtxMemDisassemble doc since its new output format
  48. 05i,22sep98,l_k  Removed wtxFindExecutable.
  49. 05h,22sep98,pcn  Change the returned error in wtxObjModuleLoadProgressReport.
  50. 05g,18sep98,l_k  Implement wtxFindExecutable.
  51. 05f,18sep98,pcn  Implement wtxObjModuleInfoAndPathGet.
  52. 05e,18sep98,pcn  Removed memory leak when asynchronous load is used.
  53. 05d,04sep98,pcn  Added WTX_EVENT_EVTPT_ADDED, WTX_EVENT_EVTPT_DELETED.
  54. 05c,10sep98,pcn  Remove wtxResultFree from wtxObjModuleLoadStart and
  55.  wtxObjModuleLoadProgressReport.
  56. 05b,18aug98,pcn  Use WTX_MSG_EVTPT_LIST_2 and doc updated.
  57. 05a,20jul98,pcn  wtxObjModuleLoadProgressReport doc updated.
  58. 04z,20jul98,pcn  Added evtptNum and toolId in the wtxEventpointListGet return
  59.  list.
  60. 04y,10jul98,fle  removed wpwrLog calls in wtxCpuInfoGet function
  61. 04x,09jul98,fle  re-added wtxCommandSend
  62. 04w,08jul98,pcn  Added undefined symbols list in
  63.  wtxObjModuleLoadProgressReport result.
  64. 04v,06jul98,pcn  Removed wtxObjModuleUndefSymAdd from API.
  65. 04u,02jul98,pcn  Removed memory leak from wtxObjModuleLoadStart and
  66.  wtxObjModuleLoadProgressReport.
  67. 04t,19jun98,pcn  Added wtxObjModuleLoadStart, wtxObjModuleLoadProgressReport,
  68.  wtxObjModuleLoadCancel.
  69. 04s,11jun98,pcn  Added an input parameter at wtxEventListGet.
  70. 04r,09jun98,jmp  added wtxAsyncResultFree to free memory used by a
  71.  wtxAsyncEventGet() call result, imported wtxAsyncEventGet()
  72.  from wtxAsync.c.
  73. 04q,03jun98,pcn  Added 2 requests: wtxSymListByModuleNameGet and
  74.  wtxSymListByModuleIdGet.
  75. 04p,25may98,pcn  Changed wtxTsLock in wtxTsTimedLock, wtxEventpointList_2 in
  76.  wtxEventpointListGet, wtxObjModuleUnload_2 in
  77.  wtxObjModuleUnloadByName.
  78. 04o,20may98,jmp  modified wtxAsyncInitialize() call, now if no user defined
  79.  function is given then received events are just stored in the
  80.  asynchronous event list, those events can be get using
  81.  wtxAsyncEventGet().
  82. 04n,19may98,rhp  doc: corrected wtxLogging example (supplied missing .CE)
  83. 04m,07may98,pcn  Re-added WTX_TS_KILLED.
  84. 04l,30apr98,dbt  added wtxHwBreakpointAdd and wtxEventpointAdd.
  85. 04k,28apr98,pcn  Removed wtxCommandSend from C API.
  86. 04j,24apr98,pcn  Removed wtxEventGetThread.
  87. 04i,23apr98,fle  added CPU name retrieving to wtxCpuInfoGet
  88. 04h,23apr98,fle  added ifdef HOST around wtxCpuInfoGet
  89.  + added warning for HOST defined functions
  90. 04g,08apr98,fle  doc: updated and added examples to wtxMemDisassemble
  91.  + added wtxCpuInfoGet function.
  92. 04f,02apr98,pcn  WTX 2: added new error codes.
  93. 04e,31mar98,fle  made wtxToolAttach() always call for wtxInfo()
  94.  + made some history cleanup
  95. 04d,27mar98,pcn  Moved #ifdef HOST after functions parameters in order to
  96.  generate manual.
  97. 04c,26mar98,pcn  Changed strdup in strcpy.
  98. 04b,26mar98,pcn  WTX 2: Added an event filter for WTX logging. Added new
  99.  behavior of wtxObjModuleLoad_2: a file can be opened locally
  100.  or by the target server.
  101. 04a,24mar98,dbt  added wtxContextStatusGet.
  102. 03z,17mar98,pcn  WTX 2: wtxObjModuleChecksum: set filename to
  103.  WTX_ALL_MODULE_CHECK if moduleId is set to WTX_ALL_MODULE_ID.
  104. 03y,09mar98,pcn  WTX 2: added a test of <fileName> in wtxLogging.
  105. 03x,06mar98,pcn  WTX 2: changed the width test in wtxMemWidthRead/Write.
  106. 03w,05mar98,fle  got rid of wtxRegistryPing() routine
  107. 03v,03mar98,pcn  WTX 2: added fcntl.h for file constants.
  108. 03u,03mar98,pcn  Added #ifdef for HOST side.
  109. 03t,02mar98,pcn  WTX 2: added wtxAsyncNotifyEnable, wtxCacheTextUpdate,
  110.  wtxEventListGet, wtxEventpointList_2, wtxLogging,
  111.  wtxMemWidthRead, wtxMemWidthWrite, wtxObjModuleChecksum,
  112.  wtxObjModuleLoad_2, wtxObjModuleUnload_2,
  113.  wtxUnregisterForEvent, wtxThreadSigHandle. Changed
  114.  WTX_EVT_BREAKPOINT in WTX_EVT_HW_BP, wtxEventAdd,
  115.  wtxResultFree, wtxObjModuleUnload, wtxEventToStrType,
  116.  wtxTargetRtTypeGet, wtxTargetCpuTypeGet.
  117. 03s,29jan98,fle  made wtxToolAttach return hWtx->errCode when unable to attch
  118.  tool (due to implementation of wtxregdSvrPing())
  119.  + added wtxRegistryPing()
  120. 03r,28jan98,c_c  Packed all wtxEvtxxxStringGet routines into one.
  121. 03q,29aug97,fle  Adding the WTX_MEM_DISASSEMBLE service
  122.  + Updating NOTE written after the "forward declarations"
  123.  + made wtxSymListGet() usable by the WTX TCL API
  124.  + moved tsSymListFree() from tgtsvr/server/tssymlk.c in
  125.    symLisFree()
  126. 03p,06dec96,dgp  doc: correct spelling
  127. 03o,21nov96,dgp  doc: change Object-Module, correct italic and bold formatting
  128. 03n,20nov96,dgp  doc: correct WTX_THROW() to WTX_THROW
  129. 03m,18nov96,dgp  doc: final changes, wtxGopherEval, wtxErrExceptionFunc, 
  130.       wtxSymFind
  131. 03l,12nov96,c_s  remove use of strerror on sun4-sunos4
  132. 03k,11nov96,dgp  doc: "final" formatting for API Guide
  133. 03j,30sep96,elp  put in share, adapted to be compiled on target side
  134.  (added wtxSymAddWithGroup() and wtxObjModuleUndefSymAdd()).
  135. 03i,19sep96,p_m  fixed syntax error in wtxMemAlign() introduced by last
  136.  doc modification
  137. 03h,17sep96,dgp  doc: API Guide updates, particularly wtxGopherEval,
  138.  wtxObjectModuleLoad
  139. 03g,05sep96,p_m  Documented wtxToolIdGet() and wtxServiceAdd()
  140. 03f,05sep96,elp  changed val in wtxMemSet() from UINT8 to UINT32 (SPR# 6894).
  141. 03e,02sep96,jmp  added wtxToolIdGet(),
  142.  added WTX RPC service number argument to wtxServiceAdd().
  143. 03d,30aug96,elp  Changed wpwrVersionGet() into wtxTsVersionGet().
  144. 03c,26jul96,pad  Changed order of include files (AIX port).
  145. 03b,26jul96,dbt  fixed a memory leak. Added serverDescFree to clean servor
  146.  descriptor. 
  147. 03a,15jul96,dbt  supressed call to wtxExchangeDelete() and 
  148.  wtxExchangeTerminate() in exchange() in case of server
  149.  exchange handle (SPR #6862).
  150. 01a,24dec94,jcf  written.
  151. */
  152. /*
  153. DESCRIPTION
  154. This module implements a C-language transport-neutral interface to the 
  155. WTX messaging protocol. 
  156. A tool must always call wtxInitialize() to initialize a handle that is
  157. used in all further WTX calls. The tool can then attach to a target
  158. server using a call to wtxToolAttach(). Each WTX handle can only be
  159. connected to one server at a time.  After a successful call of
  160. wtxToolAttach(), the handle is considered bound to the specified target
  161. server until a call of wtxToolDetach() is made; then 
  162. the handle can be attached to a new target server.  When the
  163. handle is no longer required, call wtxTerminate() to release any
  164. internal storage used by the handle. The handle must not be used after
  165. wtxTerminate() has been called.
  166. .CS
  167. #include "wtx.h"
  168.     HWTX hWtx;
  169.     /@ initialize WTX session handle @/
  170.     if (wtxInitialize (&hWtx) != WTX_OK)
  171. return (WTX_ERROR);
  172.     /@ attach to Target Server named "soubirou" @/
  173.     if (wtxToolAttach (hWtx, "soubirou", "wtxApp") != WTX_OK)
  174. return (WTX_ERROR);
  175.     /@ register for events we want to hear about (all events here) @/
  176.     if (wtxRegisterForEvent (hWtx, ".*") != WTX_OK)
  177. {
  178. wtxToolDetach (hWtx);
  179. return (WTX_ERROR);
  180. }
  181.     /@ core of the WTX application @/
  182.    .
  183.    .
  184.    .
  185.    .
  186.     /@ detach form the Target Server @/
  187.     wtxToolDetach (hWtx);
  188.     /@ terminate WTX session @/
  189.     wtxTerminate (hWtx);
  190. .CE
  191. Most WTX calls return either a pointer value which is NULL on error or a
  192. STATUS value which is WTX_ERROR if an error occurs.  A descriptive string
  193. can be obtained for the last error that occurred by calling
  194. wtxErrMsgGet().
  195. Note that virtually all WTX calls can fail due to an error in the message
  196. transport layer used to carry out WTX requests.  Transport errors that
  197. are non-recoverable result in the tool being detached from the server
  198. and an error code of WTX_ERR_API_TOOL_DISCONNECTED. If a non-fatal
  199. error occurs, WTX_ERR_API_REQUEST_FAILED is set, except in the case of
  200. a timeout. In that case the error is WTX_ERR_API_REQUEST_TIMED_OUT. In
  201. the non-fatal cases, the call may be retried. In the fatal case, retrying the
  202. call results in the error WTX_ERR_API_NOT_CONNECTED.
  203. All API calls attempt to check the validity of the API handle provided.
  204. The error WTX_ERR_API_INVALID_HANDLE indicates a bad handle. Other
  205. pointer arguments are checked and WTX_ERR_API_INVALID_ARG indicates a
  206. bad argument value such as a NULL pointer.  API calls that require the
  207. handle to be connected to a target server generate the
  208. WTX_ERR_API_NOT_CONNECTED error if the handle is not connected.
  209. In addition to simple error return values, the C API allows error
  210. handlers to be installed on a per handle basis using
  211. wtxErrHandlerAdd().  If an error occurs, the last installed
  212. handler is called first. If it returns a TRUE value, then any
  213. previously installed handlers are called in reverse order, in other words,
  214. last installed, first called.  The C API includes macros that use the
  215. predefined error handler wtxErrExceptionFunc() to support C++ style
  216. exception catching.  Once an API handle has been initialized using
  217. wtxInitiliaze(), it can be used in the WTX_TRY macro to cause API
  218. errors to be treated like exceptions. When this is done, an API call
  219. that would normally return an error code actually causes a jump
  220. straight to the nearest 'catch' handler as specified using a WTX_CATCH
  221. or WTX_CATCH_ALL macro.  The previous example is shown below using this
  222. style of error handling.
  223. .CS
  224. #include "wtx.h"
  225.     HWTX hWtx;
  226.     /@ initialize WTX session handle @/
  227.     if (wtxInitialize (&hWtx) != WTX_OK)
  228. return (WTX_ERROR);
  229.     /@ Start a block in which errors will be "caught" by a catch block @/
  230.     WTX_TRY (hWtx)
  231.         {
  232. /@ attach to Target Server named "soubirou" @/
  233.         wtxToolAttach (hWtx, "soubirou", "wtxApp");
  234. /@ register for events we want to hear about (all events here) @/
  235. wtxRegisterForEvent (hWtx, ".*");
  236. /@ core of the WTX application @/
  237.    .
  238.    .
  239.    .
  240.    .
  241. /@ detach form the Target Server @/
  242. wtxToolDetach (hWtx);
  243. }
  244.     /@ Catch a specific error, WTX_ERR_API_NOT_CONNECTED @/
  245.     WTX_CATCH (hWtx, WTX_ERR_API_NOT_CONNECTED)
  246.     {
  247.     fprintf (stderr, "Connection lost, exitingn");
  248.     wtxTerminate (hWtx);
  249.     exit (0);
  250.     }
  251.     /@ Catch any other errors in one handler and print error message @/
  252.     WTX_CATCH_ALL (hWtx)
  253. fprintf (stderr, "%sn", wtxErrMsgGet (hWtx));
  254.     /@ Finish the try block and resume normal error handling @/
  255.     WTX_TRY_END (hWtx);
  256.     /@
  257.      * Normal error handling is now restored - the WTX_TRY_END macro
  258.      * must be executed for this to occur.
  259.      @/
  260.      
  261.     /@ wtxTerminate() will also detach the tool if already attached @/
  262.     wtxTerminate (hWtx);
  263. .CE
  264. In certain circumstances, it may be useful to generate a user-defined
  265. error or to simulate an API error from within user code. This may be
  266. done using the WTX_THROW macro, which causes execution to jump to the
  267. nearest handler for the error thrown or to the nearest "catch all"
  268. handler.
  269. Many of the C API calls are very similar to the equivalent WTX
  270. protocol calls and the user may also refer to the appropriate section
  271. in the f2WTX ProtocolfP reference for further information.
  272. INCLUDE FILES: wtx.h
  273. */
  274. /*
  275. INTERNAL
  276. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  277. !                                                                             !
  278. !                                   WARNING                                   !
  279. !                                   -------                                   !
  280. !                                                                             !
  281. ! This file is to be compiled from both host and target side. When adding new !
  282. ! functions, please care if it is target oriented or not, and try to compile  !
  283. ! the target/src/wtx directory.                                               !
  284. !                                                                             !
  285. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  286. */
  287. /* includes */
  288. #include <string.h>
  289. #ifdef HOST
  290. #    include <stdlib.h>
  291. #    include <stdio.h>
  292. #    include <fcntl.h>
  293. #    ifndef WIN32
  294. # include <unistd.h>
  295. #    endif
  296. #    ifdef SUN4_SUNOS4
  297. extern int              sys_nerr;
  298. extern char *           sys_errlist;
  299. #    endif /* SUN4_SUNOS4 */
  300. #ifndef  _DEBUG
  301. #include "licmgt.h"
  302. #endif /* _DEBUG */
  303. #endif /* HOST */
  304. #include "private/wtxp.h" /* Private (and public) headers */
  305. #include "wtxexch.h"
  306. #if (! defined WIN32) && (defined HOST)
  307. #    include "win32ProfileLib.h"
  308. #endif /* WIN32 */
  309. /*
  310.  * These five include files are here because this implementation
  311.  * of the WTX API is based on RPC calls.  Full implementation of the 
  312.  * "exchange" layer would remove this transport dependency
  313.  */
  314. #include "wtxrpc.h" /* For handling wtxregd RPC key routines */
  315. #include "wtxxdr.h" /* For WTX XDR routines */
  316. #include <errno.h>
  317. #include <sys/stat.h>
  318. #include <arpa/inet.h> /* inet_ntoa */
  319. #ifdef HOST
  320. #    include <netdb.h> /* gethostbyname */
  321. #    include "wpwrutil.h"
  322. #    include "wtxAsync.h"
  323. #endif
  324. #include "sllLib.h" /* singly linked list library */
  325. #include "pathLib.h"
  326. /* defines */
  327. #define STREQ(a,b) (*(a) == *(b) ? !strcmp ((a), (b)) : 0)
  328. #define WTX_LOAD_BITMASK (WTX_LOAD_FROM_TARGET_SERVER | 
  329.  WTX_LOAD_ASYNCHRONOUSLY | 
  330.  WTX_LOAD_PROGRESS_REPORT)
  331. /* typedefs */
  332. /*
  333.  * Special dummy message type for anonymous casting and calculating field
  334.  * alignments in wtxResultFree() 
  335.  */
  336. typedef struct wtx_msg_dummy
  337.     {
  338.     WTX_CORE wtxCore;
  339.     UINT32 field;
  340.     } WTX_MSG_DUMMY;
  341. typedef struct wtxFreeNode /* wtxResultFree parameters          */
  342.     {
  343.     SL_NODE node; /* node in list                      */
  344.     void * pToFree; /* pointer to free                   */
  345.     FUNCPTR pFreeFunc; /* function that should free pointer */
  346.     void * pMsgToFree; /* WTX message containing pToFree    */
  347.     WTX_REQUEST svcNum; /* number of server service to free  */
  348.     WTX_XID server; /* RPC server to connect to          */
  349.     WTX_SVR_TYPE svrType; /* is it a tgtsvr or registry server */
  350.     } WTX_FREE_NODE;
  351. /* See wtx.h and wtxp.h */
  352. /* locals */
  353. static const char * WTX_EVT_NONE = "NONE";
  354. static const char * WTX_EVT_OBJ_LOADED = "OBJ_LOADED";
  355. static const char * WTX_EVT_CTX_EXIT = "CTX_EXIT";
  356. static const char * WTX_EVT_CTX_START = "CTX_START";
  357. static const char * WTX_EVT_TEXT_ACCESS = "TEXT_ACCESS";
  358. static const char * WTX_EVT_OBJ_UNLOADED = "OBJ_UNLOADED";
  359. static const char * WTX_EVT_TGT_RESET = "TGT_RESET";
  360. static const char * WTX_EVT_SYM_ADDED = "SYM_ADDED";
  361. static const char * WTX_EVT_SYM_REMOVED = "SYM_REMOVED";
  362. static const char * WTX_EVT_EXCEPTION = "EXCEPTION";
  363. static const char * WTX_EVT_VIO_WRITE = "VIO_WRITE";
  364. static const char * WTX_EVT_TOOL_ATTACH = "TOOL_ATTACH";
  365. static const char * WTX_EVT_TOOL_DETACH = "TOOL_DETACH";
  366. static const char * WTX_EVT_TOOL_MSG = "TOOL_MSG";
  367. static const char * WTX_EVT_DATA_ACCESS = "DATA_ACCESS";
  368. static const char * WTX_EVT_CALL_RETURN = "CALL_RETURN";
  369. static const char * WTX_EVT_USER = "USER";
  370. static const char * WTX_EVT_HW_BP           = "HW_BP";
  371. static const char * WTX_EVT_OTHER = "OTHER";
  372. static const char * WTX_EVT_INVALID = "INVALID";
  373. static const char * WTX_EVT_UNKNOWN = "UNKNOWN";
  374. static const char * WTX_EVT_TS_KILLED = "TS_KILLED";
  375. static const char * WTX_EVT_EVTPT_ADDED = "EVTPT_ADDED";
  376. static const char * WTX_EVT_EVTPT_DELETED = "EVTPT_DELETED";
  377. #if !defined (_DEBUG) && defined (NO_LICENSE)
  378. static BOOL envVarChecked  = FALSE; /* do we checked NO_LICENSE env. var? */
  379. #endif /* NO_LICENSE */
  380. #if defined (HOST) && !defined (_DEBUG)
  381. static BOOL licenseCheck   = TRUE; /* do check for license ?             */
  382. LOCAL int gotLicense = 0; /* Do we own a license ?              */
  383. #endif /* HOST */
  384. /* XXX : fle : put in comment as it was not used anywhere */
  385. /* static const char * WTX_EVT_CALL_GOT_EXC= "CALL_GOT_EXC"; */
  386. /* Externals */
  387. /* globals */
  388. static BOOL internalLoadCall; /* states if it is an internal load */
  389. /* forward declarations */
  390. LOCAL WTX_ERROR_T exchange
  391.     (
  392.     HWTX hWtx,
  393.     UINT32 svcNum,
  394.     void * pIn,
  395.     void * pOut
  396.     );
  397. LOCAL WTX_ERROR_T registryConnect /* establish a connection with regd */
  398.     (
  399.     HWTX hWtx /* WTX session handler              */
  400.     );
  401. LOCAL void registryDisconnect
  402.     (
  403.     HWTX hWtx
  404.     );
  405. STATUS wtxFreeAdd /* adds elt in wtxResultFree() list  */
  406.     (
  407.     HWTX hWtx, /* wtx session handler               */
  408.     void * pToFree, /* pointer to be freed               */
  409.     FUNCPTR pFreeFunc, /* routine to use to free pToFree    */
  410.     void * pMsgToFree, /* message to free if needed         */
  411.     WTX_REQUEST svcNum, /* service num to free if needed     */
  412.     WTX_XID server, /* RPC server to connect to          */
  413.     WTX_SVR_TYPE svrType /* connected server type             */
  414.     );
  415. LOCAL STATUS wtxMemDisassembleFree /* free disassembled insts.  */
  416.     (
  417.     WTX_DASM_INST_LIST * pDasmInstList /* disassembled list to free */
  418.     );
  419. #if 0
  420. /* XXX : fle : for SRP#67326 */
  421. #ifdef HOST
  422. LOCAL STATUS wtxObjModuleLoadProgressReportFree /* free a status report */
  423.     (
  424.     HWTX hWtx, /* WTX session handler  */
  425.     WTX_LOAD_REPORT_INFO * pToFree /* pointer to free      */
  426.     );
  427. #endif /* HOST */
  428. #endif /* 0 */
  429. LOCAL BOOL wtxResultFreeListTerminate /* empty the wtxResultFree ptrs list */
  430.     (
  431.     WTX_FREE_NODE * pWtxFreeNode, /* element in singaly linked list    */
  432.     HWTX * hWtx /* WTX session handler               */
  433.     );
  434. LOCAL BOOL wtxResultFreeServerListTerminate /* empty tgtsvr pointers list */
  435.     (
  436.     WTX_FREE_NODE * pWtxFreeNode, /* element in singaly linked list     */
  437.     HWTX * hWtx /* WTX session handler                */
  438.     );
  439. #if 0
  440. /* XXX : fle : for SRP#67326 */
  441. #ifdef HOST
  442. LOCAL STATUS wtxAsyncResultFree_2 /* frees async event list       */
  443.     (
  444.     WTX_EVENT_DESC * eventDesc /* pointer to structure to free */
  445.     );
  446. #endif /* HOST */
  447. #endif /* 0 */
  448. LOCAL BOOL wtxPtrMatch /* matches a pointer value        */
  449.     (
  450.     WTX_FREE_NODE * pWtxFreeNode, /* element in singaly linked list */
  451.     void * pToMatch /* pointer value to find          */
  452.     );
  453. LOCAL void wtxDescFree /* free a WTX_DESC structure */
  454.     (
  455.     WTX_DESC * pDescToFree /* WTX_DESC pointer to free  */
  456.     );
  457. LOCAL WTX_DESC * wtxDescDuplicate /* duplicates a WTX_DESC       */
  458.     (
  459.     HWTX hWtx, /* current WTX session handler */
  460.     WTX_DESC * pDesc /* WTX_DESC to duplicate       */
  461.     );
  462. LOCAL void toolCleanup /* cleanups when a tool detaches */
  463.     (
  464.     HWTX hWtx /* WTX API handler */
  465.     );
  466. LOCAL void serverDescFree /* frees server description item */
  467.     (
  468.     HWTX hWtx /* WTX API handler */
  469.     );
  470. #ifndef HOST
  471. LOCAL char * stringDup /* duplicates a string */
  472.     (
  473.     const char * strToDup /* string to duplicate */
  474.     );
  475. #define strdup stringDup
  476. #endif /* ! HOST */
  477. /*
  478.  * NOTE: This is a list of WTX protocol calls not accessible from the 
  479.  *       WTX C API and is based on the service numbers in wtxmsg.h
  480.  *
  481.  * WTX_VIO_READ - not implemented in server (obsolete?)
  482.  * WTX_SYM_TBL_CREATE/DELETE - to do
  483.  * WTX_SYM_TBL_LIST - to do
  484.  * WTX_WTX_SERVICE_LIST - not implemented in server - undefined
  485.  * WTX_WDB_SERVICE_LIST - not implemented in server - undefined
  486.  * WTX_OBJ_KILL - (currently TS kill only) Enough ?
  487.  * WTX_OBJ_RESTART - undefined (obsolete ?)
  488.  */
  489. #if defined (HOST) && !defined (_DEBUG)
  490. /*******************************************************************************
  491. *
  492. * wtxLmDeauthorize - Check-in a license
  493. *
  494. * This routine releases a license previously checked-out by wtxLmAuthorize ().
  495. * Typically, it is called when the process exits.
  496. *
  497. * RETURNS: N/A
  498. *
  499. * SEE ALSO: wtxLmAuthorize ()
  500. *
  501. * NOMANUAL
  502. */
  503. void wtxLmDeauthorize (void)
  504.     {
  505.     /* if we own a license, release it. */
  506.     if (gotLicense)
  507. {
  508. flexlmDeauthorize ();
  509. }
  510.     }
  511. /*******************************************************************************
  512. *
  513. * wtxLmAuthorize - Check-out a license
  514. *
  515. * This routine establishes a connection to the license server, and tries to
  516. * Check out a license.
  517. * Currently, we check a license upon first call to this routine. Once we get a
  518. * license, we always return OK to any subsequent call to this routine.
  519. * We register a handle to release the license when the tool exits.
  520. *
  521. * RETURNS: WTX_OK or WTX_ERROR if the check-out fails.
  522. *
  523. * SEE ALSO: wtxLmDeauthorize ()
  524. *
  525. * NOMANUAL
  526. */
  527. STATUS wtxLmAuthorize (void)
  528.     {
  529.     /* If we already got a license return OK */
  530.     
  531.     if (gotLicense)
  532. return OK;
  533.     /* First time: check for a valid license */
  534.     if (flexlmAuthorize (FEATURE_TORNADO_2_2, VERSION_TORNADO_2_2, 1) != OK)
  535. return ERROR;
  536.     gotLicense = 1; /* we got one! */
  537.     
  538.     /* Record a handler to release the license when the process exits */
  539.     atexit (wtxLmDeauthorize);
  540.     return OK; /* Return sucess */
  541.     }
  542. #endif
  543. /*******************************************************************************
  544. *
  545. * wtxToolAttach - connect a WTX client to the target server
  546. *
  547. * This routine establishes a connection to the target server
  548. * called <serverName> and announces the client as a WTX tool called
  549. * <toolName>. If <serverName> does not contain an `@' character, it is
  550. * used as a regular expression; if it matches more than one (registered)
  551. * target server name, an error is returned.  If <serverName> contains 
  552. * an `@' character then it must be an exact match for a valid target 
  553. * server name.
  554. *
  555. * RETURNS: WTX_OK or WTX_ERROR if the attach fails.
  556. *
  557. * ERRORS:
  558. * .iP WTX_ERR_API_ALREADY_CONNECTED 12
  559. * The handle is already connected to a target server.
  560. * .iP WTX_ERR_API_SERVER_NOT_FOUND 
  561. * <serverName> does not match a target server name using the above criteria.
  562. * .iP WTX_ERR_API_AMBIGUOUS_SERVER_NAME 
  563. * <serverName> matches more than one target server name.
  564. * .iP WTX_ERR_SVR_DOESNT_RESPOND
  565. * <serverName> is dead : no RPC connection can be achieved
  566. * .iP WTX_ERR_SVR_IS_DEAD
  567. * <serverName> is dead : server has been found dead
  568. * .iP WTX_ERR_SVR_INVALID_LICENSE
  569. * No license could be checked-out for this tool.
  570. *
  571. * SEE ALSO: WTX_TOOL_ATTACH, wtxToolDetach(), wtxToolConnected(), wtxInfoQ()
  572. */
  573. STATUS wtxToolAttach 
  574.     (
  575.     HWTX hWtx, /* WTX API handle             */
  576.     const char * serverName, /* Target Server name         */
  577.     const char * toolName /* tool name                  */
  578.     )
  579.     
  580.     {
  581.     WTX_MSG_TOOL_DESC in; /* WTX param                  */
  582.     WTX_MSG_TOOL_DESC * pOut = NULL; /* WTX result                 */
  583.     WTX_DESC_Q * pTsDescQ = NULL; /* Q Info about Target Server */
  584.     WTX_ERROR_T callStat; /* status of WTX call         */
  585.     WTX_ERROR_T errCode=WTX_ERR_NONE; /* connection init status     */
  586.     WTX_DESC * pSaveDesc = NULL; /* saved server desc          */
  587.     WTX_DESC * pTsDesc = NULL; /* Info about Target Server   */
  588.     WTX_DESC * pNewDesc = NULL; /* for updated tgtsvr entry   */
  589.     char * envUser = NULL; /* result of getenv(USER)     */
  590.     char * oldKey = NULL; /* for multi adapters tgtsvrs */
  591.     char * tmpKey = NULL; /* for multi adapters tgtsvrs */
  592.     BOOL usePMap = FALSE; /* do we use port mapper ?    */
  593.     char userName [256]; /* to format "user@host"      */
  594.     char serverAtHost [256]; /* serverName@host            */
  595.     char hostNameBuf [32]; /* for gethostname ()         */
  596.     int ipNum = 0; /* number of IP addr in list  */
  597. #ifdef WIN32
  598.     char                usrName [256]; /* holds name for Win32       */
  599. #endif
  600.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  601.     if (wtxToolConnected (hWtx))
  602. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_ALREADY_CONNECTED, WTX_ERROR);
  603.     if (hWtx->pServerDesc) 
  604. {
  605. wtxResultFree (hWtx, hWtx->pServerDesc);
  606. hWtx->pServerDesc = NULL;
  607. }
  608.     if (toolName == NULL)
  609. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  610. #if defined (HOST) && !defined (_DEBUG)
  611.     /* 
  612.      * License check (HOST side, release version only):
  613.      * if NO_LICENSE if defined for this module, we'll look if NO_LICENSE is
  614.      * defined in the process' environment. If this is the case, we skip
  615.      * license check. 
  616.      * In all cases, GDB won't be checked for license.
  617.      */
  618. #ifdef NO_LICENSE
  619.     if (!envVarChecked)
  620. {
  621. licenseCheck = (wpwrGetEnv ("NO_LICENSE") != NULL)?FALSE:TRUE;
  622. envVarChecked = TRUE;
  623. }
  624. #endif /* NO_LICENSE */
  625.      if (licenseCheck)
  626.  licenseCheck = (strstr (toolName, "gdb") == NULL)?TRUE:FALSE;
  627.     if ((licenseCheck) && (wtxLmAuthorize () != OK))
  628. {
  629. WTX_ERROR_RETURN (hWtx, WTX_ERR_SVR_INVALID_LICENSE, WTX_ERROR);
  630. }
  631. #endif /* HOST */
  632.     /* save current name in serverAtHost */
  633.     strcpy (serverAtHost, serverName);
  634.     if (!strchr (serverName, '@')) /* name: tgtsvr */
  635. {
  636. pTsDescQ = wtxInfoQ (hWtx, (char *)serverName, "tgtsvr", NULL);
  637. if (pTsDescQ == NULL)
  638.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_SERVER_NOT_FOUND, WTX_ERROR);
  639. if (pTsDescQ->pNext != NULL)
  640.     {
  641.     wtxResultFree (hWtx, pTsDescQ);
  642.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_AMBIGUOUS_SERVER_NAME, 
  643.       WTX_ERROR);
  644.     }
  645. /*
  646.  * There is an @ in the target server name, let's see if it is really
  647.  * in registry data base.
  648.  */
  649. strcpy (serverAtHost, pTsDescQ->wpwrName);
  650. wtxResultFree (hWtx, pTsDescQ);
  651. }
  652.     pTsDesc = wtxInfo (hWtx, (char *)serverAtHost); /* name: tgtsvr@host */
  653.     if (pTsDesc == NULL)
  654. WTX_ERROR_RETURN (hWtx, hWtx->errCode, WTX_ERROR);
  655.     hWtx->pServerDesc = pTsDesc;
  656.     /* allocate space to copy server information */
  657.     if ( (pSaveDesc = (WTX_DESC *) malloc (sizeof (WTX_DESC))) == NULL)
  658. {
  659. wtxResultFree (hWtx, hWtx->pServerDesc);
  660. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, WTX_ERROR);
  661. }
  662.     /* copy server information */
  663.     memcpy ((void *) pSaveDesc, (void *) hWtx->pServerDesc, sizeof (WTX_DESC));
  664.     if (hWtx->pServerDesc->wpwrName != NULL)
  665. {
  666. if ((pSaveDesc->wpwrName = (char *) malloc (strlen
  667.     (hWtx->pServerDesc->wpwrName) + 1)) == NULL)
  668.     {
  669.     free (pSaveDesc);
  670.     wtxResultFree (hWtx, hWtx->pServerDesc);
  671.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, WTX_ERROR);
  672.     }
  673.     
  674.         strcpy (pSaveDesc->wpwrName, hWtx->pServerDesc->wpwrName);
  675. }
  676.     if (hWtx->pServerDesc->wpwrKey != NULL)
  677. {
  678. if ((pSaveDesc->wpwrKey = (char *) malloc (strlen
  679.     (hWtx->pServerDesc->wpwrKey) + 1)) == NULL)
  680.     {
  681.     free (pSaveDesc->wpwrName);
  682.     free (pSaveDesc);
  683.     wtxResultFree (hWtx, hWtx->pServerDesc);
  684.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, WTX_ERROR);
  685.     }
  686.     
  687.         strcpy (pSaveDesc->wpwrKey, hWtx->pServerDesc->wpwrKey);
  688. }
  689.     if (hWtx->pServerDesc->wpwrType != NULL)
  690. {
  691. if ((pSaveDesc->wpwrType = (char *) malloc (strlen
  692.     (hWtx->pServerDesc->wpwrType) + 1)) == NULL)
  693.     {
  694.     free (pSaveDesc->wpwrKey);
  695.     free (pSaveDesc->wpwrName);
  696.     free (pSaveDesc);
  697.     wtxResultFree (hWtx, hWtx->pServerDesc);
  698.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, WTX_ERROR);
  699.     }
  700.     
  701.         strcpy (pSaveDesc->wpwrType, hWtx->pServerDesc->wpwrType);
  702. }
  703.     wtxResultFree (hWtx, hWtx->pServerDesc);
  704.     registryDisconnect (hWtx);
  705.     hWtx->pServerDesc = pSaveDesc;
  706.     /* first just initialise the connection */
  707.     if (wtxExchangeInitialize (&hWtx->server) != WTX_OK ||
  708. wtxExchangeInstall (hWtx->server, 
  709.     wtxRpcExchangeCreate, 
  710.     wtxRpcExchangeDelete, 
  711.     wtxRpcExchange, 
  712.     wtxRpcExchangeFree, 
  713.     wtxRpcExchangeControl) != WTX_OK)
  714. {
  715. /* Record the error code */
  716. errCode = wtxExchangeErrGet ((WTX_XID) hWtx->server);
  717. /* free server descriptor */
  718. serverDescFree (hWtx);
  719. /* Cleanup the exchange */
  720. wtxExchangeTerminate ((WTX_XID) hWtx->server);
  721. hWtx->server = (WTX_XID) NULL;
  722. WTX_ERROR_RETURN (hWtx, errCode, WTX_ERROR);
  723. }
  724. use_pmap:
  725.     if (wtxExchangeCreate ((WTX_XID) hWtx->server, 
  726.    hWtx->pServerDesc->wpwrKey, usePMap) != WTX_OK)
  727. {
  728. /*
  729.  * if the error comes from the wtxExchangeCreate() routine and if
  730.  * it has to deal with the IP address, then let's try to see if we
  731.  * can change the IP adapter
  732.  */
  733. if (wtxExchangeErrGet (hWtx->server) == WTX_ERR_EXCHANGE_NO_SERVER)
  734.     {
  735.     /* if there are several adapter, let's try the next one */
  736.     oldKey = hWtx->pServerDesc->wpwrKey;
  737.     while ((tmpKey = wtxRpcKeyIPListUpdate (hWtx->pServerDesc->wpwrKey,
  738.     ++ipNum)) != NULL)
  739. {
  740. if (wtxExchangeCreate ((WTX_XID) hWtx->server, tmpKey, usePMap)
  741.     == WTX_OK)
  742.     {
  743.     HWTX regdHWtx; /* wtx handle for registry    */
  744.     /* this is the right key, save it and update registry */
  745.     hWtx->pServerDesc->wpwrKey = tmpKey;
  746.     free (oldKey);
  747.     /* init the registry session */
  748.     wtxInitialize (&regdHWtx);
  749.     /* update registry entry */
  750.     if (wtxUnregister (regdHWtx, hWtx->pServerDesc->wpwrName)
  751. != WTX_OK)
  752. WTX_ERROR_RETURN (hWtx, regdHWtx->errCode, WTX_ERROR);
  753.     if ( (pNewDesc = wtxRegister (regdHWtx,
  754.   hWtx->pServerDesc->wpwrName,
  755.   hWtx->pServerDesc->wpwrType,
  756.   tmpKey)) == NULL)
  757. {
  758. WTX_ERROR_RETURN (hWtx, regdHWtx->errCode, WTX_ERROR);
  759. }
  760.     /*
  761.      * end the registry session, wtxTerminate should free the
  762.      * new description, no need to free it manuall.
  763.      */
  764.     wtxTerminate (regdHWtx);
  765.     goto updated_key;
  766.     }
  767. }
  768.     /* ok, now try again with the port mapper then ... */
  769.     if (!usePMap)
  770. {
  771. usePMap = TRUE;
  772. goto use_pmap;
  773. }
  774.     }
  775. /* Record the error code */
  776. errCode = wtxExchangeErrGet ((WTX_XID) hWtx->server);
  777. /* free server descriptor */
  778. serverDescFree (hWtx);
  779. /* Cleanup the exchange */
  780. wtxExchangeTerminate ((WTX_XID) hWtx->server);
  781. hWtx->server = (WTX_XID) NULL;
  782. WTX_ERROR_RETURN (hWtx, errCode, WTX_ERROR);
  783. }
  784. updated_key:
  785.     memset (&in, 0, sizeof (in));
  786.     in.wtxToolDesc.toolName = (char *) toolName;
  787. #ifdef HOST
  788. #ifdef WIN32
  789.     {
  790.         UINT32 size = sizeof (usrName);    
  791.         if(!GetUserName (usrName, &size))
  792.     envUser = NULL;
  793. else
  794.     envUser = usrName;
  795.     }
  796. #else
  797.     envUser = getenv ("USER");
  798. #endif /* WIN32 */
  799.     gethostname (hostNameBuf, sizeof (hostNameBuf));
  800. #else
  801.     envUser = sysBootParams.usr;
  802.     strcpy (hostNameBuf, sysBootParams.targetName);
  803. #endif /* HOST */
  804.     if (envUser == NULL)
  805. envUser = "unknown";
  806.     if (hostNameBuf[0] == '')
  807. strcpy (hostNameBuf, "unknown");
  808.     sprintf (userName, "%.24s@%.24s", envUser, hostNameBuf);
  809.     in.wtxToolDesc.userName = userName;
  810.     pOut = calloc (1, sizeof (WTX_MSG_TOOL_DESC));
  811.     if (pOut == NULL)
  812. {
  813. /* Close the connection to the server */
  814. wtxExchangeDelete (hWtx->server);
  815. /* free server descriptor */
  816. serverDescFree (hWtx);
  817. /* Clean up the exchange */
  818. wtxExchangeTerminate (hWtx->server);
  819. hWtx->server = NULL;
  820. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, WTX_ERROR);
  821. }
  822.     /* Do the attach call */
  823.     callStat = exchange (hWtx, WTX_TOOL_ATTACH, &in, pOut);
  824.     if (callStat != WTX_ERR_NONE)
  825. {
  826. /* Close the connection to the server */
  827. wtxExchangeDelete (hWtx->server);
  828. /* free server descriptor */
  829. serverDescFree (hWtx);
  830. /* Clean up the exchange */
  831. wtxExchangeTerminate (hWtx->server);
  832. hWtx->server = NULL;
  833. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  834. }
  835.     /* Set the msgToolId and pToolDesc filed in the HWTX for future use */
  836.     hWtx->pToolDesc = &pOut->wtxToolDesc;
  837.     hWtx->msgToolId.wtxCore.objId = pOut->wtxToolDesc.id;
  838.     if (wtxFreeAdd (hWtx, (void *) &pOut->wtxToolDesc, NULL, pOut,
  839.     WTX_TOOL_ATTACH, hWtx->server, WTX_SVR_SERVER) != WTX_OK)
  840. {
  841. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), WTX_ERROR);
  842. }
  843.     return (WTX_OK);
  844.     }
  845. /*******************************************************************************
  846. *
  847. * wtxToolConnected - check to see if a tool is connected to a target server
  848. *
  849. * This routine checks if the tool represented by <hWtx> is currently
  850. * connected to a target server. 
  851. *
  852. * NOTE: If <hWtx> is an invalid handle then FALSE is returned.
  853. *
  854. * RETURNS: TRUE if the tool is connected, FALSE otherwise.
  855. *
  856. * SEE ALSO: wtxErrClear(), wtxErrGet()
  857. */
  858. BOOL32 wtxToolConnected 
  859.     (
  860.     HWTX hWtx /* WTX API handle */
  861.     )
  862.     {
  863.     WTX_CHECK_HANDLE (hWtx, FALSE);
  864.     return (hWtx->server != NULL);
  865.     }
  866. /*******************************************************************************
  867. *
  868. * wtxToolDetach - detach from the target server
  869. *
  870. * This routine detaches from the target server. 
  871. * The connection status for <hWtx> is cleared and any memory
  872. * allocated by the tool attach is freed. 
  873. *
  874. * CLEANUP
  875. * This routine cleans all the tools allocated pointers. All items that have been
  876. * allocated by `wtx' calls during the wtxToolAttach() are freed. All the
  877. * elements are freed calling for the wtxResultFree() routine. This makes
  878. * impossible to access data from previous `wtx' calls.
  879. *
  880. * NOTE: Even if the detach fails internally (for example, the server
  881. * it is attached to has died), the API still puts the handle into a
  882. * detached state and performs all necessary internal cleanup. In this
  883. * case the internal error is `not' reported since the tool is no longer
  884. * attached and the handle can subsequently be attached to another server.
  885. *
  886. * RETURNS: WTX_OK or WTX_ERROR.
  887. *
  888. * SEE ALSO: WTX_TOOL_DETACH, wtxToolAttach()
  889. */
  890. STATUS wtxToolDetach 
  891.     (
  892.     HWTX hWtx /* WTX API handle */
  893.     )
  894.     {
  895.     WTX_ERROR_T callStat; /* WTX call status */
  896.     WTX_MSG_RESULT out; /* WTX result */
  897.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  898.     if (! wtxToolConnected(hWtx))
  899. return (WTX_OK);
  900. #ifdef HOST
  901.     /* close async. notif */
  902.     wtxAsyncStop (&hWtx->asyncHandle);
  903.     hWtx->asyncHandle = NULL;
  904. #endif /* HOST */
  905.     memset (&out, 0, sizeof (out));
  906.     callStat = exchange (hWtx, WTX_TOOL_DETACH, &hWtx->msgToolId, &out);
  907.     /* Free allocated memory and close neatly the connection to the server */
  908.     if (callStat == WTX_ERR_NONE)
  909. wtxExchangeFree (hWtx->server, WTX_TOOL_DETACH, &out);
  910.     /* 
  911.      * free the server descriptor and the strings that were allocated in 
  912.      * wtxToolAttach().
  913.      */
  914.     serverDescFree (hWtx);
  915.     toolCleanup(hWtx);
  916.     /* Actively ignore any errors that may occur */
  917.     return (WTX_OK);
  918.     }
  919. /*******************************************************************************
  920. *
  921. * wtxInitialize - initialization routine to be called by the WTX client
  922. *
  923. * This routine allocates a handle structure for the tool's use and
  924. * does any initialization required for use of the WTX interface.  All
  925. * subsequent calls by the tool should use the handle returned in <phWtx>.
  926. * If WTX_ERROR is returned and the handle <phWtx> is zero, then the
  927. * initialization failed because the internal handle structure could
  928. * not be allocated. Otherwise use wtxErrMsgGet() to find the cause
  929. * of the error.
  930. * RETURNS: WTX_OK or WTX_ERROR if the initialization fails.
  931. *
  932. * ERRORS: 
  933. * .iP WTX_ERR_API_INVALID_ARG 12
  934. * The pointer <phWtx> is NULL.
  935. * .iP WTX_ERR_API_MEMALLOC 
  936. * The handle cannot be allocated.
  937. *
  938. * SEE ALSO: wtxTerminate(), wtxVerify()
  939. */
  940. STATUS wtxInitialize 
  941.     (
  942.     HWTX * phWtx /* RETURN: handle to use in subsequent API calls */
  943.     )
  944.     {
  945.     if (phWtx == NULL)
  946. WTX_ERROR_RETURN (NULL, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  947.     *phWtx = calloc (1, sizeof (struct _wtx));
  948.     
  949.     if (*phWtx == NULL)
  950. WTX_ERROR_RETURN (NULL, WTX_ERR_API_MEMALLOC, WTX_ERROR);
  951.     
  952.     /* Set the field that identifies this as a valid handle */
  953.     (*phWtx)->self = *phWtx;
  954.     (*phWtx)->pWtxFreeList = NULL;
  955.     return (WTX_OK);
  956.     }
  957. /*******************************************************************************
  958. *
  959. * wtxTerminate - terminate the use of a WTX client handle
  960. *
  961. * This routine destroys the specified context handle so it may no
  962. * longer be used in WTX API calls.  If the tool is attached to a
  963. * target server, it is first detached. (It is forcibly detached if
  964. * errors make a normal detach impossible.)  Any memory allocated by 
  965. * the handle is freed and the handle is invalidated; any subsequent 
  966. * use causes an abort.
  967. *
  968. * CLEANUP
  969. * This routine frees all the `wtx' pointers that have been allocated by `wtx'
  970. * calls during the session. Thus, it makes it impossible to address them anymore
  971. *
  972. * RETURNS: WTX_OK or WTX_ERROR.
  973. *
  974. * SEE ALSO: wtxInitialize(), wtxVerify()
  975. */
  976. STATUS wtxTerminate
  977.     (
  978.     HWTX hWtx /* WTX API handle */
  979.     )
  980.     {
  981.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  982.     wtxToolDetach (hWtx);
  983.     /*
  984.      * as we exit the WTX session, all the pointers from the wtxResultFree()
  985.      * pointers list should be freed.
  986.      */
  987.     if (hWtx->pWtxFreeList != NULL)
  988. {
  989. if (sllCount (hWtx->pWtxFreeList) > 0)
  990.     {
  991.     sllEach (hWtx->pWtxFreeList, wtxResultFreeListTerminate,
  992.      (int) &hWtx);
  993.     }
  994. sllDelete (hWtx->pWtxFreeList);
  995. hWtx->pWtxFreeList = NULL;
  996. }
  997.     if (hWtx->pServerDesc) 
  998. {
  999. wtxResultFree (hWtx, hWtx->pServerDesc);
  1000. }
  1001.     if (hWtx->pSelfDesc)
  1002. {
  1003. wtxResultFree (hWtx, hWtx->pSelfDesc);
  1004. }
  1005.     if (hWtx->registry)
  1006. wtxExchangeDelete (hWtx->registry);
  1007.     wtxExchangeTerminate (hWtx->server);
  1008.     wtxExchangeTerminate (hWtx->registry);
  1009.     /* Invalidate this handle in case it is used after terminate */
  1010.     hWtx->self = NULL;
  1011.     /* Now free up the handle memory */
  1012.     free (hWtx);
  1013.     return (WTX_OK);
  1014.     }
  1015. /*******************************************************************************
  1016. *
  1017. * wtxErrSet - set the error code for the handle
  1018. *
  1019. * This routine sets the error value <errCode> in the handle specified 
  1020. * by <hWtx> so that wtxErrGet() can return <errCode> as the error.
  1021. *
  1022. * NOTE: Error handlers for the handle are not called. To set the error
  1023. * code and call the registered error handlers, use wtxErrDispatch().
  1024. *
  1025. * RETURNS: WTX_OK or WTX_ERROR.
  1026. *
  1027. * SEE ALSO: wtxErrGet(), wtxErrMsgGet(), wtxErrClear(), wtxErrDispatch().
  1028. */
  1029. STATUS wtxErrSet 
  1030.     (
  1031.     HWTX  hWtx,  /* WTX API handle */
  1032.     UINT32 errCode /* error value to set */
  1033.     )
  1034.     {
  1035.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  1036.     /* Ensure any allocated strings are freed up */
  1037.     wtxErrClear (hWtx);
  1038.     hWtx->errCode = errCode;
  1039.     return (WTX_OK);
  1040.     }
  1041. /*******************************************************************************
  1042. *
  1043. * wtxErrGet - return the last error for a handle
  1044. *
  1045. * This routine returns the last error that occurred for the <hWtx> handle.
  1046. * The error code is only valid after an error is reported by one of the
  1047. * API calls. To check for an error after a series of API calls use 
  1048. * wtxErrClear() to clear the error status at the start and call wtxErrGet()
  1049. * at the end. 
  1050. *
  1051. * RETURNS: The last error code or WTX_ERROR if the handle is invalid.
  1052. *
  1053. * SEE ALSO: wtxErrMsgGet(), wtxErrSet(), wtxErrClear()
  1054. */
  1055. WTX_ERROR_T wtxErrGet 
  1056.     (
  1057.     HWTX hWtx /* WTX API handle */
  1058.     )
  1059.     {
  1060.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  1061.     return (hWtx->errCode);
  1062.     }
  1063. /*******************************************************************************
  1064. *
  1065. * wtxErrHandlerAdd - add an error handler for the WTX handle
  1066. *
  1067. * This routine adds a new error handler to the list of registered handlers
  1068. * for the handle <hWtx>.  The last error handler added is the first one
  1069. * called when an error occurs. The function <pFunc> is called with three
  1070. * arguments, the handle on which the error occurred, the client data
  1071. * <pClientData>, and a call data parameter which is the error code. If the
  1072. * function returns the value TRUE then each previously registered handler
  1073. * function is called in turn until all are called or one returns the
  1074. * value FALSE.
  1075. *
  1076. * EXAMPLE
  1077. * The following is a sample error handler:
  1078. *
  1079. * .CS
  1080. *   BOOL32 errorHandler
  1081. *       (
  1082. * HWTX   hWtx,      /@ WTX API handle @/
  1083. * void * pClientData,  /@ client data from wtxErrHandlerAdd() call @/
  1084. * void * errCode       /@ error code passed from wtxErrDispatch() @/
  1085. *       )
  1086. *
  1087. *       {
  1088. * /@ print an error message @/
  1089. *
  1090. * fprintf (stderr, 
  1091. *  "Error %s (%d) from server %sn", 
  1092. *  wtxErrMsgGet (hWtx),
  1093. *  (WTX_ERROR_T) errCode, /@ or use wtxErrGet() @/
  1094. *  wtxTsNameGet (hWtx));
  1095. *
  1096. * /@ return TRUE allowing previously installed handlers to be called @/
  1097. *
  1098. * return TRUE;
  1099. * }
  1100. * .CE
  1101. *
  1102. * RETURNS: A new handler ID or NULL on failure.
  1103. *
  1104. * ERRORS:
  1105. * .iP WTX_ERR_API_MEMALLOC 12
  1106. * No memory is available to add the new handler.
  1107. *
  1108. * SEE ALSO: wtxErrHandlerRemove(), wtxErrDispatch()
  1109. */
  1110. WTX_HANDLER_T wtxErrHandlerAdd 
  1111.     (
  1112.     HWTX hWtx, /* WTX API handle */
  1113.     WTX_HANDLER_FUNC pFunc, /* function to call on error */
  1114.     void * pClientData /* data to pass function */
  1115.     )
  1116.     {
  1117.     WTX_HANDLER_T descNew;
  1118.     WTX_CHECK_HANDLE (hWtx, NULL);
  1119.     descNew = calloc (1, sizeof (_WTX_HANDLER_T));
  1120.     if (descNew == NULL)
  1121. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1122.     
  1123.     descNew->pFunc = pFunc;
  1124.     descNew->pClientData = pClientData;
  1125.     descNew->prev = hWtx->errHandler;
  1126.     hWtx->errHandler = descNew;
  1127.     return descNew;
  1128.     }
  1129. /*******************************************************************************
  1130. *
  1131. * wtxErrHandlerRemove - remove an error handler from the WTX handle
  1132. *
  1133. * This function removes the error handler referenced by <errHandler> from 
  1134. * the handler list for <hWtx>. The error handler ID <errHandler> must be a 
  1135. * valid error handler ID returned by a call of wtxErrHandlerAdd().
  1136. *
  1137. * NOTE: It is safe for wtxErrHandlerRemove() to be called from within an
  1138. * error handler function, even if the call is to remove itself.
  1139. *
  1140. * RETURNS: WTX_OK or WTX_ERROR.
  1141. *
  1142. * ERRORS:
  1143. * .iP WTX_ERR_API_HANDLER_NOT_FOUND 12
  1144. * <errHandler> is not a valid handler ID.
  1145. *
  1146. * SEE ALSO: wtxErrHandlerAdd(), wtxErrDispatch() 
  1147. */
  1148. STATUS wtxErrHandlerRemove 
  1149.     (
  1150.     HWTX hWtx, /* WTX API handle */
  1151.     WTX_HANDLER_T errHandler /* Error handler to remove */
  1152.     )
  1153.     {
  1154.     WTX_HANDLER_T desc;
  1155.     WTX_HANDLER_T last;
  1156.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  1157.     last = NULL;
  1158.     for (desc = hWtx->errHandler; desc; desc = desc->prev)
  1159. {
  1160. if (desc == errHandler)
  1161.     {
  1162.     /* Got the one to remove */
  1163.     if (last)
  1164. last->prev = desc->prev;
  1165.     else
  1166. hWtx->errHandler = desc->prev;
  1167.     free (desc);
  1168.     return (WTX_OK);
  1169.     }
  1170. last = desc;
  1171. }
  1172.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_HANDLER_NOT_FOUND, WTX_ERROR);
  1173.     }
  1174. /*******************************************************************************
  1175. *
  1176. * wtxErrDispatch - dispatch an error with supplied code for the given handle
  1177. *
  1178. * This function records the error <errCode> against the handle <hWtx> and 
  1179. * calls all the registered error handlers for it until one returns FALSE.
  1180. *
  1181. * RETURNS: WTX_OK or WTX_ERROR if the handle is invalid.
  1182. *
  1183. * SEE ALSO: wtxErrHandlerAdd()
  1184. */
  1185. STATUS wtxErrDispatch
  1186.     (
  1187.     HWTX hWtx, /* WTX API handle */
  1188.     WTX_ERROR_T errCode /* error code to register */
  1189.     )
  1190.     {
  1191.     WTX_HANDLER_T desc;
  1192.     BOOL32 continueToDispatch;
  1193.     /* cannot use macro here as it will cause recursion via WTX_ERROR_RETURN */
  1194.     if (hWtx == NULL || hWtx->self != hWtx)
  1195. {
  1196. /* cannot do anything with the error */
  1197. /* FIXME: should implement a global error handler */
  1198. return WTX_ERROR;
  1199. }
  1200.     /* Record the error code */
  1201.     hWtx->errCode = errCode;
  1202.     hWtx->errMsg = NULL;
  1203.     continueToDispatch = TRUE;
  1204.     desc = hWtx->errHandler; 
  1205.     /* Dispatch the error to all the error handlers */
  1206.     while ((desc != NULL) && continueToDispatch)
  1207. {
  1208. WTX_HANDLER_T prev;
  1209. /* Just in case the handler removes itself! */
  1210. prev = desc->prev;
  1211. /* Be sure the function is non-null */
  1212. if (desc->pFunc)
  1213.     continueToDispatch = desc->pFunc (hWtx, 
  1214.       desc->pClientData, 
  1215.       (void *) errCode);
  1216. desc = prev;
  1217. }
  1218.     return (WTX_OK);
  1219.     }
  1220. /*******************************************************************************
  1221. * wtxErrMsgGet - fetch the last network WTX API error string
  1222. *
  1223. * This routine gets a meaningful string for the last WTX API call
  1224. * that returned WTX_ERROR. The string is only valid after a WTX
  1225. * call has returned an error.
  1226. *
  1227. * NOTE: The return value is a pointer to internal data and must
  1228. * not be freed by the caller. Also the string is only valid until
  1229. * the next error occurs or wtxErrClear() is called. It must
  1230. * be copied by the caller if the value must be stored.
  1231. *
  1232. * RETURNS: A pointer to a string or NULL if an error has occurred. 
  1233. *
  1234. * SEE ALSO: wtxErrClear(), wtxErrGet()
  1235. */
  1236. const char * wtxErrMsgGet
  1237.     (
  1238.     HWTX hWtx /* WTX API handle */
  1239.     )
  1240.     {
  1241.     WTX_CHECK_HANDLE (hWtx, NULL);
  1242.     /* This allows for caching of previous values but is not yet implemented */
  1243.     if (hWtx->errMsg != NULL)
  1244. return hWtx->errMsg;
  1245.     else
  1246. {
  1247. hWtx->errMsg = wtxErrToMsg (hWtx, hWtx->errCode);
  1248. return hWtx->errMsg;
  1249. }
  1250.     }
  1251. /*******************************************************************************
  1252. *
  1253. * wtxErrToMsg - convert an WTX error code to a descriptive string
  1254. *
  1255. * This routine takes an error code which has been returned by a WTX API
  1256. * call and returns a descriptive string. The value returned is a pointer
  1257. * to a string in statically allocated memory. The string must be copied 
  1258. * if the value is to be stored and it must not be freed by the caller.
  1259. *
  1260. * RETURNS: A pointer to an error string.
  1261. */
  1262. const char * wtxErrToMsg
  1263.     (
  1264.     HWTX hWtx, 
  1265.     WTX_ERROR_T errCode
  1266.     )
  1267.     {
  1268.     static char buffer [256];
  1269.     if (errCode == WTX_ERR_NONE)
  1270. return "No error";
  1271.     if ((errCode > WTXERR_BASE_NUM) && (errCode < WTX_ERR_LAST))
  1272. {
  1273. FILE * fp;
  1274. #ifdef WIN32
  1275. sprintf (buffer, "%s\host\resource\tcl\wtxerrdb.tcl", 
  1276.  getenv ("WIND_BASE"));
  1277. #else
  1278. sprintf (buffer, "%s/host/resource/tcl/wtxerrdb.tcl", 
  1279.  getenv ("WIND_BASE"));
  1280. #endif
  1281.     
  1282. fp = fopen (buffer, "r");
  1283. while (fp != NULL && ! ferror (fp))
  1284.     {
  1285.     UINT32 errNum;
  1286.     char errStr[256];
  1287.     if (fgets (buffer, sizeof (buffer), fp) == NULL)
  1288. break;
  1289.     if (sscanf (buffer, "set wtxError(0x%x) %s", &errNum, errStr) == 2
  1290. && (errNum == (UINT32)errCode))
  1291. {
  1292. sprintf (buffer, "%s", errStr);
  1293. fclose (fp);
  1294. return buffer;
  1295. }
  1296.     }
  1297. if (fp)
  1298.     fclose (fp);
  1299. /* A WTX error we have no error text for */
  1300. sprintf (buffer, "WTX error %#x", errCode);
  1301. }
  1302. #ifdef SUN4_SUNOS4
  1303.     /*
  1304.      * Avoid strerror() on SUNOS4, as this will pull libiberty.a into
  1305.      * the link, making it more difficult to bind this code into a
  1306.      * shared library.
  1307.      */
  1308.     else if (errCode > 0 && errCode < sys_nerr && sys_errlist [errCode] != NULL)
  1309.         {
  1310.         /* Probably a system error */
  1311.         sprintf (buffer, "%s (%d)", sys_errlist [errCode], errCode);
  1312.         }
  1313. #else  /* !SUN4_SUNOS4 */
  1314.     else if (strerror (errCode) != NULL)
  1315.         /* Probably a system error */
  1316.         sprintf (buffer, "%s (%d)", strerror (errCode), errCode);
  1317. #endif /* SUN4_SUNOS4 */
  1318.     else
  1319. /* Some other error we don't know about */
  1320. sprintf (buffer, "error %d (%#x)", errCode, errCode);
  1321.     return buffer;
  1322.     }
  1323. /*******************************************************************************
  1324. *
  1325. * wtxErrClear - explicitly clear any error status for the tool
  1326. *
  1327. * This routine clears an error message already recorded. It can be
  1328. * called before a WTX routine if you want to test for an error afterwards
  1329. * by checking whether wtxErrGet() returns a non-zero value.
  1330. *
  1331. * RETURNS: WTX_OK or WTX_ERROR.
  1332. *
  1333. * SEE ALSO: wtxErrGet(), wtxErrMsgGet(), wtxErrSet()
  1334. */
  1335. STATUS wtxErrClear
  1336.     (
  1337.     HWTX hWtx /* WTX API handle */
  1338.     )
  1339.     {
  1340.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  1341.     hWtx->errCode = WTX_ERR_NONE;
  1342.     hWtx->errMsg = NULL;
  1343.     return (WTX_OK);
  1344.     }
  1345. /*******************************************************************************
  1346. *
  1347. * wtxErrExceptionFunc - a function to handle an error using longjmp()
  1348. *
  1349. * This function is called as part of the error handling process shown in the
  1350. * discussion of C++ style exception catching in the wtx library description
  1351. * (f2WTX C LibraryfP).  The WTX_TRY macro, which registers the error
  1352. * handler wtxErrExceptionFunc(), is found in wtx.h.  <pClientData> contains
  1353. * the address of <jumpBuf> from WTX_TRY and <pCallData> is the error code 
  1354. * that is returned by WTX_TRY and should be cast to the type WTX_ERROR_T..
  1355. *
  1356. * RETURNS: FALSE if <pClientData> is NULL, otherwise it does not return.
  1357. * It executes a longjmp() back to <jumpBuf> in the WTX_TRY macro, which
  1358. * returns the error code passed back by <pCallData>.
  1359. *
  1360. * SEE ALSO: wtxErrHandlerAdd(), wtxErrDispatch()
  1361. */
  1362. BOOL32 wtxErrExceptionFunc 
  1363.     (
  1364.     HWTX hWtx, /* WTX API handle */
  1365.     void * pClientData, /* pointer to a jump buffer */
  1366.     void * pCallData /* error code to return via setjmp() */
  1367.     )
  1368.     {
  1369.     if (pClientData != NULL)
  1370. longjmp (pClientData, (int) pCallData);
  1371.     return FALSE;
  1372.     }
  1373. /*******************************************************************************
  1374. *
  1375. * wtxClientDataGet - get the client data associated with the WTX handle
  1376. *
  1377. * This routine sets the pointer pointed at by <ppClientData> to the
  1378. * value set by the last call to wtxClientDataSet() for the handle <hWtx>.
  1379. *
  1380. * RETURNS: WTX_OK or WTX_ERROR.
  1381. *
  1382. * ERRORS: 
  1383. * .iP WTX_ERR_API_INVALID_ARG 12
  1384. * <ppClientData> is NULL.
  1385. *
  1386. * SEE ALSO: wtxClientDataSet()
  1387. */
  1388. STATUS wtxClientDataGet 
  1389.     (
  1390.     HWTX hWtx, /* WTX API handle */
  1391.     void ** ppClientData /* RETURN: pointer to client data pointer */
  1392.     )
  1393.     {
  1394.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  1395.     if (ppClientData == NULL)
  1396. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  1397.     *ppClientData = hWtx->pClientData;
  1398.     return (WTX_OK);
  1399.     }
  1400. /*******************************************************************************
  1401. *
  1402. * wtxClientDataSet - set the client data associated with the WTX handle
  1403. *
  1404. * This routine causes the value <pClientData> to be associated with the
  1405. * WTX API handle <hWtx>. The client data can be used by the
  1406. * caller in any way and, except when in the set and get routines,
  1407. * is not used or altered in any way by the WTX API. The initial value
  1408. * of the client data before it is set is always NULL.
  1409. *
  1410. * RETURNS: WTX_OK or WTX_ERROR.
  1411. *
  1412. * SEE ALSO: wtxClientDataGet().
  1413. */
  1414. STATUS wtxClientDataSet 
  1415.     (
  1416.     HWTX hWtx, /* WTX API handle */
  1417.     void * pClientData /* value to associate with handle */
  1418.     )
  1419.     {
  1420.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  1421.     hWtx->pClientData = pClientData;
  1422.     return (WTX_OK);
  1423.     }
  1424. /*******************************************************************************
  1425. *
  1426. * wtxAgentModeGet - get the mode of the target agent
  1427. *
  1428. * This routine returns the running mode of the target agent that the 
  1429. * current target server is attached to.  
  1430. *
  1431. * EXPAND ../../../include/wtxtypes.h WTX_AGENT_MODE_TYPE
  1432. *
  1433. * RETURNS: The current agent running mode or WTX_ERROR.
  1434. *
  1435. * SEE ALSO: WTX_AGENT_MODE_GET, wtxTsInfoGet(), wtxAgentModeSet()
  1436. */
  1437. WTX_AGENT_MODE_TYPE wtxAgentModeGet 
  1438.     (
  1439.     HWTX hWtx /* WTX API handle */
  1440.     )
  1441.     {
  1442.     WTX_ERROR_T callStat; /* client status */
  1443.     WTX_AGENT_MODE_TYPE result; /* debug agent mode */
  1444.     WTX_MSG_RESULT out; /* WTX result */
  1445.     /*
  1446.      * All API calls that require a connection to the target server
  1447.      * should use the WTX_CHECK_CONNECTED macro before doing anything else.
  1448.      * This macro also calls WTX_CHECK_HANDLE to validate the handle.
  1449.      */
  1450.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1451.     /* Always remember to initialize the out params */
  1452.     memset (&out, 0, sizeof (out));
  1453.     callStat = exchange (hWtx, WTX_AGENT_MODE_GET, &hWtx->msgToolId, &out);
  1454.     /*
  1455.      * If there is an error we don't need to free the result with 
  1456.      * wtxExchangeFree() because wtxExchange() (called by exchange()) 
  1457.      * does this for us when there is an error.
  1458.      */
  1459.     if (callStat != WTX_ERR_NONE)
  1460. /*
  1461.  * On error the WTX_ERROR_RETURN macro calls wtxErrDispatch() for
  1462.  * us (which sets the error code in the API handle and calls any
  1463.  * registered error handlers). It then returns the last param as
  1464.  * the result. In the case where the out param was dynamically
  1465.  * allocated (see wtxEventGet() for example) is the API call fails
  1466.  * then we must call free() on the result before the error return.
  1467.  */
  1468. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1469.     /* 
  1470.      * Here we extract any information we want from the out param, then
  1471.      * free it using wtxExchangeFree() so any exchange allocated memory is
  1472.      * released and then return the desired result value.
  1473.      */
  1474.     result = out.val.value_u.v_int32;
  1475.     wtxExchangeFree (hWtx->server, WTX_AGENT_MODE_GET, &out);
  1476.     return result;
  1477.     }
  1478. /*******************************************************************************
  1479. *
  1480. * wtxAgentModeSet - set the mode of the target agent
  1481. *
  1482. * This routine sets the mode of the target agent that the current target
  1483. * server is attached to.  A given agent may not support all the possible 
  1484. * modes.
  1485. *
  1486. * EXPAND ../../../include/wtxtypes.h WTX_AGENT_MODE_TYPE
  1487. *
  1488. * RETURNS: WTX_OK or WTX_ERROR.
  1489. *
  1490. * SEE ALSO: WTX_AGENT_MODE_SET, wtxTsInfoGet(), wtxAgentModeGet()
  1491. */
  1492. STATUS wtxAgentModeSet 
  1493.     (
  1494.     HWTX hWtx, /* WTX API handle */
  1495.     WTX_AGENT_MODE_TYPE agentMode /* debug agent mode */
  1496.     )
  1497.     {
  1498.     WTX_ERROR_T callStat; /* client status */
  1499.     WTX_MSG_PARAM in; /* WTX param */
  1500.     WTX_MSG_RESULT out; /* WTX result */
  1501.     /*
  1502.      * All API calls that require a connection to the target server
  1503.      * should use the WTX_CHECK_CONNECTED macro before doing anything else.
  1504.      * This macro also calls WTX_CHECK_HANDLE to validate the handle.
  1505.      */
  1506.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1507.     /* Always remember to initialize the in and out params */
  1508.     memset (&in, 0, sizeof (in));
  1509.     memset (&out, 0, sizeof (out));
  1510.     /* Fill in the relevant fields of the in params for the call */
  1511.     in.param.valueType = V_UINT32;
  1512.     in.param.value_u.v_uint32 = agentMode;
  1513.     /* Now make the call recording the result status */
  1514.     callStat = exchange (hWtx, WTX_AGENT_MODE_SET, &in, &out);
  1515.     /*
  1516.      * If there is an error we don't need to free the result with 
  1517.      * wtxExchangeFree() because wtxExchange() (called by exchange()) 
  1518.      * does this for us when there is an error.
  1519.      */
  1520.     if (callStat != WTX_ERR_NONE)
  1521. /*
  1522.  * On error the WTX_ERROR_RETURN macro calls wtxErrDispatch() for
  1523.  * us (which sets the error code in the API handle and calls any
  1524.  * registered error handlers). It then returns the last param as
  1525.  * the result. In the case where the out param was dynamically
  1526.  * allocated (see wtxEventGet() for example) is the API call fails
  1527.  * then we must call free() on the result before the error return.
  1528.  */
  1529. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1530.     /* 
  1531.      * Here we extract any information we want from the out param, then
  1532.      * free it using wtxExchangeFree() so any exchange allocated memory is
  1533.      * released and then return the desired result value.
  1534.      */
  1535.     wtxExchangeFree (hWtx->server, WTX_AGENT_MODE_SET, &out);
  1536.     return (WTX_OK);
  1537.     }
  1538. /*******************************************************************************
  1539. *
  1540. * wtxAsyncNotifyEnable - start the asynchronous event notification
  1541. *
  1542. * This function creates a socket-based link between the target server and 
  1543. * the client where events will be sent. If a user defined function 
  1544. * is given (pFunc != NULL) then this function is called each time an 
  1545. * event is received by the target server, this function must take 
  1546. * a WTX_EVENT_DESC as input parameter. If no user defined function is 
  1547. * given then received events are just stored in the asynchronous event 
  1548. * list, those events can be get using wtxAsyncEventGet().
  1549. *
  1550. * In conjunction with wtxAsyncNotifyEnable(), wtxRegisterForEvent() (or
  1551. * wtxUnregisterForEvent()) must be used to specify which type of events must
  1552. * be sent to the requester.
  1553. *
  1554. * Upon calling this function, the wtxEventGet() and wtxEventListGet() 
  1555. * routines will always return nothing.
  1556. *
  1557. * When an event is coming to the client, the event is put in an 
  1558. * WTX_EVENT_DESC structure and passed to the user provided function 
  1559. * pointed to by <pFunc>.
  1560. *
  1561. * All strings contained in the WTX_EVENT_DESC structure must be copied 
  1562. * before to be used because their life duration is depending on the events
  1563. * stream.
  1564. *
  1565. * The user defined function must take a WTX_EVENT_DESC * as input 
  1566. * parameter. It is called each time an event is received by the target
  1567. * server.
  1568. * NOTE:
  1569. * This service uses WTX_COMMAND_SEND request of the WTX protocol. 
  1570. *
  1571. * EXAMPLE:
  1572. *
  1573. * Declaration of a simple event handler.
  1574. *
  1575. * .CS
  1576. *   LOCAL void eventHookRtn /@ Hook routine used by the notification @/
  1577. *       (
  1578. *       WTX_EVENT_DESC * event  /@ Event received from the target server @/
  1579. *       )
  1580. *       {
  1581. * /@ Just print the event string and exit @/
  1582. *
  1583. *       if (event->event != NULL)
  1584. *           printf ("Received event: %sn", event->event);
  1585. * }
  1586. * .CE
  1587. *
  1588. * Start of the asynchronous notification from the C API.
  1589. *
  1590. * .CS
  1591. * /@ Initialization @/
  1592. * .
  1593. * .
  1594. *
  1595. * /@ Start the notification @/
  1596. *
  1597. *       if (wtxAsyncNotifyEnable (wtxh, (FUNCPTR) eventHookRtn) 
  1598. *     != (UINT32) WTX_OK)
  1599. *     return (WTX_ERROR);
  1600. *
  1601. * /@ core of the WTX application @/
  1602. * .
  1603. * .
  1604. * .CE
  1605. *
  1606. * RETURN: WTX_OK or WTX_ERROR if the request failed.
  1607. *
  1608. * ERRORS:
  1609. * .iP WTX_ERR_API_SERVICE_ALREADY_STARTED 12
  1610. * An wtxAsyncNotifyDisable must be called before.
  1611. * .iP WTX_ERR_API_CANT_OPEN_SOCKET
  1612. * Socket creation, bind or listen failed.
  1613. * .iP WTX_ERR_API_CANT_GET_HOSTNAME
  1614. * Cannot get name of current host.
  1615. *
  1616. * SEE ALSO: WTX_COMMAND_SEND, wtxAsyncNotifyEnable(), wtxAsyncEventGet()
  1617. */
  1618. STATUS wtxAsyncNotifyEnable
  1619.     (
  1620.     HWTX            hWtx,              /* WTX API handle        */
  1621.     FUNCPTR         pFunc              /* User defined function */
  1622.     )
  1623.     {
  1624. #ifdef HOST
  1625.     WTX_MSG_PARAM       in;            /* Query parameters         */
  1626.     WTX_MSG_RESULT      out;           /* Query result             */
  1627.     WTX_ERROR_T         callStat;      /* Exchange result          */
  1628.     int status;        /* Return value    */
  1629.     struct hostent *    he;            /* Host entries             */
  1630.     char                buf [128];     /* Input param. string      */
  1631.     char                bufPort [32];  /* String for port #        */
  1632.     char                hostName [32]; /* Host name                */
  1633.     SOCK_DESC           sockDesc;      /* Socket descriptor        */
  1634.     /*
  1635.      * All API calls that require a connection to the target server
  1636.      * should use the WTX_CHECK_CONNECTED macro before doing anything else.
  1637.      * This macro also calls WTX_CHECK_HANDLE to validate the handle.
  1638.      */
  1639.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1640.     /* Open a socket, create the event list and start the threads */
  1641.     status = wtxAsyncInitialize (&sockDesc, pFunc, &hWtx->asyncHandle);
  1642.     if (status != WTX_OK)
  1643.         {
  1644.         return (status);
  1645.         }
  1646.     /* Set input - ouput parameters for WTX_COMMAND_SEND */
  1647.     in.param.valueType = V_PCHAR;
  1648.     if (gethostname (hostName, sizeof (hostName)) != OK)
  1649.         {
  1650.         /* Tchao */
  1651.         return (WTX_ERR_API_CANT_GET_HOSTNAME);
  1652.         }
  1653.     he = gethostbyname (hostName);
  1654.     memset (buf, 0, sizeof (buf));
  1655.     strcpy (buf, WTX_ASYNC_NOTIFY_ENABLE_CMD);
  1656.     strcat (buf, SEPARATOR);
  1657.     strcat (buf, (const char *) inet_ntoa (*((struct in_addr *)he->h_addr)));
  1658.     strcat (buf, SEPARATOR);
  1659.     sprintf (bufPort, "%d", sockDesc.portNumber);
  1660.     strcat (buf, bufPort);
  1661.     in.param.value_u.v_pchar = buf;
  1662.     memset (&out, 0, sizeof (out));
  1663.     /* Call WTX_COMMAND_SEND - wtxAsyncNotifyEnable service */
  1664.     callStat = exchange (hWtx, WTX_COMMAND_SEND, &in, &out);
  1665.     if (callStat != WTX_ERR_NONE)
  1666.         {
  1667.         /* Set off the asynchronous notification */
  1668. wtxAsyncStop (&hWtx->asyncHandle);
  1669. hWtx->asyncHandle = NULL;
  1670.         /* Tchao */
  1671.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1672.         }
  1673.     wtxExchangeFree (hWtx->server, WTX_COMMAND_SEND, &out);
  1674. #endif /* HOST */
  1675.     return (WTX_OK);
  1676.     }
  1677. /*******************************************************************************
  1678. *
  1679. * wtxAsyncNotifyDisable - stop the asynchronous event notification
  1680. *
  1681. * This function sends to the target server an order to stop the asynchronous
  1682. * notification of events.
  1683. *
  1684. * NOTE:
  1685. * This service uses WTX_COMMAND_SEND request of the WTX protocol.
  1686. *
  1687. * RETURN: WTX_OK or WTX_ERROR if exchange failed.
  1688. *
  1689. * SEE ALSO: WTX_COMMAND_SEND, wtxAsyncNotifyEnable(), wtxAsyncEventGet()
  1690. */
  1691. STATUS wtxAsyncNotifyDisable
  1692.     (
  1693.     HWTX        hWtx                       /* WTX API handle */
  1694.     )
  1695.     {
  1696. #ifdef HOST
  1697.     WTX_ERROR_T         callStat = WTX_OK; /* Exchange result */
  1698.     WTX_MSG_PARAM       in;            /* Query parameters */
  1699.     WTX_MSG_RESULT      out;           /* Query result     */
  1700.     char                buf [32];      /* Input buffer     */
  1701.     /*
  1702.      * All API calls that require a connection to the target server
  1703.      * should use the WTX_CHECK_CONNECTED macro before doing anything else.
  1704.      * This macro also calls WTX_CHECK_HANDLE to validate the handle.
  1705.      */
  1706.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1707.     /* Set input - ouput parameters for WTX_COMMAND_SEND */
  1708.     in.param.valueType = V_PCHAR;
  1709.     strcpy (buf, WTX_ASYNC_NOTIFY_DISABLE_CMD);
  1710.     in.param.value_u.v_pchar = buf;
  1711.     memset (&out, 0, sizeof (out));
  1712.     /* Call WTX_COMMAND_SEND - wtxAsyncNotifyDisable service */
  1713.     callStat = exchange (hWtx, WTX_COMMAND_SEND, &in, &out);
  1714.     if (callStat == WTX_ERR_NONE)
  1715. wtxExchangeFree (hWtx->server, WTX_COMMAND_SEND, &out);
  1716.     /* Free the event list and stop the async. notif. mechanism */
  1717.     wtxAsyncStop (&hWtx->asyncHandle);
  1718.     hWtx->asyncHandle = NULL;
  1719.     /* Tchao */
  1720. #endif
  1721.     return (WTX_OK);
  1722.     }
  1723. /*******************************************************************************
  1724. *
  1725. * wtxBreakpointAdd - create a new WTX eventpoint of type breakpoint
  1726. *
  1727. * This routine creates a new eventpoint on the target to represent a
  1728. * breakpoint at the address <tgtAddr> for the target context <contextId>.
  1729. * The target server maintains a list of eventpoints created on the target
  1730. * and this can be queried using wtxEventpointList().  When a context is
  1731. * destroyed on the target or the target is reset, eventpoints are deleted
  1732. * automatically without intervention from the creator.
  1733. *
  1734. * The context types are given by:
  1735. *
  1736. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  1737. *
  1738. * When <contextType> is set to WTX_CONTEXT_SYSTEM, then only breakpoints
  1739. * in system mode can be added. When <contextType> is set to WTX_CONTEXT_TASK,
  1740. * then only breakpoints in context task can be added.
  1741. *
  1742. * RETURNS: The ID of the new breakpoint or WTX_ERROR if the add fails.
  1743. *
  1744. * SEE ALSO: WTX_EVENTPOINT_ADD, wtxEventpointAdd(), wtxEventpointDelete(), 
  1745. * wtxEventpointList()
  1746. */
  1747. UINT32 wtxBreakpointAdd 
  1748.     (
  1749.     HWTX hWtx, /* WTX API handle */
  1750.     WTX_CONTEXT_TYPE contextType, /* type of context to put bp in */
  1751.     WTX_CONTEXT_ID_T contextId, /* associated context */
  1752.     TGT_ADDR_T tgtAddr /* breakpoint address */
  1753.     )
  1754.     {
  1755.     WTX_MSG_RESULT out;
  1756.     WTX_MSG_EVTPT_DESC in;
  1757.     WTX_ERROR_T callStat;
  1758.     UINT32 bpId;
  1759.     
  1760.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1761.     memset (&out, 0, sizeof (out));
  1762.     memset (&in, 0, sizeof (in));
  1763.     in.wtxEvtpt.event.eventType = WTX_EVENT_TEXT_ACCESS;
  1764.     in.wtxEvtpt.event.eventArg = (TGT_ARG_T) tgtAddr;
  1765.     in.wtxEvtpt.context.contextType = contextType;
  1766.     in.wtxEvtpt.context.contextId = contextId;
  1767.     /* ??? Not used by target agent */
  1768.     in.wtxEvtpt.action.actionType = WTX_ACTION_STOP | WTX_ACTION_NOTIFY; 
  1769.     in.wtxEvtpt.action.actionArg = 0; /* ??? Not used by target agent */
  1770.     in.wtxEvtpt.action.callRtn = 0; /* ??? Not used by target agent */
  1771.     in.wtxEvtpt.action.callArg = 0; /* ??? Not used by target agent */
  1772.     callStat = exchange (hWtx, WTX_EVENTPOINT_ADD, &in, &out);
  1773.     if (callStat != WTX_ERR_NONE)
  1774. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1775.     bpId = out.val.value_u.v_uint32; 
  1776.     wtxExchangeFree (hWtx->server, WTX_EVENTPOINT_ADD, &out);
  1777.     return bpId;
  1778.     }
  1779. /*******************************************************************************
  1780. *
  1781. * wtxCacheTextUpdate - synchronize the instruction and data caches.
  1782. *
  1783. * This function flushes the data chache, then invalidates the instruction cache.
  1784. * This operation forces the instruction cache to fetch code that may have been 
  1785. * created via the data path.
  1786. *
  1787. * ERRORS:
  1788. * .iP WTX_ERR_API_INVALID_ARG 12
  1789. * <nBytes> is invalid.
  1790. *
  1791. * RETURNS: WTX_OK or WTX_ERROR if exchange failed.
  1792. *
  1793. * SEE ALSO: WTX_CACHE_TEXT_UPDATE, wtxMemRead(), wtxMemWrite()
  1794. */
  1795. STATUS wtxCacheTextUpdate
  1796.     (
  1797.     HWTX        hWtx,                   /* WTX API handle            */
  1798.     TGT_ADDR_T  addr,                   /* remote addr to update     */
  1799.     UINT32      nBytes                  /* number of bytes to update */
  1800.     )
  1801.     {
  1802.     WTX_ERROR_T                 callStat;
  1803.     WTX_MSG_MEM_BLOCK_DESC      in;
  1804.     WTX_MSG_RESULT              out;
  1805.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1806.     if (nBytes == 0)
  1807.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  1808.     memset (&in, 0, sizeof (in));
  1809.     memset (&out, 0, sizeof (out));
  1810.     in.startAddr = addr;
  1811.     in.numBytes = nBytes;
  1812.     callStat = exchange (hWtx, WTX_CACHE_TEXT_UPDATE, &in, &out);
  1813.     if (callStat != WTX_ERR_NONE)
  1814.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1815.     wtxExchangeFree (hWtx->server, WTX_CACHE_TEXT_UPDATE, &out);
  1816.     return (WTX_OK);
  1817.     }
  1818. /******************************************************************************
  1819. *
  1820. * wtxCommandSend - Pass a string to be interpreted by the target server
  1821. *
  1822. * This function is used to control the target server behavior.
  1823. * Services availables are: wtxTsKill(), wtxTsRestart(), wtxLogging (),
  1824. * wtxTsLock(), wtxTsUnlock(), wtxTargetReset(), wtxAsyncNotifyEnable(),
  1825. * wtxAsyncNotifyDisable().
  1826. *
  1827. * This service sends a string to the target server which interprets it.
  1828. * If the requested service is not known by tsWtxCommandSend(), then
  1829. * the string is sent back to the client.
  1830. *
  1831. * EXAMPLE
  1832. * The following is a sample of string
  1833. *
  1834. * .CS
  1835. *    commandString = "wtxTsLock_30";    /@ lock the target server for 30s @/
  1836. *    commandString = "wtxTsUnlock";     /@ Unlock the target server @/
  1837. *    commandString = "wtxLoggingOn_/folk/pascal/wtx.txt"; /@ wtx log started @/
  1838. * .CE
  1839. *
  1840. * NOTE:
  1841. * A separator is used ("_") and only some command strings can be 
  1842. * recognized by the target server (plus options if needed):
  1843. * .iP "wdbLoggingOn"
  1844. * Open the file and log all WDB requests.
  1845. * .iP "wdbLoggingOff"
  1846. * Close the file and stop the log.
  1847. * .iP "wtxLoggingOn"
  1848. * Open the file and log all WTX requests.
  1849. * .iP "wtxLoggingOff"
  1850. * Close the file and stop the log.
  1851. * .iP "allLoggingOff"
  1852. * Stop WDB and WTX log.
  1853. * .iP "wtxAsyncNotifyEnable"
  1854. * Start the asynchronous notification of events.
  1855. * .iP "wtxAsyncNotifyDisable"
  1856. * Stop the asynchronous notification of events.
  1857. * .iP "wtxObjKillDestroy"
  1858. * Kill the target server.
  1859. * .iP "wtxObjKillRestart"
  1860. * Restart the target server.
  1861. * .iP "wtxTsLock"
  1862. * Lock the target server.
  1863. * .iP "wtxTsUnlock"
  1864. * Unlock the target server.
  1865. * .iP "wtxTargetReset"
  1866. * Reset the target.
  1867. * .iP "wtxTargetIpAddressGet"
  1868. * Get the target's IP address (if applicable) in a.b.c.d form.
  1869. * .iP "wtxTargetToolNameGet"
  1870. * Get the name of the tool used to build target run-time (e.g. "gnu").
  1871. *
  1872. * RETURNS: string containing the command's result.
  1873. * SEE ALSO: wtxTsKill(), wtxTsRestart(), wtxLogging(), wtxTsLock(), 
  1874. * wtxTsUnlock(), wtxTargetReset(), wtxAsyncNotifyEnable(),
  1875. * wtxAsyncNotifyDisable(), wtxTargetToolNameGet(), wtxTargetIpAddressGet().
  1876. */
  1877. char * wtxCommandSend
  1878.     (
  1879.     HWTX    hWtx,                          /* WTX API handle           */
  1880.     char *  commandString                  /* String to be interpreted */
  1881.     )
  1882.     {
  1883.     WTX_MSG_RESULT  out;
  1884.     WTX_MSG_PARAM   in;
  1885.     WTX_ERROR_T     callStat;
  1886.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1887.     memset (&out, 0, sizeof (out));
  1888.     memset (&in, 0, sizeof (in));
  1889.     in.param.valueType = V_PCHAR;
  1890.     in.param.value_u.v_pchar = commandString;
  1891.     callStat = exchange (hWtx, WTX_COMMAND_SEND, &in, &out);
  1892.     if (callStat != WTX_ERR_NONE)
  1893.         WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1894.     wtxExchangeFree (hWtx->server, WTX_COMMAND_SEND, &out);
  1895.     return (out.val.value_u.v_pchar);
  1896.     }
  1897. /*******************************************************************************
  1898. *
  1899. * wtxTargetIpAddressGet - gets target IP address.
  1900. *
  1901. * This routine returns the target's IP address in network byte order. The
  1902. * returned address is the one used by the target server to connect the target.
  1903. *
  1904. * On error (the target have no IP address), this value will be (UINT32) 0.
  1905. *
  1906. * RETURNS: the target's IP address in network byte order or 0 on error.
  1907. */
  1908. UINT32 wtxTargetIpAddressGet 
  1909.     (
  1910.     HWTX hWtx /* WTX API handle             */
  1911.     )
  1912.     {
  1913.     WTX_MSG_RESULT out; /* output structure desc      */
  1914.     WTX_MSG_PARAM in; /* input structure desc       */
  1915.     WTX_ERROR_T callStat; /* WTX exchange result status */
  1916.     UINT32 targetIP = 0; /* returned target IP address */
  1917.     WTX_CHECK_CONNECTED (hWtx, 0);
  1918.     memset (&out, 0, sizeof (out));
  1919.     memset (&in, 0, sizeof (in));
  1920.     in.param.valueType = V_PCHAR;
  1921.     in.param.value_u.v_pchar = WTX_TARGET_IP_ADDRESS_CMD;
  1922.     callStat = exchange (hWtx, WTX_COMMAND_SEND, &in, &out);
  1923.     if (callStat != WTX_ERR_NONE)
  1924.         WTX_ERROR_RETURN (hWtx, callStat, 0);
  1925.     targetIP = inet_addr (out.val.value_u.v_pchar);
  1926.     /* free the RPC buffers */
  1927.     wtxExchangeFree (hWtx->server, WTX_COMMAND_SEND, &out);
  1928.     return (targetIP);
  1929.     }
  1930. /*******************************************************************************
  1931. *
  1932. * wtxTargetToolNameGet - get target tool name.
  1933. *
  1934. * This routine returns the name of the tool used to build the target run-time.
  1935. *
  1936. * On error (the target have no tool name), this value will be "Unknown".
  1937. *
  1938. * RETURNS: a string representing a tool name (like "gnu") or NULL
  1939. *
  1940. * SEE ALSO: wtxTsInfoGet
  1941. */
  1942. char * wtxTargetToolNameGet 
  1943.     (
  1944.     HWTX hWtx /* WTX API handle             */
  1945.     )
  1946.     {
  1947. #ifdef HOST
  1948.     WTX_MSG_RESULT out; /* output structure desc      */
  1949.     WTX_MSG_PARAM in; /* input structure desc       */
  1950.     WTX_ERROR_T callStat; /* WTX exchange result status */
  1951.     WTX_CHECK_CONNECTED (hWtx, 0);
  1952.     /* return cached name */
  1953.     if (hWtx->targetToolName != NULL)
  1954. return hWtx->targetToolName;
  1955.     memset (&out, 0, sizeof (out));
  1956.     memset (&in, 0, sizeof (in));
  1957.     in.param.valueType = V_PCHAR;
  1958.     in.param.value_u.v_pchar = WTX_TARGET_TOOLNAME_GET_CMD;
  1959.     callStat = exchange (hWtx, WTX_COMMAND_SEND, &in, &out);
  1960.     if (callStat != WTX_ERR_NONE)
  1961.         WTX_ERROR_RETURN (hWtx, callStat, 0);
  1962.     hWtx->targetToolName = strdup (out.val.value_u.v_pchar);
  1963.     /* free the RPC buffers */
  1964.     wtxExchangeFree (hWtx->server, WTX_COMMAND_SEND, &out);
  1965. #endif /* HOST*/
  1966.     return (hWtx->targetToolName);
  1967.     }
  1968. /*******************************************************************************
  1969. *
  1970. * wtxCpuInfoGet - gets cpu related information from architecturedb file
  1971. *
  1972. * This function allows to get target CPU related informations. <cpuNum>
  1973. * specifies the CPU number in data base, while <cpuInfoType> specifies which
  1974. * parameter to get.
  1975. *
  1976. * <cpuInfoType> can be from the following type
  1977. *
  1978. * EXPAND ../../../include/wtx.h CPU_INFO
  1979. *
  1980. * NOTE:
  1981. * returned value if not NULL should be freed by caller through a call to free()
  1982. *
  1983. * RETURNS: a string containing parameter in string format or NULL.
  1984. *
  1985. * SEE ALSO: wtxTsInfoGet()
  1986. */
  1987. char * wtxCpuInfoGet
  1988.     (
  1989.     int cpuNum, /* cpu number to get info on       */
  1990.     CPU_INFO cpuInfoType /* cpu info type to get            */
  1991.     )
  1992.     {
  1993.     char * cpuInfo = NULL; /* returned target cpu information */
  1994. #ifdef HOST
  1995.     char * windBase = NULL; /* win base directory name         */
  1996.     char * cpuFamilyName = NULL; /* family name of CPU num <cpuNum> */
  1997.     char section [100]; /* section number e.g. CPU ID      */
  1998.     char paramBuf [100]; /* receiving parameter buffer      */
  1999.     char configFile [PATH_MAX]; /* configuration file name         */
  2000.     int ix = 0; /* loop counter                    */
  2001.     int nChar = 0; /* # of chars in returned value    */
  2002.     CPU_INFO_TYPE targetCpuInfo[] = /* cpu data initialization */
  2003. {
  2004. /* param, string, section */
  2005. {CPU_INFO_NONE, "none", NULL},
  2006. {ARCH_DIR, "Architecture Directory", NULL},
  2007. {LEADING_CHAR, "Leading Character", NULL},
  2008. {DEMANGLER, "demangler", NULL},
  2009. {CPU_NAME, "cpuname", NULL},
  2010. {ARCH_OBJ_DIR, "Architecture Object Directory", NULL}
  2011. };
  2012.     sprintf (section, "CPU_%d", cpuNum);
  2013.     /* setting architecture data base file name */
  2014.     windBase = wpwrGetEnv ("WIND_BASE");
  2015.     if (windBase == NULL)
  2016.         {
  2017. goto error1;
  2018. }
  2019.     strcpy (configFile, windBase);
  2020.     strcat (configFile, "/host/resource/target/architecturedb");
  2021. #ifdef WIN32
  2022.     wpwrBackslashToSlash (configFile);
  2023. #endif /* WIN32 */
  2024.     /* get CPU family name */
  2025.     nChar = GetPrivateProfileString (section, "cpuFamilyName", "unknown",
  2026.      paramBuf, sizeof (paramBuf), configFile);
  2027.     if ( (! strcmp (paramBuf, "unknown")) ||
  2028.  ( (cpuFamilyName = strdup (paramBuf)) == NULL))
  2029. {
  2030. goto error1;
  2031. }
  2032.     /* section assignement for parameters */
  2033.     targetCpuInfo[1].section = cpuFamilyName;
  2034.     targetCpuInfo[2].section = cpuFamilyName;
  2035.     targetCpuInfo[3].section = "misc";
  2036.     targetCpuInfo[4].section = (char *) section;
  2037.     targetCpuInfo[5].section = cpuFamilyName;
  2038.     /* set searched string */
  2039.     for (ix = 1 ; ix < (int) NELEMENTS (targetCpuInfo) ; ix++)
  2040. {
  2041. if (targetCpuInfo[ix].param == cpuInfoType)
  2042.     {
  2043.     if ( (targetCpuInfo[ix].section != NULL) &&
  2044.  (targetCpuInfo[ix].string != NULL))
  2045. {
  2046. nChar = GetPrivateProfileString (targetCpuInfo[ix].section,
  2047.  targetCpuInfo[ix].string,
  2048.  "unknown", paramBuf,
  2049.  sizeof (paramBuf), configFile);
  2050. }
  2051.     else
  2052. {
  2053. goto error2;
  2054. }
  2055.     break;
  2056.     }
  2057. }
  2058.     /* allocate and verify returned value */
  2059.     if ( (! strcmp (paramBuf, "unknown")) ||
  2060.  ( (cpuInfo = strdup (paramBuf)) == NULL))
  2061. {
  2062. goto error2;
  2063. }
  2064. error2:
  2065.     free (cpuFamilyName);
  2066. error1:
  2067. #endif /* HOST */
  2068.     return cpuInfo;
  2069.     }
  2070. /*******************************************************************************
  2071. *
  2072. * wtxEventpointAdd - create a new WTX eventpoint
  2073. *
  2074. * This routine creates a new eventpoint on the target. This routine is a
  2075. * generic facility for setting breakpoints. An eventpoint specifies the
  2076. * context to which it applies, the type of event to detect (for example 
  2077. * breakpoint, context exit), and the action to be taken upon detection of 
  2078. * the event (for example, notify the target server of the event).
  2079. *
  2080. * The target server maintains a list of eventpoints created on the target
  2081. * and this can be queried using wtxEventpointList().  When a context is
  2082. * destroyed on the target or the target is reset, eventpoints are deleted
  2083. * automatically without intervention from the creator.
  2084. *
  2085. * When <pEvtpt->context.contextType> is set to WTX_CONTEXT_SYSTEM, then 
  2086. * only eventpoints in system mode can be added. 
  2087. * When <pEvtpt->context.contextType> is set to WTX_CONTEXT_TASK, then only 
  2088. * eventpoints in context task can be added.
  2089. *
  2090. * The eventpoint parameters are grouped into the structure:
  2091. *
  2092. * EXPAND ../../../include/wtxmsg.h WTX_EVTPT_2
  2093. *
  2094. * where WTX_EVENT_2 is:
  2095. *
  2096. * EXPAND ../../../include/wtxmsg.h WTX_EVENT_2
  2097. * where WTX_CONTEXT is:
  2098. *
  2099. * EXPAND ../../../include/wtxmsg.h WTX_CONTEXT
  2100. * The context types are given by:
  2101. *
  2102. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2103. *
  2104. * If contextType is set to WTX_CONTEXT_TASK and contextId set to 0, 
  2105. * then it is equivalent to contextType set to WTX_CONTEXT_ANY_TASK.
  2106. *
  2107. * where WTX_ACTION is:
  2108. *
  2109. * EXPAND ../../../include/wtxmsg.h WTX_ACTION
  2110. *
  2111. * The action types are given by WTX_ACTION_TYPE and can be or'ed 
  2112. * together if multiple actions are needed:
  2113. *
  2114. * EXPAND ../../../include/wtxtypes.h WTX_ACTION_TYPE
  2115. *
  2116. * RETURNS: The ID of the new eventpoint or WTX_ERROR if the add fails.
  2117. *
  2118. * SEE ALSO: WTX_EVENTPOINT_ADD_2, wtxEventpointDelete(), wtxEventpointList()
  2119. */
  2120. UINT32 wtxEventpointAdd 
  2121.     (
  2122.     HWTX hWtx, /* WTX API handle */
  2123.     WTX_EVTPT_2 * pEvtpt /* eventpoint descriptor */
  2124.     )
  2125.     {
  2126.     WTX_MSG_RESULT out;
  2127.     WTX_MSG_EVTPT_DESC_2 in;
  2128.     WTX_ERROR_T callStat;
  2129.     UINT32 evtptId;
  2130.     
  2131.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2132.     memset (&out, 0, sizeof (out));
  2133.     memset (&in, 0, sizeof (in));
  2134.     /*
  2135.      * XXX - must have WTX_EVTPT_2 fields identical to those
  2136.      * WTX_MSG_EVTPT_DESC_2 from wtxEvtpt onwards. Awaits change to
  2137.      * message definitions on wtxmsg.h so this hack will go away.
  2138.      */
  2139.     memcpy (&in.wtxEvtpt, pEvtpt, sizeof (WTX_EVTPT_2));
  2140.     callStat = exchange (hWtx, WTX_EVENTPOINT_ADD_2, &in, &out);
  2141.     if (callStat != WTX_ERR_NONE)
  2142. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2143.     evtptId = out.val.value_u.v_uint32; 
  2144.     wtxExchangeFree (hWtx->server, WTX_EVENTPOINT_ADD_2, &out);
  2145.     return evtptId;
  2146.     }
  2147. /*******************************************************************************
  2148. *
  2149. * wtxEventpointDelete - delete an eventpoint from the target
  2150. *
  2151. * This routine deletes an existing eventpoint in the context given when it
  2152. * was created.  The eventpoint is identified by <evtptId> which is the
  2153. * ID returned by wtxBreakpointAdd(), wtxContextExitNotifyAdd()... If the 
  2154. * eventpoint has already been deleted on the target (for example, because 
  2155. * the context associated with it no longer exists), then the first call of 
  2156. * wtxEventpointDelete() returns WTX_OK. (The target server ignores the 
  2157. * deletion of a valid eventpoint ID that no longer exists on the target.)  
  2158. * If the target server eventpoint list does not contain the <evtptId>, then 
  2159. * the error WTX_ERR_SVR_INVALID_EVENTPOINT occurs.
  2160. * RETURNS: WTX_OK or WTX_ERROR if the delete fails.
  2161. *
  2162. * SEE ALSO: WTX_EVENTPOINT_DELETE, wtxBreakpointAdd(), 
  2163. * wtxContextExitNotifyAdd(), wtxEventpointAdd(), wtxHwBreakpointAdd(), 
  2164. * wtxEventpointList() 
  2165. */
  2166. STATUS wtxEventpointDelete 
  2167.     (
  2168.     HWTX hWtx, /* WTX API handle */
  2169.     UINT32 evtptId /* ID of eventpoint to delete */
  2170.     )
  2171.     {
  2172.     WTX_MSG_RESULT out;
  2173.     WTX_MSG_PARAM in;
  2174.     WTX_ERROR_T callStat;
  2175.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2176.     memset (&in, 0, sizeof (in));
  2177.     memset (&out, 0, sizeof (out));
  2178.     in.param.valueType = V_UINT32;
  2179.     in.param.value_u.v_uint32 = evtptId;
  2180.    
  2181.     callStat = exchange (hWtx, WTX_EVENTPOINT_DELETE, &in, &out);
  2182.     if (callStat != WTX_ERR_NONE)
  2183. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2184.     wtxExchangeFree (hWtx->server, WTX_EVENTPOINT_DELETE, &out);
  2185.     return (WTX_OK);
  2186.     }
  2187. /*******************************************************************************
  2188. *
  2189. * wtxConsoleCreate - create a console window (UNIX only)
  2190. *
  2191. * This routine creates a new console window. The name passed in <name>
  2192. * is used as the title for the new window. If <name> is NULL, a unique 
  2193. * name is assigned by the target server.  When the target server is
  2194. * running in an X-Window environment, the <display> parameter
  2195. * identifies the X display device to create the window on. The number of
  2196. * buffered lines (default 88) can be changed by setting the environment variable
  2197. * `WTX_CONSOLE_LINES' to the number of desired buffered lines. Set this
  2198. * variable before launching the target server. The <fdIn>
  2199. * and <fdOut> parameters are pointers to INT32 variables in
  2200. * which are stored the target server file descriptors for the
  2201. * input and output of the new console.  wtxVioCtl() can be used
  2202. * to redirect VIO input and output to the console.
  2203. * UNIX HOSTS
  2204. * On UNIX systems the returned ID is actually a process
  2205. * ID of the new console running on the same host as the target server.
  2206. *
  2207. * WINDOWS HOSTS
  2208. * This request is not implemented on Windows.  Windows allows only one virtual
  2209. * console and it must be started on the target server command line with the
  2210. * `-c' option.
  2211. *
  2212. * RETURNS: The ID number of the new console or WTX_ERROR.
  2213. *
  2214. * ERRORS:
  2215. * .iP WTX_ERR_API_INVALID_ARG 12
  2216. * Either <fdIn> or <fdOut> is NULL.
  2217. *
  2218. * SEE ALSO: WTX_CONSOLE_CREATE, wtxConsoleKill(), wtxVioCtl()
  2219. */
  2220. INT32 wtxConsoleCreate
  2221.     (
  2222.     HWTX hWtx, /* WTX API handle */
  2223.     const char *name, /* Name of console window */
  2224.     const char *display, /* Display name eg: host:0 */
  2225.     INT32 *fdIn, /* RETURN: input file descriptor */
  2226.     INT32 *fdOut /* RETURN: output file descriptor */
  2227.     )
  2228.     {
  2229.     WTX_MSG_CONSOLE_DESC out;
  2230.     WTX_MSG_CONSOLE_DESC in;
  2231.     WTX_ERROR_T callStat;
  2232.     INT32 pid;
  2233.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2234.     if (fdIn == 0 || fdOut == 0)
  2235. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  2236.     memset (&in, 0, sizeof (in));
  2237.     memset (&out, 0, sizeof (out));
  2238.     in.wtxConsDesc.name = (char *) name;
  2239.     in.wtxConsDesc.display = (char *) display;
  2240.    
  2241.     callStat = exchange (hWtx, WTX_CONSOLE_CREATE, &in, &out);
  2242.     if (callStat != WTX_ERR_NONE)
  2243. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2244.     *fdIn = out.wtxConsDesc.fdIn;
  2245.     *fdOut = out.wtxConsDesc.fdOut;
  2246.     pid = out.wtxConsDesc.pid;
  2247.     wtxExchangeFree (hWtx->server, WTX_CONSOLE_CREATE, &out);
  2248.     return pid;
  2249.     }
  2250. /*******************************************************************************
  2251. *
  2252. * wtxConsoleKill - destroy a console (UNIX only)
  2253. *
  2254. * This routine destroys a console identified by <consoleId> and created by 
  2255. * a previous call to wtxConsoleCreate().
  2256. * WINDOWS HOSTS
  2257. * This request is not implemented on Windows.  If issued, it returns an
  2258. * error, but does not attempt to kill an existing console.
  2259. *
  2260. * RETURNS: WTX_OK or WTX_ERROR.
  2261. *
  2262. * SEE ALSO: WTX_CONSOLE_KILL, wtxConsoleCreate() 
  2263. */
  2264. STATUS wtxConsoleKill
  2265.     (
  2266.     HWTX hWtx, /* WTX API handle */
  2267.     INT32 consoleId /* id of console to destroy */
  2268.     )
  2269.     {
  2270.     WTX_MSG_RESULT out;
  2271.     WTX_MSG_PARAM in;
  2272.     WTX_ERROR_T callStat;
  2273.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2274.     memset (&in, 0, sizeof (in));
  2275.     memset (&out, 0, sizeof (out));
  2276.     in.param.valueType = V_INT32;
  2277.     in.param.value_u.v_int32 = consoleId;
  2278.    
  2279.     callStat = exchange (hWtx, WTX_CONSOLE_KILL, &in, &out);
  2280.     if (callStat != WTX_ERR_NONE)
  2281. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2282.     wtxExchangeFree (hWtx->server, WTX_CONSOLE_KILL, &out);
  2283.     return (WTX_OK);
  2284.     }
  2285. /*******************************************************************************
  2286. *
  2287. * wtxContextCont - continue execution of a target context
  2288. *
  2289. * This routine synchronously continues execution of the context <contextId>
  2290. * on the target after it has stopped at a breakpoint.  This routine should
  2291. * be used instead of wtxContextResume() when debugging a task to prevent
  2292. * the task hitting the breakpoint a second time.
  2293. *
  2294. * The context types are given by:
  2295. *
  2296. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2297. *
  2298. * RETURNS: WTX_OK or WTX_ERROR on failure.
  2299. *
  2300. * SEE ALSO: WTX_CONTEXT_CONT, wtxContextResume(), wtxBreakpointAdd()
  2301. */
  2302. STATUS wtxContextCont 
  2303.     (
  2304.     HWTX hWtx, /* WTX API handle */
  2305.     WTX_CONTEXT_TYPE contextType, /* type of context to continue */
  2306.     WTX_CONTEXT_ID_T contextId /* id of context to continue */
  2307.     )
  2308.     {
  2309.     WTX_MSG_RESULT out;
  2310.     WTX_MSG_CONTEXT in;
  2311.     WTX_ERROR_T callStat;
  2312.     
  2313.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2314.     memset (&out, 0, sizeof (out));
  2315.     memset (&in, 0, sizeof (in));
  2316.     in.contextType = contextType;
  2317.     in.contextId = contextId;
  2318.     callStat = exchange (hWtx, WTX_CONTEXT_CONT, &in, &out);
  2319.     if (callStat != WTX_ERR_NONE)
  2320. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2321.     wtxExchangeFree (hWtx->server, WTX_CONTEXT_CONT, &out);
  2322.     
  2323.     return (WTX_OK);
  2324.     }
  2325. /*******************************************************************************
  2326. * wtxContextCreate - create a new context on the target
  2327. *
  2328. * This routine creates a new context using the information in the
  2329. * context descriptor pointed to by <pContextDesc> which describes
  2330. * parameters for a new task context or a system context. The caller is
  2331. * responsible for freeing information supplied in the context
  2332. * descriptor after the call.
  2333. *
  2334. * EXPAND ../../../include/wtx.h WTX_CONTEXT_DESC
  2335. *
  2336. * ERRORS:
  2337. * .iP WTX_ERR_API_INVALID_ARG 12
  2338. * <pContextDesc> is invalid
  2339. *
  2340. * RETURNS: The ID of the new context or WTX_ERROR. 
  2341. *
  2342. * SEE ALSO: WTX_CONTEXT_CREATE, wtxContextKill()
  2343. */
  2344. WTX_CONTEXT_ID_T wtxContextCreate 
  2345.     (
  2346.     HWTX    hWtx, /* WTX API handle */
  2347.     WTX_CONTEXT_DESC *    pContextDesc /* context descriptor */
  2348.     )
  2349.     {
  2350.     WTX_MSG_CONTEXT_DESC in;
  2351.     WTX_MSG_CONTEXT out;
  2352.     WTX_ERROR_T callStat;
  2353.     WTX_CONTEXT_ID_T ctxId;
  2354.     
  2355.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2356.     if (pContextDesc == NULL)
  2357. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  2358.     memset (&in, 0, sizeof (in));
  2359.     memset (&out, 0, sizeof (out));
  2360.     /* Fill in the context create descritor message. */
  2361.     /*
  2362.      * XXX - must have WTX_CONTEXT_DESC fields identical to those
  2363.      * WTX_MSG_CONTEXT_DESC from contextType onwards. Awaits change to
  2364.      * message definitions on wtxmsg.h so this hack will go away.
  2365.      */
  2366.     memcpy (&in.contextType, pContextDesc, sizeof (WTX_CONTEXT_DESC));
  2367.     
  2368.     callStat = exchange (hWtx, WTX_CONTEXT_CREATE, &in, &out);
  2369.     if (callStat != WTX_ERR_NONE)
  2370. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2371.     ctxId = out.contextId;
  2372.     wtxExchangeFree (hWtx->server, WTX_CONTEXT_CREATE, &out);
  2373.     return ctxId;
  2374.     }
  2375. /*******************************************************************************
  2376. *
  2377. * wtxContextResume - resume execution of a target context
  2378. *
  2379. * This routine synchronously resumes execution of the context <contextId>
  2380. * on the target after it has been suspended, perhaps by wtxContextSuspend().
  2381. * Use wtxContextCont() rather than this routine to continue a task from a 
  2382. * breakpoint; this routine causes the task to hit the breakpoint again.
  2383. *
  2384. * The context types are given by:
  2385. *
  2386. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2387. *
  2388. * RETURNS: WTX_OK or WTX_ERROR on failure.
  2389. *
  2390. * SEE ALSO: WTX_CONTEXT_RESUME, wtxContextSuspend()
  2391. */
  2392. STATUS wtxContextResume 
  2393.     (
  2394.     HWTX hWtx, /* WTX API handle */
  2395.     WTX_CONTEXT_TYPE contextType, /* type of context to resume */
  2396.     WTX_CONTEXT_ID_T contextId /* id of context to resume */
  2397.     )
  2398.     {
  2399.     WTX_MSG_RESULT out;
  2400.     WTX_MSG_CONTEXT in;
  2401.     WTX_ERROR_T callStat;
  2402.     
  2403.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2404.     memset (&out, 0, sizeof (out));
  2405.     memset (&in, 0, sizeof (in));
  2406.     in.contextType = contextType;
  2407.     in.contextId = contextId;
  2408.     callStat = exchange (hWtx, WTX_CONTEXT_RESUME, &in, &out);
  2409.     if (callStat != WTX_ERR_NONE)
  2410. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2411.     wtxExchangeFree (hWtx->server, WTX_CONTEXT_RESUME, &out);
  2412.     return (WTX_OK);
  2413.     }
  2414. /*******************************************************************************
  2415. *
  2416. * wtxContextStatusGet - get the status of a context on the target
  2417. *
  2418. * This routine returns the status of the context <contextId> on the target. 
  2419. *
  2420. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_STATUS
  2421. *
  2422. * The context types are given by:
  2423. *
  2424. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2425. *
  2426. * RETURNS: The status of the context or WTX_ERROR.
  2427. *
  2428. * SEE ALSO: WTX_CONTEXT_STATUS_GET, wtxContextSuspend(), wtxContextResume()
  2429. */
  2430. WTX_CONTEXT_STATUS wtxContextStatusGet 
  2431.     (
  2432.     HWTX hWtx, /* WTX API handle */
  2433.     WTX_CONTEXT_TYPE contextType, /* type of context */
  2434.     WTX_CONTEXT_ID_T contextId /* id of context */
  2435.     )
  2436.     {
  2437.     WTX_MSG_RESULT out;
  2438.     WTX_CONTEXT_STATUS result; /* context status */
  2439.     WTX_MSG_CONTEXT in;
  2440.     WTX_ERROR_T callStat;
  2441.     
  2442.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2443.     memset (&out, 0, sizeof (out));
  2444.     memset (&in, 0, sizeof (in));
  2445.     in.contextType = contextType;
  2446.     in.contextId = contextId;
  2447.     callStat = exchange (hWtx, WTX_CONTEXT_STATUS_GET, &in, &out);
  2448.     if (callStat != WTX_ERR_NONE)
  2449. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2450.     result = out.val.value_u.v_int32;
  2451.     wtxExchangeFree (hWtx->server, WTX_CONTEXT_STATUS_GET, &out);
  2452.     return (result);
  2453.     }
  2454. /*******************************************************************************
  2455. *
  2456. * wtxContextExitNotifyAdd - add a context exit notification eventpoint
  2457. *
  2458. * This routine creates a new eventpoint that notifies the user when the
  2459. * specified context exits by sending a WTX_EVT_CTX_EXIT event.  The eventpoint 
  2460. * is removed automatically when the context exits or the routine
  2461. * wtxEventpointDelete() can be used to remove the eventpoint before the
  2462. * context exits.
  2463. *
  2464. * When <contextType> is set to WTX_CONTEXT_SYSTEM, then only eventpoints 
  2465. * in system mode can be added. 
  2466. * When <contextType> is set to WTX_CONTEXT_TASK, then only eventpoints in 
  2467. * context task can be added.
  2468. *
  2469. * The context types are given by:
  2470. *
  2471. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2472. *
  2473. * RETURNS: A unique identifier for the new eventpoint or WTX_ERROR.
  2474. *
  2475. * SEE ALSO: WTX_EVENTPOINT_ADD, wtxEventpointAdd(), wtxEventpointList(), 
  2476. * wtxEventpointDelete()
  2477. */
  2478. UINT32 wtxContextExitNotifyAdd 
  2479.     (
  2480.     HWTX hWtx, /* WTX API handle */
  2481.     WTX_CONTEXT_TYPE contextType, /* type of context */
  2482.     WTX_CONTEXT_ID_T contextId /* associated context */
  2483.     )
  2484.     {
  2485.     WTX_MSG_RESULT out;
  2486.     WTX_MSG_EVTPT_DESC in;
  2487.     WTX_ERROR_T callStat;
  2488.     UINT32 result;
  2489.     
  2490.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2491.     memset (&out, 0, sizeof (out));
  2492.     memset (&in, 0, sizeof (in));
  2493.     in.wtxEvtpt.event.eventType = WTX_EVENT_CTX_EXIT;
  2494.     in.wtxEvtpt.context.contextType = contextType;
  2495.     in.wtxEvtpt.context.contextId = contextId;
  2496.     in.wtxEvtpt.action.actionType = WTX_ACTION_NOTIFY;
  2497.     callStat = exchange (hWtx, WTX_EVENTPOINT_ADD, &in, &out);
  2498.     if (callStat != WTX_ERR_NONE)
  2499. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2500.     result = out.val.value_u.v_uint32; 
  2501.     wtxExchangeFree (hWtx->server, WTX_EVENTPOINT_ADD, &out);
  2502.     return result;
  2503.     }
  2504. /*******************************************************************************
  2505. *
  2506. * wtxContextKill - kill a target context
  2507. *
  2508. * This routine synchronously kills the context specified by
  2509. * <contextId> on the target.  
  2510. *
  2511. * The context types are given by:
  2512. *
  2513. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2514. *
  2515. * NOTE: Killing the the system context may result in a reboot of the
  2516. * target. However, the correct way to reboot the target system is by calling
  2517. * wtxTargetReset().
  2518. *
  2519. * RETURNS: WTX_OK or WTX_ERROR if the context kill fails.
  2520. *
  2521. * SEE ALSO: WTX_CONTEXT_KILL, wtxTargetReset() 
  2522. */
  2523. STATUS wtxContextKill 
  2524.     (
  2525.     HWTX hWtx, /* WTX API handle */
  2526.     WTX_CONTEXT_TYPE contextType, /* type of context to kill */
  2527.     WTX_CONTEXT_ID_T contextId /* id of context to kill   */
  2528.     )
  2529.     {
  2530.     WTX_MSG_RESULT out;
  2531.     WTX_MSG_CONTEXT in;
  2532.     WTX_ERROR_T callStat;
  2533.     
  2534.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2535.     memset (&out, 0, sizeof (out));
  2536.     memset (&in, 0, sizeof (in));
  2537.     in.contextType = contextType;
  2538.     in.contextId = contextId;
  2539.     callStat = exchange (hWtx, WTX_CONTEXT_KILL, &in, &out);
  2540.     if (callStat != WTX_ERR_NONE)
  2541. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2542.     wtxExchangeFree (hWtx->server, WTX_CONTEXT_KILL, &out);
  2543.     return (WTX_OK);
  2544.     }
  2545. /*******************************************************************************
  2546. *
  2547. * wtxContextStep - single step execution of a target context
  2548. *
  2549. * This routine asynchronously single steps execution of a context on
  2550. * the target. Stepping occurs while <stepStart> <= PC < <stepEnd>.  If
  2551. * stepStart == stepEnd == 0 then the context is single stepped one
  2552. * machine instruction only.  Note that <stepStart> does not set the
  2553. * initial program counter; this must be done separately.
  2554. *
  2555. * The context types are given by:
  2556. *
  2557. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2558. *
  2559. * NOTE: Stepping is an asynchronous operation so the return of this
  2560. * function does not signify completion of the stepping. After stepping
  2561. * completes, a breakpoint event is generated at the address which
  2562. * terminated the stepping operation.
  2563. *
  2564. * RETURNS: WTX_OK or WTX_ERROR if the step fails.
  2565. *
  2566. * SEE ALSO: WTX_CONTEXT_STEP, wtxContextCont(), wtxContextSuspend()
  2567. */
  2568. STATUS wtxContextStep 
  2569.     (
  2570.     HWTX   hWtx, /* WTX API handle */
  2571.     WTX_CONTEXT_TYPE contextType, /* type of context to resume */
  2572.     WTX_CONTEXT_ID_T contextId, /* id of context to step */
  2573.     TGT_ADDR_T   stepStart, /* stepStart pc value */
  2574.     TGT_ADDR_T    stepEnd /* stepEnd PC vale */
  2575.     )
  2576.     {
  2577.     WTX_MSG_RESULT out;
  2578.     WTX_MSG_CONTEXT_STEP_DESC in;
  2579.     WTX_ERROR_T callStat;
  2580.     
  2581.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2582.     memset (&out, 0, sizeof (out));
  2583.     memset (&in, 0, sizeof (in));
  2584.     in.context.contextType = contextType;
  2585.     in.context.contextId = contextId;
  2586.     in.startAddr = stepStart;
  2587.     in.endAddr = stepEnd;
  2588.     callStat = exchange (hWtx, WTX_CONTEXT_STEP, &in, &out);
  2589.     if (callStat != WTX_ERR_NONE)
  2590. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2591.     wtxExchangeFree (hWtx->server, WTX_CONTEXT_STEP, &out);
  2592.     return (WTX_OK);
  2593.     }
  2594. /*******************************************************************************
  2595. *
  2596. * wtxContextSuspend - suspend a target context
  2597. *
  2598. * This routine synchronously suspends execution of a context on the
  2599. * target.
  2600. *
  2601. * The context types are given by:
  2602. *
  2603. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2604. *
  2605. * RETURNS: WTX_OK or WTX_ERROR if the suspend fails.
  2606. *
  2607. * SEE ALSO: WTX_CONTEXT_SUSPEND
  2608. */
  2609. STATUS wtxContextSuspend 
  2610.     (
  2611.     HWTX hWtx, /* WTX API handle */
  2612.     WTX_CONTEXT_TYPE contextType, /* type of context to suspend */
  2613.     WTX_CONTEXT_ID_T contextId /* id of context being suspended */
  2614.     )
  2615.     {
  2616.     WTX_MSG_RESULT out;
  2617.     WTX_MSG_CONTEXT in;
  2618.     WTX_ERROR_T callStat;
  2619.     
  2620.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2621.     memset (&out, 0, sizeof (out));
  2622.     memset (&in, 0, sizeof (in));
  2623.     in.contextType = contextType;
  2624.     in.contextId =  contextId;
  2625.     callStat = exchange (hWtx, WTX_CONTEXT_SUSPEND, &in, &out);
  2626.     if (callStat != WTX_ERR_NONE)
  2627. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2628.     wtxExchangeFree (hWtx->server, WTX_CONTEXT_SUSPEND, &out);
  2629.     return (WTX_OK);
  2630.     }
  2631. /*******************************************************************************
  2632. *
  2633. * wtxEventAdd - send an event to the target server
  2634. *
  2635. * This routine sends an event to the target server. The target server adds 
  2636. * it to the event list of any attached tool that has selected that event
  2637. * by using wtxRegisterForEvent() with a suitable event pattern.  The
  2638. * event is not sent back to the tool that generated it.
  2639. *
  2640. * EXPAND ../../../include/wtxmsg.h WTX_MSG_EVENT_DESC
  2641. *
  2642. * EXPAND ../../../include/wtxmsg.h WTX_EVENT_DESC
  2643. *
  2644. * RETURNS: WTX_OK or WTX_ERROR.
  2645. *
  2646. * SEE ALSO: WTX_EVENT_ADD, wtxEventGet(), wtxEventListGet(), 
  2647. * wtxRegisterForEvent(), wtxUnregisterForEvent().
  2648. */
  2649. STATUS wtxEventAdd
  2650.     (
  2651.     HWTX  hWtx, /* WTX API handle */
  2652.     const char * event, /* event string to send */
  2653.     UINT32       addlDataLen, /* length of addl data block in bytes */
  2654.     const void * pAddlData /* pointer to additional data */
  2655.     )
  2656.     {
  2657.     WTX_MSG_EVENT_DESC in;
  2658.     WTX_MSG_RESULT out;
  2659.     
  2660.     WTX_ERROR_T callStat;
  2661.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2662.     if (addlDataLen != 0 && pAddlData == NULL)
  2663. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  2664.     if (event == NULL)
  2665. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  2666.     memset (&out, 0, sizeof (out));
  2667.     memset (&in, 0, sizeof (in));
  2668.     if ((in.eventDesc.event = (char *) malloc (strlen (event) + 1)) == NULL)
  2669. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, WTX_ERROR);
  2670.     
  2671.     strcpy (in.eventDesc.event, event);
  2672.     in.eventDesc.addlDataLen = (INT32) addlDataLen;
  2673.     if (addlDataLen != 0)
  2674.         {
  2675.         if ((in.eventDesc.addlData = (char *) malloc (addlDataLen)) == NULL)
  2676.     {
  2677.     free (in.eventDesc.event);
  2678.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, WTX_ERROR);
  2679.     }
  2680.         memcpy (in.eventDesc.addlData, pAddlData, addlDataLen);
  2681.         }
  2682.     else
  2683.         in.eventDesc.addlData = NULL;
  2684.     callStat = exchange (hWtx, WTX_EVENT_ADD, &in, &out);
  2685.     if (callStat != WTX_ERR_NONE)
  2686. {
  2687. if (in.eventDesc.addlDataLen != 0)
  2688.     free (in.eventDesc.addlData);
  2689. free (in.eventDesc.event);
  2690.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2691. }
  2692.     if (in.eventDesc.addlDataLen != 0)
  2693. free (in.eventDesc.addlData);
  2694.     free (in.eventDesc.event);
  2695.     return (WTX_OK);
  2696.     }
  2697. /*******************************************************************************
  2698. *
  2699. * wtxEventGet - get an event from the target
  2700. *
  2701. * This routine polls the target server for any events sent to this
  2702. * client tool. It only returns one event at a time.  The event
  2703. * descriptor returned is a string containing the primary event
  2704. * data, 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 wtxResultFree(). Note that an
  2707. * event descriptor is always returned even when no real event is ready
  2708. * for the tool. In this case the event descriptor is WTX_EVENT_OTHER, 
  2709. * `addlDataLen' is 0, and `addlData' is NULL.
  2710. *
  2711. * EXPAND ../../../include/wtxmsg.h WTX_EVENT_DESC
  2712. *
  2713. * RETURNS: A pointer to the descriptor for the event received or NULL.
  2714. *
  2715. * SEE ALSO: WTX_EVENT_GET, wtxEventAdd(), wtxEventListGet(), 
  2716. * wtxResultFree(), wtxStrToEventType(), wtxStrToInt(), wtxStrToTgtAddr()
  2717. */
  2718. WTX_EVENT_DESC * wtxEventGet
  2719.     (
  2720.     HWTX hWtx /* WTX API handle */
  2721.     )
  2722.     {
  2723.     WTX_ERROR_T callStat;
  2724.     WTX_MSG_EVENT_DESC * pOut;
  2725.     WTX_CHECK_CONNECTED (hWtx, NULL);
  2726.     pOut = calloc (1, sizeof (WTX_MSG_EVENT_DESC));
  2727.     if (pOut == NULL)
  2728. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  2729.     callStat = exchange (hWtx, WTX_EVENT_GET, &hWtx->msgToolId, pOut);
  2730.     if (callStat != WTX_ERR_NONE)
  2731. {
  2732. free (pOut); /* Free allocated message */
  2733. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  2734. }
  2735.     /* add pointer to the wtxResultFree () list */
  2736.     if (wtxFreeAdd (hWtx, (void *) &pOut->eventDesc, NULL, pOut, WTX_EVENT_GET,
  2737.     hWtx->server, WTX_SVR_SERVER) != WTX_OK)
  2738. {
  2739. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  2740. }
  2741.     return (&pOut->eventDesc);
  2742.     }
  2743. /******************************************************************************
  2744. *
  2745. * wtxEventListGet - get all the events in one call.
  2746. *
  2747. * This function flushes the target server events queue. If more than one 
  2748. * event is found, WTX_EVENT_NODE structure is filled with the events found
  2749. * up to the limit fixed by <nEvents>. If <nEvents> is equal to 1, then this
  2750. * function is equivalent to wtxEventGet(). If all the events will have to be
  2751. * flushed, then <nEvents> must be equal to WTX_ALL_EVENTS.
  2752. *
  2753. * WTX_EVENT_NODE contains a WTX_EVENT_DESC structure and a pointer to the
  2754. * next WTX_EVENT_NODE (or NULL if it is the last event).
  2755. *
  2756. * EXPAND ../../../include/wtxmsg.h WTX_EVENT_NODE
  2757. * EXPAND ../../../include/wtxmsg.h WTX_EVENT_DESC
  2758. *
  2759. * NOTE : The result of the wtxEventListGet() call should be freed by a call to
  2760. * wtxResultFree ().
  2761. *
  2762. * RETURN: A pointer to the event list or NULL if there's no events or if
  2763. * something failed (errCode must be checked).
  2764. *
  2765. * SEE ALSO: WTX_EVENT_LIST_GET, wtxEventGet(), wtxEventAdd(), 
  2766. * wtxRegisterForEvent(), wtxUnregisterForEvent(), wtxResultFree()
  2767. */
  2768. WTX_EVENT_NODE * wtxEventListGet
  2769.     (
  2770.     HWTX                hWtx,           /* WTX API handle */
  2771.     UINT32 nEvents /* Number of events to return */
  2772.     )
  2773.     {
  2774.     WTX_ERROR_T          callStat;
  2775.     WTX_MSG_PARAM        in;
  2776.     WTX_MSG_EVENT_LIST * pOut;
  2777.     WTX_CHECK_CONNECTED (hWtx, NULL);
  2778.     memset (&in, 0, sizeof (in));
  2779.     in.param.valueType = V_UINT32;
  2780.     in.param.value_u.v_uint32 = nEvents;
  2781.     /* Output parameter location */
  2782.     pOut = calloc (1, sizeof (WTX_MSG_EVENT_LIST));
  2783.     if (pOut == NULL)
  2784.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  2785.     callStat = exchange (hWtx, WTX_EVENT_LIST_GET, &in, pOut);
  2786.     if (callStat != WTX_ERR_NONE)
  2787.         {
  2788.         free (pOut);                   /* Free allocated message */
  2789.         WTX_ERROR_RETURN (hWtx, callStat, NULL);
  2790.         }
  2791.     /* Output parameter */
  2792.     /* add pointer to the wtxResultFree () list */
  2793.     if (wtxFreeAdd (hWtx, (void *) pOut->pEventList, NULL, pOut,
  2794.     WTX_EVENT_LIST_GET, hWtx->server, WTX_SVR_SERVER) != WTX_OK)
  2795. {
  2796. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  2797. }
  2798.     return (pOut->pEventList);
  2799.     }
  2800. /*******************************************************************************
  2801. *
  2802. * wtxEventpointList - list eventpoints on the target server
  2803. *
  2804. * This routine returns a pointer to a list of all eventpoints managed
  2805. * by the target server. These include breakpoints and context exit
  2806. * notifications. The list returned is dynamically allocated and should
  2807. * be freed by calling wtxResultFree()
  2808. *
  2809. * EXPAND ../../../include/wtx.h WTX_EVTPT_LIST
  2810. *
  2811. * RETURNS: A pointer to a list of eventpoints or NULL on error.
  2812. *
  2813. * SEE ALSO: WTX_EVENTPOINT_LIST, wtxEventpointAdd(), wtxBreakpointAdd(), 
  2814. * wtxContextExitNotifyAdd()
  2815. */
  2816. WTX_EVTPT_LIST * wtxEventpointList 
  2817.     (
  2818.     HWTX hWtx /* WTX API handle */
  2819.     )
  2820.     {
  2821.     WTX_MSG_EVTPT_LIST * pOut;
  2822.     WTX_ERROR_T  callStat;
  2823.     WTX_CHECK_CONNECTED (hWtx, NULL);
  2824.     pOut = calloc (1, sizeof (WTX_MSG_EVTPT_LIST));    
  2825.     if (pOut == NULL)
  2826. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  2827.     callStat = exchange (hWtx, WTX_EVENTPOINT_LIST, &hWtx->msgToolId, pOut);
  2828.     if (callStat != WTX_ERR_NONE)
  2829. {
  2830. free (pOut);
  2831. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  2832. }
  2833.     /* add pointer to the wtxResultFree () list */
  2834.     if (wtxFreeAdd (hWtx, (void *) &pOut->nEvtpt, NULL, pOut,
  2835.     WTX_EVENTPOINT_LIST, hWtx->server, WTX_SVR_SERVER)
  2836. != WTX_OK)
  2837. {
  2838. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  2839. }
  2840.     return (WTX_EVTPT_LIST *) &pOut->nEvtpt;
  2841.     }
  2842. /*******************************************************************************
  2843. *
  2844. * wtxEventpointListGet - list eventpoints on the target server
  2845. *
  2846. * This routine returns a pointer to a list of eventpoints info: eventpoints
  2847. * managed by the target server, the tool identifier and the eventpoint
  2848. * identifier.
  2849. *
  2850. * EXPAND ../../../include/wtx.h WTX_EVTPT_LIST_2
  2851. *
  2852. * NOTE : The result of a call to wtxEventpointListGet() should be freed via
  2853. * wtxResultFree()
  2854. *
  2855. * RETURNS: A pointer to an eventpoints info list or NULL on error.
  2856. *
  2857. * SEE ALSO: WTX_EVENTPOINT_LIST_GET, wtxEventpointList(), wtxBreakpointAdd(),
  2858. * wtxContextExitNotifyAdd(), wtxHwBreakpointAdd(), wtxEventpointAdd(),
  2859. * wtxResultFree()
  2860. */
  2861. WTX_EVTPT_LIST_2 * wtxEventpointListGet
  2862.     (
  2863.     HWTX hWtx           /* WTX API handle */
  2864.     )
  2865.     {
  2866.     WTX_MSG_EVTPT_LIST_2 * pOut;
  2867.     WTX_ERROR_T callStat;
  2868.     WTX_CHECK_CONNECTED (hWtx, NULL);
  2869.     pOut = calloc (1, sizeof (WTX_MSG_EVTPT_LIST_2));
  2870.     if (pOut == NULL)
  2871.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  2872.     callStat = exchange (hWtx, WTX_EVENTPOINT_LIST_GET, &hWtx->msgToolId, pOut);
  2873.     if (callStat != WTX_ERR_NONE)
  2874.         {
  2875.         free (pOut);
  2876.         WTX_ERROR_RETURN (hWtx, callStat, NULL);
  2877.         }
  2878.     /* add pointer to the wtxResultFree () list */
  2879.     if (wtxFreeAdd (hWtx, (void *) &pOut->nEvtpt, NULL, pOut,
  2880.     WTX_EVENTPOINT_LIST_GET, hWtx->server, WTX_SVR_SERVER)
  2881. != WTX_OK)
  2882. {
  2883. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  2884. }