📄 ckusig.c
字号:
/* C K U S I G -- Kermit signal handling for Unix and OS/2 systems *//* Author: Jeffrey Altman (jaltman@columbia.edu), Columbia University Academic Information Systems, New York City. Copyright (C) 1985, 1996, Trustees of Columbia University in the City of New York. The C-Kermit software may not be, in whole or in part, licensed or sold for profit as a software product itself, nor may it be included in or distributed with commercial products or otherwise distributed by commercial concerns to their clients or customers without written permission of the Office of Kermit Development and Distribution, Columbia University. This copyright notice must not be removed, altered, or obscured.*/#include "ckcsym.h"#include "ckcasc.h" /* ASCII character symbols */#include "ckcdeb.h" /* Debug & other symbols */#include "ckcker.h" /* Kermit symbols */#include "ckcnet.h" /* Network symbols */#ifndef NOSPL#include "ckuusr.h"#endif /* NOSPL */#include <signal.h>#ifdef NT#include <setjmpex.h>#include <excpt.h>#else /* NT */#include <setjmp.h>#endif /* NT */#include "ckcsig.h"#ifdef NOCCTRAPextern ckjmpbuf cmjbuf;#endif /* NOCCTRAP */#ifdef MAC#define signal msignal#define SIGTYP long#define alarm malarm#define SIG_IGN 0#define SIGALRM 1#define SIGINT 2SIGTYP (*msignal(int type, SIGTYP (*func)(int)))(int);#endif /* MAC */#ifdef AMIGA#define signal asignal#define alarm aarlarm#define SIGALRM (_NUMSIG+1)#define SIGTYP voidSIGTYP (*asignal(int type, SIGTYP (*func)(int)))(int);unsigned aalarm(unsigned);#endif /* AMIGA */#ifdef NTASMDWORDckgetIP(void){ __asm { mov eax, dword ptr [esp+0x10] jmp ckgetIP + 0x18 } return 1;}#endif /* NTASM */#ifdef NTDWORDexception_filter( void ) { GetExceptionInformation ; return( EXCEPTION_EXECUTE_HANDLER ) ;}voidcrash( void ) { int x = 0, y = 0 ; x / y ;}#endif /* NT */#ifndef NOCCTRAPint#ifdef CK_ANSICcc_execute( ckjptr(sj_buf), ck_sigfunc dofunc, ck_sigfunc failfunc ) #elsecc_execute( sj_buf, dofunc, failfunc) ckjptr(sj_buf); ck_sigfunc dofunc; ck_sigfunc failfunc;#endif /* CK_ANSIC *//* cc_execute */ { int rc = 0 ;#ifdef NTASM DWORD Eip, Esp ; isinterrupted = 0; sj_buf->retcode = 0 ; sj_buf->Id = GetCurrentThreadId() ; memset( &sj_buf->context, 0, sizeof(CONTEXT) ); sj_buf->context.ContextFlags = CONTEXT_FULL ;#ifndef COMMENT GetThreadContext(GetCurrentThread(), &(sj_buf->context) ) ; __asm { mov ecx,dword ptr [sj_buf] mov dword ptr [ecx+0xc4],esp } sj_buf->context.EFlags = 530 ; sj_buf->context.Eip = ckgetIP()+0x0C ;#else /* COMMENT */ __asm { mov eax, dword ptr [sj_buf] push eax mov eax, 0xfffffffe push eax mov eax, 0x00000039 mov edx,esp int 0x2e pop eax pop eax }#endif /* COMMENT */#endif /* NTASM */ if (#ifdef NTASM isinterrupted#else cksetjmp(ckjdref(sj_buf))#endif /* NTASM */ ) {#ifdef NTASM __asm { mov esp, ESPToRestore } isinterrupted = 0 ;#endif /* NTASM */ (*failfunc)(NULL) ;#ifdef NTASM rc = sj_buf->retcode ;#else /* NTASM */ rc = -1 ;#endif /* NTASM */ } else { #ifdef NT __try { (*dofunc)(NULL) ; } __except( exception_filter() ) { debug(F100,"cc_execute __except","",0); debug(F111,"exception_filter","_exception_code", GetExceptionCode() ) ; longjmp(ckjdref(sj_buf),SIGINT) ; }#else /* NT */ (*dofunc)(NULL) ;#endif /* NT */ } return rc ;}#endif /* NOCCTRAP */int#ifdef CK_ANSIC /* ANSIC C declaration... */alrm_execute(ckjptr(sj_buf), int timo, ck_sighand handler, ck_sigfunc dofunc, ck_sigfunc failfunc ) #else /* Not ANSIC C ... */alrm_execute(sj_buf, timo, handler, dofunc, failfunc ) ckjptr(sj_buf); int timo; ck_sighand handler; ck_sigfunc dofunc; ck_sigfunc failfunc;#endif /* CK_ANSIC *//* alrm_execute */ { int rc = 0; int savalrm = 0;_PROTOTYP(SIGTYP (*savhandler), (int)); savalrm = alarm(timo); savhandler = signal(SIGALRM, handler);#ifdef NTASM sj_buf->retcode = 0 ; sj_buf->Id = GetCurrentThreadId(); memset(&sj_buf->context, 0, sizeof(CONTEXT)); sj_buf->context.ContextFlags = CONTEXT_FULL;#ifndef COMMENT GetThreadContext(GetCurrentThread(), &(sj_buf->context));#else __asm { mov eax, dword ptr [sj_buf] push eax mov eax, 0xfffffffe push eax mov eax, 0x00000039 mov edx,esp int 0x2e pop eax pop eax }#endif isinterrupted = 0;#endif /* NTASM */ if (#ifdef NTASM sj_buf->retcode#else cksetjmp(ckjdref(sj_buf))#endif /* NTASM */ ) { (*failfunc)(NULL) ; rc = -1 ; } else { #ifdef NT __try { (*dofunc)(NULL) ; } __except( exception_filter() ) { debug(F100,"alrm_execute __except","",0); debug(F111,"exception_filter","_exception_code", GetExceptionCode() ) ; longjmp(ckjdref(sj_buf),SIGINT) ; }#else /* NT */ (*dofunc)(NULL) ;#endif /* NT */ } alarm(savalrm) ; if ( savhandler ) signal( SIGALRM, savhandler ) ; return rc ;}int#ifdef CK_ANSIC /* ANSIC C declaration... */cc_alrm_execute(ckjptr(sj_buf), int timo, ck_sighand handler, ck_sigfunc dofunc, ck_sigfunc failfunc ) #else /* Not ANSIC C ... */cc_alrm_execute(sj_buf, timo, handler, dofunc, failfunc ) ckjptr(sj_buf); int timo; ck_sighand handler; ck_sigfunc dofunc; ck_sigfunc failfunc;#endif /* CK_ANSIC *//* cc_alrm_execute */ { int rc = 0; int savalrm = 0;_PROTOTYP(SIGTYP (*savhandler), (int)); savalrm = alarm(timo); savhandler = signal( SIGALRM, handler );#ifdef NTASM sj_buf->retcode = 0 ; sj_buf->Id = GetCurrentThreadId() ; memset( &sj_buf->context, 0, sizeof(CONTEXT) ); sj_buf->context.ContextFlags = CONTEXT_FULL ;#ifndef COMMENT GetThreadContext( GetCurrentThread(), &(sj_buf->context) ) ;#else __asm { mov eax, dword ptr [sj_buf] push eax mov eax, 0xfffffffe push eax mov eax, 0x00000039 mov edx,esp int 0x2e pop eax pop eax }#endif isinterrupted = 0;#endif /* NTASM */ if (#ifdef NTASM sj_buf->retcode#else cksetjmp(ckjdref(sj_buf))#endif /* NTASM */ ) { (*failfunc)(NULL) ; rc = -1 ; } else { #ifdef NT __try { (*dofunc)(NULL) ; } __except( exception_filter() ) { debug(F100,"cc_alrm_execute __except","",0); debug(F111,"exception_filter","_exception_code", GetExceptionCode() ) ; longjmp(ckjdref(sj_buf),SIGINT) ; }#else /* NT */ (*dofunc)(NULL) ;#endif /* NT */ } alarm(savalrm) ; if ( savhandler ) signal( SIGALRM, savhandler ) ; return rc ;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -