| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  Unified handling of special chars. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2012-07-20 11:15:04 +02:00
										 |  |  |  *    Copyright IBM Corp. 2001 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  *    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 | 
					
						
							| 
									
										
										
										
											2006-12-08 15:53:52 +01:00
										 |  |  | ctrlchar_handle_sysrq(struct work_struct *work) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-17 21:15:47 -07:00
										 |  |  | 	handle_sysrq(ctrlchar_sysrq_key); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-08 15:53:52 +01:00
										 |  |  | static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #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; | 
					
						
							|  |  |  | } |