- drats.
[oweals/busybox.git] / libbb / xgetlarg.c
index 598b0b3d6fb21d235dc8fc71eed7154d582ab19d..893cd28133e9dd55b10e9676b2bf62e5f0664bd7 100644 (file)
@@ -1,6 +1,8 @@
 /* vi: set sw=4 ts=4: */
 /*
- * Copyright (C) 2003 Erik Andersen <andersee@debian.org>
+ * Copyright (C) 2003-2004 Erik Andersen <andersen@codepoet.org>
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
 
 #include <getopt.h>
 #include <errno.h>
 #include <assert.h>
+#include <ctype.h>
 
-#include "busybox.h"
+#include "libbb.h"
 
-extern long bb_xgetlarg(char *arg, int base, long lower, long upper)
+long bb_xgetlarg(const char *arg, int base, long lower, long upper)
 {
        long result;
        char *endptr;
        int errno_save = errno;
 
        assert(arg!=NULL);
+
+       /* Don't allow leading whitespace.
+        * Wrap isspace in () to make sure we call the
+        * function rather than the macro. */
+       if ((isspace)(*arg)) {
+               bb_show_usage();
+       }
+
        errno = 0;
        result = strtol(arg, &endptr, base);
-       if (errno != 0 || *endptr!='\0' || result < lower || result > upper)
-               show_usage();
+       if (errno != 0 || *endptr!='\0' || endptr==arg || result < lower || result > upper)
+               bb_show_usage();
        errno = errno_save;
        return result;
 }