]> granicus.if.org Git - shadow/commitdiff
* libmisc/strtoday.c: Add support for numerical dates, assuming
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Thu, 18 Mar 2010 11:53:49 +0000 (11:53 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Thu, 18 Mar 2010 11:53:49 +0000 (11:53 +0000)
they are already specified in number of days since Epoch. Return
-2 in case of errors to support the specification of -1.
* src/usermod.c, src/useradd.c: Adapt to the new error value of
strtoday().
* src/chage.c:  Remove isnum(). Adapt to the new error value of
strtoday(). Support for numerical dates is moved to strtoday().

ChangeLog
libmisc/strtoday.c
src/chage.c
src/useradd.c
src/usermod.c

index 74e2a991ec2ed9291e55796e398e0d0eb02c83b2..0d46810aa69eb2a0a2441743ed57f4a98e83bae9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2010-03-18  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * libmisc/strtoday.c: Add support for numerical dates, assuming
+       they are already specified in number of days since Epoch. Return
+       -2 in case of errors to support the specification of -1.
+       * src/usermod.c, src/useradd.c: Adapt to the new error value of
+       strtoday().
+       * src/chage.c:  Remove isnum(). Adapt to the new error value of
+       strtoday(). Support for numerical dates is moved to strtoday().
+
 2010-03-18  Nicolas François  <nicolas.francois@centraliens.net>
 
        * man/po/fr.po: Harmonize name of parameters.
index 7abbf108d78a547d712ecb1117f6022e0de3cf12..fe40e00a5ff065e602aac2ec5fa34f24e9812c70 100644 (file)
@@ -36,6 +36,8 @@
 
 #include <config.h>
 
+#include <ctype.h>
+
 #ident "$Id$"
 
 #include "defines.h"
@@ -44,6 +46,7 @@
 #ifndef USE_GETDATE
 #define USE_GETDATE 1
 #endif
+
 #if USE_GETDATE
 #include "getdate.h"
 /*
@@ -63,6 +66,8 @@
 long strtoday (const char *str)
 {
        time_t t;
+       bool isnum = true;
+       const char *s = str;
 
        /*
         * get_date() interprets an empty string as the current date,
@@ -70,12 +75,35 @@ long strtoday (const char *str)
         * (useradd sets sp_expire = current date for new lusers)
         */
        if ((NULL == str) || ('\0' == *str)) {
-               return -1;
+               return -2;
+       }
+
+       /* If a numerical value is provided, this is already a number of
+        * days since EPOCH.
+        */
+       if ('-' == *s) {
+               s++;
+       }
+       while (' ' == *s) {
+               s++;
+       }
+       while (isnum && ('\0' != *s)) {
+               if (!isdigit (*s)) {
+                       isnum = false;
+               }
+               s++;
+       }
+       if (isnum) {
+               long retdate;
+               if (getlong (str, &retdate) == 0) {
+                       return -2;
+               }
+               return retdate;
        }
 
-       t = get_date (str, (time_t *) 0);
+       t = get_date (str, NULL);
        if ((time_t) - 1 == t) {
-               return -1;
+               return -2;
        }
        /* convert seconds to days since 1970-01-01 */
        return (long) (t + DAY / 2) / DAY;
index 238a503c2aba5778b523f2aa9617874483343cb6..c986cb8ecc9b7f13161ba39911dbc356d56cb64f 100644 (file)
@@ -93,7 +93,6 @@ static long expdate;
 #define        EPOCH           "1969-12-31"
 
 /* local function prototypes */
-static bool isnum (const char *s);
 static void usage (int status);
 static void date_to_str (char *buf, size_t maxsize, time_t date);
 static int new_fields (void);
@@ -138,20 +137,6 @@ static void fail_exit (int code)
        exit (code);
 }
 
-/*
- * isnum - determine whether or not a string is a number
- */
-static bool isnum (const char *s)
-{
-       while ('\0' != *s) {
-               if (!isdigit (*s)) {
-                       return false;
-               }
-               s++;
-       }
-       return true;
-}
-
 /*
  * usage - print command line syntax and exit
  */
@@ -226,7 +211,7 @@ static int new_fields (void)
                lstchgdate = -1;
        } else {
                lstchgdate = strtoday (buf);
-               if (lstchgdate == -1) {
+               if (lstchgdate < -1) {
                        return 0;
                }
        }
@@ -254,7 +239,7 @@ static int new_fields (void)
                expdate = -1;
        } else {
                expdate = strtoday (buf);
-               if (expdate == -1) {
+               if (expdate < -1) {
                        return 0;
                }
        }
@@ -409,10 +394,8 @@ static void process_flags (int argc, char **argv)
                switch (c) {
                case 'd':
                        dflg = true;
-                       if (!isnum (optarg)) {
-                               lstchgdate = strtoday (optarg);
-                       } else if (   (getlong (optarg, &lstchgdate) == 0)
-                                  || (lstchgdate < -1)) {
+                       lstchgdate = strtoday (optarg);
+                       if (lstchgdate < -1) {
                                fprintf (stderr,
                                         _("%s: invalid date '%s'\n"),
                                         Prog, optarg);
@@ -421,10 +404,8 @@ static void process_flags (int argc, char **argv)
                        break;
                case 'E':
                        Eflg = true;
-                       if (!isnum (optarg)) {
-                               expdate = strtoday (optarg);
-                       } else if (   (getlong (optarg, &expdate) == 0)
-                                  || (expdate < -1)) {
+                       expdate = strtoday (optarg);
+                       if (expdate < -1) {
                                fprintf (stderr,
                                         _("%s: invalid date '%s'\n"),
                                         Prog, optarg);
index d8cb8fbd837517e08a50a949b1dac56b23a0d3ac..ee656f7c8ece5fd1d261cf7571d8e859695e2a27 100644 (file)
@@ -1041,7 +1041,7 @@ static void process_flags (int argc, char **argv)
                        case 'e':
                                if ('\0' != *optarg) {
                                        user_expire = strtoday (optarg);
-                                       if (user_expire == -1) {
+                                       if (user_expire < -1) {
                                                fprintf (stderr,
                                                         _("%s: invalid date '%s'\n"),
                                                         Prog, optarg);
index bb9f85adb2ee4eda22c8566df193a36556767c6e..b41271773b3cbe351e7b9098fe04d210f9f61838 100644 (file)
@@ -940,7 +940,7 @@ static void process_flags (int argc, char **argv)
                        case 'e':
                                if ('\0' != *optarg) {
                                        user_newexpire = strtoday (optarg);
-                                       if (user_newexpire == -1) {
+                                       if (user_newexpire < -1) {
                                                fprintf (stderr,
                                                         _("%s: invalid date '%s'\n"),
                                                         Prog, optarg);