/*
* 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
* `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
#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__ */