mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 09:41:44 +00:00
f335397d17
Sysrq operations do not accept tty argument anymore so no need to pass it to us. [Stephen Rothwell <sfr@canb.auug.org.au>: fix build breakage in drm code caused by sysrq using bool but not including linux/types.h] [Sachin Sant <sachinp@in.ibm.com>: fix build breakage in s390 keyboadr driver] Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk> Acked-by: Jason Wessel <jason.wessel@windriver.com> Acked-by: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
74 lines
1.6 KiB
C
74 lines
1.6 KiB
C
/*
|
|
* drivers/s390/char/ctrlchar.c
|
|
* Unified handling of special chars.
|
|
*
|
|
* Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
|
* Author(s): Fritz Elfert <felfert@millenux.com> <elfert@de.ibm.com>
|
|
*
|
|
*/
|
|
|
|
#include <linux/stddef.h>
|
|
#include <asm/errno.h>
|
|
#include <linux/sysrq.h>
|
|
#include <linux/ctype.h>
|
|
|
|
#include "ctrlchar.h"
|
|
|
|
#ifdef CONFIG_MAGIC_SYSRQ
|
|
static int ctrlchar_sysrq_key;
|
|
|
|
static void
|
|
ctrlchar_handle_sysrq(struct work_struct *work)
|
|
{
|
|
handle_sysrq(ctrlchar_sysrq_key);
|
|
}
|
|
|
|
static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq);
|
|
#endif
|
|
|
|
|
|
/**
|
|
* Check for special chars at start of input.
|
|
*
|
|
* @param buf Console input buffer.
|
|
* @param len Length of valid data in buffer.
|
|
* @param tty The tty struct for this console.
|
|
* @return CTRLCHAR_NONE, if nothing matched,
|
|
* CTRLCHAR_SYSRQ, if sysrq was encountered
|
|
* otherwise char to be inserted logically or'ed
|
|
* with CTRLCHAR_CTRL
|
|
*/
|
|
unsigned int
|
|
ctrlchar_handle(const unsigned char *buf, int len, struct tty_struct *tty)
|
|
{
|
|
if ((len < 2) || (len > 3))
|
|
return CTRLCHAR_NONE;
|
|
|
|
/* hat is 0xb1 in codepage 037 (US etc.) and thus */
|
|
/* converted to 0x5e in ascii ('^') */
|
|
if ((buf[0] != '^') && (buf[0] != '\252'))
|
|
return CTRLCHAR_NONE;
|
|
|
|
#ifdef CONFIG_MAGIC_SYSRQ
|
|
/* racy */
|
|
if (len == 3 && buf[1] == '-') {
|
|
ctrlchar_sysrq_key = buf[2];
|
|
schedule_work(&ctrlchar_work);
|
|
return CTRLCHAR_SYSRQ;
|
|
}
|
|
#endif
|
|
|
|
if (len != 2)
|
|
return CTRLCHAR_NONE;
|
|
|
|
switch (tolower(buf[1])) {
|
|
case 'c':
|
|
return INTR_CHAR(tty) | CTRLCHAR_CTRL;
|
|
case 'd':
|
|
return EOF_CHAR(tty) | CTRLCHAR_CTRL;
|
|
case 'z':
|
|
return SUSP_CHAR(tty) | CTRLCHAR_CTRL;
|
|
}
|
|
return CTRLCHAR_NONE;
|
|
}
|