tools lib: Update copy of strtobool from the kernel sources
authorArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 20 Jul 2017 18:35:33 +0000 (15:35 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 20 Jul 2017 18:47:33 +0000 (15:47 -0300)
Getting support for "on", "off" introduced in a81a5a17d44b ("lib: add
"on"/"off" support to kstrtobool") and making it check for NULL,
introduced in ef951599074b ("lib: move strtobool() to kstrtobool()").

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Kees Cook <keescook@chromium.org>
Link: http://lkml.kernel.org/n/tip-mu8ghin4rklacmmubzwv8td7@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/string.c

index bd239bc1d557dbde447e8128ac7cd3163dc11a04..a4246f14ded101f2dc61ca04d092b7cebe677632 100644 (file)
@@ -39,27 +39,45 @@ void *memdup(const void *src, size_t len)
  * @s: input string
  * @res: result
  *
- * This routine returns 0 iff the first character is one of 'Yy1Nn0'.
- * Otherwise it will return -EINVAL.  Value pointed to by res is
- * updated upon finding a match.
+ * 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 strtobool(const char *s, bool *res)
 {
+       if (!s)
+               return -EINVAL;
+
        switch (s[0]) {
        case 'y':
        case 'Y':
        case '1':
                *res = true;
-               break;
+               return 0;
        case 'n':
        case 'N':
        case '0':
                *res = false;
-               break;
+               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:
-               return -EINVAL;
+               break;
        }
-       return 0;
+
+       return -EINVAL;
 }
 
 /**