ctrlchar.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  drivers/s390/char/ctrlchar.c
  3.  *  Unified handling of special chars.
  4.  *
  5.  *    Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *    Author(s): Fritz Elfert <felfert@millenux.com> <elfert@de.ibm.com>
  7.  *
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/types.h>
  11. #include <linux/tty.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/sysrq.h>
  14. #include <asm/io.h>
  15. #include <asm/uaccess.h>
  16. #include <asm/delay.h>
  17. #include <asm/cpcmd.h>
  18. #include <asm/irq.h>
  19. #ifdef CONFIG_MAGIC_SYSRQ
  20. static int ctrlchar_sysrq_key;
  21. static struct tq_struct ctrlchar_tq;
  22. static void
  23. ctrlchar_handle_sysrq(struct tty_struct *tty) {
  24. handle_sysrq(ctrlchar_sysrq_key, NULL, NULL, tty);
  25. }
  26. #endif
  27. void ctrlchar_init(void) {
  28. #ifdef CONFIG_MAGIC_SYSRQ
  29. static int init_done = 0;
  30. if (init_done++)
  31. return;
  32. INIT_LIST_HEAD(&ctrlchar_tq.list);
  33. ctrlchar_tq.sync = 0;
  34. ctrlchar_tq.routine = (void (*)(void *)) ctrlchar_handle_sysrq;
  35. #endif
  36. }
  37. /**
  38.  * Check for special chars at start of input.
  39.  *
  40.  * @param buf Console input buffer.
  41.  * @param len Length of valid data in buffer.
  42.  * @param tty The tty struct for this console.
  43.  * @return NULL, if nothing matched, (char *)-1, if buffer contents
  44.  *         should be ignored, otherwise pointer to char to be inserted.
  45.  */
  46. char *ctrlchar_handle(const char *buf, int len, struct tty_struct *tty) {
  47. static char ret;
  48. if ((len < 2) || (len > 3))
  49. return NULL;
  50. /* hat is 0xb1 in codepage 037 (US etc.) and thus */
  51. /* converted to 0x5e in ascii ('^') */
  52. if ((buf[0] != '^') && (buf[0] != '252'))
  53. return NULL;
  54. switch (buf[1]) {
  55. #ifdef CONFIG_MAGIC_SYSRQ
  56. case '-':
  57. if (len == 3) {
  58. ctrlchar_sysrq_key = buf[2];
  59. ctrlchar_tq.data = tty;
  60. queue_task(&ctrlchar_tq, &tq_immediate);
  61. mark_bh(IMMEDIATE_BH);
  62. return (char *)-1;
  63. }
  64. break;
  65. #endif
  66. case 'c':
  67. if (len == 2) {
  68. ret = INTR_CHAR(tty);
  69. return &ret;
  70. }
  71. break;
  72. case 'd':
  73. if (len == 2) {
  74. ret = EOF_CHAR(tty);
  75. return &ret;
  76. }
  77. break;
  78. case 'z':
  79. if (len == 2) {
  80. ret = SUSP_CHAR(tty);
  81. return &ret;
  82. }
  83. break;
  84. }
  85. return NULL;
  86. }