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