a53c8fab3f
Remove the file name from the comment at top of many files. In most cases the file name was wrong anyway, so it's rather pointless. Also unify the IBM copyright statement. We did have a lot of sightly different statements and wanted to change them one after another whenever a file gets touched. However that never happened. Instead people start to take the old/"wrong" statements to use as a template for new files. So unify all of them in one go. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
73 lines
1.6 KiB
C
73 lines
1.6 KiB
C
/*
|
|
* Unified handling of special chars.
|
|
*
|
|
* Copyright IBM Corp. 2001
|
|
* 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;
|
|
}
|