]> granicus.if.org Git - fcron/commitdiff
added ign_* options
authorthib <thib>
Mon, 4 Dec 2000 20:16:50 +0000 (20:16 +0000)
committerthib <thib>
Mon, 4 Dec 2000 20:16:50 +0000 (20:16 +0000)
fileconf.c
option.h

index d176b232124e22e024a2894596d8fe98225860a8..728a255d81be02657c1f2f1ca29dfff6671b2872 100644 (file)
@@ -22,7 +22,7 @@
  *  `LICENSE' that comes with the fcron source distribution.
  */
 
- /* $Id: fileconf.c,v 1.25 2000-11-14 19:46:23 thib Exp $ */
+ /* $Id: fileconf.c,v 1.26 2000-12-04 20:16:50 thib Exp $ */
 
 #include "fcrontab.h"
 
@@ -34,7 +34,8 @@ char *get_num(char *ptr, int *num, int max, short int decimal,
 char *get_runas(char *ptr, uid_t *uid);
 char *get_nice(char *ptr, int *nice);
 char *get_bool(char *ptr, int *i);
-char *read_field(char *ptr, bitstr_t *ary, int max, const char **names);
+char *read_field(char *ptr, bitstr_t *ary, int max, const char **names,
+                char is_runfreq1);
 void read_freq(char *ptr, CF *cf);
 void read_arys(char *ptr, CF *cf);
 void read_env(char *ptr, CF *cf);
@@ -62,6 +63,12 @@ const char *mons_ary[] = {
     NULL
 };
 
+/* warning : all names must have the same length */
+/* we want a number from 1 to 5: we set the first string to a number,
+ * in order to make get_num() ignore it */
+const char *field_ary[] = {
+    "333", "min", "hrs", "day", "mon", "dow", NULL
+};
 
 char *
 get_string(char *ptr)
@@ -509,6 +516,17 @@ read_opt(char *ptr, CL *cl)
                fprintf(stderr, "  Opt : '%s' %d\n", opt_name, i);
        }
 
+       else if (strcmp(opt_name, "lavgonce") == 0 ) {
+           if ( in_brackets && (ptr = get_bool(ptr, &i)) == NULL )
+               Handle_err;
+           if (i == 0 )
+               set_lavg_sev(cl->cl_option);
+           else
+               clear_lavg_sev(cl->cl_option);
+           if (debug_opt)
+               fprintf(stderr, "  Opt : '%s' %d\n", opt_name, i);
+       }
+
        else if (strcmp(opt_name, "exesev") == 0 ) {
            if ( in_brackets && (ptr = get_bool(ptr, &i)) == NULL )
                Handle_err;
@@ -558,6 +576,54 @@ read_opt(char *ptr, CL *cl)
                fprintf(stderr, "  Opt : '%s' %d\n", opt_name, i);
        }
 
+       else if( strcmp(opt_name, "ignore") == 0 ) {
+           do {
+               if(!in_brackets || (ptr=get_num(ptr,&i,5,0,field_ary)) == NULL)
+                   Handle_err;
+               switch (i) {
+               case 1:
+                   set_ign_mins(cl->cl_option); break;
+               case 2:
+                   set_ign_hrs(cl->cl_option); break;
+               case 3:
+                   set_ign_days(cl->cl_option); break;
+               case 4:
+                   set_ign_mons(cl->cl_option); break;
+               case 5:
+                   set_ign_dow(cl->cl_option); break;
+               default:
+                   Handle_err;
+               }
+               if (debug_opt)
+                   fprintf(stderr, "  Opt : '%s' %s\n",opt_name,field_ary[i]);
+
+           } while (*ptr == ',' && ptr++);
+       }
+
+       else if( strcmp(opt_name, "account") == 0 ) {
+           do {
+               if(!in_brackets || (ptr=get_num(ptr,&i,5,0,field_ary)) == NULL)
+                   Handle_err;
+               switch (i) {
+               case 1:
+                   clear_ign_mins(cl->cl_option); break;
+               case 2:
+                   clear_ign_hrs(cl->cl_option); break;
+               case 3:
+                   clear_ign_days(cl->cl_option); break;
+               case 4:
+                   clear_ign_mons(cl->cl_option); break;
+               case 5:
+                   clear_ign_dow(cl->cl_option); break;
+               default:
+                   Handle_err;
+               }
+               if (debug_opt)
+                   fprintf(stderr, "  Opt : '%s' %s\n",opt_name,field_ary[i]);
+
+           } while (*ptr == ',' && ptr++);
+       }
+
        else if( strcmp(opt_name, "lavg") == 0 ) {
            if(!in_brackets ||(ptr=get_num(ptr, &i, UCHAR_MAX, 1, NULL))==NULL)
                Handle_err;
@@ -908,7 +974,7 @@ read_freq(char *ptr, CF *cf)
 
 
 #define R_field(ptr, ary, max, aryconst, descrp) \
-  if((ptr = read_field(ptr, ary, max, aryconst)) == NULL) { \
+  if((ptr = read_field(ptr, ary, max, aryconst, is_runfreq1)) == NULL) { \
       if (debug_opt) \
           fprintf(stderr, "\n"); \
       fprintf(stderr, "%s:%d: Error while reading " descrp " field: " \
@@ -923,6 +989,7 @@ read_arys(char *ptr, CF *cf)
 {
     CL *cl = NULL;
     unsigned int i = 0;
+    char is_runfreq1 = 0;
 
     Alloc(cl, CL);
     memcpy(cl, &default_line, sizeof(CL));
@@ -953,6 +1020,9 @@ read_arys(char *ptr, CF *cf)
     if (debug_opt)
        fprintf(stderr, "     ");
 
+    /* set is_runfreq1 : this is used in R_field */
+    is_runfreq1 = (cl->cl_runfreq == 1) ? 1 : 0;
+
     /* get the fields (check for errors) */
     R_field(ptr, cl->cl_mins, 59, NULL, "minutes");
     R_field(ptr, cl->cl_hrs, 23, NULL, "hours");
@@ -985,23 +1055,35 @@ read_arys(char *ptr, CF *cf)
        const size_t s_dow=8;
        int j = 0;
        
-       bit_ffc(cl->cl_mins, s_mins, &j);
-       if ( j != -1 ) goto ok;
-       bit_ffc(cl->cl_hrs, s_hrs, &j);
-       if ( j != -1 ) goto ok;
-       bit_ffc(cl->cl_days, s_days, &j);
-       if ( j != -1 ) {
-           if ( is_dayand(cl->cl_option) )
-               goto ok;
-           else {
-               bit_ffc(cl->cl_dow, s_dow, &j);
-               if ( j != -1 ) goto ok;
+       if ( ! is_ign_mins(cl->cl_option) ) {
+           bit_ffc(cl->cl_mins, s_mins, &j);
+           if ( j != -1 ) goto ok;
+       }
+       if ( ! is_ign_hrs(cl->cl_option) ) {
+           bit_ffc(cl->cl_hrs, s_hrs, &j);
+           if ( j != -1 ) goto ok;
+       }
+       if ( ! is_ign_days(cl->cl_option) ) {
+           bit_ffc(cl->cl_days, s_days, &j);
+           if ( j != -1 ) {
+               if ( is_dayand(cl->cl_option) )
+                   goto ok;
+               else {
+                   if ( ! is_ign_dow(cl->cl_option) ) {
+                       bit_ffc(cl->cl_dow, s_dow, &j);
+                       if ( j != -1 ) goto ok;
+                   }
+               }
            }
        }
-       bit_ffc(cl->cl_mons, s_mons, &j);
-       if ( j != -1 ) goto ok;
-       bit_ffc(cl->cl_dow, s_dow, &j);
-       if ( j != -1 && is_dayand(cl->cl_option) ) goto ok;
+       if ( ! is_ign_mons(cl->cl_option) ) {
+           bit_ffc(cl->cl_mons, s_mons, &j);
+           if ( j != -1 ) goto ok;
+       }
+       if ( ! is_ign_dow(cl->cl_option) ) {
+           bit_ffc(cl->cl_dow, s_dow, &j);
+           if ( j != -1 && is_dayand(cl->cl_option) ) goto ok;
+       }
 
        fprintf(stderr, "%s:%d: runfreq=1 with no intervals: skipping line.\n",
                file_name, line);
@@ -1097,7 +1179,8 @@ get_num(char *ptr, int *num, int max, short int decimal, const char **names)
 
 
 char *
-read_field(char *ptr, bitstr_t *ary, int max, const char **names)
+read_field(char *ptr, bitstr_t *ary, int max, const char **names,
+          char is_runfreq1)
     /* read a field like "2,5-8,10-20/2,21-30~25" and fill ary */
 {
     int start = 0;
@@ -1105,6 +1188,8 @@ read_field(char *ptr, bitstr_t *ary, int max, const char **names)
     int step = 0;
     int rm = 0;
     int i = 0;
+    char is_single = 0;
+    char is_interval = 0;
 
     while ( (*ptr != ' ') && (*ptr != '\t') && (*ptr != '\0') ) {
        
@@ -1130,7 +1215,15 @@ read_field(char *ptr, bitstr_t *ary, int max, const char **names)
                /* this is a single number : set up array and continue */
                if (debug_opt)
                    fprintf(stderr, " %d", start);
+               if (is_interval == 1) {
+                   fprintf(stderr, "\n%s:%d: Could not have both single "
+                           "numbers and intervals with option runfreq set"
+                           " to 1", file_name, line);
+                   need_correction = 1;
+                   return NULL;
+               }
                bit_set(ary, start);
+               is_single = 1;
                continue;
            }
 
@@ -1159,6 +1252,19 @@ read_field(char *ptr, bitstr_t *ary, int max, const char **names)
        if (debug_opt)
            fprintf(stderr, " %d-%d/%d", start, stop, step);
 
+       if (step == 1) {
+           if (is_single == 1) {
+               fprintf(stderr, "\n%s:%d: Could not have both single numbers "
+                       "and intervals with option runfreq set to 1",
+                       file_name, line);
+               need_correction = 1;
+               return NULL;
+           }
+           is_interval = 1;
+       }
+       else
+           is_single = 1;
+
        if (start < stop)
            for (i = start;  i <= stop;  i += step)
                bit_set(ary, i);
index afe45117bf65ae4b5cb70d4d83058f7a9499ea75..bbf4a59aa97d2b70aa8e8a0f6ef6197379c725dd 100644 (file)
--- a/option.h
+++ b/option.h
  *  `LICENSE' that comes with the fcron source distribution.
  */
 
