]> granicus.if.org Git - fcron/blobdiff - global.h
fixed bug preventing audit from being disabled -- thanks Thomas Deutschmann
[fcron] / global.h
index ebac60595666084a3ec7fce65c20b829e8e2b32a..ce1d2693286374b1e2daa4aeffa3683a2c9a071c 100644 (file)
--- a/global.h
+++ b/global.h
@@ -1,7 +1,7 @@
 /*
  * FCRON - periodic command scheduler 
  *
- *  Copyright 2000-2002 Thibault Godouet <fcron@free.fr>
+ *  Copyright 2000-2016 Thibault Godouet <fcron@free.fr>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -21,7 +21,6 @@
  *  `LICENSE' that comes with the fcron source distribution.
  */
 
- /* $Id: global.h,v 1.40 2003-07-14 10:51:52 thib Exp $ */
 
 
 /* 
 #include <errno.h>
 #endif
 
-#ifdef CONFIG_FLASK
-#include <flask_util.h>
-#include <fs_secure.h>
-#include <ss.h>
-#include <linux/flask/av_permissions.h>
-#include <get_sid_list.h>
+#ifdef WITH_SELINUX
+#include <selinux.h>
+#include <get_context_list.h>
+#include <selinux/flask.h>
+#include <selinux/av_permissions.h>
 #endif
 
 #ifdef HAVE_GETOPT_H
 #include <getopt.h>
 #endif
 
+#ifdef HAVE_GRP_H
+#include <grp.h>
+#endif
+
 #ifdef HAVE_LIMITS_H
 #include <limits.h>
 #endif
 
+#include <locale.h>
+#include <nl_types.h>
+#include <langinfo.h>
 #include <pwd.h>
 #include <signal.h>
 
 #include <sys/time.h>
 #endif
 
-#ifdef HAVE_SYS_TERMIOS_H
-#include <sys/termios.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
 #endif
 
 #ifdef HAVE_UNISTD_H
 #include <sys/fcntl.h>
 #endif
 
+#ifdef HAVE_CRED_H
+#include <cred.h>
+#endif
+#ifdef HAVE_UCRED_H
+#include <ucred.h>
+#endif
+#ifdef HAVE_SYS_CRED_H
+#include <sys/cred.h>
+#endif
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif
+
+#ifdef WITH_AUDIT
+#include <libaudit.h>
+#endif
+
 #ifdef HAVE_LIBPAM
 #include "pam.h"
 #endif
 
-#include "bitstring.h"     /* bit arrays */
-#include "option.h"        /* manage fcrontab's options */
+#include "bitstring.h"          /* bit arrays */
+#include "option.h"             /* manage fcrontab's options */
+#include "env_list.h"           /* manage fcrontab's environment variable lists */
+#include "cl.h"                 /* Cron Line cl_t type and associated functions */
 
 /* you should not change this (nor need to do it) */
-#define ERR     -1           
+#define ERR     -1
 #define OK       0
 
 /* options for local functions */
 #define STD 0
 
+/* Approximate max value of time_t which localtime() allows: on a 64bits system,
+ * this is less than LONG_MAX (64bits) as this is limited by struct tm's tm_year
+ * which is a (not long) int (32bits).
+ * As a time_t of INT_MAX=2^31 is 'only' in year 2038, we try to use a larger value
+ * if we can. */
+/* // FIXME: test on 32bit system */
+/* 2^33 = 8589934592, so LONG is 64bits at least */
+#if (LONG_MAX > INT_MAX) && (LONG_MAX > 8589934592)
+/* defined as time_t of 1st Jan of year (SHRT_MAX-1900) at 00:00:00 */
+#define TIME_T_MAX 971859427200
+#else
+/* struct tm's tm_year is of type int, and tm_year will always be smaller than
+ * the equivalent time_t, so INT_MAX is always a safe max value for time_t. */
+#define TIME_T_MAX INT_MAX
+#endif
+
 /* macros */
-#define Alloc(PTR, TYPE) \
-        if( (PTR = calloc(1, sizeof(TYPE))) == NULL ) \
-            die_e("Could not calloc.");
-
-#define Set(VAR, VALUE) \
-        { \
-          free(VAR); \
-          VAR = strdup2(VALUE); \
-        }
-
-#define Flush(VAR) \
-        { \
-          free(VAR); \
-          VAR = NULL; \
-       }
+#ifndef HAVE_SETEUID
+#define seteuid(arg) setresuid(-1,(arg),-1)
+#endif
+
+#ifndef HAVE_SETEGID
+#define setegid(arg) setresgid(-1,(arg),-1)
+#endif
 
 #define Skip_blanks(PTR) \
         while((*(PTR) == ' ') || (*(PTR) == '\t')) \
               *__xx__++ = '\0';  \
         } while (0)
 
-
 #define debug if(debug_opt) Debug
 
