]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 <[email protected]> <[email protected]> | |
7 | * | |
8 | */ | |
9 | ||
1da177e4 LT |
10 | #include <linux/stddef.h> |
11 | #include <asm/errno.h> | |
12 | #include <linux/sysrq.h> | |
13 | #include <linux/ctype.h> | |
14 | ||
15 | #include "ctrlchar.h" | |
16 | ||
17 | #ifdef CONFIG_MAGIC_SYSRQ | |
18 | static int ctrlchar_sysrq_key; | |
19 | ||
20 | static void | |
e45ccc05 | 21 | ctrlchar_handle_sysrq(struct work_struct *work) |
1da177e4 | 22 | { |
f335397d | 23 | handle_sysrq(ctrlchar_sysrq_key); |
1da177e4 LT |
24 | } |
25 | ||
e45ccc05 | 26 | static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq); |
1da177e4 LT |
27 | #endif |
28 | ||
29 | ||
30 | /** | |
31 | * Check for special chars at start of input. | |
32 | * | |
33 | * @param buf Console input buffer. | |
34 | * @param len Length of valid data in buffer. | |
35 | * @param tty The tty struct for this console. | |
36 | * @return CTRLCHAR_NONE, if nothing matched, | |
37 | * CTRLCHAR_SYSRQ, if sysrq was encountered | |
38 | * otherwise char to be inserted logically or'ed | |
39 | * with CTRLCHAR_CTRL | |
40 | */ | |
41 | unsigned int | |
42 | ctrlchar_handle(const unsigned char *buf, int len, struct tty_struct *tty) | |
43 | { | |
44 | if ((len < 2) || (len > 3)) | |
45 | return CTRLCHAR_NONE; | |
46 | ||
47 | /* hat is 0xb1 in codepage 037 (US etc.) and thus */ | |
48 | /* converted to 0x5e in ascii ('^') */ | |
49 | if ((buf[0] != '^') && (buf[0] != '\252')) | |
50 | return CTRLCHAR_NONE; | |
51 | ||
52 | #ifdef CONFIG_MAGIC_SYSRQ | |
53 | /* racy */ | |
54 | if (len == 3 && buf[1] == '-') { | |
55 | ctrlchar_sysrq_key = buf[2]; | |
1da177e4 LT |
56 | schedule_work(&ctrlchar_work); |
57 | return CTRLCHAR_SYSRQ; | |
58 | } | |
59 | #endif | |
60 | ||
61 | if (len != 2) | |
62 | return CTRLCHAR_NONE; | |
63 | ||
64 | switch (tolower(buf[1])) { | |
65 | case 'c': | |
66 | return INTR_CHAR(tty) | CTRLCHAR_CTRL; | |
67 | case 'd': | |
68 | return EOF_CHAR(tty) | CTRLCHAR_CTRL; | |
69 | case 'z': | |
70 | return SUSP_CHAR(tty) | CTRLCHAR_CTRL; | |
71 | } | |
72 | return CTRLCHAR_NONE; | |
73 | } |