home *** CD-ROM | disk | FTP | other *** search
/ kermit.columbia.edu / kermit.columbia.edu.tar / kermit.columbia.edu / panix / k95source.zip / ckcsig.h < prev    next >
C/C++ Source or Header  |  2004-03-14  |  6KB  |  215 lines

  1. /*  C K C S I G . H  */
  2.  
  3. /*  Definitions and prototypes for signal handling  */
  4.  
  5. /*
  6.   Author: Jeffrey E Altman (jaltman@secure-endpoints.com),
  7.   Secure Endpoints Inc., New York City.
  8.  
  9.   Copyright (C) 1985, 2004,
  10.     Trustees of Columbia University in the City of New York.
  11.     All rights reserved.  See the C-Kermit COPYING.TXT file or the
  12.     copyright text in the ckcmai.c module for disclaimer and permissions.
  13. */
  14. #ifdef OS2
  15. #ifndef NT
  16. #ifndef __HEV__                 /* INCL_SEMAPHORE may also define HEV */
  17. #define __HEV__
  18. typedef  ULONG    HEV;                  /* hev */
  19. typedef  HEV      *PHEV;
  20. #endif /* __HEV__ */
  21. #endif /* NT */
  22. struct _threadinfo {
  23.     int inuse;
  24.     int child;
  25.     int sibling;
  26. #ifdef NT
  27.     HANDLE id;
  28.     HANDLE handle;
  29.     HANDLE parent;
  30.     HANDLE CompletionSem ;
  31.     HANDLE DieSem ;
  32. #else /* NT */
  33.     TID id;
  34.     TID parent;
  35.     HEV CompletionSem;
  36.     HEV DieSem;
  37. #endif /* NT */
  38. };
  39. #endif /* OS2 */
  40.  
  41. #ifdef CK_ANSIC
  42. typedef SIGTYP (*ck_sigfunc)(void *);
  43. typedef SIGTYP (*ck_sighand)(int);
  44. #else
  45. typedef SIGTYP (*ck_sigfunc)();
  46. typedef SIGTYP (*ck_sighand)();
  47. #endif /* CK_ANSIC */
  48.  
  49. /* Macros for POSIX vs old-style signal handling. */
  50.  
  51. #ifdef CK_POSIX_SIG
  52. typedef sigjmp_buf ckjmpbuf;
  53. #else
  54. #ifdef NT
  55. #define NOCRYPT
  56. #include <windows.h>
  57. #ifdef NTASM
  58. typedef struct {
  59.     CONTEXT context;
  60.     DWORD retcode;
  61. } ckjmpbuf;
  62. #else /* NTASM */
  63. typedef jmp_buf ckjmpbuf;
  64. #endif /* NTASM */
  65. #else
  66. typedef jmp_buf ckjmpbuf;
  67. #endif
  68. #endif /* CK_POSIX_SIG */
  69. /*
  70.   Suppose you want to pass the address of a jmp_buf bar to a function foo.
  71.   Since jmp_buf is normally defined (typedef'd) as an array, you would do
  72.   it like this:  foo(bar), where foo = foo(jmp_buf bar).  But suppose a
  73.   jmp_buf is (say) a struct rather than an array.  Then you must do
  74.   foo(&bar) where foo is foo(jmp_buf * bar).  This is controlled here in
  75.   the traditional fashion, by ifdefs.  By default, we assume that jmp_buf
  76.   is an array.  Define the symbol JBNOTARRAY if jmp_buf is not an array.
  77. */
  78. #ifndef JBNOTARRAY
  79. #ifdef NT
  80. #define JBNOTARRAY
  81. #endif /* NT */
  82. #endif /* JBNOTARRAY */
  83.  
  84. #ifdef JBNOTARRAY
  85. typedef ckjmpbuf * ckjptr;
  86. #define ckjaddr(x) & x
  87. #define ckjdref(x) * x
  88. #ifdef CK_POSIX_SIG
  89. #define cksetjmp(x) sigsetjmp(x,1)
  90. #define cklongjmp(x,y) siglongjmp(x,y)
  91. #else
  92. #ifdef NT
  93. __inline int
  94. ck_ih(void) {
  95.     extern int TlsIndex;
  96. #ifdef NTSIG
  97.     struct _threadinfo * threadinfo;
  98.     threadinfo = (struct _threadinfo *) TlsGetValue(TlsIndex);
  99.     if (threadinfo) {
  100.         if (WaitAndResetSem(threadinfo->DieSem,0)) {
  101.             ckThreadDie(threadinfo);
  102.             return 1;                   /* This should never execute */
  103.         }
  104.     }
  105. #ifdef COMMENT
  106.     else debug( F100, "ck_ih() threadinfo is NULL","",0);
  107. #endif /* COMMENT */
  108. #endif /* NTSIG */
  109.     return 0;
  110. }
  111. #ifdef NTSIG
  112. #define cksetjmp(x) setjmp(x)
  113. #define cklongjmp(x,y) longjmp(x,y)
  114. #else /* NTSIG */
  115. #ifdef NTASM
  116. __inline DWORD
  117. cksetjmp( ckjptr jmp ) {
  118.     extern int isinterrupted;
  119.     jmp->retcode = 0;
  120.     memset( &jmp->context, 0, sizeof(CONTEXT) );
  121.     jmp->context.ContextFlags = CONTEXT_FULL ;
  122.     if ( !GetThreadContext( GetCurrentThread(), &jmp->context ) )
  123.       debug( F101, "cksetjmp GetThreadContext failed","",GetLastError());
  124.     debug(F101,"cksetjmp returns","",jmp->retcode);
  125.     isinterrupted = 0;
  126.     return (jmp->retcode);
  127. }
  128.  
  129. __inline void
  130. cklongjmp( ckjptr jmp, int retval ) {
  131.     extern HANDLE tidCommand;
  132.     extern int ttyfd, mdmtyp ;
  133.     extern DWORD CommandID;
  134.     extern int isinterrupted;
  135.  
  136.     connoi();
  137.     isinterrupted = 1;
  138.     jmp->retcode = ( retval ? retval : 1 );
  139.     debug(F101,"about to SetThreadContext for thread","", CommandID);
  140.     debug(F101,"from Thread","",GetCurrentThreadId());
  141.     if ( mdmtyp >= 0 ) {
  142.         PurgeComm( (HANDLE) ttyfd, PURGE_TXABORT | PURGE_RXABORT );
  143.     }
  144.     if (SetThreadContext( tidCommand, &jmp->context ))
  145.       debug(F100,"cklongjmp SetThreadContext success","",0);
  146.     else
  147.       debug(F101,"cklongjmp SetThreadContext failed","",GetLastError());
  148.     msleep(50);
  149.     cmini(1);                           /* Reset command parser */
  150.     putkey(13);                         /* Stuff a carriage return */
  151.    /* PostEventAvailSem(); */
  152. }
  153. #else /* NTASM */
  154. void crash( void ) ;
  155. #define cksetjmp(x) setjmp(x)
  156. __inline void
  157. cklongjmp( ckjptr jmp, int retval ) {
  158.     extern HANDLE tidCommand;
  159.     extern int ttyfd, mdmtyp;
  160.     extern DWORD CommandID;
  161.     CONTEXT context;
  162.  
  163.     if ( mdmtyp >= 0 ) {
  164.         PurgeComm( (HANDLE) ttyfd, PURGE_TXABORT | PURGE_RXABORT ) ;
  165.     }
  166.     memset( &context, 0, sizeof(CONTEXT) );
  167.     context.ContextFlags = CONTEXT_FULL;
  168.     if ( !GetThreadContext( tidCommand, &context ) )
  169.       debug( F101, "cklongjmp GetThreadContext failed","",GetLastError());
  170.  
  171.     /* Invalidate the instruction pointer */
  172.     context.Eip =  (unsigned long) crash;
  173.  
  174.     debug(F101,"about to SetThreadContext for thread","", CommandID);
  175.     debug(F101,"from Thread","",GetCurrentThreadId());
  176.     if (SetThreadContext( tidCommand, &context ))
  177.       debug(F100,"cklongjmp SetThreadContext success","",0);
  178.     else
  179.       debug(F101,"cklongjmp SetThreadContext failed","",GetLastError());
  180. }
  181. #endif /* NTASM */
  182. #endif /* NTSIG */
  183. #else /* NT */
  184. #define cksetjmp(x) setjmp(x)
  185. #define cklongjmp(x,y) longjmp(x,y)
  186. #endif /* NT */
  187. #endif /* CK_POSIX_SIG */
  188. #else  /* jmp_buf is an array */
  189. typedef ckjmpbuf ckjptr;
  190. #define ckjaddr(x) x
  191. #define ckjdref(x) x
  192. #ifdef CK_POSIX_SIG
  193. #define cksetjmp(x) sigsetjmp(x,1)
  194. #define cklongjmp(x,y) siglongjmp(x,y)
  195. #else
  196. #define cksetjmp(x) setjmp(x)
  197. #define cklongjmp(x,y) longjmp(x,y)
  198. #endif /* CK_POSIX_SIG */
  199. #endif /* JBNOTARRAY */
  200.  
  201. _PROTOTYP( int cc_execute, (ckjptr, ck_sigfunc, ck_sigfunc) );
  202. _PROTOTYP( int alrm_execute,
  203.           (ckjptr,
  204.            int /* timo */,
  205.            ck_sighand /* handler */,
  206.            ck_sigfunc, ck_sigfunc) );
  207. _PROTOTYP( int cc_alrm_execute,
  208.           (ckjptr,
  209.            int /* timo */,
  210.            ck_sighand /* handler */,
  211.            ck_sigfunc,
  212.            ck_sigfunc) );
  213.  
  214. /* End of ckusig.h */
  215.