Andreas Thienemann b41752
This patch should resolve some problems with handling of am/pm
Andreas Thienemann b41752
in schedules as reported by bug #808.
Andreas Thienemann b41752
Andreas Thienemann b41752
According to the NIST (US National Institute of Standards and Technology),
Andreas Thienemann b41752
12am and 12pm are ambiguous and can be defined to anything.  However,
Andreas Thienemann b41752
12:01am is the same as 00:01 and 12:01pm is the same as 12:01, so Bacula
Andreas Thienemann b41752
defines 12am as 00:00 (midnight) and 12pm as 12:00 (noon).  You can avoid
Andreas Thienemann b41752
this abiguity (confusion) by using 24 hour time specifications (i.e.  no
Andreas Thienemann b41752
am/pm). This is the definition in Bacula version 2.0.3 and later.
Andreas Thienemann b41752
Andreas Thienemann b41752
Apply it to version 2.0.3 with:
Andreas Thienemann b41752
Andreas Thienemann b41752
  cd <bacula-source>
Andreas Thienemann b41752
  patch -p0 <2.0.3-ampm.patch
Andreas Thienemann b41752
  make
Andreas Thienemann b41752
  ...
Andreas Thienemann b41752
  make install
Andreas Thienemann b41752
Andreas Thienemann b41752
Index: src/dird/run_conf.c
Andreas Thienemann b41752
===================================================================
Andreas Thienemann b41752
--- src/dird/run_conf.c	(revision 4349)
Andreas Thienemann b41752
+++ src/dird/run_conf.c	(working copy)
Andreas Thienemann b41752
@@ -339,6 +339,7 @@
Andreas Thienemann b41752
    for ( ; token != T_EOL; (token = lex_get_token(lc, T_ALL))) {
Andreas Thienemann b41752
       int len; 
Andreas Thienemann b41752
       bool pm = false;
Andreas Thienemann b41752
+      bool am = false;
Andreas Thienemann b41752
       switch (token) {
Andreas Thienemann b41752
       case T_NUMBER:
Andreas Thienemann b41752
          state = s_mday;
Andreas Thienemann b41752
@@ -434,6 +435,7 @@
Andreas Thienemann b41752
          if (!have_hour) {
Andreas Thienemann b41752
             clear_bits(0, 23, lrun.hour);
Andreas Thienemann b41752
          }
Andreas Thienemann b41752
+//       Dmsg1(000, "s_time=%s\n", lc->str);
Andreas Thienemann b41752
          p = strchr(lc->str, ':');
Andreas Thienemann b41752
          if (!p)  {
Andreas Thienemann b41752
             scan_err0(lc, _("Time logic error.\n"));
Andreas Thienemann b41752
@@ -441,20 +443,19 @@
Andreas Thienemann b41752
          }
Andreas Thienemann b41752
          *p++ = 0;                 /* separate two halves */
Andreas Thienemann b41752
          code = atoi(lc->str);     /* pick up hour */
Andreas Thienemann b41752
+         code2 = atoi(p);          /* pick up minutes */
Andreas Thienemann b41752
          len = strlen(p);
Andreas Thienemann b41752
-         if (len > 2 && p[len-1] == 'm') {
Andreas Thienemann b41752
-            if (p[len-2] == 'a') {
Andreas Thienemann b41752
-               pm = false;
Andreas Thienemann b41752
-            } else if (p[len-2] == 'p') {
Andreas Thienemann b41752
-               pm = true;
Andreas Thienemann b41752
-            } else {
Andreas Thienemann b41752
-               scan_err0(lc, _("Bad time specification."));
Andreas Thienemann b41752
-               /* NOT REACHED */
Andreas Thienemann b41752
-            }
Andreas Thienemann b41752
-         } else {
Andreas Thienemann b41752
-            pm = false;
Andreas Thienemann b41752
+         if (len >= 2) {
Andreas Thienemann b41752
+            p += 2;
Andreas Thienemann b41752
          }
Andreas Thienemann b41752
-         code2 = atoi(p);             /* pick up minutes */
Andreas Thienemann b41752
+         if (strcasecmp(p, "pm") == 0) {
Andreas Thienemann b41752
+            pm = true;
Andreas Thienemann b41752
+         } else if (strcasecmp(p, "am") == 0) {
Andreas Thienemann b41752
+            am = true;
Andreas Thienemann b41752
+         } else if (len != 2) {
Andreas Thienemann b41752
+            scan_err0(lc, _("Bad time specification."));
Andreas Thienemann b41752
+            /* NOT REACHED */
Andreas Thienemann b41752
+         }   
Andreas Thienemann b41752
          /* 
Andreas Thienemann b41752
           * Note, according to NIST, 12am and 12pm are ambiguous and
Andreas Thienemann b41752
           *  can be defined to anything.  However, 12:01am is the same
Andreas Thienemann b41752
@@ -467,13 +468,14 @@
Andreas Thienemann b41752
                code += 12;
Andreas Thienemann b41752
             }
Andreas Thienemann b41752
          /* am */
Andreas Thienemann b41752
-         } else if (code == 12) {
Andreas Thienemann b41752
+         } else if (am && code == 12) {
Andreas Thienemann b41752
             code -= 12;
Andreas Thienemann b41752
          }
Andreas Thienemann b41752
          if (code < 0 || code > 23 || code2 < 0 || code2 > 59) {
Andreas Thienemann b41752
             scan_err0(lc, _("Bad time specification."));
Andreas Thienemann b41752
             /* NOT REACHED */
Andreas Thienemann b41752
          }
Andreas Thienemann b41752
+//       Dmsg2(000, "hour=%d min=%d\n", code, code2);
Andreas Thienemann b41752
          set_bit(code, lrun.hour);
Andreas Thienemann b41752
          lrun.minute = code2;
Andreas Thienemann b41752
          have_hour = true;