-typedef struct env_t {
-    char         *e_val;        /* env value                            */
-    struct env_t *e_next;
-} env_t ;
-
 typedef struct cf_t {
-    struct cf_t  *cf_next;
-    struct cl_t  *cf_line_base;
-    char        *cf_user;      /* user-name                                 */
-    struct env_t *cf_env_base;  /* list of all env variables to set          */
-    int                  cf_running;   /* number of jobs running                    */
-    signed char          cf_tzdiff;    /* time diff between system and local hour   */
-#ifdef CONFIG_FLASK
-    security_id_t cf_user_sid;
-    security_id_t cf_file_sid;
+    struct cf_t *cf_next;
+    struct cl_t *cf_line_base;
+    char *cf_user;              /* user-name                                 */
+    env_list_t *cf_env_list;    /* list of all parsed env var                */
+    int cf_running;             /* number of jobs running                    */
+    signed char cf_tzdiff;      /* time diff between system and local hour   */
+#ifdef WITH_SELINUX
+    security_context_t cf_user_context;
+    security_context_t cf_file_context;
 #endif
 } cf_t;
 
 
-#define OPTION_SIZE 4
-#define LAVG_SIZE 3
-/* warning : do not change the order of the members of this structure
- *   because some tests made are dependent to that order */
-/* warning : if you change a field type, you may have to also make some changes
- *   in the save/load binary fcrontab functions */
-typedef struct cl_t {
-    struct cl_t   *cl_next;
-    struct cf_t   *cl_file;       /* the file in which the line is           */
-    char         *cl_shell;      /* shell command                           */
-    char          *cl_runas;      /* determine permissions of the job        */
-    char          *cl_mailto;     /* mail output to cl_mailto                */
-    long int       cl_id;         /* line's unique id number                 */
-    time_t         cl_until;      /* timeout of the wait for a lavg value    */
-    time_t         cl_first;      /* initial delay preserved for volatile entries */
-    time_t         cl_nextexe;    /* time and date of the next execution     */
-    long int       cl_timefreq;   /* Run every n seconds                     */
-    unsigned short cl_remain;     /* remaining until next execution          */
-    unsigned short cl_runfreq;    /* Run once every n matches                */
-    unsigned char  cl_option[OPTION_SIZE]; /* line's option (see option.h)   */
-    unsigned char  cl_lavg[LAVG_SIZE];/*load averages needed (1,5,15 mins)   */
-    unsigned char  cl_numexe;     /* entries in queues & running processes   */
-    char           cl_nice;       /* nice value to control priority          */
-    /* see bitstring(3) man page for more details */
-    bitstr_t      bit_decl(cl_mins, 60); /* 0-59                            */
-    bitstr_t      bit_decl(cl_hrs, 24);  /* 0-23                            */
-    bitstr_t      bit_decl(cl_days, 32); /* 1-31                            */
-    bitstr_t      bit_decl(cl_mons, 12); /* 0-11                            */
-    bitstr_t      bit_decl(cl_dow, 8);   /* 0-7, 0 and 7 are both Sunday    */
-} cl_t;
-
 typedef struct job_t {
-    struct cl_t  *j_line;
-    struct job_t   *j_next;
+    struct cl_t *j_line;
+    struct job_t *j_next;
 } job_t;
 
-typedef struct lavg_t {
-    struct cl_t *l_line;  
-    time_t       l_until;   /* the timeout of the wait for load averages */
-} lavg_t;
 
-typedef struct exe_t {
-    struct cl_t *e_line;
-    pid_t        e_ctrl_pid; /* pid of the fcron process controling the job */
-    pid_t        e_job_pid;  /* pid of the job itself */
-} exe_t;
+#if SIZEOF_TIME_T == SIZEOF_SHORT_INT
+#define ATTR_SIZE_TIMET "h"
+#define CAST_TIMET_PTR (short int *)
+#elif SIZEOF_TIME_T == SIZEOF_INT
+#define ATTR_SIZE_TIMET ""
+#define CAST_TIMET_PTR (int *)
+#elif SIZEOF_TIME_T == SIZEOF_LONG_INT
+#define ATTR_SIZE_TIMET "l"
+#define CAST_TIMET_PTR (long int *)
+#elif SIZEOF_TIME_T == SIZEOF_LONG_LONG_INT
+#define ATTR_SIZE_TIMET "ll"
+#define CAST_TIMET_PTR (long long int *)
+#else
+#error "SIZEOF_TIME_T does not correspond with a known format."
+#endif
+
+#if SIZEOF_PID_T == SIZEOF_SHORT_INT
+#define ATTR_SIZE_PIDT "h"
+#define CAST_PIDT_PTR (short int *)
+#elif SIZEOF_PID_T == SIZEOF_INT
+#define ATTR_SIZE_PIDT ""
+#define CAST_PIDT_PTR (int *)
+#elif SIZEOF_PID_T == SIZEOF_LONG_INT
+#define ATTR_SIZE_PIDT "l"
+#define CAST_PIDT_PTR (long int *)
+#elif SIZEOF_PID_T == SIZEOF_LONG_LONG_INT
+#define ATTR_SIZE_PIDT "ll"
+#define CAST_PIDT_PTR (long long int *)
+#else
+#error "SIZEOF_PID_T does not correspond with a known format."
+#endif
 
 
 /* local header files : we include here the headers which may use some types defined
@@ -231,7 +248,7 @@ typedef struct exe_t {
 #include "log.h"
 /* functions used by fcrontab, fcrondyn, and fcron */
 #include "subs.h"
+/* file related helper functions */
+#include "filesubs.h"
 
-
-#endif /* __GLOBAL_H__ */
-
+#endif                          /* __GLOBAL_H__ */