time_t first_sleep = FIRST_SLEEP;
time_t save_time = SAVE;
-char once = 0; /* set to 1 if fcron shall return immediately after running
- * all jobs that are due at the time when fcron is started */
+char once = 0; /* set to 1 if fcron shall return immediately after running
+ * all jobs that are due at the time when fcron is started */
/* Get the default locale character set for the mail
* "Content-Type: ...; charset=" header */
/* print a help message about command line options and exit */
{
fprintf(stderr, "\nfcron " VERSION_QUOTED "\n\n"
- "fcron [-d] [-f] [-b]\n"
- "fcron -h\n"
- " -s t --savetime t Save fcrontabs on disk every t sec.\n"
- " -l t --firstsleep t Sets the initial delay before any job is executed"
- ",\n default to %d seconds.\n"
- " -m n --maxserial n Set to n the max number of running serial jobs.\n"
- " -c f --configfile f Make fcron use config file f.\n"
- " -n d --newspooldir d Create d as a new spool directory.\n"
- " -f --foreground Stay in foreground.\n"
- " -b --background Go to background.\n"
- " -y --nosyslog Don't log to syslog at all.\n"
- " -p --logfilepath If set, log to the file given as argument.\n"
- " -o --once Execute all jobs that need to be run, wait for "
- "them,\n then return. Sets firstsleep to 0.\n"
- " Especially useful with -f and -y.\n"
- " -d --debug Set Debug mode.\n"
- " -h --help Show this help message.\n"
- " -V --version Display version & infos about fcron.\n",
- FIRST_SLEEP
- );
-
+ "fcron [-d] [-f] [-b]\n"
+ "fcron -h\n"
+ " -s t --savetime t Save fcrontabs on disk every t sec.\n"
+ " -l t --firstsleep t Sets the initial delay before any job is executed"
+ ",\n default to %d seconds.\n"
+ " -m n --maxserial n Set to n the max number of running serial jobs.\n"
+ " -c f --configfile f Make fcron use config file f.\n"
+ " -n d --newspooldir d Create d as a new spool directory.\n"
+ " -f --foreground Stay in foreground.\n"
+ " -b --background Go to background.\n"
+ " -y --nosyslog Don't log to syslog at all.\n"
+ " -p --logfilepath If set, log to the file given as argument.\n"
+ " -o --once Execute all jobs that need to be run, wait for "
+ "them,\n then return. Sets firstsleep to 0.\n"
+ " Especially useful with -f and -y.\n"
+ " -d --debug Set Debug mode.\n"
+ " -h --help Show this help message.\n"
+ " -V --version Display version & infos about fcron.\n",
+ FIRST_SLEEP);
+
exit(EXIT_ERR);
}
int i;
#ifdef HAVE_GETOPT_LONG
- static struct option opt[] =
- {
- {"debug", 0, NULL, 'd'},
- {"foreground", 0, NULL, 'f'},
- {"background", 0, NULL, 'b'},
- {"nosyslog", 0, NULL, 'y'},
- {"logfilepath", 1, NULL, 'p'},
- {"help", 0, NULL, 'h'},
- {"version", 0, NULL, 'V'},
- {"once", 0, NULL, 'o'},
- {"savetime", 1, NULL, 's'},
- {"firstsleep", 1, NULL, 'l'},
- {"maxserial", 1, NULL, 'm'},
- {"configfile", 1, NULL, 'c'},
- {"newspooldir", 1, NULL, 'n'},
- {"queuelen", 1, NULL, 'q'},
- {0,0,0,0}
+ static struct option opt[] = {
+ {"debug", 0, NULL, 'd'},
+ {"foreground", 0, NULL, 'f'},
+ {"background", 0, NULL, 'b'},
+ {"nosyslog", 0, NULL, 'y'},
+ {"logfilepath", 1, NULL, 'p'},
+ {"help", 0, NULL, 'h'},
+ {"version", 0, NULL, 'V'},
+ {"once", 0, NULL, 'o'},
+ {"savetime", 1, NULL, 's'},
+ {"firstsleep", 1, NULL, 'l'},
+ {"maxserial", 1, NULL, 'm'},
+ {"configfile", 1, NULL, 'c'},
+ {"newspooldir", 1, NULL, 'n'},
+ {"queuelen", 1, NULL, 'q'},
+ {0, 0, 0, 0}
};
#endif /* HAVE_GETOPT_LONG */
while (1) {
#ifdef HAVE_GETOPT_LONG
- c = getopt_long(argc, argv, "dfbyp:hVos:l:m:c:n:q:", opt, NULL);
+ c = getopt_long(argc, argv, "dfbyp:hVos:l:m:c:n:q:", opt, NULL);
#else
- c = getopt(argc, argv, "dfbyp:hVos:l:m:c:n:q:");
-#endif /* HAVE_GETOPT_LONG */
- if ( c == EOF ) break;
- switch ( (char)c ) {
+ c = getopt(argc, argv, "dfbyp:hVos:l:m:c:n:q:");
+#endif /* HAVE_GETOPT_LONG */
+ if (c == EOF)
+ break;
+ switch ((char)c) {
- case 'V':
- info(); break;
+ case 'V':
+ info();
+ break;
- case 'h':
- usage(); break;
+ case 'h':
+ usage();
+ break;
- case 'd':
- debug_opt = 1; break;
+ case 'd':
+ debug_opt = 1;
+ break;
- case 'f':
- foreground = 1; break;
+ case 'f':
+ foreground = 1;
+ break;
- case 'b':
- foreground = 0; break;
+ case 'b':
+ foreground = 0;
+ break;
- case 'y':
- dosyslog = 0; break;
+ case 'y':
+ dosyslog = 0;
+ break;
case 'p':
logfile_path = strdup2(optarg);
break;
-
- case 'o':
- once = 1; first_sleep = 0; break;
-
- case 's':
- if ( (save_time = strtol(optarg, NULL, 10)) < 60 || save_time >= LONG_MAX )
- die("Save time can only be set between 60 and %d.", LONG_MAX);
- break;
-
- case 'l':
- if ( (first_sleep = strtol(optarg, NULL, 10)) < 0 || first_sleep >= LONG_MAX)
- die("First sleep can only be set between 0 and %d.", LONG_MAX);
- break;
-
- case 'm':
- if ( (serial_max_running = strtol(optarg, NULL, 10)) <= 0
- || serial_max_running >= SHRT_MAX )
- die("Max running can only be set between 1 and %d.",SHRT_MAX);
- break;
-
- case 'c':
- Set(fcronconf, optarg);
- break;
-
- case 'n':
- create_spooldir(optarg);
- break;
-
- case 'q':
- if ( (lavg_queue_max = serial_queue_max = strtol(optarg, NULL, 10)) < 5
- || serial_queue_max >= SHRT_MAX )
- die("Queue length can only be set between 5 and %d.", SHRT_MAX);
- break;
-
- case ':':
- error("(parseopt) Missing parameter");
- usage();
-
- case '?':
- usage();
-
- default:
- warn("(parseopt) Warning: getopt returned %c", c);
- }
+
+ case 'o':
+ once = 1;
+ first_sleep = 0;
+ break;
+
+ case 's':
+ if ((save_time = strtol(optarg, NULL, 10)) < 60
+ || save_time >= LONG_MAX)
+ die("Save time can only be set between 60 and %d.", LONG_MAX);
+ break;
+
+ case 'l':
+ if ((first_sleep = strtol(optarg, NULL, 10)) < 0
+ || first_sleep >= LONG_MAX)
+ die("First sleep can only be set between 0 and %d.", LONG_MAX);
+ break;
+
+ case 'm':
+ if ((serial_max_running = strtol(optarg, NULL, 10)) <= 0
+ || serial_max_running >= SHRT_MAX)
+ die("Max running can only be set between 1 and %d.", SHRT_MAX);
+ break;
+
+ case 'c':
+ Set(fcronconf, optarg);
+ break;
+
+ case 'n':
+ create_spooldir(optarg);
+ break;
+
+ case 'q':
+ if ((lavg_queue_max = serial_queue_max =
+ strtol(optarg, NULL, 10)) < 5 || serial_queue_max >= SHRT_MAX)
+ die("Queue length can only be set between 5 and %d.", SHRT_MAX);
+ break;
+
+ case ':':
+ error("(parseopt) Missing parameter");
+ usage();
+
+ case '?':
+ usage();
+
+ default:
+ warn("(parseopt) Warning: getopt returned %c", c);
+ }
}
if (optind < argc) {
char *logfile_path = NULL;
-char* make_msg(const char *append, char *fmt, va_list args);
+char *make_msg(const char *append, char *fmt, va_list args);
void log_syslog_str(int priority, char *msg);
-void log_file_str(FILE *logfile, int priority, char *msg);
+void log_file_str(FILE * logfile, int priority, char *msg);
void log_console_str(int priority, char *msg);
void log_fd_str(int fd, char *msg);
-static void print_line_prefix(FILE *logfile, int priority);
+static void print_line_prefix(FILE * logfile, int priority);
static void xlog(int priority, int fd, char *fmt, va_list args);
static void xlog_e(int priority, int fd, char *fmt, va_list args);
#ifdef HAVE_LIBPAM
void
xopenlog(void)
{
- if (log_open)
- return;
+ if (log_open)
+ return;
/* we MUST set log_open to 1 before doing anything else. That way,
* if we call a function that logs something, which calls xopenlog,
if (dosyslog) {
/* we have already called openlog() which cannot fail */
- syslog(COMPLAIN_LEVEL, "Could not fopen log file '%s': %s", logfile_path, strerror(saved_errno));
+ syslog(COMPLAIN_LEVEL, "Could not fopen log file '%s': %s",
+ logfile_path, strerror(saved_errno));
}
print_line_prefix(stderr, COMPLAIN_LEVEL);
- fprintf(stderr, "Could not fopen log file '%s': %s\n", logfile_path, strerror(saved_errno));
+ fprintf(stderr, "Could not fopen log file '%s': %s\n", logfile_path,
+ strerror(saved_errno));
}
}
xcloselog()
{
if (!log_open)
- return;
+ return;
// check whether we need to close syslog, or a file.
if (logfile != NULL) {
- if (fclose(logfile)!= 0) {
+ if (fclose(logfile) != 0) {
int saved_errno = errno;
- syslog(COMPLAIN_LEVEL, "Error while closing log file '%s': %s", logfile_path, strerror(saved_errno));
+ syslog(COMPLAIN_LEVEL, "Error while closing log file '%s': %s",
+ logfile_path, strerror(saved_errno));
if (foreground == 1) {
print_line_prefix(stderr, COMPLAIN_LEVEL);
- fprintf(stderr, "Error while closing log file '%s': %s\n", logfile_path, strerror(saved_errno));
+ fprintf(stderr, "Error while closing log file '%s': %s\n",
+ logfile_path, strerror(saved_errno));
}
}
}
if (dosyslog) {
- closelog();
+ closelog();
}
log_open = 0;
{
if (dosyslog) {
xopenlog();
- syslog(priority, "%s", msg);
+ syslog(priority, "%s", msg);
}
}
/* log a simple string to a log file if needed */
void
-log_file_str(FILE *logfile, int priority, char *msg)
+log_file_str(FILE * logfile, int priority, char *msg)
{
xopenlog();
/* we may have failed to open the logfile - check if
* it does exist *after* xopenlog() */
if (logfile != NULL) {
- print_line_prefix(logfile, priority);
+ print_line_prefix(logfile, priority);
fprintf(logfile, "%s\n", msg);
fflush(logfile);
}
log_console_str(int priority, char *msg)
{
if (foreground == 1) {
- print_line_prefix(stderr, priority);
- fprintf(stderr, "%s\n", msg);
+ print_line_prefix(stderr, priority);
+ fprintf(stderr, "%s\n", msg);
}
}
/* write a message to the file specified by logfile. */
static void
-print_line_prefix(FILE *logfile, int priority)
+print_line_prefix(FILE * logfile, int priority)
{
time_t t = time(NULL);
struct tm *ft;
strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", ft);
// is it an info/warning/error/debug message?
- switch(priority) {
- case EXPLAIN_LEVEL:
- type = " INFO";
- break;
- case WARNING_LEVEL:
- type = " WARN";
- break;
- case COMPLAIN_LEVEL:
- type = "ERROR";
- break;
- case DEBUG_LEVEL:
- type = "DEBUG";
- break;
- default:
- type = "UNKNOWN_SEVERITY";
+ switch (priority) {
+ case EXPLAIN_LEVEL:
+ type = " INFO";
+ break;
+ case WARNING_LEVEL:
+ type = " WARN";
+ break;
+ case COMPLAIN_LEVEL:
+ type = "ERROR";
+ break;
+ case DEBUG_LEVEL:
+ type = "DEBUG";
+ break;
+ default:
+ type = "UNKNOWN_SEVERITY";
}
// print the log message.
err_no = errno;
- va_start(args, fmt);
- xlog_e(COMPLAIN_LEVEL, -1, fmt, args);
- va_end(args);
- if (getpid() == daemon_pid) {
+ va_start(args, fmt);
+ xlog_e(COMPLAIN_LEVEL, -1, fmt, args);
+ va_end(args);
+ if (getpid() == daemon_pid) {
error("Aborted");
}
else {
/* if open() didn't fail make sure we opened a 'normal' file */
if (fd >= 0) {
- if ( fstat(fd, &s) < 0 ) {
+ if (fstat(fd, &s) < 0) {
saved_errno = errno;
error_e("open_as_user(): could not fstat %s", pathname);
if (close(fd) < 0)
return fd;
/* if open() didn't fail make sure we opened a 'normal' file */
- if ( fstat(fd, &s) < 0 ) {
+ if (fstat(fd, &s) < 0) {
saved_errno = errno;
error_e("open_as_user(): could not fstat %s", pathname);
goto err;
}
- if ( ! S_ISREG(s.st_mode) || s.st_nlink != 1 ) {
+ if (!S_ISREG(s.st_mode) || s.st_nlink != 1) {
saved_errno = errno;
error_e("open_as_user(): file %s is not a regular file", pathname);
goto err;
if (!(s.st_mode & S_IROTH || (s.st_uid == openuid && s.st_mode & S_IRUSR)
|| (s.st_gid == opengid && s.st_mode & S_IRGRP))) {
error("open_as_user(): file %s does not pass the security test: "
- "uid=%d gid=%d mode=%lo openuid=%d opengid=%d",
- pathname, s.st_uid, s.st_gid, s.st_mode, openuid, opengid);
+ "uid=%d gid=%d mode=%lo openuid=%d opengid=%d",
+ pathname, s.st_uid, s.st_gid, s.st_mode, openuid, opengid);
saved_errno = EACCES;
goto err;
}
* then we will end up changing the ownership even if the seteuid()
* version of that function wouldn't have. That shouldn't break
* anything though. */
- if ( (flags & O_CREAT) && fchown(fd, openuid, opengid) != 0) {
+ if ((flags & O_CREAT) && fchown(fd, openuid, opengid) != 0) {
saved_errno = errno;
- error_e("Could not fchown %s to uid:%d gid:%d", pathname, openuid, opengid);
+ error_e("Could not fchown %s to uid:%d gid:%d", pathname, openuid,
+ opengid);
goto err;
}