diff options
Diffstat (limited to 'lib/kstrtox.c')
| -rw-r--r-- | lib/kstrtox.c | 64 | 
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/kstrtox.c b/lib/kstrtox.c index 94be244e8441..d8a5cf66c316 100644 --- a/lib/kstrtox.c +++ b/lib/kstrtox.c @@ -321,6 +321,70 @@ int kstrtos8(const char *s, unsigned int base, s8 *res)  }  EXPORT_SYMBOL(kstrtos8); +/** + * kstrtobool - convert common user inputs into boolean values + * @s: input string + * @res: result + * + * This routine returns 0 iff the first character is one of 'Yy1Nn0', or + * [oO][NnFf] for "on" and "off". Otherwise it will return -EINVAL.  Value + * pointed to by res is updated upon finding a match. + */ +int kstrtobool(const char *s, bool *res) +{ +	if (!s) +		return -EINVAL; + +	switch (s[0]) { +	case 'y': +	case 'Y': +	case '1': +		*res = true; +		return 0; +	case 'n': +	case 'N': +	case '0': +		*res = false; +		return 0; +	case 'o': +	case 'O': +		switch (s[1]) { +		case 'n': +		case 'N': +			*res = true; +			return 0; +		case 'f': +		case 'F': +			*res = false; +			return 0; +		default: +			break; +		} +	default: +		break; +	} + +	return -EINVAL; +} +EXPORT_SYMBOL(kstrtobool); + +/* + * Since "base" would be a nonsense argument, this open-codes the + * _from_user helper instead of using the helper macro below. + */ +int kstrtobool_from_user(const char __user *s, size_t count, bool *res) +{ +	/* Longest string needed to differentiate, newline, terminator */ +	char buf[4]; + +	count = min(count, sizeof(buf) - 1); +	if (copy_from_user(buf, s, count)) +		return -EFAULT; +	buf[count] = '\0'; +	return kstrtobool(buf, res); +} +EXPORT_SYMBOL(kstrtobool_from_user); +  #define kstrto_from_user(f, g, type)					\  int f(const char __user *s, size_t count, unsigned int base, type *res)	\  {									\  | 
