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

通讯/手机编程

开发平台:

Windows_Unix

  1. /* C K U S I G  --  Kermit signal handling for Unix and OS/2 systems */
  2. /*
  3.   Author: Jeffrey Altman (jaltman@columbia.edu),
  4.   Columbia University Academic Information Systems, New York City.
  5.   Copyright (C) 1985, 2000,
  6.     Trustees of Columbia University in the City of New York.
  7.     All rights reserved.  See the C-Kermit COPYING.TXT file or the
  8.     copyright text in the ckcmai.c module for disclaimer and permissions.
  9. */
  10. #include "ckcsym.h"
  11. #include "ckcasc.h" /* ASCII character symbols */
  12. #include "ckcdeb.h" /* Debug & other symbols */
  13. #include "ckcker.h" /* Kermit symbols */
  14. #include "ckcnet.h" /* Network symbols */
  15. #ifndef NOSPL
  16. #include "ckuusr.h"
  17. #endif /* NOSPL */
  18. #include <signal.h>
  19. #ifdef NT
  20. #include <setjmpex.h>
  21. #include <excpt.h>
  22. #else /* NT */
  23. #include <setjmp.h>
  24. #endif /* NT */
  25. #include "ckcsig.h"
  26. #ifdef NOCCTRAP
  27. extern ckjmpbuf cmjbuf;
  28. #endif /* NOCCTRAP */
  29. #ifdef MAC
  30. #define signal msignal
  31. #define SIGTYP long
  32. #define alarm malarm
  33. #define SIG_IGN 0
  34. #define SIGALRM 1
  35. #define SIGINT  2
  36. SIGTYP (*msignal(int type, SIGTYP (*func)(int)))(int);
  37. #endif /* MAC */
  38. #ifdef STRATUS
  39. /* We know these are set here.  MUST unset them before the definitions. */
  40. #define signal vsignal
  41. #define alarm valarm
  42. SIGTYP (*vsignal(int type, SIGTYP (*func)(int)))(int);
  43. int valarm(int interval);
  44. #endif /* STRATUS */
  45. #ifdef AMIGA
  46. #define signal asignal
  47. #define alarm aalarm
  48. #define SIGALRM (_NUMSIG+1)
  49. #define SIGTYP void
  50. SIGTYP (*asignal(int type, SIGTYP (*func)(int)))(int);
  51. unsigned aalarm(unsigned);
  52. #endif /* AMIGA */
  53. #ifdef NTASM
  54. DWORD
  55. ckgetIP(void)
  56. {
  57.    __asm
  58.    {
  59.       mov eax, dword ptr [esp+0x10]
  60.       jmp ckgetIP + 0x18
  61.    }
  62.    return 1;
  63. }
  64. #endif /* NTASM */
  65. #ifdef NT
  66. DWORD
  67. exception_filter( void )
  68. {
  69.    GetExceptionInformation ;
  70.    return( EXCEPTION_EXECUTE_HANDLER ) ;
  71. }
  72. void
  73. crash( void )
  74. {
  75.    int x = 0, y = 0 ;
  76.     x / y ;
  77. }
  78. #endif /* NT */
  79. #ifndef NOCCTRAP
  80. int
  81. #ifdef CK_ANSIC
  82. cc_execute( ckjptr(sj_buf), ck_sigfunc dofunc, ck_sigfunc failfunc )
  83. #else
  84. cc_execute( sj_buf, dofunc, failfunc)
  85.     ckjptr(sj_buf);
  86.     ck_sigfunc dofunc;
  87.     ck_sigfunc failfunc;
  88. #endif /* CK_ANSIC */
  89. /* cc_execute */ {
  90.     int rc = 0 ;
  91. #ifdef NTASM
  92.    DWORD Eip, Esp ;
  93.     isinterrupted = 0;
  94.     sj_buf->retcode = 0 ;
  95.     sj_buf->Id = GetCurrentThreadId() ;
  96.     memset( &sj_buf->context, 0, sizeof(CONTEXT) );
  97.     sj_buf->context.ContextFlags = CONTEXT_FULL ;
  98. #ifndef COMMENT
  99.     GetThreadContext(GetCurrentThread(), &(sj_buf->context) ) ;
  100.     __asm
  101.     {
  102.           mov       ecx,dword ptr [sj_buf]
  103.           mov       dword ptr [ecx+0xc4],esp
  104.     }
  105.    sj_buf->context.EFlags = 530 ;
  106.    sj_buf->context.Eip = ckgetIP()+0x0C ;
  107. #else /* COMMENT */
  108.    __asm
  109.    {
  110.       mov eax, dword ptr [sj_buf]
  111.       push eax
  112.       mov eax, 0xfffffffe
  113.       push eax
  114.       mov eax, 0x00000039
  115.       mov edx,esp
  116.       int 0x2e
  117.       pop eax
  118.       pop eax
  119.    }
  120. #endif /* COMMENT */
  121. #endif /* NTASM */
  122.     if (
  123. #ifdef NTASM
  124.          isinterrupted
  125. #else
  126.  cksetjmp(ckjdref(sj_buf))
  127. #endif /* NTASM */
  128.  ) {
  129. #ifdef NTASM
  130.           __asm
  131.             {
  132.                 mov esp, ESPToRestore
  133.             }
  134.             isinterrupted = 0 ;
  135. #endif /* NTASM */
  136.             (*failfunc)(NULL) ;
  137. #ifdef NTASM
  138.              rc = sj_buf->retcode ;
  139. #else /* NTASM */
  140.              rc = -1 ;
  141. #endif  /* NTASM */
  142.          } else {
  143. #ifdef NT
  144.             __try {
  145.                (*dofunc)(NULL);
  146.             }
  147.             __except(exception_filter())
  148.             {
  149.                debug(F100,"cc_execute __except","",0);
  150.                debug(F111,
  151.      "exception_filter",
  152.      "_exception_code",
  153.      etExceptionCode()
  154.      );
  155.                longjmp(ckjdref(sj_buf),SIGINT);
  156.             }
  157. #else /* NT */
  158.             (*dofunc)(NULL);
  159. #endif /* NT */
  160.          }
  161.    return rc ;
  162. }
  163. #endif /* NOCCTRAP */
  164. int
  165. #ifdef CK_ANSIC /* ANSIC C declaration... */
  166. alrm_execute(ckjptr(sj_buf),
  167.      int timo,
  168.      ck_sighand handler,
  169.      ck_sigfunc dofunc,
  170.      ck_sigfunc failfunc
  171.      )
  172. #else /* Not ANSIC C ... */
  173. alrm_execute(sj_buf,
  174.      timo,
  175.      handler,
  176.      dofunc,
  177.      failfunc
  178.      )
  179.     ckjptr(sj_buf);
  180.     int timo;
  181.     ck_sighand handler;
  182.     ck_sigfunc dofunc;
  183.     ck_sigfunc failfunc;
  184. #endif /* CK_ANSIC */
  185. /* alrm_execute */ {
  186.     int rc = 0;
  187.     int savalrm = 0;
  188. _PROTOTYP(SIGTYP (*savhandler), (int));
  189.     savalrm = alarm(timo);
  190.     savhandler = signal(SIGALRM, handler);
  191. #ifdef NTASM
  192.     sj_buf->retcode = 0 ;
  193.     sj_buf->Id = GetCurrentThreadId();
  194.     memset(&sj_buf->context, 0, sizeof(CONTEXT));
  195.     sj_buf->context.ContextFlags = CONTEXT_FULL;
  196. #ifndef COMMENT
  197.     GetThreadContext(GetCurrentThread(), &(sj_buf->context));
  198. #else
  199.    __asm
  200.    {
  201.       mov eax, dword ptr [sj_buf]
  202.       push eax
  203.       mov eax, 0xfffffffe
  204.       push eax
  205.       mov eax, 0x00000039
  206.       mov edx,esp
  207.       int 0x2e
  208.       pop eax
  209.       pop eax
  210.    }
  211. #endif
  212.     isinterrupted = 0;
  213. #endif /* NTASM */
  214.     if (
  215. #ifdef NTASM
  216.  sj_buf->retcode
  217. #else
  218.  cksetjmp(ckjdref(sj_buf))
  219. #endif /* NTASM */
  220. ) {
  221. (*failfunc)(NULL) ;
  222. rc = -1 ;
  223.     } else {
  224. #ifdef NT
  225.        __try {
  226.           (*dofunc)(NULL) ;
  227.        }
  228.        __except( exception_filter() )
  229.        {
  230.           debug(F100,"alrm_execute __except","",0);
  231.           debug(F111,"exception_filter",
  232. "_exception_code",
  233. GetExceptionCode()
  234. );
  235.           longjmp(ckjdref(sj_buf),SIGINT);
  236.        }
  237. #else /* NT */
  238.        (*dofunc)(NULL) ;
  239. #endif /* NT */
  240.     }
  241.     alarm(savalrm) ;
  242.     if ( savhandler )
  243.         signal( SIGALRM, savhandler ) ;
  244.     return rc ;
  245. }
  246. int
  247. #ifdef CK_ANSIC /* ANSIC C declaration... */
  248. cc_alrm_execute(ckjptr(sj_buf),
  249. int timo,
  250. ck_sighand handler,
  251. ck_sigfunc dofunc,
  252. ck_sigfunc failfunc
  253. )
  254. #else /* Not ANSIC C ... */
  255. cc_alrm_execute(sj_buf,
  256.      timo,
  257.      handler,
  258.      dofunc,
  259.      failfunc
  260.      )
  261.     ckjptr(sj_buf);
  262.     int timo;
  263.     ck_sighand handler;
  264.     ck_sigfunc dofunc;
  265.     ck_sigfunc failfunc;
  266. #endif /* CK_ANSIC */
  267. /* cc_alrm_execute */ {
  268.     int rc = 0;
  269.     int savalrm = 0;
  270. _PROTOTYP(SIGTYP (*savhandler), (int));
  271.     savalrm = alarm(timo);
  272.     savhandler = signal( SIGALRM, handler );
  273. #ifdef NTASM
  274.     sj_buf->retcode = 0 ;
  275.     sj_buf->Id = GetCurrentThreadId() ;
  276.     memset( &sj_buf->context, 0, sizeof(CONTEXT) );
  277.     sj_buf->context.ContextFlags = CONTEXT_FULL ;
  278. #ifndef COMMENT
  279.     GetThreadContext( GetCurrentThread(), &(sj_buf->context) ) ;
  280. #else
  281.    __asm
  282.    {
  283.       mov eax, dword ptr [sj_buf]
  284.       push eax
  285.       mov eax, 0xfffffffe
  286.       push eax
  287.       mov eax, 0x00000039
  288.       mov edx,esp
  289.       int 0x2e
  290.       pop eax
  291.       pop eax
  292.    }
  293. #endif
  294.     isinterrupted = 0;
  295. #endif /* NTASM */
  296.     if (
  297. #ifdef NTASM
  298.  sj_buf->retcode
  299. #else
  300.  cksetjmp(ckjdref(sj_buf))
  301. #endif /* NTASM */
  302. ) {
  303. (*failfunc)(NULL) ;
  304. rc = -1 ;
  305.     } else {
  306. #ifdef NT
  307.        __try {
  308.           (*dofunc)(NULL) ;
  309.        }
  310.        __except( exception_filter() )
  311.        {
  312.    debug(F100,"cc_alrm_execute __except","",0);
  313.    debug(F111,
  314.  "exception_filter",
  315.  "_exception_code",
  316.  GetExceptionCode()
  317.  );
  318.    longjmp(ckjdref(sj_buf),SIGINT) ;
  319.        }
  320. #else /* NT */
  321.        (*dofunc)(NULL) ;
  322. #endif /* NT */
  323.     }
  324.     alarm(savalrm);
  325.     if (savhandler)
  326.       signal(SIGALRM,savhandler);
  327.     return(rc);
  328. }