diff -uN ../anacron-2.3/Makefile ./Makefile --- ../anacron-2.3/Makefile Fri Jun 23 00:26:11 2000 +++ ./Makefile Fri May 2 22:16:51 2003 @@ -19,16 +19,16 @@ # `COPYING' that comes with the Anacron source distribution. -PREFIX = -BINDIR = $(PREFIX)/usr/sbin -MANDIR = $(PREFIX)/usr/man +PREFIX ?= /usr/local +BINDIR = $(PREFIX)/sbin +MANDIR = $(PREFIX)/man CFLAGS = -Wall -pedantic -O2 #CFLAGS = -Wall -O2 -g -DDEBUG # If you change these, please update the man-pages too # Only absolute paths here, please SPOOLDIR = /var/spool/anacron -ANACRONTAB = /etc/anacrontab +ANACRONTAB = $(PREFIX)/etc/anacrontab RELEASE = 2.3 package_name = anacron-$(RELEASE) @@ -64,7 +64,7 @@ .PHONY: installdirs installdirs: - $(INSTALL_DIR) $(BINDIR) $(PREFIX)$(SPOOLDIR) \ + $(INSTALL_DIR) $(BINDIR) $(SPOOLDIR) \ $(MANDIR)/man5 $(MANDIR)/man8 .PHONY: install @@ -72,6 +72,7 @@ $(INSTALL_PROGRAM) anacron $(BINDIR)/anacron $(INSTALL_DATA) anacrontab.5 $(MANDIR)/man5/anacrontab.5 $(INSTALL_DATA) anacron.8 $(MANDIR)/man8/anacron.8 + $(INSTALL_DATA) anacrontab.sample $(PREFIX)/etc/anacrontab.sample .PHONY: clean clean: diff -uN ../anacron-2.3/anacron.8 ./anacron.8 --- ../anacron-2.3/anacron.8 Fri Jun 23 00:42:05 2000 +++ ./anacron.8 Fri May 2 21:57:56 2003 @@ -18,7 +18,7 @@ usually controlled by \fBcron\fR. .PP When executed, Anacron reads a list of jobs from a configuration file, normally -.I /etc/anacrontab +.I /usr/local/etc/anacrontab (see \fBanacrontab(5)\fR). This file contains the list of jobs that Anacron controls. Each job entry specifies a period in days, @@ -84,7 +84,7 @@ .TP .B -n Run jobs now. Ignore the delay specifications in the -.I /etc/anacrontab +.I /usr/local/etc/anacrontab file. This options implies \fB-s\fR. .TP .B -d @@ -117,7 +117,7 @@ for more information. .SH FILES .TP -.I /etc/anacrontab +.I /usr/local/etc/anacrontab Contains specifications of jobs. See \fBanacrontab(5)\fR for a complete description. .TP diff -uN ../anacron-2.3/anacrontab.5 ./anacrontab.5 --- ../anacron-2.3/anacrontab.5 Wed Jun 21 01:12:18 2000 +++ ./anacrontab.5 Fri May 2 21:58:31 2003 @@ -1,9 +1,9 @@ .TH ANACRONTAB 5 1998-02-02 "Itai Tzur" "Anacron Users' Manual" .SH NAME -/etc/anacrontab \- configuration file for anacron +/usr/local/etc/anacrontab \- configuration file for anacron .SH DESCRIPTION The file -.I /etc/anacrontab +.I /usr/local/etc/anacrontab describes the jobs controlled by \fBanacron(8)\fR. Its lines can be of three kinds: job-description lines, environment assignments, or empty lines. diff -uN ../anacron-2.3/anacrontab.sample ./anacrontab.sample --- ../anacron-2.3/anacrontab.sample Thu Jan 1 01:00:00 1970 +++ ./anacrontab.sample Sat May 3 20:14:43 2003 @@ -0,0 +1,12 @@ + +PATH=/bin:/sbin:/usr/bin:/usr/sbin + +# days make sure the command is executed at least every 'days' days +# delay delay in minutes, before a command starts +# id unique id of a command + +# days delay id command +1 5 daily periodic daily +7 15 weekly periodic weekly +30 60 monthly periodic monthly + diff -uN ../anacron-2.3/matchrx.c ./matchrx.c --- ../anacron-2.3/matchrx.c Wed Jun 21 01:12:18 2000 +++ ./matchrx.c Thu May 1 14:46:35 2003 @@ -23,6 +23,7 @@ #include +#include #include #include #include diff -uN ../anacron-2.3/readtab.c ./readtab.c --- ../anacron-2.3/readtab.c Fri Jun 23 00:13:12 2000 +++ ./readtab.c Mon Aug 25 16:46:18 2003 @@ -19,6 +19,11 @@ The GNU General Public License can also be found in the file `COPYING' that comes with the Anacron source distribution. + + Changes: + + May 2003 (Derik van Zuetphen) + replaced obstack with malloc/realloc calls */ @@ -29,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -37,8 +41,6 @@ #include "global.h" #include "matchrx.h" -static struct obstack input_o; /* holds input line */ -static struct obstack tab_o; /* holds processed data read from anacrontab */ static FILE *tab; job_rec **job_array; int njobs; /* number of jobs to run */ @@ -47,9 +49,7 @@ static job_rec *last_job_rec; /* last job stored in memory, at the moment */ static env_rec *last_env_rec; /* last environment assignment stored */ -/* some definitions for the obstack macros */ -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free +#define MAXTABLINE 1000 static void * xmalloc (size_t size) @@ -63,6 +63,18 @@ return ptr; } +static void * +xrealloc (void *mem, size_t size) +/* Just like standard realloc(), only never returns NULL. */ +{ + void * ptr; + + ptr = realloc(mem,size); + if (ptr == NULL) + die("Memory exhausted"); + return ptr; +} + static int conv2int(const char *s) /* Return the int or -1 on over/under-flow @@ -78,19 +90,20 @@ } static char * -read_tab_line () +read_tab_line (char *line) /* Read one line and return a pointer to it. Return NULL if no more lines. */ { int c; + int i = 0; if (feof(tab)) return NULL; - while ((c = getc(tab)) != EOF && c != '\n') - obstack_1grow(&input_o, c); + while (i < MAXTABLINE-1 && (c = getc(tab)) != EOF && c != '\n') + line[i++] = c; if (ferror(tab)) die_e("Error reading %s", anacrontab); - obstack_1grow(&input_o, '\0'); - return obstack_finish(&input_o); + line[i] = 0; + return line; } static int @@ -119,8 +132,8 @@ var_len = strlen(env_var); val_len = strlen(value); - er = obstack_alloc(&tab_o, sizeof(env_rec)); - er->assign = obstack_alloc(&tab_o, var_len + 1 + val_len + 1); + er = (env_rec*)xmalloc(sizeof(env_rec)); + er->assign = (char*)xmalloc(var_len + 1 + val_len + 1); strcpy(er->assign, env_var); er->assign[var_len] = '='; strcpy(er->assign + var_len + 1, value); @@ -151,14 +164,14 @@ anacrontab, line_num); return; } - jr = obstack_alloc(&tab_o, sizeof(job_rec)); + jr = (job_rec*)xmalloc(sizeof(job_rec)); jr->period = period; jr->delay = delay; jr->tab_line = line_num; - jr->ident = obstack_alloc(&tab_o, ident_len + 1); + jr->ident = (char*)xmalloc(ident_len + 1); strcpy(jr->ident, ident); jr->arg_num = job_arg_num(ident); - jr->command = obstack_alloc(&tab_o, command_len + 1); + jr->command = (char*)xmalloc(command_len + 1); strcpy(jr->command, command); jr->job_pid = jr->mailer_pid = 0; if (last_job_rec != NULL) last_job_rec->next = jr; @@ -222,7 +235,7 @@ read_tab() /* Read the anacrontab file into memory */ { - char *tab_line; + char tab_line[MAXTABLINE]; first_job_rec = last_job_rec = NULL; first_env_rec = last_env_rec = NULL; @@ -231,14 +244,10 @@ /* Open the anacrontab file */ tab = fopen(anacrontab, "r"); if (tab == NULL) die_e("Error opening %s", anacrontab); - /* Initialize the obstacks */ - obstack_init(&input_o); - obstack_init(&tab_o); - while ((tab_line = read_tab_line()) != NULL) + while ((read_tab_line(tab_line)) != NULL) { line_num++; parse_tab_line(tab_line); - obstack_free(&input_o, tab_line); } if (fclose(tab)) die_e("Error closing %s", anacrontab); } @@ -269,16 +278,17 @@ j = first_job_rec; njobs = 0; + job_array = NULL; while (j != NULL) { if (j->arg_num != -1 && (update_only || consider_job(j))) { + job_array = (job_rec**)xrealloc(job_array, (njobs+1)*sizeof(j)); + job_array[njobs] = j; njobs++; - obstack_grow(&tab_o, &j, sizeof(j)); } j = j->next; } - job_array = obstack_finish(&tab_o); /* sort the jobs */ qsort(job_array, njobs, sizeof(*job_array),