X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Frun_conf.c;h=23b8732ceca49d2c3a56f566cc445ff5a93d548f;hb=c5f4a68937116a768e6d85bc576a5fd41a56e93a;hp=334ef8a184db405da0657a14324a09de9cd16528;hpb=7cefbfdacb1d394f034d4bee6e7a96af1f06df95;p=bacula%2Fbacula diff --git a/bacula/src/dird/run_conf.c b/bacula/src/dird/run_conf.c index 334ef8a184..23b8732cec 100644 --- a/bacula/src/dird/run_conf.c +++ b/bacula/src/dird/run_conf.c @@ -1,39 +1,39 @@ -/* - * - * Configuration parser for Director Run Configuration - * directives, which are part of the Schedule Resource - * - * Kern Sibbald, May MM - * - * Version $Id$ - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2006 Free Software Foundation Europe e.V. + Copyright (C) 2000-2008 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public - License as published by the Free Software Foundation plus additions - that are listed in the file LICENSE. + modify it under the terms of version three of the GNU Affero General Public + License as published by the Free Software Foundation and included + in the file LICENSE. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Bacula® is a registered trademark of John Walker. + Bacula® is a registered trademark of Kern Sibbald. The licensor of Bacula is the Free Software Foundation Europe (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * + * Configuration parser for Director Run Configuration + * directives, which are part of the Schedule Resource + * + * Kern Sibbald, May MM + * + * Version $Id$ + */ #include "bacula.h" #include "dird.h" @@ -66,7 +66,7 @@ enum e_state { }; struct s_keyw { - const char *name; /* keyword */ + const char *name; /* keyword */ enum e_state state; /* parser state */ int code; /* state value */ }; @@ -186,7 +186,6 @@ void store_run(LEX *lc, RES_ITEM *item, int index, int pass) int token, state, state2 = 0, code = 0, code2 = 0; int options = lc->options; RUN **run = (RUN **)(item->value); - RUN *trun; char *p; RES *res; @@ -337,7 +336,9 @@ void store_run(LEX *lc, RES_ITEM *item, int index, int pass) set_defaults(); for ( ; token != T_EOL; (token = lex_get_token(lc, T_ALL))) { - int len, pm = 0; + int len; + bool pm = false; + bool am = false; switch (token) { case T_NUMBER: state = s_mday; @@ -361,6 +362,7 @@ void store_run(LEX *lc, RES_ITEM *item, int index, int pass) code = atoi(lc->str+1); if (code < 0 || code > 53) { scan_err0(lc, _("Week number out of range (0-53)")); + /* NOT REACHED */ } state = s_woy; /* week of year */ break; @@ -432,6 +434,7 @@ void store_run(LEX *lc, RES_ITEM *item, int index, int pass) if (!have_hour) { clear_bits(0, 23, lrun.hour); } +// Dmsg1(000, "s_time=%s\n", lc->str); p = strchr(lc->str, ':'); if (!p) { scan_err0(lc, _("Time logic error.\n")); @@ -439,32 +442,39 @@ void store_run(LEX *lc, RES_ITEM *item, int index, int pass) } *p++ = 0; /* separate two halves */ code = atoi(lc->str); /* pick up hour */ + code2 = atoi(p); /* pick up minutes */ len = strlen(p); - if (len > 2 && p[len-1] == 'm') { - if (p[len-2] == 'a') { - pm = 0; - } else if (p[len-2] == 'p') { - pm = 1; - } else { - scan_err0(lc, _("Bad time specification.")); - /* NOT REACHED */ - } - } else { - pm = 0; + if (len >= 2) { + p += 2; } - code2 = atoi(p); /* pick up minutes */ + if (strcasecmp(p, "pm") == 0) { + pm = true; + } else if (strcasecmp(p, "am") == 0) { + am = true; + } else if (len != 2) { + scan_err0(lc, _("Bad time specification.")); + /* NOT REACHED */ + } + /* + * Note, according to NIST, 12am and 12pm are ambiguous and + * can be defined to anything. However, 12:01am is the same + * as 00:01 and 12:01pm is the same as 12:01, so we define + * 12am as 00:00 and 12pm as 12:00. + */ if (pm) { /* Convert to 24 hour time */ - if (code == 12) { - code -= 12; - } else { + if (code != 12) { code += 12; } + /* am */ + } else if (am && code == 12) { + code -= 12; } if (code < 0 || code > 23 || code2 < 0 || code2 > 59) { scan_err0(lc, _("Bad time specification.")); /* NOT REACHED */ } +// Dmsg2(000, "hour=%d min=%d\n", code, code2); set_bit(code, lrun.hour); lrun.minute = code2; have_hour = true; @@ -612,16 +622,24 @@ void store_run(LEX *lc, RES_ITEM *item, int index, int pass) } /* Allocate run record, copy new stuff into it, - * and link it into the list of run records + * and append it to the list of run records * in the schedule resource. */ if (pass == 2) { - trun = (RUN *)malloc(sizeof(RUN)); - memcpy(trun, &lrun, sizeof(RUN)); - if (*run) { - trun->next = *run; + RUN *tail; + + /* Create new run record */ + RUN *nrun = (RUN *)malloc(sizeof(RUN)); + memcpy(nrun, &lrun, sizeof(RUN)); + nrun ->next = NULL; + + if (!*run) { /* if empty list */ + *run = nrun; /* add new record */ + } else { + for (tail = *run; tail->next; tail=tail->next) + { } + tail->next = nrun; } - *run = trun; } lc->options = options; /* restore scanner options */