| /* |
| * 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); |
| |
| /** |
| * match_string - matches given string in an array |
| * @array: array of strings |
| * @n: number of strings in the array or -1 for NULL terminated arrays |
| * @string: string to match with |
| * |
| * Return: |
| * index of a @string in the @array if matches, or %-EINVAL otherwise. |
| */ |
| int match_string(const char * const *array, size_t n, const char *string) |
| { |
| int index; |
| const char *item; |
| |
| for (index = 0; index < n; index++) { |
| item = array[index]; |
| if (!item) |
| break; |
| if (!strcmp(item, string)) |
| return index; |
| } |
| |
| return -EINVAL; |
| } |
| EXPORT_SYMBOL(match_string); |