ckcsig.h
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:6k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

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