⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyserv.c

📁 小型通讯程序的C语言源程序的C语言源程序库
💻 C
字号:
/* * This file is part of the Minicom Communications Program, * written by Miquel van Smoorenburg 1991/1992/1993. * * Keyserv.c	- a process that translates keypresses to *		  ANSI, VT100 or MINIX escape sequences. * * 		  Communications with this process from minicom *		  goes through pipes, file descriptors 3 & 4. */#include <sys/types.h>#include <signal.h>#include <string.h>#if defined (_POSIX_SOURCE) || defined(_BSD43)#  include <unistd.h>#endif#include <setjmp.h>#undef NULL#include <stdio.h>#include "window.h"#include "keyboard.h"#include "minicom.h"#include "vt100.h"/* Emulation modes */#define VT100	1#define MINIX	2#define ANSI	3/* Pipe file descriptors */#define from_minicom 3#define to_minicom   4/* Set modes to normal */int keypadmode = NORMAL;int cursormode = NORMAL;char *_tptr = CNULL;		/* Pointer to termcap information */int mode = VT100;		/* Emulation mode selector */int parent;			/* Process ID of minicom */jmp_buf mainloop;		/* To jump to after a 'HELLO' signal */char **escseq;			/* Translation table to use */static int argument;		/* Argument to 'HELLO' command */static int esc_char = 1;	/* Escape character (initially ^A) */static int bs_code = 8;		/* Code that backspace key sends */extern int pendingkeys;		/* From wkeys.c */char *st_vtesc[] = {  "", "\033OP", "\033OQ", "\033OR", "\033OS", "", "", "", "", "", "",  "\033[H", "", "\033[A", "\033[D", "\033[C", "\033[B", "\033[K", "",  "", "\177" };char *app_vtesc[] = {  "", "\033OP", "\033OQ", "\033OR", "\033OS", "", "", "", "", "", "",  "\033[H", "", "\033OA", "\033OD", "\033OC", "\033OB", "\033[K", "",  "", "\177" };char *minixesc[] = {  "", "\033OP", "\033OQ", "\033OR", "\033OS", "\033OT", "\033OU", "\033OV",  "\033OW", "\033OX", "\033OY", "\033[H", "\033[V", "\033[A", "\033[D",  "\033[C", "\033[B", "\033[Y", "\033[U", "0", "\177" };char *ansiesc[] = {  "", "\033OP", "\033OQ", "\033OR", "\033OS", "\033OT", "\033OU", "\033OV",  "\033OW", "\033OX", "\033OY", "\033[H", "\033[V", "\033[A", "\033[D",  "\033[C", "\033[B", "\033[Y", "\033[U", "0", "\177" };/* * We got a signal. This means that there is some information for us. * Read it, and jump to the main loop. *//*ARGSUSED*/void handler(dummy)int dummy;{  unsigned char buf[8];  int n;  signal(HELLO, handler);  n = read(from_minicom, buf, 8);  if (n <= 0) {  	n = 2;  	buf[0] = 0;  }  if (n % 2 == 1) {	n++;	read(from_minicom, buf + n, 1);  }  argument = buf[n-1];  longjmp(mainloop, (int)buf[n - 2]);}/* * Send a string to the modem */void sendstr(s)char *s;{  write(1, s, strlen(s));}/* * Main program of keyserv. */int main(argc, argv)int argc;char **argv;{  int c;  char ch;  int f, fun;  int stopped = 0;#ifdef _COH3  parent = atoi(argv[1]);#else  parent = getppid();#endif    /* Initialize signal handlers */  signal(SIGHUP, SIG_IGN);  signal(SIGQUIT, SIG_IGN);  signal(SIGINT, SIG_IGN);#ifdef SIGTSTP  signal(SIGTSTP, SIG_IGN);  signal(SIGTTIN, SIG_IGN);  signal(SIGTTOU, SIG_IGN);#endif  signal(HELLO, handler);  /* Set up escape sequence table */  escseq = st_vtesc;  /* Cbreak, no echo (minicom itself sets to raw if needed) */  (void) setcbreak(1);  if ((fun = setjmp(mainloop)) != 0) {  	switch(fun) {  	/* We come here after minicom has told us something */  	case KVT100: /* VT100 keyboard */		mode = VT100;		escseq = st_vtesc;		break;	case KANSI:  /* ANSI keyboard */		mode = ANSI;		escseq = ansiesc;		break;	case KMINIX: /* MINIX keyboard */		mode = MINIX;		escseq = minixesc;		break;	case KKPST: /* Keypad in standard mode, not used */		keypadmode = NORMAL; 		break;	case KKPAPP: /* Keypad in applications mode, not used */		keypadmode = APPL;		break;	case KCURST: /* Standard cursor keys */		cursormode = NORMAL;		if (mode == VT100)			escseq = st_vtesc;		break;	case KCURAPP: /* cursor keys in applications mode */		cursormode = APPL;		if (mode == VT100)			escseq = app_vtesc;		break;	case KSTOP:  /* Sleep until further notice */		stopped = 1;		break;	case KSIGIO: /* Wait for keypress and tell parent */		kill(parent, ACK);		f = read(0, &ch, 1);		if (f == 1) {			write(to_minicom, &ch, 1);			(void) kill(parent, HELLO);		}		break;	case KSTART: /* Restart when stopped */		stopped  = 0;		break;	case KSETBS: /* Set code that BS key sends */		bs_code = argument;		break;	case KSETESC: /* Set escape character */		esc_char = argument;		break;	default:		break;    }    if (fun != KSIGIO) {	kill(parent, ACK);    }  }  /* Wait if stopped */  if (stopped) pause();  /* Main loop: read keyboard, send to modem */  while(1) {  	c = getch();  	if (c > 256 && c < 256 + NUM_KEYS) {  		sendstr(escseq[c - 256]);  	}  	if (c < 256) {  		if (c == K_ERA) c = bs_code;  		ch = c;  		/* Test for escape characters */  		if (c == esc_char || (esc_char == 128 && c > 128)) { 			/* If we typed too fast, and the escape sequence			 * was not that of a function key, the next key			 * is already in the buffer.			 */			if (c == esc_char && pendingkeys > 0) {				ch = getch();			}  			write(to_minicom, &ch, 1);  			(void) kill(parent, HELLO);  		} else {  			write(1, &ch, 1);  		}  	}  }  /*NOTREACHED*/  return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -