forked from mirrors/linux
		
	 16c7fa0582
			
		
	
	
		16c7fa0582
		
	
	
	
	
		
			
			There are several places in kernel where modules unescapes input to convert C-Style Escape Sequences into byte codes. The patch provides generic implementation of such approach. Test cases are also included into the patch. [akpm@linux-foundation.org: clarify comment] [akpm@linux-foundation.org: export get_random_int() to modules] Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: Samuel Thibault <samuel.thibault@ens-lyon.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Jason Baron <jbaron@redhat.com> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: William Hubbs <w.d.hubbs@gmail.com> Cc: Chris Brannon <chris@the-brannons.com> Cc: Kirk Reiser <kirk@braille.uwo.ca> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _LINUX_STRING_HELPERS_H_
 | |
| #define _LINUX_STRING_HELPERS_H_
 | |
| 
 | |
| #include <linux/types.h>
 | |
| 
 | |
| /* Descriptions of the types of units to
 | |
|  * print in */
 | |
| enum string_size_units {
 | |
| 	STRING_UNITS_10,	/* use powers of 10^3 (standard SI) */
 | |
| 	STRING_UNITS_2,		/* use binary powers of 2^10 */
 | |
| };
 | |
| 
 | |
| int string_get_size(u64 size, enum string_size_units units,
 | |
| 		    char *buf, int len);
 | |
| 
 | |
| #define UNESCAPE_SPACE		0x01
 | |
| #define UNESCAPE_OCTAL		0x02
 | |
| #define UNESCAPE_HEX		0x04
 | |
| #define UNESCAPE_SPECIAL	0x08
 | |
| #define UNESCAPE_ANY		\
 | |
| 	(UNESCAPE_SPACE | UNESCAPE_OCTAL | UNESCAPE_HEX | UNESCAPE_SPECIAL)
 | |
| 
 | |
| /**
 | |
|  * string_unescape - unquote characters in the given string
 | |
|  * @src:	source buffer (escaped)
 | |
|  * @dst:	destination buffer (unescaped)
 | |
|  * @size:	size of the destination buffer (0 to unlimit)
 | |
|  * @flags:	combination of the flags (bitwise OR):
 | |
|  *	%UNESCAPE_SPACE:
 | |
|  *		'\f' - form feed
 | |
|  *		'\n' - new line
 | |
|  *		'\r' - carriage return
 | |
|  *		'\t' - horizontal tab
 | |
|  *		'\v' - vertical tab
 | |
|  *	%UNESCAPE_OCTAL:
 | |
|  *		'\NNN' - byte with octal value NNN (1 to 3 digits)
 | |
|  *	%UNESCAPE_HEX:
 | |
|  *		'\xHH' - byte with hexadecimal value HH (1 to 2 digits)
 | |
|  *	%UNESCAPE_SPECIAL:
 | |
|  *		'\"' - double quote
 | |
|  *		'\\' - backslash
 | |
|  *		'\a' - alert (BEL)
 | |
|  *		'\e' - escape
 | |
|  *	%UNESCAPE_ANY:
 | |
|  *		all previous together
 | |
|  *
 | |
|  * Returns amount of characters processed to the destination buffer excluding
 | |
|  * trailing '\0'.
 | |
|  *
 | |
|  * Because the size of the output will be the same as or less than the size of
 | |
|  * the input, the transformation may be performed in place.
 | |
|  *
 | |
|  * Caller must provide valid source and destination pointers. Be aware that
 | |
|  * destination buffer will always be NULL-terminated. Source string must be
 | |
|  * NULL-terminated as well.
 | |
|  */
 | |
| int string_unescape(char *src, char *dst, size_t size, unsigned int flags);
 | |
| 
 | |
| static inline int string_unescape_inplace(char *buf, unsigned int flags)
 | |
| {
 | |
| 	return string_unescape(buf, buf, 0, flags);
 | |
| }
 | |
| 
 | |
| static inline int string_unescape_any(char *src, char *dst, size_t size)
 | |
| {
 | |
| 	return string_unescape(src, dst, size, UNESCAPE_ANY);
 | |
| }
 | |
| 
 | |
| static inline int string_unescape_any_inplace(char *buf)
 | |
| {
 | |
| 	return string_unescape_any(buf, buf, 0);
 | |
| }
 | |
| 
 | |
| #endif
 |