keyserv.c
上传用户:tianjinjs
上传日期:2007-01-05
资源大小:309k
文件大小:5k
源码类别:

Modem编程

开发平台:

Unix_Linux

  1. /*
  2.  * Keyserv.c A process that translates keypresses to
  3.  * ANSI or VT102 escape sequences.
  4.  *  Communications with this process from minicom
  5.  * goes through pipes, file descriptors 3 & 4.
  6.  *
  7.  * This file is part of the minicom communications package,
  8.  * Copyright 1991-1995 Miquel van Smoorenburg.
  9.  *
  10.  * This program is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU General Public License
  12.  * as published by the Free Software Foundation; either version
  13.  * 2 of the License, or (at your option) any later version.
  14.  */
  15. #include "port.h"
  16. #include "minicom.h"
  17. /* Emulation modes */
  18. #define EVT100 1
  19. #define EANSI 2
  20. /* Pipe file descriptors */
  21. #define from_minicom 3
  22. #define to_minicom   4
  23. /* Set modes to normal */
  24. int keypadmode = NORMAL;
  25. int cursormode = NORMAL;
  26. char *_tptr = (char *)NULL; /* Pointer to termcap information */
  27. int mode = EVT100; /* Emulation mode selector */
  28. int parent; /* Process ID of minicom */
  29. jmp_buf mainloop; /* To jump to after a 'HELLO' signal */
  30. char **escseq; /* Translation table to use */
  31. static int argument; /* Argument to 'HELLO' command */
  32. static int esc_char = 1; /* Escape character (initially ^A) */
  33. static int bs_code = 8; /* Code that backspace key sends */
  34. extern int pendingkeys; /* From wkeys.c */
  35. char *st_vtesc[] = {
  36.   "", "33OP", "33OQ", "33OR", "33OS", "", "", "", "", "", "",
  37.   "33[H", "", "33[A", "33[D", "33[C", "33[B", "33[K", "",
  38.   "", "177" };
  39. char *app_vtesc[] = {
  40.   "", "33OP", "33OQ", "33OR", "33OS", "", "", "", "", "", "",
  41.   "33[H", "", "33OA", "33OD", "33OC", "33OB", "33[K", "",
  42.   "", "177" };
  43. char *ansiesc[] = {
  44.   "", "33OP", "33OQ", "33OR", "33OS", "33OT", "33OU", "33OV",
  45.   "33OW", "33OX", "33OY", "33[H", "33[V", "33[A", "33[D",
  46.   "33[C", "33[B", "33[Y", "33[U", "0", "177" };
  47. /*
  48.  * We got a signal. This means that there is some information for us.
  49.  * Read it, and jump to the main loop.
  50.  */
  51. /*ARGSUSED*/
  52. void handler(dummy)
  53. int dummy;
  54. {
  55.   unsigned char buf[8];
  56.   int n;
  57.   signal(HELLO, handler);
  58.   n = read(from_minicom, buf, 8);
  59.   if (n <= 0) {
  60.    n = 2;
  61.    buf[0] = 0;
  62.   }
  63.   if (n % 2 == 1) {
  64. n++;
  65. read(from_minicom, buf + n, 1);
  66.   }
  67.   argument = buf[n-1];
  68.   longjmp(mainloop, (int)buf[n - 2]);
  69. }
  70. /*
  71.  * Send a string to the modem
  72.  */
  73. void sendstr(s)
  74. char *s;
  75. {
  76.   write(1, s, strlen(s));
  77. }
  78. /*
  79.  * Main program of keyserv.
  80.  */
  81. int main(argc, argv)
  82. int argc;
  83. char **argv;
  84. {
  85.   int c;
  86.   char ch;
  87.   int f, fun;
  88.   int stopped = 0;
  89.   parent = atoi(argv[1]);
  90.   
  91.   /* Initialize signal handlers */
  92.   /* signal(SIGHUP, SIG_IGN); */
  93.   signal(SIGQUIT, SIG_IGN);
  94.   signal(SIGINT, SIG_IGN);
  95. #ifdef SIGTSTP
  96.   signal(SIGTSTP, SIG_IGN);
  97.   signal(SIGTTIN, SIG_IGN);
  98.   signal(SIGTTOU, SIG_IGN);
  99. #endif
  100.   signal(HELLO, handler);
  101.   /* Set up escape sequence table */
  102.   escseq = st_vtesc;
  103.   /* Cbreak, no echo (minicom itself sets to raw if needed) */
  104.   (void) setcbreak(1);
  105.   if ((fun = setjmp(mainloop)) != 0) {
  106.    switch(fun) {
  107.    /* We come here after minicom has told us something */
  108.    case KVT100: /* VT100 keyboard */
  109. mode = EVT100;
  110. escseq = st_vtesc;
  111. break;
  112. case KANSI:  /* ANSI keyboard */
  113. mode = EANSI;
  114. escseq = ansiesc;
  115. break;
  116. case KKPST: /* Keypad in standard mode, not used */
  117. keypadmode = NORMAL; 
  118. break;
  119. case KKPAPP: /* Keypad in applications mode, not used */
  120. keypadmode = APPL;
  121. break;
  122. case KCURST: /* Standard cursor keys */
  123. cursormode = NORMAL;
  124. if (mode == EVT100)
  125. escseq = st_vtesc;
  126. break;
  127. case KCURAPP: /* cursor keys in applications mode */
  128. cursormode = APPL;
  129. if (mode == EVT100)
  130. escseq = app_vtesc;
  131. break;
  132. case KSTOP:  /* Sleep until further notice */
  133. stopped = 1;
  134. break;
  135. case KSIGIO: /* Wait for keypress and tell parent */
  136. kill(parent, ACK);
  137. f = read(0, &ch, 1);
  138. if (f == 1) {
  139. write(to_minicom, &ch, 1);
  140. (void) kill(parent, HELLO);
  141. }
  142. break;
  143. case KSTART: /* Restart when stopped */
  144. stopped  = 0;
  145. break;
  146. case KSETBS: /* Set code that BS key sends */
  147. bs_code = argument;
  148. break;
  149. case KSETESC: /* Set escape character */
  150. esc_char = argument;
  151. break;
  152. default:
  153. break;
  154.     }
  155.     if (fun != KSIGIO) {
  156. kill(parent, ACK);
  157.     }
  158.   }
  159.   /* Wait if stopped */
  160.   if (stopped) pause();
  161.   /* Main loop: read keyboard, send to modem */
  162.   while(1) {
  163.    c = wxgetch();
  164.    if (c > 256 && c < 256 + NUM_KEYS) {
  165.    sendstr(escseq[c - 256]);
  166.    }
  167.    if (c < 256) {
  168.    if (c == K_ERA) c = bs_code;
  169.    ch = c;
  170.    /* Test for escape characters */
  171.    if (c == esc_char || (esc_char == 128 && c > 128)) { 
  172. /* If we typed too fast, and the escape sequence
  173.  * was not that of a function key, the next key
  174.  * is already in the buffer.
  175.  */
  176. if (c == esc_char && pendingkeys > 0) {
  177. ch = wxgetch();
  178. }
  179.    write(to_minicom, &ch, 1);
  180.    (void) kill(parent, HELLO);
  181.    } else {
  182.    write(1, &ch, 1);
  183.    }
  184.    }
  185.   }
  186.   /*NOTREACHED*/
  187.   return(0);
  188. }