Whamcloud - gitweb
LU-13090 utils: fix lfs_migrate -p for file with pool
[fs/lustre-release.git] / libcfs / libcfs / libcfs_string.c
index cd93921..ee39d23 100644 (file)
@@ -165,26 +165,6 @@ out:
 }
 EXPORT_SYMBOL(cfs_firststr);
 
-char *
-cfs_trimwhite(char *str)
-{
-       char *end;
-
-       while (isspace(*str))
-               str++;
-
-       end = str + strlen(str);
-       while (end > str) {
-               if (!isspace(end[-1]))
-                       break;
-               end--;
-       }
-
-       *end = 0;
-       return str;
-}
-EXPORT_SYMBOL(cfs_trimwhite);
-
 /**
  * Extracts tokens from strings.
  *
@@ -254,17 +234,47 @@ int
 cfs_str2num_check(char *str, int nob, unsigned *num,
                  unsigned min, unsigned max)
 {
-       char    *endp;
-
-       *num = simple_strtoul(str, &endp, 0);
-       if (endp == str)
-               return 0;
+       bool all_numbers = true;
+       char *endp, cache;
+       int len;
+       int rc;
+
+       endp = strim(str);
+       /**
+        * kstrouint can only handle strings composed
+        * of only numbers. We need to scan the string
+        * passed in for the first non-digit character
+        * and end the string at that location. If we
+        * don't find any non-digit character we still
+        * need to place a '\0' at position len since
+        * we are not interested in the rest of the
+        * string which is longer than len in size.
+        * After we are done the character at the
+        * position we placed '\0' must be restored.
+        */
+       len = min((int)strlen(endp), nob);
+       for (; endp < str + len; endp++) {
+               if (!isxdigit(*endp) && *endp != '-' &&
+                   *endp != '+') {
+                       all_numbers = false;
+                       break;
+               }
+       }
 
-       for (; endp < str + nob; endp++) {
-               if (!isspace(*endp))
-                       return 0;
+       /* Eat trailing space */
+       if (!all_numbers && isspace(*endp)) {
+               all_numbers = true;
+               endp--;
        }
 
+       cache = *endp;
+       *endp = '\0';
+
+       rc = kstrtouint(str, 0, num);
+       *endp = cache;
+       if (rc || !all_numbers)
+               return 0;
+
        return (*num >= min && *num <= max);
 }
 EXPORT_SYMBOL(cfs_str2num_check);