- /* $Id: option.h,v 1.10 2000-09-30 11:59:34 thib Exp $ */
+ /* $Id: option.h,v 1.11 2000-12-04 20:20:09 thib Exp $ */
+
+/* This has been inspired from bitstring(3) : here is the original copyright :
+ */
+
+/*
+ * Copyright (c) 1989 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Vixie.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
 
 /* read and set options of a line */
 
   9      does this line use option runas ?
   10     can this job be executed several times simultaneously
   11     can this job be put several times in the serial queue simultaneously
+  12     can this job be put several times in the lavg queue simultaneously
+  13     should mins field be ignored in goto_non_matching() ?
+  14     should hrs field be ignored in goto_non_matching() ?
+  15     should days field be ignored in goto_non_matching() ?
+  16     should mons field be ignored in goto_non_matching() ?
+  17     should dow field be ignored in goto_non_matching() ?
 
 */
 
 
 /* internal macros */
 
+#define        _bit_byte(bit) \
+       ((bit) >> 3)
+
 #define        _bit_set(opt, bit) \
-       (opt |= (1u << bit))
+       ((opt)[_bit_byte(bit)] |= (1 << ((bit)&0x7)))
 
 #define        _bit_test(opt, bit) \
-       (opt & (1u << bit))
+       ((opt)[_bit_byte(bit)] & (1 << ((bit)&0x7)))
 
 #define        _bit_clear(opt, bit) \
