| /* |
| * Copyright(c) 2016 Hauke Mehrtens <hauke@hauke-m.de> |
| * |
| * Backport functionality introduced in Linux 4.6. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| */ |
| |
| #include <linux/kernel.h> |
| #include <linux/uaccess.h> |
| #include <linux/export.h> |
| |
| /** |
| * 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_GPL(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_GPL(kstrtobool_from_user); |