diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fa487b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +anacron_2.3.orig.tar.gz +anacron.init diff --git a/anacron-2.3-fdclose.patch b/anacron-2.3-fdclose.patch new file mode 100644 index 0000000..96e20d4 --- /dev/null +++ b/anacron-2.3-fdclose.patch @@ -0,0 +1,107 @@ +diff -uNr anacron-2.3-orig/global.h anacron-2.3/global.h +--- anacron-2.3-orig/global.h 2000-06-23 01:00:14.000000000 +0100 ++++ anacron-2.3/global.h 2006-03-20 15:31:28.000000000 +0000 +@@ -60,6 +60,7 @@ + int tab_line; + int arg_num; + int timestamp_fd; ++ int input_fd; + int output_fd; + int mail_header_size; + pid_t job_pid; +diff -uNr anacron-2.3-orig/runjob.c anacron-2.3/runjob.c +--- anacron-2.3-orig/runjob.c 2006-02-21 14:05:08.000000000 +0000 ++++ anacron-2.3/runjob.c 2006-03-20 15:32:32.000000000 +0000 +@@ -38,12 +38,12 @@ + #include + + static int +-temp_file() ++temp_file(job_rec *jr) + /* Open a temporary file and return its file descriptor */ + { + const int max_retries = 50; + char *name; +- int fd, i; ++ int fdin, fdout, i; + + i = 0; + name = NULL; +@@ -53,16 +53,24 @@ + free(name); + name = tempnam(NULL, NULL); + if (name == NULL) die("Can't find a unique temporary filename"); +- fd = open(name, O_RDWR | O_CREAT | O_EXCL | O_APPEND, +- S_IRUSR | S_IWUSR); ++ fdout = open(name, O_WRONLY | O_CREAT | O_EXCL | O_APPEND, ++ S_IRUSR | S_IWUSR); ++ if ( fdout != -1 ) ++ fdin = open(name, O_RDONLY, S_IRUSR | S_IWUSR); + /* I'm not sure we actually need to be so persistent here */ +- } while (fd == -1 && errno == EEXIST && i < max_retries); ++ } while (fdout == -1 && errno == EEXIST && i < max_retries); + +- if (fd == -1) die_e("Can't open temporary file"); ++ if (fdout == -1) die_e("Can't open temporary file for writing"); ++ if (fdin == -1) die_e("Can't open temporary file for reading"); + if (unlink(name)) die_e("Can't unlink temporary file"); + free(name); +- fcntl(fd, F_SETFD, 1); /* set close-on-exec flag */ +- return fd; ++ fcntl(fdout, F_SETFD, 1); /* set close-on-exec flag */ ++ fcntl(fdin, F_SETFD, 1); /* set close-on-exec flag */ ++ ++ jr->input_fd = fdin; ++ jr->output_fd = fdout; ++ ++ return fdout; + } + + static off_t +@@ -170,17 +178,28 @@ + pid = xfork(); + if (pid == 0) + { ++ long fdflags; ++ + /* child */ + in_background = 1; + /* set stdin to the job's output */ + xclose(0); +- if (dup2(jr->output_fd, 0) != 0) die_e("Can't dup2()"); ++ if (dup2(jr->input_fd, 0) != 0) die_e("Can't dup2()"); + if (lseek(0, 0, SEEK_SET) != 0) die_e("Can't lseek()"); + umask(old_umask); + if (sigprocmask(SIG_SETMASK, &old_sigmask, NULL)) + die_e("sigprocmask error"); + xcloselog(); + ++ /* Ensure stdout/stderr are sane before exec-ing sendmail */ ++ xclose(1); xopen(1, "/dev/null", O_WRONLY); ++ xclose(2); xopen(2, "/dev/null", O_WRONLY); ++ xclose(jr->output_fd); ++ ++ /* Ensure stdin is not appendable ... ? */ ++ /* fdflags = fcntl(0, F_GETFL); fdflags &= ~O_APPEND; */ ++ /* fcntl(0, F_SETFL, fdflags ); */ ++ + /* Here, I basically mirrored the way /usr/sbin/sendmail is called + * by cron on a Debian system, except for the "-oem" and "-or0s" + * options, which don't seem to be appropriate here. +@@ -225,7 +244,7 @@ + setup_env(jr); + + /* create temporary file for stdout and stderr of the job */ +- fd = jr->output_fd = temp_file(); ++ temp_file(jr); fd = jr->output_fd; + /* write mail header */ + xwrite(fd, "From: "); + xwrite(fd, username()); +@@ -283,6 +302,7 @@ + running_jobs--; + if (mail_output) launch_mailer(jr); + xclose(jr->output_fd); ++ xclose(jr->input_fd); + } + + void diff --git a/anacron-2.3-hostname.patch b/anacron-2.3-hostname.patch new file mode 100644 index 0000000..984e0e6 --- /dev/null +++ b/anacron-2.3-hostname.patch @@ -0,0 +1,44 @@ +--- anacron-2.3/runjob.c.hostname 2006-10-04 11:58:55.000000000 +0200 ++++ anacron-2.3/runjob.c 2006-10-09 09:43:23.000000000 +0200 +@@ -94,6 +94,17 @@ + } + + static char * ++hostname() ++{ ++ char hostname[MAXHOSTNAME]; ++ ++ if (gethostname(hostname, MAXHOSTNAME) == 0) ++ return hostname; ++ else ++ die_e("Can't resolve hostname"); ++} ++ ++static char * + mailto() + { + char *alias; +@@ -255,9 +266,11 @@ + xwrite(fd, "Content-Type: text/plain; charset=\""); + xwrite(fd, nl_langinfo(CODESET)); + xwrite(fd, "\"\n"); +- xwrite(fd, "Subject: Anacron job '"); ++ xwrite(fd, "Subject: Anacron job for '"); ++ xwrite(fd, hostname()); ++ xwrite(fd, "' "); + xwrite(fd, jr->ident); +- xwrite(fd, "'\n\n"); ++ xwrite(fd, "\n"); + jr->mail_header_size = file_size(fd); + + pid = xfork(); +--- anacron-2.3/global.h.hostname 2006-10-04 11:58:55.000000000 +0200 ++++ anacron-2.3/global.h 2006-10-04 11:58:55.000000000 +0200 +@@ -33,6 +33,7 @@ + + /* Mail interface. (All MTAs should supply this command) */ + #define SENDMAIL "/usr/sbin/sendmail" ++#define MAXHOSTNAME 64 + + #ifndef PID_FILE + #define PID_FILE "/var/run/anacron.pid" diff --git a/anacron-2.3-lock-files.patch b/anacron-2.3-lock-files.patch new file mode 100644 index 0000000..63927c9 --- /dev/null +++ b/anacron-2.3-lock-files.patch @@ -0,0 +1,248 @@ +--- anacron-2.3/main.c.lock-files 2000-06-22 20:00:14.000000000 -0400 ++++ anacron-2.3/main.c 2006-04-13 20:38:13.000000000 -0400 +@@ -21,39 +21,42 @@ + `COPYING' that comes with the Anacron source distribution. + */ + +- +-#include +-#include ++#include + #include ++#include + #include + #include +-#include ++#include + #include + #include ++#include ++#include ++#include ++#include + #include "global.h" + #include "gregor.h" + +-pid_t primary_pid; +-int day_now; +-int year, month, day_of_month; /* date anacron started */ +- +-char *program_name; +-char *anacrontab; +-int serialize, force, update_only, now, +- no_daemon, quiet; /* command-line options */ +-char **args; /* vector of "job" command-line arguments */ +-int nargs; /* number of these */ ++pid_t primary_pid=-1; ++int day_now=0; ++int year=0, month=0, day_of_month=0; /* date anacron started */ ++ ++char *program_name=0; ++char *anacrontab=0; ++int serialize=0, force=0, update_only=0, now=0, ++ no_daemon=0, quiet=0; /* command-line options */ ++char **args=0; /* vector of "job" command-line arguments */ ++int nargs=0; /* number of these */ + char *defarg = "*"; +-int in_background; /* are we in the background? */ +-int old_umask; /* umask when started */ +-sigset_t old_sigmask; /* signal mask when started */ +- +-job_rec *first_job_rec; +-env_rec *first_env_rec; +- +-static time_t start_sec; /* time anacron started */ +-static volatile int got_sigalrm, got_sigchld, got_sigusr1; +-int running_jobs, running_mailers; /* , number of */ ++int in_background=0; /* are we in the background? */ ++int old_umask=0; /* umask when started */ ++sigset_t old_sigmask={0}; /* signal mask when started */ ++ ++job_rec *first_job_rec=0; ++env_rec *first_env_rec=0; ++ ++static time_t start_sec=0; /* time anacron started */ ++static volatile int got_sigalrm=0, got_sigchld=0, got_sigusr1=0; ++int running_jobs=0, running_mailers=0; /* , number of */ + + static void + print_version() +@@ -183,6 +186,8 @@ + if (close(fd)) die_e("Can't close file descriptor %d", fd); + } + ++static int anacron_already_running(); ++ + static void + go_background() + /* Become a daemon. The foreground process exits successfully. */ +@@ -206,9 +211,16 @@ + else + { + /* child */ ++ xcloselog(); + primary_pid = getpid(); + if (setsid() == -1) die_e("setsid() error"); + in_background = 1; ++ chdir(SPOOLDIR); ++ if( anacron_already_running() ) ++ { ++ errno=EDEADLK; ++ die_e("Cannot run in daemon mode - anacron already running."); ++ } + } + } + +@@ -265,6 +277,16 @@ + sa.sa_mask = ss; + sa.sa_flags = 0; + if (sigaction(SIGUSR1, &sa, NULL)) die_e("sigaction error"); ++ /* setup SIGQUIT handler */ ++ sa.sa_handler = handle_sigusr1; ++ sa.sa_mask = ss; ++ sa.sa_flags = 0; ++ if (sigaction(SIGQUIT, &sa, NULL)) die_e("sigaction error"); ++ /* setup SIGTERM handler */ ++ sa.sa_handler = handle_sigusr1; ++ sa.sa_mask = ss; ++ sa.sa_flags = 0; ++ if (sigaction(SIGTERM, &sa, NULL)) die_e("sigaction error"); + } + + static void +@@ -409,6 +431,94 @@ + explain("Jobs will be executed sequentially"); + } + ++static void remove_lock_and_pid_files(void) ++{ ++ unlink(PID_FILE); ++ unlink(LOCK_FILE); ++} ++ ++static int anacron_already_running() ++{ ++ char buf[PATH_MAX], buf2[PATH_MAX], buf3[32]; ++ FILE *fp=0; ++ pid_t pid=-1; ++ mode_t mode; ++ int len, fd; ++ ++ if ( access( PID_FILE, F_OK ) == 0 ) ++ { ++ if ( ( fp = fopen( PID_FILE, "r" ) ) == 0L ) ++ { ++ complain("%s exists but is not readable",PID_FILE); ++ return 1; ++ } ++ ++ if ( fscanf(fp,"%u",&pid) != 1 ) ++ { ++ explain("%s does not contain a valid pid",PID_FILE); ++ return 1; ++ } ++ ++ fclose(fp); ++ ++ snprintf(buf, PATH_MAX, "/proc/%u", pid); ++ ++ if( access(buf, F_OK) == 0 ) ++ { ++ ++ snprintf(buf3, 32, "/proc/%u/exe", pid); ++ if( (len = readlink(buf3, buf2, PATH_MAX)) <= 0 ) ++ len = 0; ++ ++ buf2[len] = '\0'; ++ ++ snprintf(buf3, 32, "/proc/%u/exe", getpid()); ++ if( (len = readlink(buf3, buf, PATH_MAX)) <= 0 ) ++ len = 0; ++ buf[len] = '\0'; ++ ++ if( strcmp( buf, buf2 ) == 0 ) ++ return 1; ++ } ++ } ++ /* main process removes lock files once it ++ * has determined no other anacron is running: ++ */ ++ remove_lock_and_pid_files(); ++ ++ if( no_daemon || in_background ) ++ { ++ /* daemon process, or main process in no_daemon mode, ++ * creates the lock and pid files: ++ */ ++ if( ( fd = open(LOCK_FILE, O_CREAT | O_WRONLY | O_EXCL, 0600) ) == -1 ) ++ { ++ complain("Cannot exclusively create %s: %s",PID_FILE,strerror(errno)); ++ return 1; ++ } ++ close(fd); ++ ++ mode = umask(0077); ++ if( ( fp = fopen(PID_FILE, "w") ) == 0L ) ++ { ++ complain("Cannot create %s",PID_FILE); ++ umask(mode); ++ return 1; ++ } ++ umask(mode); ++ ++ /* lock and pid files removed automatically at normal exit ++ * by creator process: ++ */ ++ atexit( remove_lock_and_pid_files ); ++ ++ fprintf(fp,"%u",getpid()); ++ fflush(fp); ++ fclose(fp); ++ } ++ return 0; ++} ++ + int + main(int argc, char *argv[]) + { +@@ -423,6 +533,12 @@ + + parse_opts(argc, argv); + ++ if ( anacron_already_running() ) ++ { ++ errno=EDEADLK; ++ die_e("Cannot run - another anacron process is already running."); ++ } ++ + if (anacrontab == NULL) + anacrontab = strdup(ANACRONTAB); + +@@ -433,7 +549,9 @@ + old_umask = umask(0); + + if (sigprocmask(0, NULL, &old_sigmask)) die_e("sigset error"); +- ++ ++ if( !no_daemon ) ++ ioctl(0,TIOCNOTTY,0); + if (fclose(stdin)) die_e("Can't close stdin"); + xopen(0, "/dev/null", O_RDONLY); + +--- anacron-2.3/global.h.lock-files 2000-06-22 20:00:14.000000000 -0400 ++++ anacron-2.3/global.h 2006-04-13 20:25:42.000000000 -0400 +@@ -34,6 +34,14 @@ + /* Mail interface. (All MTAs should supply this command) */ + #define SENDMAIL "/usr/sbin/sendmail" + ++#ifndef PID_FILE ++#define PID_FILE "/var/run/anacron.pid" ++#endif ++ ++#ifndef LOCK_FILE ++#define LOCK_FILE "/var/lock/subsys/anacron" ++#endif ++ + /* End of user-configurable section */ + + diff --git a/anacron-2.3-mail-content-type-77108.patch b/anacron-2.3-mail-content-type-77108.patch new file mode 100644 index 0000000..4481603 --- /dev/null +++ b/anacron-2.3-mail-content-type-77108.patch @@ -0,0 +1,22 @@ +diff -u anacron-2.3/runjob.c~ anacron-2.3/runjob.c +--- anacron-2.3/runjob.c~ 2003-07-10 15:25:44.000000000 +0900 ++++ anacron-2.3/runjob.c 2003-07-10 15:25:44.000000000 +0900 +@@ -35,6 +35,8 @@ + #include + #include "global.h" + ++#include ++ + static int + temp_file() + /* Open a temporary file and return its file descriptor */ +@@ -217,6 +219,9 @@ + xwrite(fd, "To: "); + xwrite(fd, username()); + xwrite(fd, "\n"); ++ xwrite(fd, "Content-Type: text/plain; charset=\""); ++ xwrite(fd, nl_langinfo(CODESET)); ++ xwrite(fd, "\"\n"); + xwrite(fd, "Subject: Anacron job '"); + xwrite(fd, jr->ident); + xwrite(fd, "'\n\n"); diff --git a/anacron-2.3-mailto.patch b/anacron-2.3-mailto.patch new file mode 100644 index 0000000..79629d8 --- /dev/null +++ b/anacron-2.3-mailto.patch @@ -0,0 +1,58 @@ +diff -U 3 anacron-2.3.oud/runjob.c anacron-2.3/runjob.c +--- anacron-2.3.oud/runjob.c 2000-06-21 01:12:18.000000000 +0200 ++++ anacron-2.3/runjob.c 2004-07-09 19:05:22.314056376 +0200 +@@ -83,6 +83,18 @@ + return ps->pw_name; + } + ++static char * ++mailto() ++{ ++ char *alias; ++ ++ alias = getenv("MAILTO"); ++ if (alias == NULL || strlen(alias) == 0) ++ return username(); ++ else ++ return alias; ++} ++ + static void + xputenv(const char *s) + { +@@ -109,7 +121,6 @@ + run_job(const job_rec *jr) + /* This is called to start the job, after the fork */ + { +- setup_env(jr); + /* setup stdout and stderr */ + xclose(1); + xclose(2); +@@ -173,7 +184,7 @@ + * options, which don't seem to be appropriate here. + * Hopefully, this will keep all the MTAs happy. */ + execl(SENDMAIL, SENDMAIL, "-FAnacron", "-odi", +- username(), (char *)NULL); ++ mailto(), (char *)NULL); + die_e("Can't exec " SENDMAIL); + } + /* parent */ +@@ -208,6 +219,9 @@ + pid_t pid; + int fd; + ++ /* import environment for mailto() to work properly */ ++ setup_env(jr); ++ + /* create temporary file for stdout and stderr of the job */ + fd = jr->output_fd = temp_file(); + /* write mail header */ +@@ -215,7 +229,7 @@ + xwrite(fd, username()); + xwrite(fd, " (Anacron)\n"); + xwrite(fd, "To: "); +- xwrite(fd, username()); ++ xwrite(fd, mailto()); + xwrite(fd, "\n"); + xwrite(fd, "Subject: Anacron job '"); + xwrite(fd, jr->ident); diff --git a/anacron-2.3-memleaking.patch b/anacron-2.3-memleaking.patch new file mode 100644 index 0000000..66641a2 --- /dev/null +++ b/anacron-2.3-memleaking.patch @@ -0,0 +1,213 @@ +diff -ur anacron-2.3.orig/global.h anacron-2.3/global.h +--- anacron-2.3.orig/global.h 2006-10-08 09:58:47.000000000 -0400 ++++ anacron-2.3/global.h 2006-10-08 10:08:18.000000000 -0400 +@@ -108,18 +108,25 @@ + /* main.c */ + int xopen(int fd, const char *file_name, int flags); + void xclose(int fd); +-pid_t xfork(); ++pid_t xfork(void); ++ ++#ifdef __GNUC__ ++#define PRINTF_FORMAT(n, m) \ ++ __attribute__ ((format (printf, n, m))) ++#else ++#define PRINTF_FORMAT(n, m) ++#endif + + /* log.c */ +-void explain(const char *fmt, ...); +-void explain_e(const char *fmt, ...); +-void complain(const char *fmt, ...); +-void complain_e(const char *fmt, ...); +-void die(const char *fmt, ...); +-void die_e(const char *fmt, ...); +-void xdebug(const char *fmt, ...); +-void xdebug_e(const char *fmt, ...); +-void xcloselog(); ++void explain(const char *fmt, ...)PRINTF_FORMAT(1,2); ++void explain_e(const char *fmt, ...)PRINTF_FORMAT(1,2); ++void complain(const char *fmt, ...)PRINTF_FORMAT(1,2); ++void complain_e(const char *fmt, ...)PRINTF_FORMAT(1,2); ++void die(const char *fmt, ...)PRINTF_FORMAT(1,2); ++void die_e(const char *fmt, ...)PRINTF_FORMAT(1,2); ++void xdebug(const char *fmt, ...)PRINTF_FORMAT(1,2); ++void xdebug_e(const char *fmt, ...)PRINTF_FORMAT(1,2); ++void xcloselog(void); + + #ifdef DEBUG + #define Debug(args) xdebug args +@@ -130,8 +137,8 @@ + #endif /* not DEBUG */ + + /* readtab.c */ +-void read_tab(); +-void arrange_jobs(); ++void read_tab(void); ++void arrange_jobs(void); + + /* lock.c */ + int consider_job(job_rec *jr); +diff -ur anacron-2.3.orig/gregor.c anacron-2.3/gregor.c +--- anacron-2.3.orig/gregor.c 2006-10-08 09:58:47.000000000 -0400 ++++ anacron-2.3/gregor.c 2006-10-08 10:24:05.000000000 -0400 +@@ -25,7 +25,7 @@ + #include + #include "gregor.h" + +-const static int ++static const int + days_in_month[] = { + 31, /* Jan */ + 28, /* Feb (non-leap) */ +diff -ur anacron-2.3.orig/lock.c anacron-2.3/lock.c +--- anacron-2.3.orig/lock.c 2006-10-08 09:58:47.000000000 -0400 ++++ anacron-2.3/lock.c 2006-10-08 16:14:14.000000000 -0400 +@@ -42,7 +42,7 @@ + jr->timestamp_fd = open(jr->ident, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); + if (jr->timestamp_fd == -1) + die_e("Can't open timestamp file for job %s", jr->ident); +- fcntl(jr->timestamp_fd, F_SETFD, 1); /* set close-on-exec flag */ ++ fcntl(jr->timestamp_fd, F_SETFD, FD_CLOEXEC); /* set close-on-exec flag */ + /* We want to own this file, and set its mode to 0600. This is necessary + * in order to prevent other users from putting locks on it. */ + if (fchown(jr->timestamp_fd, getuid(), getgid())) +diff -ur anacron-2.3.orig/log.c anacron-2.3/log.c +--- anacron-2.3.orig/log.c 2006-10-08 09:58:47.000000000 -0400 ++++ anacron-2.3/log.c 2006-10-08 10:27:29.000000000 -0400 +@@ -35,6 +35,7 @@ + */ + + #include ++#include + #include + #include + #include +@@ -79,7 +80,7 @@ + } + + static void +-log(int priority, const char *fmt, va_list args) ++slog(int priority, const char *fmt, va_list args) + /* Log a message, described by "fmt" and "args", with the specified + * "priority". */ + { +@@ -97,7 +98,7 @@ + + static void + log_e(int priority, const char *fmt, va_list args) +-/* Same as log(), but also appends an error description corresponding ++/* Same as slog(), but also appends an error description corresponding + * to "errno". */ + { + int saved_errno; +@@ -123,7 +124,7 @@ + va_list args; + + va_start(args, fmt); +- log(EXPLAIN_LEVEL, fmt, args); ++ slog(EXPLAIN_LEVEL, fmt, args); + va_end(args); + } + +@@ -145,7 +146,7 @@ + va_list args; + + va_start(args, fmt); +- log(COMPLAIN_LEVEL, fmt, args); ++ slog(COMPLAIN_LEVEL, fmt, args); + va_end(args); + } + +@@ -167,7 +168,7 @@ + va_list args; + + va_start(args, fmt); +- log(COMPLAIN_LEVEL, fmt, args); ++ slog(COMPLAIN_LEVEL, fmt, args); + va_end(args); + if (getpid() == primary_pid) complain("Aborted"); + +@@ -199,7 +200,7 @@ + va_list args; + + va_start(args, fmt); +- log(DEBUG_LEVEL, fmt, args); ++ slog(DEBUG_LEVEL, fmt, args); + va_end(args); + } + +diff -ur anacron-2.3.orig/matchrx.c anacron-2.3/matchrx.c +--- anacron-2.3.orig/matchrx.c 2006-10-08 09:58:47.000000000 -0400 ++++ anacron-2.3/matchrx.c 2006-10-08 10:29:24.000000000 -0400 +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include "matchrx.h" + + int +@@ -49,11 +50,23 @@ + sub_offsets = malloc(sizeof(regmatch_t) * (n_sub + 1)); + memset(sub_offsets, 0, sizeof(regmatch_t) * (n_sub + 1)); + +- if (regcomp(&crx, rx, REG_EXTENDED)) return - 1; ++ if (regcomp(&crx, rx, REG_EXTENDED)) ++ { ++ free(sub_offsets); ++ return - 1; ++ } + r = regexec(&crx, string, n_sub + 1, sub_offsets, 0); +- if (r != 0 && r != REG_NOMATCH) return - 1; ++ if (r != 0 && r != REG_NOMATCH) ++ { ++ free(sub_offsets); ++ return - 1; ++ } + regfree(&crx); +- if (r == REG_NOMATCH) return 0; ++ if (r == REG_NOMATCH) ++ { ++ free(sub_offsets); ++ return 0; ++ } + + va_start(va, n_sub); + n = 1; +@@ -62,7 +75,11 @@ + substring = va_arg(va, char**); + if (substring != NULL) + { +- if (sub_offsets[n].rm_so == -1) return - 1; ++ if (sub_offsets[n].rm_so == -1) ++ { ++ free(sub_offsets); ++ return - 1; ++ } + *substring = string + sub_offsets[n].rm_so; + *(string + sub_offsets[n].rm_eo) = 0; + } +diff -ur anacron-2.3.orig/runjob.c anacron-2.3/runjob.c +--- anacron-2.3.orig/runjob.c 2006-10-08 09:58:47.000000000 -0400 ++++ anacron-2.3/runjob.c 2006-10-08 16:09:37.000000000 -0400 +@@ -64,8 +64,8 @@ + if (fdin == -1) die_e("Can't open temporary file for reading"); + if (unlink(name)) die_e("Can't unlink temporary file"); + free(name); +- fcntl(fdout, F_SETFD, 1); /* set close-on-exec flag */ +- fcntl(fdin, F_SETFD, 1); /* set close-on-exec flag */ ++ fcntl(fdout, F_SETFD, FD_CLOEXEC); /* set close-on-exec flag */ ++ fcntl(fdin, F_SETFD, FD_CLOEXEC); /* set close-on-exec flag */ + + jr->input_fd = fdin; + jr->output_fd = fdout; +@@ -178,7 +178,7 @@ + pid = xfork(); + if (pid == 0) + { +- long fdflags; ++ /* long fdflags; */ + + /* child */ + in_background = 1; diff --git a/anacron-2.3-mk-incl.patch b/anacron-2.3-mk-incl.patch new file mode 100644 index 0000000..8dff5fb --- /dev/null +++ b/anacron-2.3-mk-incl.patch @@ -0,0 +1,12 @@ +diff -u anacron-2.3/Makefile~ anacron-2.3/Makefile +--- anacron-2.3/Makefile~ 2002-08-28 19:18:49.000000000 +0900 ++++ anacron-2.3/Makefile 2002-08-28 19:18:49.000000000 +0900 +@@ -54,7 +54,7 @@ + $(SHELL) -ec "$(CC) -MM $(ALL_CPPFLAGS) $< \ + | sed '1s/^\(.*\)\.o[ :]*/\1.d &/1' > $@" + +-include $(csources:.c=.d) ++-include $(csources:.c=.d) + + anacron: $(objects) + $(CC) $(LDFLAGS) $^ $(LOADLIBES) -o $@ diff --git a/anacron-2.3-noconst.patch b/anacron-2.3-noconst.patch new file mode 100644 index 0000000..f72b796 --- /dev/null +++ b/anacron-2.3-noconst.patch @@ -0,0 +1,11 @@ +--- anacron-2.3/gregor.c.sopwith 2004-07-02 10:51:24.000000000 -0400 ++++ anacron-2.3/gregor.c 2004-07-02 10:51:33.000000000 -0400 +@@ -65,7 +65,7 @@ + { + int dn; + int i; +- const int isleap; /* save three calls to leap() */ ++ int isleap; /* save three calls to leap() */ + + /* Some validity checks */ + diff --git a/anacron-2.3-path.patch b/anacron-2.3-path.patch new file mode 100644 index 0000000..1442bd8 --- /dev/null +++ b/anacron-2.3-path.patch @@ -0,0 +1,11 @@ +--- ./anacrontab.path 2006-08-30 14:57:23.000000000 +0200 ++++ ./anacrontab 2006-08-30 14:58:09.000000000 +0200 +@@ -3,7 +3,7 @@ + # See anacron(8) and anacrontab(5) for details. + + SHELL=/bin/sh +-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ++PATH=/sbin:/bin:/usr/sbin:/usr/bin + MAILTO=root + + 1 65 cron.daily run-parts /etc/cron.daily diff --git a/anacron-2.3-pic.patch b/anacron-2.3-pic.patch new file mode 100644 index 0000000..5cb26d7 --- /dev/null +++ b/anacron-2.3-pic.patch @@ -0,0 +1,12 @@ +--- anacron-2.3/Makefile.piee 2006-10-17 12:39:39.000000000 +0200 ++++ anacron-2.3/Makefile 2006-10-17 12:39:39.000000000 +0200 +@@ -22,7 +22,8 @@ + PREFIX = + BINDIR = $(PREFIX)/usr/sbin + MANDIR = $(PREFIX)/usr/man +-CFLAGS = -Wall -pedantic -O2 ++LDFLAGS = -fpie -Wl,-z,relro ++CFLAGS = -Wall -pedantic -W -Wundef -fpie + #CFLAGS = -Wall -O2 -g -DDEBUG + + # If you change these, please update the man-pages too diff --git a/anacron.init b/anacron.init new file mode 100755 index 0000000..4d20e76 --- /dev/null +++ b/anacron.init @@ -0,0 +1,83 @@ +#!/bin/sh +# Startup script for anacron +# +# chkconfig: 2345 95 05 +# description: Run cron jobs that were left out due to downtime +# pidfile: /var/run/anacron.pid +# +# Source function library. +. /etc/rc.d/init.d/functions + +[ -f /usr/sbin/anacron ] || exit 0 + +prog="anacron" +PIDFILE=/var/run/${prog}.pid +LOCKFILE=/var/lock/subsys/$prog +# +# NOTE: anacron exits after it has determined it has no more work to do. +# Hence, its initscript cannot do normal lock file management. +# The anacron binary now creates its own /var/run/anacron.pid pid file +# and /var/lock/subsys lock files, and removes them automatically at exit, +# so at least there will be no more "anacron is dead but subsys locked" +# messages. +# + +start() { + echo -n $"Starting $prog: " + daemon +19 anacron -s + RETVAL=$? + if [ $RETVAL -ne 0 ]; then + failure; + fi; + echo + return $RETVAL +} + +stop() { + echo -n $"Stopping $prog: " + if [ -f $PIDFILE ]; then + killproc anacron + RETVAL=$? + if [ $RETVAL -ne 0 ]; then + failure; + fi; + else + RETVAL=1 + failure; + fi + echo + return $RETVAL +} + +case "$1" in + start) + start + ;; + + stop) + stop + ;; + + status) + status anacron + ;; + + restart) + stop + start + ;; + + condrestart) + if [ -f $LOCKFILE ]; then + stop + start + fi + ;; + + *) + echo $"Usage: $0 {start|stop|restart|condrestart|status}" + exit 1 + +esac + +exit $RETVAL diff --git a/anacron.spec b/anacron.spec new file mode 100644 index 0000000..c477197 --- /dev/null +++ b/anacron.spec @@ -0,0 +1,343 @@ +Summary: A cron-like program that can run jobs lost during downtime +Name: anacron +Version: 2.3 +Release: 47%{?dist} +License: GPL +Group: System Environment/Base +URL: http://packages.debian.org/stable/source/anacron +Source: http://ftp.debian.org/debian/pool/main/a/anacron/%{name}_%{version}.orig.tar.gz +Source1: anacrontab +Source2: anacron.init +Patch0: anacron-2.3-mk-incl.patch +Patch1: anacron-2.3-mail-content-type-77108.patch +Patch2: anacron-2.3-noconst.patch +Patch3: anacron-2.3-mailto.patch +Patch4: anacron-2.3-lock-files.patch +Patch5: anacron-2.3-fdclose.patch +Patch6: anacron-2.3-hostname.patch +#Patch7: anacron-2.3-pie.patch +#Patch8: anacron-2.3-memoryleak.patch +Patch9: anacron-2.3-pic.patch +Patch10: anacron-2.3-memleaking.patch +Requires: /bin/sh +Requires: crontabs +Requires: initscripts +Requires(post): /sbin/chkconfig +Requires(preun): /sbin/chkconfig +Requires(postun): /sbin/service +Requires(preun): /sbin/service +BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot + +%description +Anacron (like `anac(h)ronistic') is a periodic command scheduler. +It executes commands at intervals specified in days. Unlike cron, it +does not assume that the system is running continuously. It can +therefore be used to control the execution of daily, weekly and +monthly jobs (or anything with a period of n days), on systems that +don't run 24 hours a day. When installed and configured properly, +Anacron will make sure that the commands are run at the specified +intervals as closely as machine-uptime permits. + +This package is pre-configured to execute the daily jobs of the Red +Hat Linux (Fedora Core) system. You should install this program if your +system isn't powered on 24 hours a day to make sure the maintenance +jobs of other Red Hat Linux (Fedora Core) packages are executed each day. + +%prep +%setup -q +%patch0 -p1 -b .incl +%patch1 -p1 -b .charset +%patch2 -p1 -b .noconst +%patch3 -p1 -b .mailto +%patch4 -p1 -b .lock-files +%patch5 -p1 -b .fdclose +%patch6 -p1 -b .hostname +#%patch7 -p1 -b .pie +#%patch8 -p1 -b .memoryleak +%patch9 -p1 -b .pic +%patch10 -p1 -b .memleaking + +%build +make CFLAGS="$RPM_OPT_FLAGS" %{?_smp_mflags} + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/{etc/,usr/sbin/,%{_mandir}/man5,%{_mandir}/man8/} +mkdir -p $RPM_BUILD_ROOT/var/spool/anacron/ + +# +cp anacron $RPM_BUILD_ROOT/usr/sbin +cp anacron.8 $RPM_BUILD_ROOT/%{_mandir}/man8/ +cp anacrontab.5 $RPM_BUILD_ROOT/%{_mandir}/man5/ +cp %SOURCE1 $RPM_BUILD_ROOT/etc + +for i in cron.daily cron.weekly cron.monthly;do +mkdir -p $RPM_BUILD_ROOT/etc/$i/ +cat << EOF > $RPM_BUILD_ROOT/etc/$i/0anacron +#!/bin/sh +# +# anacron's cron script +# +# This script updates anacron time stamps. It is called through run-parts +# either by anacron itself or by cron. +# +# The script is called "0anacron" to assure that it will be executed +# _before_ all other scripts. + +# Don't run anacron if this script is called by anacron. +if [ ! -e /var/run/anacron.pid ]; then + anacron -u $i +fi + +EOF +chmod +x $RPM_BUILD_ROOT/etc/$i/0anacron +done + +# +#for i in `find $RPM_BUILD_ROOT/ -type 'f' -perm '+a=x'`;do +# file $i|grep -q "not stripped" && strip $i +#done + +mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d/ +install -c -m755 %SOURCE2 $RPM_BUILD_ROOT/etc/rc.d/init.d/anacron + +%clean +rm -rf $RPM_BUILD_ROOT + + +%post +/sbin/chkconfig --add anacron + +%preun +if [ "$1" = "0" ]; then + service anacron stop >/dev/null 2>&1 + /sbin/chkconfig --del anacron +fi + +%postun +if [ "$1" -ge "1" ]; then + service anacron condrestart >/dev/null 2>&1 +fi + +%files +%defattr(-,root,root,0755) +%doc COPYING README +%config(noreplace) /etc/anacrontab +%dir /var/spool/anacron/ +%config(noreplace) /etc/rc.d/init.d/* +/%{_mandir}/man5/* +/%{_mandir}/man8/* +/usr/sbin/anacron +##%config(noreplace) /etc/cron.daily/0anacron +%attr(755,root,root) %dir /etc/cron.daily/0anacron +%attr(755,root,root) %dir /etc/cron.monthly/0anacron +%attr(755,root,root) %dir /etc/cron.weekly/0anacron + +%changelog +* Tue Feb 6 2007 Marcela Maslanova 2.3-47 +- thanks for review from Jef Spaleta +- rhbz#225247, rhbz#211309 + +* Mon Dec 04 2006 Marcela Maslanova 2.3-45 +- rebuilt with pie insted pic + +* Tue Oct 10 2006 Marcela Maslanova 2.3-44 +- fix memory leaking (both #210020) +- PIE(PIC) executable + +* Tue Oct 2 2006 Marcela Maslanova 2.3-42 +- hostname added to mail (#208914) + +* Fri Sep 29 2006 Marcela Maslanova 2.3-41 +- change spec file - patch from Orion Poplawski (#191410) + +* Mon Sep 11 2006 Dan Walsh 2.3-40 +- Grab the fdclose patch from FC4 +- fix bug 185973: allow use of sendmail under selinux-policy-strict: + apply patch contributed by Ted Rule + +* Wed Aug 30 2006 Jitka Kudrnacova - 2.3-39 +- modified PATH in /etc/anacrontab file to make the same as in /etc/crontab (#61891) + +* Wed Jul 12 2006 Jesse Keating - 2.3-38.FC6.1 +- rebuild + +* Thu Apr 13 2006 Jason Vas Dias - 2.3-38.1 +- fix bug 188403: anacron SysVinit locking: + Since anacron just exits when it has no more work to do, the + initscript cannot do normal /var/lock/subsys/anacron lock file + creation, else messages such as 'anacron dead but subsys locked' + will appear when changing init levels. + + Now, the anacron process itself creates its own + /var/lock/subsys/anacron SysVinit lock file and + /var/run/anacron.pid pid file to co-operate more + gracefully with the initscript system. + +* Fri Feb 10 2006 Jesse Keating - 2.3-36.1 +- bump again for double-long bug on ppc(64) + +* Tue Feb 07 2006 Jason Vas Dias - 2.3-36 +- rebuild for new gcc, glibc, glibc-kernheaders + +* Wed Jan 11 2006 Peter Jones 2.3-35 +- Fix initscript so changing runlevel shuts it down correctly + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Wed Mar 16 2005 Jason Vas Dias 2.3-34 +- Rebuild with gcc4 in FC4. + +* Mon Feb 21 2005 Jason Vas Dias 2.3-33 +- Rebuild for FC4 . + +* Tue Sep 28 2004 Rik van Riel 2.3-32 +- add MAILTO option, like vixie cron has (bz#127924) + +* Fri Jul 2 2004 Elliot Lee +- rebuilt +- Add noconst patch to fix invalid C + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Thu Jul 10 2003 Jens Petersen - 2.3-29 +- don't require vixie-cron (#21176) [reported by Gerald Teschl] +- in init script don't remove /var/lock/subsys/anacron when stopping (#58462) +- exit init script with actual exit status (#44600) [reported by Enrico Scholz] + +* Thu Jul 10 2003 Jens Petersen - 2.3-28 +- add a Content-Type header to mails giving the charset encoding (#77108) + +* Thu Jul 10 2003 Jens Petersen - 2.3-27 +- in init script do not touch /var/lock/subsys/anacron when starting (#58462) +- require crontabs (#21176) +- update source url + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Wed Jan 22 2003 Tim Powers +- rebuilt + +* Wed Dec 11 2002 Tim Powers 2.3-24 +- rebuild on all arches + +* Fri Aug 23 2002 Jens Petersen 2.3-23 +- delay the start of anacron by 60min to make startup more pleasant (#68304) +- at startup run jobs serially and nice 19 to reduce load (#65870, #68304) +- spec file now in utf-8 +- dont install non-existant NEWS file +- silence make include warnings + +* Fri Jul 19 2002 Akira TAGOH 2.3-22 +- fix the stripped binary issue. + +* Mon Jul 08 2002 Bill Huang +- Update "Copyright" to "License" in spec file + +* Fri Jun 21 2002 Tim Powers +- automated rebuild + +* Thu May 23 2002 Tim Powers +- automated rebuild + +* Wed Jan 09 2002 Tim Powers +- automated rebuild + +* Sun Jun 24 2001 Elliot Lee +- Bump release + rebuild. + +* Tue Apr 3 2001 Crutcher Dunnavant +- add dependancy to vixie-cron (for /usr/bin/run-parts) + +* Tue Feb 13 2001 Tim Waugh +- killproc is a shell function and can't be passed as a parameter + (bug #27150). + +* Mon Feb 5 2001 Bernhard Rosenkraenzer +- Fix i18n in initscript ("Stopping anacron" wasn't translated) + (#26076) + +* Fri Feb 2 2001 Trond Eivind Glomsrød +- i18nize initscript + +* Thu Dec 7 2000 Crutcher Dunnavant +- rebuild in rebuild cycle. + +* Mon Oct 30 2000 Matt Wilson +- touch /var/lock/subsys/anacron to prevent excess startage during + init level change + +* Wed Aug 30 2000 Bernhard Rosenkraenzer +- Shut down earlier to prevent NFS mounted /usr filesystems from causing + problems (Bug #16257) + +* Fri Aug 4 2000 Bernhard Rosenkraenzer +- Start it later so services some cron scripts may depend on are running + (Bug #15335) + +* Thu Aug 3 2000 Bernhard Rosenkraenzer +- Fix up initscript (Bug #15123 and an unreported bug) + +* Sat Jul 15 2000 Bill Nottingham +- move initscript back + +* Wed Jul 12 2000 Prospector +- automatic rebuild + +* Mon Jul 10 2000 Bernhard Rosenkraenzer +- Fix up initscripts (Bug #13625) + +* Tue Jul 4 2000 Matt Wilson +- Prereq: /sbin/chkconfig + +* Mon Jun 26 2000 Preston Brown +- move initscript to /etc/init.d, fix up post/preun/postun scripts. + +* Sun Jun 26 2000 Bernhard Rosenkraenzer +- 2.3 + +* Sun Jun 18 2000 Matt Wilson +- use %%{_mandir} + +* Fri Mar 03 2000 Tim Powers +- fixed startup script so that it doesn't put stuff in /var/lock/subsys. + Complains since anacronda turns itself off when it is run, and the file in + /var/lock/subsys isn't removed. + +* Mon Feb 28 2000 Tim Powers +- fixed startup script, now it actually stops, gives status and restarts. + Fixes bug #9835 + +* Mon Feb 7 2000 Bill Nottingham +- handle compressed manpages + +* Fri Feb 4 2000 Bernhard Rosenkraenzer +- rebuild to get compressed man pages +- mark /etc/cron.daily/... as config files + +* Wed Feb 02 2000 Cristian Gafton +- fix annoying defines +- rebuild to update description and group + +* Thu Jan 6 2000 Bernhard Rosenkränzer +- initial Red Hat package + +* Wed Dec 29 1999 Chmouel Boudjnah +- Remove cron.hourly check (unusefull). + +* Wed Nov 10 1999 Chmouel Boudjnah +- 2.1 from debian. +- Fix typo in initscripts. + +* Thu Jul 22 1999 Chmouel Boudjnah +- Fix wrong entries in anacrontab. +- Add a /etc/rc.sysinit/ script + +* Tue Apr 27 1999 Chmouel Boudjnah +- Fix bug with /var/spool/anacron/ + +* Sat Apr 10 1999 Chmouel Boudjnah +- First version mainly inspired from the Debian package. diff --git a/anacrontab b/anacrontab new file mode 100644 index 0000000..ab071e7 --- /dev/null +++ b/anacrontab @@ -0,0 +1,11 @@ +# /etc/anacrontab: configuration file for anacron + +# See anacron(8) and anacrontab(5) for details. + +SHELL=/bin/sh +PATH=/sbin:/bin:/usr/sbin:/usr/bin +MAILTO=root + +1 65 cron.daily run-parts /etc/cron.daily +7 70 cron.weekly run-parts /etc/cron.weekly +30 75 cron.monthly run-parts /etc/cron.monthly diff --git a/dead.package b/dead.package deleted file mode 100644 index 983275a..0000000 --- a/dead.package +++ /dev/null @@ -1 +0,0 @@ -Obsoleted by cronie-anacron as of F-12. diff --git a/sources b/sources new file mode 100644 index 0000000..f016dad --- /dev/null +++ b/sources @@ -0,0 +1,2 @@ +9fdfc50f5741643332722a9145146278 anacron_2.3.orig.tar.gz +094af5e05723d2c4924d60f73d738509 anacron.init