-       (opt &= ~(1u << bit))
+       ((opt)[_bit_byte(bit)] &= ~(1 << ((bit)&0x7)))
 
 
 /* external macros */
        (_bit_clear(opt, 10))
 
 
-#if ( SERIAL_ONCE == 0 )
+#if ( SERIAL_ONCE == 1 )
 /*
   bit 11 : set to 1 : can be put several times in serial queue simultaneously
            set to 0 : can only be put once in serial queue simultaneously
 #endif /* SERIAL_ONCE == 0 */
 
 
+#if ( LAVG_ONCE == 1 )
+/*
+  bit 12 : set to 1 : can be put several times in lavg queue simultaneously
+           set to 0 : can only be put once in lavg queue simultaneously
+*/
+#define        is_lavg_sev(opt) \
+       (_bit_test(opt, 12))
+#define        set_lavg_sev(opt) \
+       (_bit_set(opt, 12))
+#define clear_lavg_sev(opt) \
+       (_bit_clear(opt, 12))
+#else
+/*
+  bit 12 : set to 1 : can only be put once in lavg queue simultaneously
+           set to 0 : can be put several times in lavg queue simultaneously
+*/
+#define        is_lavg_sev(opt) \
+       ( ! _bit_test(opt, 12))
+#define        set_lavg_sev(opt) \
+       (_bit_clear(opt, 12))
+#define clear_lavg_sev(opt) \
+       (_bit_set(opt, 12))
+#endif /* LAVG_ONCE == 0 */
+
+
+/*
+  bit 13 : set to 1 : mins field should be ignored in goto_non_matching()
+           set to 0 : mins field should not be ignored in goto_non_matching()
+*/
+#define        is_ign_mins(opt) \
+       (_bit_test(opt, 13))
+#define        set_ign_mins(opt) \
+       (_bit_set(opt, 13))
+#define clear_ign_mins(opt) \
+       (_bit_clear(opt, 13))
+
+
+/*
+  bit 14 : set to 1 : hrs field should be ignored in goto_non_matching()
+           set to 0 : hrs field should not be ignored in goto_non_matching()
+*/
+#define        is_ign_hrs(opt) \
+       (_bit_test(opt, 14))
+#define        set_ign_hrs(opt) \
+       (_bit_set(opt, 14))
+#define clear_ign_hrs(opt) \
+       (_bit_clear(opt, 14))
+
+
+/*
+  bit 15 : set to 1 : days field should be ignored in goto_non_matching()
+           set to 0 : days field should not be ignored in goto_non_matching()
+*/
+#define        is_ign_days(opt) \
+       (_bit_test(opt, 15))
+#define        set_ign_days(opt) \
+       (_bit_set(opt, 15))
+#define clear_ign_days(opt) \
+       (_bit_clear(opt, 15))
+
+
+/*
+  bit 16 : set to 1 : mons field should be ignored in goto_non_matching()
+           set to 0 : mons field should not be ignored in goto_non_matching()
+*/
+#define        is_ign_mons(opt) \
+       (_bit_test(opt, 16))
+#define        set_ign_mons(opt) \
+       (_bit_set(opt, 16))
+#define clear_ign_mons(opt) \
+       (_bit_clear(opt, 16))
+
+
+/*
+  bit 17 : set to 1 : dow field should be ignored in goto_non_matching()
+           set to 0 : dow field should not be ignored in goto_non_matching()
+*/
+#define        is_ign_dow(opt) \
+       (_bit_test(opt, 17))
+#define        set_ign_dow(opt) \
+       (_bit_set(opt, 17))
+#define clear_ign_dow(opt) \
+       (_bit_clear(opt, 17))
+
+
 #endif /* __OPTIONH__ */