berg@messua.informatik.rwth-aachen.de (Stephen R. van den Berg) (06/26/91)
Submitted-by: Stephen R. van den Berg <berg@messua.informatik.rwth-aachen.de> Posting-number: Volume 20, Issue 68 Archive-name: procmail/patch01 Patch-To: procmail: Volume 20, Issue 49-51 Environment: UNIX, sendmail This patch file will upgrade procmail v2.02 to v2.03. Fixes all the portability problems that have been reported to me. Contains several cosmetic improvements. Fixes two minor bugs. Save the following in a file; cd procmail; and feed it to patch like in: patch -p < this_file_or_whatever_you_named_it Check if no *.rej files were generated; rm all *.orig files in all subdirectories. -- The latest version (currently v2.03) can be obtained directly from the ftp-archive at: amaru.informatik.rwth-aachen.de (137.226.112.31) as compressed tar file: pub/unix/procmail.tar.Z or in compressed shar format: pub/unix/procmail.0?.Z Stephen R. van den Berg. -----------------------------cut here------------------------------ diff -rc ../old/FEATURES ./FEATURES *** ../old/FEATURES Tue Jun 18 16:12:55 1991 --- ./FEATURES Thu Jun 20 11:56:46 1991 *************** *** 49,54 **** --- 49,55 ---- standard mail programs) + Can split up mailboxes into the individual messages + Can split up digests into the individual messages + + Can split up saved articles into the individual articles Feature summary for lockfile: + Provides NFS-secure lockfiles to shell script programmers diff -rc ../old/HISTORY ./HISTORY *** ../old/HISTORY Tue Jun 18 16:12:55 1991 --- ./HISTORY Thu Jun 20 11:56:47 1991 *************** *** 115,117 **** --- 115,139 ---- 1991/06/12: v2.02 Fixed typo in strstr replacement Fixed runaway line while logging long folder names + 1991/06/20: v2.03 + Added EX_OSFILE to include/sysexits.h (oversight) + Slightly changed the terminate code in procmail (more reliable + when forks did not succeed while filtering and signals arrived + during a small window) + Added a listing of all entries that can appear in autoconf.h + to autoconf to simplify manual autoconf.h generation + Changed formail to be able to split up collected articles (trivial) + Edited include/string.h, strspn is of type int + Changes to autoconf: + Added strtol detection + Enhanced const detection for braindamaged compilers + Stopped using the function grepfor, changed it into a small + script (Vltrix does not support functions in /bin/sh) + Made the check for missing library parts more resistant against + elaborate warnings from the C-compiler + Fixed typo in retint.c (sleep with one redundant argument), hurray + for prototypes + Added MANSUFFIX macro to Makefile + Avoided namespace conflict ("failurel") in lockfile.c for + braindamaged compilers + Renamed ultostr to avoided library conflict on some machines diff -rc ../old/Makefile ./Makefile *** ../old/Makefile Tue Jun 18 16:12:46 1991 --- ./Makefile Thu Jun 20 12:00:38 1991 *************** *** 1,10 **** ! #$Id: Makefile,v 2.0 1991/06/10 14:39:08 berg Rel $ # change BASENAME to your home directory if need be BASENAME = /usr/local BINDIR = $(BASENAME)/bin ! MANDIR = $(BASENAME)/man/man1 ######################################################################## # Only edit below this line if you *think* you know what you are doing # --- 1,11 ---- ! #$Id: Makefile,v 2.3 1991/06/20 09:54:14 berg Rel $ # change BASENAME to your home directory if need be BASENAME = /usr/local BINDIR = $(BASENAME)/bin ! MANSUFFIX= 1 ! MANDIR = $(BASENAME)/man/man$(MANSUFFIX) ######################################################################## # Only edit below this line if you *think* you know what you are doing # *************** *** 41,52 **** formail: formail.$(O) common.$(O) $(CC) $(CFLAGS) -o formail formail.$(O) common.$(O) ${LDFLAGS} ! _autotst: _autotst.c ! $(CC) $(CFLAGS) -o _autotst _autotst.c $(LDFLAGS) autoconf.h: autoconf Makefile ! /bin/sh autoconf $(OBJ): $(DEP) retint.$(O): $(DEP) exopen.h --- 42,55 ---- formail: formail.$(O) common.$(O) $(CC) $(CFLAGS) -o formail formail.$(O) common.$(O) ${LDFLAGS} ! _autotst: _autotst.$(O) ! $(CC) $(CFLAGS) -o _autotst _autotst.$(O) $(LDFLAGS) autoconf.h: autoconf Makefile ! /bin/sh autoconf $(O) + Makefile: + $(OBJ): $(DEP) retint.$(O): $(DEP) exopen.h *************** *** 69,79 **** $(CC) $(CFLAGS) -c $*.c install: all ! chmod 755 $(BINS) cp $(BINS) $(BINDIR) ! chmod 644 man/procmail.1 man/lockfile.1 man/formail.1 ! cp man/procmail.1 man/lockfile.1 man/formail.1 $(MANDIR) clean: $(RM) $(OBJ) common.$(O) lockfile.$(O) exopen.$(O) retint.$(O) \ ! formail.$(O) $(BINS) autoconf.h _autotst* --- 72,86 ---- $(CC) $(CFLAGS) -c $*.c install: all ! chmod 0755 $(BINS) cp $(BINS) $(BINDIR) ! chmod 0644 man/procmail.$(MANSUFFIX) man/lockfile.$(MANSUFFIX) \ ! man/formail.$(MANSUFFIX) ! cp man/procmail.$(MANSUFFIX) man/lockfile.$(MANSUFFIX) \ ! man/formail.$(MANSUFFIX) $(MANDIR) + again: all + clean: $(RM) $(OBJ) common.$(O) lockfile.$(O) exopen.$(O) retint.$(O) \ ! formail.$(O) $(BINS) autoconf.h _autotst* grepfor diff -rc ../old/README ./README *** ../old/README Tue Jun 18 16:12:28 1991 --- ./README Thu Jun 20 11:56:57 1991 *************** *** 24,30 **** ------------------------------ DESCRIPTION ----------------------------------- ! The procmail mail processing program. (v2.02 1991/06/12) Can be used to create mail-servers, mailing lists, sort your incoming mail into separate folders/files (real convenient when subscribing to one or more --- 24,30 ---- ------------------------------ DESCRIPTION ----------------------------------- ! The procmail mail processing program. (v2.03 1991/06/20) Can be used to create mail-servers, mailing lists, sort your incoming mail into separate folders/files (real convenient when subscribing to one or more *************** *** 73,78 **** --- 73,86 ---- 6369 ZG Simpelveld The Netherlands + ---------------------- + A recent version can be picked up at various comp.sources.misc archives. + The latest version can be obtained directly from the ftp-archive at: + + amaru.informatik.rwth-aachen.de (137.226.112.31) + + as compressed tar file: pub/unix/procmail.tar.Z + or in compressed shar format: pub/unix/procmail.0?.Z ---------------------- P.S. I don't mind if you feed the program files through your favourite C diff -rc ../old/autoconf ./autoconf *** ../old/autoconf Tue Jun 18 16:12:48 1991 --- ./autoconf Thu Jun 20 11:56:59 1991 *************** *** 1,10 **** - #!/bin/sh - #$Id: autoconf,v 2.1 1991/06/11 12:59:16 berg Rel $ ! SHELL=/bin/sh || exec /bin/sh <autoconf # we're in a csh, feed myself to sh ACONF=autoconf.h ! trap "rm $ACONF;exit 1" 1 2 3 15 cat >$ACONF <<HERE /* This file was automagically generated by autoconf */ --- 1,37 ---- ! #$Id: autoconf,v 2.4 1991/06/20 09:54:14 berg Rel $ + SHELL=/bin/sh || exec /bin/sh autoconf $1 # we're in a csh, feed myself to sh + + # All possible entries in autoconf.h: + # + # #define const + # #define volatile + # #define void char + # typedef int mode_t; + # typedef int pid_t; + # typedef unsigned size_t; + # typedef long time_t; + # #define NOmemmove + # #define NObcopy + # #define NOstrstr + # #define strtol(str,ptr,base) ((long)atoi(str)) + + PATH=:$PATH + export SHELL ACONF=autoconf.h ! trap "exit 1" 1 2 3 15 ! ! cat >grepfor <<HERE ! if fgrep "\$1" _autotst.rrr >/dev/null ! then ! echo "\$2" >>$ACONF ! exit 0 ! fi ! exit 1 ! HERE ! chmod 0755 grepfor ! cat >$ACONF <<HERE /* This file was automagically generated by autoconf */ *************** *** 14,43 **** # hence the const test has to precede all others. cat >_autotst.c <<HERE ! main(){const int i;return 0;} HERE echo 'Testing for const' ! if make _autotst >/dev/null 2>&1 ! then ! : ! else ! echo '#define const' >>$ACONF ! fi ! rm -f _autotst _autotst.o cat >_autotst.c <<HERE main(){volatile int i;return 0;} HERE echo 'Testing for volatile' ! if make _autotst >/dev/null 2>&1 then : else echo '#define volatile' >>$ACONF fi ! rm -f _autotst _autotst.o cat >_autotst.c <<HERE main(){int i;i= -1;return i=-i;} --- 41,68 ---- # hence the const test has to precede all others. cat >_autotst.c <<HERE ! main(){const char*p;const char*q; ! p="t";q=p;return 0;} HERE echo 'Testing for const' ! make _autotst.$1 >_autotst.rrr 2>&1 ! rm -f _autotst.$1 + grepfor const '#define const' + cat >_autotst.c <<HERE main(){volatile int i;return 0;} HERE echo 'Testing for volatile' ! if make _autotst.$1 >/dev/null 2>&1 then : else echo '#define volatile' >>$ACONF fi ! rm -f _autotst.$1 cat >_autotst.c <<HERE main(){int i;i= -1;return i=-i;} *************** *** 51,57 **** echo 'Aha, this one is genuine antique!' echo '#define void char' >>$ACONF fi ! rm -f _autotst _autotst.o cat >_autotst.c <<HERE --- 76,82 ---- echo 'Aha, this one is genuine antique!' echo '#define void char' >>$ACONF fi ! rm -f _autotst _autotst.$1 cat >_autotst.c <<HERE *************** *** 66,81 **** HERE echo 'Testing for void*,size_t,pid_t,time_t,mode_t' ! make _autotst >_autotst.rrr 2>&1 ! rm -f _autotst _autotst.o - grepfor(){ - if fgrep "$1" _autotst.rrr >/dev/null - then - echo "$2" >>$ACONF - fi - } - grepfor void '#define void char' grepfor size_t 'typedef unsigned size_t;' grepfor pid_t 'typedef int pid_t;' --- 91,99 ---- HERE echo 'Testing for void*,size_t,pid_t,time_t,mode_t' ! make _autotst.$1 >_autotst.rrr 2>&1 ! rm -f _autotst.$1 grepfor void '#define void char' grepfor size_t 'typedef unsigned size_t;' grepfor pid_t 'typedef int pid_t;' *************** *** 84,107 **** cat >_autotst.c <<HERE #include "includes.h" ! main(){char a[1]; ! setpwent();endpwent();memmove(a,"t",1);bcopy("t",a,1);strstr(a,"t");return 0;} HERE ! echo 'Testing for memmove & strstr' make _autotst >_autotst.rrr 2>&1 ! rm -f _autotst _autotst.o ! if fgrep memmove _autotst.rrr >/dev/null ! then ! echo '#define NOmemmove' >>$ACONF ! grepfor bcopy '#define NObcopy' ! fi grepfor strstr '#define NOstrstr' grepfor setpwent '#define setpwent()' grepfor endpwent '#define endpwent()' ! rm -f _autotst* echo -----------------------------autoconf.h----------------------------------- cat autoconf.h --- 102,124 ---- cat >_autotst.c <<HERE #include "includes.h" ! main(){char a[2]; ! setpwent();endpwent();memmove(a,"0",1);bcopy("0",a,1);strstr(a,"0"); ! strtol("0",(char**)0,10);return 0;} HERE ! echo 'Testing for memmove, strstr & strtol' ! make _autotst.$1 >/dev/null 2>&1 make _autotst >_autotst.rrr 2>&1 ! rm -f _autotst _autotst.$1 ! grepfor memmove '#define NOmemmove' && grepfor bcopy '#define NObcopy' grepfor strstr '#define NOstrstr' grepfor setpwent '#define setpwent()' grepfor endpwent '#define endpwent()' + grepfor strtol '#define strtol(str,ptr,base) ((long)atoi(str))' ! rm -f _autotst* grepfor echo -----------------------------autoconf.h----------------------------------- cat autoconf.h diff -rc ../old/common.c ./common.c *** ../old/common.c Tue Jun 18 16:12:30 1991 --- ./common.c Thu Jun 20 11:57:00 1991 *************** *** 9,15 **** * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: common.c,v 2.0 1991/06/10 14:35:35 berg Rel $"; #endif #include "includes.h" --- 9,15 ---- * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: common.c,v 2.1 1991/06/19 17:41:41 berg Rel $"; #endif #include "includes.h" *************** *** 42,48 **** #include "shell.h" ! shexec(argv)const char *const*argv;{int i;const char**newargv,**p; execvp(*argv,argv); /* if this one fails, we retry it as a shell script */ for(p=(const char**)argv,i=1;i++,*p++;); /* count the arguments */ newargv=malloc(i*sizeof*p); --- 42,48 ---- #include "shell.h" ! shexec(argv)const char*const*argv;{int i;const char**newargv,**p; execvp(*argv,argv); /* if this one fails, we retry it as a shell script */ for(p=(const char**)argv,i=1;i++,*p++;); /* count the arguments */ newargv=malloc(i*sizeof*p); diff -rc ../old/formail.c ./formail.c *** ../old/formail.c Tue Jun 18 16:12:51 1991 --- ./formail.c Thu Jun 20 11:57:09 1991 *************** *** 11,19 **** * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: formail.c,v 2.3 1991/06/12 10:50:21 berg Rel $"; #endif ! static char rcsdate[]="$Date: 1991/06/12 10:50:21 $"; #include "config.h" /* I know, overkill, only need BinSh */ #include "includes.h" --- 11,19 ---- * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: formail.c,v 2.6 1991/06/19 17:47:00 berg Rel $"; #endif ! static char rcsdate[]="$Date: 1991/06/19 17:47:00 $"; #include "config.h" /* I know, overkill, only need BinSh */ #include "includes.h" *************** *** 32,38 **** static const char From[]=FROM,replyto[]="Reply-To:",Fromm[]="From:", returnpath[]="Return-Path",sender[]="Sender:",outofmem[]="Out of memory\n", subject[]="Subject:",re[]=" Re:",couldntw[]="Couldn't write to stdout", ! references[]="References:",messageid[]="Message-ID:",Date[]="Date:"; const char binsh[]=BinSh; static struct {const char*const head;const int len,wrepl;}sest[]={ {sender,STRLEN(sender),0},{replyto,STRLEN(replyto),4}, --- 32,39 ---- static const char From[]=FROM,replyto[]="Reply-To:",Fromm[]="From:", returnpath[]="Return-Path",sender[]="Sender:",outofmem[]="Out of memory\n", subject[]="Subject:",re[]=" Re:",couldntw[]="Couldn't write to stdout", ! references[]="References:",messageid[]="Message-ID:",Date[]="Date:", ! article[]="Article "; const char binsh[]=BinSh; static struct {const char*const head;const int len,wrepl;}sest[]={ {sender,STRLEN(sender),0},{replyto,STRLEN(replyto),4}, *************** *** 44,50 **** #define refr rex[1] #define msid rex[2] static struct {const char*const hedr;const int lnr;}cdigest[]={ ! {Fromm,STRLEN(Fromm)},{Date,STRLEN(Date)},{subject,STRLEN(subject)}}; #define mxl(a,b) mx(STRLEN(a),STRLEN(b)) #define dig_HDR_LEN mx(mxl(From,Fromm),mxl(Date,subject)) static errout,oldstdout; --- 45,52 ---- #define refr rex[1] #define msid rex[2] static struct {const char*const hedr;const int lnr;}cdigest[]={ ! {Fromm,STRLEN(Fromm)},{Date,STRLEN(Date)},{subject,STRLEN(subject)}, ! {article,STRLEN(article)}}; #define mxl(a,b) mx(STRLEN(a),STRLEN(b)) #define dig_HDR_LEN mx(mxl(From,Fromm),mxl(Date,subject)) static errout,oldstdout; *************** *** 73,80 **** #include "shell.h" ! main(argc,argv)const char*const argv[];{time_t t; ! int i,lastm,nowm,thelen=0,split=0,force=0,bogus=1,every=0,areply=0, trust=0,digest=0,nowait=0; size_t buflen,p=0,lnl=0,thename,ll; char*buf,*chp; --- 75,82 ---- #include "shell.h" ! main(lastm,argv)const char*const argv[];{time_t t; ! int i,nowm,thelen=0,split=0,force=0,bogus=1,every=0,areply=0, trust=0,digest=0,nowait=0; size_t buflen,p=0,lnl=0,thename,ll; char*buf,*chp; diff -rc ../old/goodies.c ./goodies.c *** ../old/goodies.c Tue Jun 18 16:12:36 1991 --- ./goodies.c Thu Jun 20 11:57:11 1991 *************** *** 9,15 **** * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: goodies.c,v 2.1 1991/06/11 12:59:16 berg Rel $"; #endif #include "config.h" #include "procmail.h" --- 9,15 ---- * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: goodies.c,v 2.3 1991/06/19 17:41:41 berg Rel $"; #endif #include "config.h" #include "procmail.h" *************** *** 34,40 **** if(got>NORMAL_TEXT) early_eof: log(unexpeof); ready: if(got!=SKIPPING_SPACE||sarg) /* not terminated yet or sarg==2 ? */ ! ready0: *p++='\0'; *p=TMNATE;return; case '\\': if(got==SINGLE_QUOTED) --- 34,40 ---- if(got>NORMAL_TEXT) early_eof: log(unexpeof); ready: if(got!=SKIPPING_SPACE||sarg) /* not terminated yet or sarg==2 ? */ ! *p++='\0'; *p=TMNATE;return; case '\\': if(got==SINGLE_QUOTED) *************** *** 108,114 **** *startb++=i; *startb='\0'; if(i!='}'){ ! badsubst: log("Bad substitution of");logqnl(buf2);continue;} i='\0';} else if(alphanum(i)){ /* $name */ do *startb++=i; --- 108,114 ---- *startb++=i; *startb='\0'; if(i!='}'){ ! log("Bad substitution of");logqnl(buf2);continue;} i='\0';} else if(alphanum(i)){ /* $name */ do *startb++=i; *************** *** 117,123 **** i='\0'; *startb='\0';} else if(i=='$'){ /* $$=pid */ ! ultostr(0,(unsigned long)thepid,p);i='\0';goto eofstr;} else{ *p++='$';goto newchar;} /* not a substitution */ startb=(char*)tgetenv(buf2); --- 117,123 ---- i='\0'; *startb='\0';} else if(i=='$'){ /* $$=pid */ ! ultstr(0,(unsigned long)thepid,p);i='\0';goto eofstr;} else{ *p++='$';goto newchar;} /* not a substitution */ startb=(char*)tgetenv(buf2); *************** *** 151,157 **** if(got<=SKIPPING_SPACE) /* should we bother to change mode? */ got=NORMAL_TEXT;}} ! ultostr(minwidth,val,dest)unsigned long val;char*dest;{int i;unsigned long j; j=val;i=0; /* a beauty, isn't it :-) */ do i++; /* determine needed width */ while(j/=10); --- 151,157 ---- if(got<=SKIPPING_SPACE) /* should we bother to change mode? */ got=NORMAL_TEXT;}} ! ultstr(minwidth,val,dest)unsigned long val;char*dest;{int i;unsigned long j; j=val;i=0; /* a beauty, isn't it :-) */ do i++; /* determine needed width */ while(j/=10); diff -rc ../old/includes.h ./includes.h *** ../old/includes.h Tue Jun 18 16:12:26 1991 --- ./includes.h Thu Jun 20 12:03:05 1991 *************** *** 1,4 **** ! /*$Id: includes.h,v 2.2 1991/06/11 13:06:52 berg Rel $*/ #include "autoconf.h" /* not all the "library identifiers" specified here need to be --- 1,4 ---- ! /*$Id: includes.h,v 2.3 1991/06/18 11:39:23 berg Rel $*/ #include "autoconf.h" /* not all the "library identifiers" specified here need to be *************** *** 15,21 **** #include <stdlib.h> /* getenv() malloc() realloc() free() strtol() */ #include <time.h> /* time() ctime() time_t */ ! #include <fcntl.h> /* O_RDONLY O_WRONLY O_APPEND */ #include <pwd.h> /* getpwuid() struct passwd */ #include <sys/wait.h> /* wait() */ #include <sys/utsname.h> /* uname() utsname */ --- 15,21 ---- #include <stdlib.h> /* getenv() malloc() realloc() free() strtol() */ #include <time.h> /* time() ctime() time_t */ ! #include <fcntl.h> /* O_RDONLY O_WRONLY O_APPEND O_CREAT O_EXCL */ #include <pwd.h> /* getpwuid() struct passwd */ #include <sys/wait.h> /* wait() */ #include <sys/utsname.h> /* uname() utsname */ *************** *** 26,32 **** strspn() strcspn() strchr() strcmp() strncmp() strpbrk() strstr() memmove() */ #include <errno.h> /* EINTR EEXIST EMFILE ENFILE */ ! #include <sysexits.h> /* EX_OK EX_UNAVAILABLE EX_OSERR EX_CANTCREAT EX_IOERR */ #ifndef O_SYNC #define O_SYNC 0 --- 26,32 ---- strspn() strcspn() strchr() strcmp() strncmp() strpbrk() strstr() memmove() */ #include <errno.h> /* EINTR EEXIST EMFILE ENFILE */ ! #include <sysexits.h> /* EX_OK EX_UNAVAILABLE EX_OSERR EX_OSFILE EX_CANTCREAT EX_IOERR */ #ifndef O_SYNC #define O_SYNC 0 diff -rc ../old/lockfile.c ./lockfile.c *** ../old/lockfile.c Tue Jun 18 16:12:35 1991 --- ./lockfile.c Thu Jun 20 11:57:13 1991 *************** *** 7,15 **** * This file can be freely copied for any use. * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: lockfile.c,v 2.1 1991/06/11 14:00:41 berg Rel $"; #endif ! static char rcsdate[]="$Date: 1991/06/11 14:00:41 $"; #include "config.h" /* overkill, I know, only need DIRSEP */ #include "includes.h" --- 7,15 ---- * This file can be freely copied for any use. * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: lockfile.c,v 2.3 1991/06/19 17:41:41 berg Rel $"; #endif ! static char rcsdate[]="$Date: 1991/06/19 17:41:41 $"; #include "config.h" /* overkill, I know, only need DIRSEP */ #include "includes.h" *************** *** 21,27 **** exitflag=1;} main(argc,argv)const int argc;const char*argv[];{const char**p,*cp; ! int sleepsec,retries,i,invert,force,suspend,retval=0; static char usage[]= "Usage: lockfile -nnn | -rnnn | -! | -lnnn | -snnn | file ...\n"; sleepsec=8;force=retries=invert=0;suspend=16;thepid=getpid(); --- 21,27 ---- exitflag=1;} main(argc,argv)const int argc;const char*argv[];{const char**p,*cp; ! int sleepsec,retries,invert,force,suspend,retval=0; static char usage[]= "Usage: lockfile -nnn | -rnnn | -! | -lnnn | -snnn | file ...\n"; sleepsec=8;force=retries=invert=0;suspend=16;thepid=getpid(); *************** *** 39,45 **** case 's':suspend=strtol(cp+2,(char**)0,10);break; default: if(cp[1]-'0'>(unsigned)9){ ! putse(usage);retval=EX_USAGE;goto failure;} if(sleepsec>=0) sleepsec=strtol(cp+1,(char**)0,10);} else --- 39,45 ---- case 's':suspend=strtol(cp+2,(char**)0,10);break; default: if(cp[1]-'0'>(unsigned)9){ ! putse(usage);retval=EX_USAGE;goto failurel;} if(sleepsec>=0) sleepsec=strtol(cp+1,(char**)0,10);} else *************** *** 48,54 **** else{ while(0>NFSxopen(cp)){struct stat buf;time_t t; if(exitflag||retries==1){ ! failure: sleepsec= -1;p[-1]=0;goto again;} if(force&&(t=time((time_t*)0),!stat(cp,&buf))&& force<t-buf.st_mtime){ unlink(cp);putse("Forcing lock on \"");putse(cp);putse("\"\n"); --- 48,54 ---- else{ while(0>NFSxopen(cp)){struct stat buf;time_t t; if(exitflag||retries==1){ ! failurel: sleepsec= -1;p[-1]=0;goto again;} if(force&&(t=time((time_t*)0),!stat(cp,&buf))&& force<t-buf.st_mtime){ unlink(cp);putse("Forcing lock on \"");putse(cp);putse("\"\n"); *************** *** 62,68 **** putse(a)char*a;{char*b; b=a-1; while(*++b); ! write(STDERR,a,b-a);} #include "exopen.h" --- 62,68 ---- putse(a)char*a;{char*b; b=a-1; while(*++b); ! write(STDERR,a,(size_t)(b-a));} #include "exopen.h" *************** *** 79,86 **** void*tmalloc(len)const size_t len;{ /* stub */ return malloc(len);} ! ropen(name,mode,mask)const char*const name;const mode_t mask;{ /* stub */ ! return open(name,mode,mask);} rclose(fd)const int fd;{ /* stub */ return close(fd);} --- 79,86 ---- void*tmalloc(len)const size_t len;{ /* stub */ return malloc(len);} ! ropen(name,mode,mask)const char*const name;const int mode;const mode_t mask;{ ! return open(name,mode,mask);} /* stub */ rclose(fd)const int fd;{ /* stub */ return close(fd);} diff -rc ../old/nonint.c ./nonint.c *** ../old/nonint.c Tue Jun 18 16:12:38 1991 --- ./nonint.c Thu Jun 20 11:57:17 1991 *************** *** 9,15 **** * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: nonint.c,v 2.0 1991/06/10 14:35:35 berg Rel $"; #endif #include "config.h" #include "procmail.h" --- 9,15 ---- * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: nonint.c,v 2.2 1991/06/19 17:41:41 berg Rel $"; #endif #include "config.h" #include "procmail.h" *************** *** 73,79 **** void sterminate(){static const char*const msg[]={newline,0, "memory\n","fork\n","file descriptor\n"}; signal(SIGTERM,SIG_IGN);signal(SIGHUP,SIG_IGN);signal(SIGINT,SIG_IGN); ! if(pidchild) /* don't kill what is not ours, we might be root */ kill(pidchild,SIGTERM); if(!nextexit){ nextexit=1;log("Terminating prematurely"); --- 73,79 ---- void sterminate(){static const char*const msg[]={newline,0, "memory\n","fork\n","file descriptor\n"}; signal(SIGTERM,SIG_IGN);signal(SIGHUP,SIG_IGN);signal(SIGINT,SIG_IGN); ! if(pidchild>0) /* don't kill what is not ours, we might be root */ kill(pidchild,SIGTERM); if(!nextexit){ nextexit=1;log("Terminating prematurely"); *************** *** 84,91 **** void stermchild(){ signal(SIGHUP,SIG_IGN);signal(SIGINT,SIG_IGN);signal(SIGQUIT,SIG_IGN); ! signal(SIGTERM,SIG_IGN);kill(pidfilt,SIGTERM);kill(thepid,SIGQUIT); ! log("Rescue of unfiltered data "); if(dump(PWRB,backblock,backlen)) /* pump back the data through the backpipe */ log("failed\n"); else --- 84,93 ---- void stermchild(){ signal(SIGHUP,SIG_IGN);signal(SIGINT,SIG_IGN);signal(SIGQUIT,SIG_IGN); ! signal(SIGTERM,SIG_IGN); ! if(pidfilt>0) /* don't kill what is not ours, we might be root */ ! kill(pidfilt,SIGTERM); ! kill(thepid,SIGQUIT);log("Rescue of unfiltered data "); if(dump(PWRB,backblock,backlen)) /* pump back the data through the backpipe */ log("failed\n"); else *************** *** 174,180 **** char*tstrdup(a)const char*const a;{int i; i=strlen(a)+1;return tmemmove(malloc(i),a,i);} ! const char*tgetenv(a)const char*a;{const char*b; return(b=getenv(a))?b:"";} char*cstr(a,b)const char*const a,*const b;{ /* dynamic buffer management */ --- 176,182 ---- char*tstrdup(a)const char*const a;{int i; i=strlen(a)+1;return tmemmove(malloc(i),a,i);} ! const char*tgetenv(a)const char*const a;{const char*b; return(b=getenv(a))?b:"";} char*cstr(a,b)const char*const a,*const b;{ /* dynamic buffer management */ diff -rc ../old/procmail.c ./procmail.c *** ../old/procmail.c Tue Jun 18 16:12:37 1991 --- ./procmail.c Thu Jun 20 11:57:18 1991 *************** *** 11,17 **** * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: procmail.c,v 2.3 1991/06/12 10:23:06 berg Rel $"; #endif #include "config.h" #define MAIN --- 11,17 ---- * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: procmail.c,v 2.6 1991/06/19 17:41:41 berg Rel $"; #endif #include "config.h" #define MAIN *************** *** 18,24 **** #include "procmail.h" #include "shell.h" ! #define VERSION "procmail v2.02 1991/06/12 written by Stephen R.van den Berg\n\ \t\t\t\tberg@messua.informatik.rwth-aachen.de\n\ \t\t\t\tberg@physik.tu-muenchen.de\n" --- 18,24 ---- #include "procmail.h" #include "shell.h" ! #define VERSION "procmail v2.03 1991/06/20 written by Stephen R.van den Berg\n\ \t\t\t\tberg@messua.informatik.rwth-aachen.de\n\ \t\t\t\tberg@physik.tu-muenchen.de\n" *************** *** 58,64 **** if(0>opena(devnull)||0>opena(console)) return EX_OSFILE; setbuf(stdin,(char*)0);buf=malloc(linebuf);buf2=malloc(linebuf);chdir(tmp); ! ultostr(0,(unsigned long)(i=getuid()),buf); setpwent(); {struct passwd*pass; if(pass=getpwuid(i)){ /* find user defaults in /etc/passwd */ --- 58,64 ---- if(0>opena(devnull)||0>opena(console)) return EX_OSFILE; setbuf(stdin,(char*)0);buf=malloc(linebuf);buf2=malloc(linebuf);chdir(tmp); ! ultstr(0,(unsigned long)(i=getuid()),buf); setpwent(); {struct passwd*pass; if(pass=getpwuid(i)){ /* find user defaults in /etc/passwd */ *************** *** 279,285 **** log(buf);i-=i%TABWIDTH; /* tell where we last dumped it */ do log(TABCHAR); while((i+=TABWIDTH)<LENoffset); ! ultostr(7,lastdump,buf);log(buf);log(newline);terminate();} dirmail(){struct stat stbuf; /* directory name is expected in buf */ strcpy(buf2,strcat(buf,MCDIRSEP)); --- 279,285 ---- log(buf);i-=i%TABWIDTH; /* tell where we last dumped it */ do log(TABCHAR); while((i+=TABWIDTH)<LENoffset); ! ultstr(7,lastdump,buf);log(buf);log(newline);terminate();} dirmail(){struct stat stbuf; /* directory name is expected in buf */ strcpy(buf2,strcat(buf,MCDIRSEP)); diff -rc ../old/retint.c ./retint.c *** ../old/retint.c Tue Jun 18 16:12:40 1991 --- ./retint.c Thu Jun 20 11:57:21 1991 *************** *** 9,15 **** * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: retint.c,v 2.0 1991/06/10 14:35:35 berg Rel $"; #endif #include "config.h" #include "procmail.h" --- 9,15 ---- * * ************************************************************************/ #ifdef RCS ! static char rcsid[]="$Id: retint.c,v 2.4 1991/06/19 17:45:35 berg Rel $"; #endif #include "config.h" #include "procmail.h" *************** *** 52,59 **** while(!flaggerd) suspend();} /* to prevent polling */ ! grepin(expr,source,len,casesens)const char*const expr,*const source;long len;{ ! pid_t pid;int poutfd[2];static const char*newargv[5]={0,"-e"}; newargv[3]=casesens?(char*)0:"-i";*newargv=tgetenv(grep);newargv[2]=expr; rpipe(poutfd); if(!(pid=sfork())){ /* start grep */ --- 52,60 ---- while(!flaggerd) suspend();} /* to prevent polling */ ! grepin(expr,source,len,casesens)const char*const expr,*const source;long len; ! const int casesens;{pid_t pid;int poutfd[2]; ! static const char*newargv[5]={0,"-e"}; newargv[3]=casesens?(char*)0:"-i";*newargv=tgetenv(grep);newargv[2]=expr; rpipe(poutfd); if(!(pid=sfork())){ /* start grep */ *************** *** 153,159 **** while(0>(i=read(fd,a,(size_t)len))&&errno==EINTR); return i;} ! ropen(name,mode,mask)const char*const name;const mode_t mask;{int i,r; for(r=noresretry;0>(i=open(name,mode,mask));) /* a sysV secure open */ if(errno!=EINTR) if(!((errno==EMFILE||errno==ENFILE)&&(r<0||r--))) --- 154,161 ---- while(0>(i=read(fd,a,(size_t)len))&&errno==EINTR); return i;} ! ropen(name,mode,mask)const char*const name;const int mode;const mode_t mask;{ ! int i,r; for(r=noresretry;0>(i=open(name,mode,mask));) /* a sysV secure open */ if(errno!=EINTR) if(!((errno==EMFILE||errno==ENFILE)&&(r<0||r--))) *************** *** 191,200 **** else{ log("Forcing lock on");logqnl(name);suspend();}}} else{ /* maybe filename too long, shorten and retry */ ! if(0<(i=strlen(name)-1)&&!strchr(dirsep,(name[i-1]))){ name[i]='\0';continue;} log("Lockfailure on");logqnl(name);return;} ! sleep(DEFlocksleep,locksleep); if(nextexit) goto term;}} --- 193,202 ---- else{ log("Forcing lock on");logqnl(name);suspend();}}} else{ /* maybe filename too long, shorten and retry */ ! if(0<(i=strlen(name)-1)&&!strchr(dirsep,name[i-1])){ name[i]='\0';continue;} log("Lockfailure on");logqnl(name);return;} ! sleep((unsigned)locksleep); if(nextexit) goto term;}} diff -rc ../old/include/stdlib.h ./include/stdlib.h *** ../old/include/stdlib.h Tue Jun 18 16:12:14 1991 --- ./include/stdlib.h Thu Jun 20 11:56:35 1991 *************** *** 1,3 **** - #define strtol(str,ptr,base) ((long)atoi(str)) void*malloc(),*realloc(); const char*getenv(); --- 1,2 ---- diff -rc ../old/include/string.h ./include/string.h *** ../old/include/string.h Tue Jun 18 16:12:18 1991 --- ./include/string.h Thu Jun 20 11:56:36 1991 *************** *** 1,3 **** #include <strings.h> ! char*strchr(),*strpbrk(),*strspn(),*strcspn(); --- 1,3 ---- #include <strings.h> ! char*strchr(),*strpbrk(); diff -rc ../old/include/sysexits.h ./include/sysexits.h *** ../old/include/sysexits.h Tue Jun 18 16:12:17 1991 --- ./include/sysexits.h Thu Jun 20 11:56:36 1991 *************** *** 1,8 **** ! /* Standard exit codes, original list maintained ! by Eric Allman (eric@berkeley, ucbvax!eric) */ ! #define EX_OK 0 ! #define EX_USAGE 64 ! #define EX_UNAVAILABLE 69 ! #define EX_OSERR 71 ! #define EX_CANTCREAT 73 ! #define EX_IOERR 74 --- 1,9 ---- ! /* Standard exit codes, original list maintained ! by Eric Allman (eric@berkeley, ucbvax!eric) */ ! #define EX_OK 0 ! #define EX_USAGE 64 ! #define EX_UNAVAILABLE 69 ! #define EX_OSERR 71 ! #define EX_OSFILE 72 ! #define EX_CANTCREAT 73 ! #define EX_IOERR 74 diff -rc ../old/man/formail.1 ./man/formail.1 *** ../old/man/formail.1 Tue Jun 18 16:12:23 1991 --- ./man/formail.1 Thu Jun 20 11:57:15 1991 *************** *** 2,8 **** .ds Rv \\$3 .ds Dt \\$4 .. ! .Id $Id: formail.1,v 2.0 1991/06/10 17:37:18 berg Rel $ .de Sh .br .ne 9 --- 2,8 ---- .ds Rv \\$3 .ds Dt \\$4 .. ! .Id $Id: formail.1,v 2.1 1991/06/18 11:30:15 berg Rel $ .de Sh .br .ne 9 *************** *** 42,48 **** .B formail is a filter that can be used to force mail into mailbox format, perform real rigorous `From ' escaping, generate auto-replying headers or split up a ! mailbox/digest file. The mail/mailbox contents will be expected on stdin. .LP If formail is supposed to determine the sender of the mail, but is unable to find any, it will substitute `foo@bar'. --- 42,49 ---- .B formail is a filter that can be used to force mail into mailbox format, perform real rigorous `From ' escaping, generate auto-replying headers or split up a ! mailbox/digest/articles file. The mail/mailbox/article contents will be ! expected on stdin. .LP If formail is supposed to determine the sender of the mail, but is unable to find any, it will substitute `foo@bar'. *************** *** 85,91 **** message (this is normally not the case). .Tp .B \-d ! Enables formail to split up digests into their original messages. .Tp .I "\fB\+\fPskip" Skip the first --- 86,92 ---- message (this is normally not the case). .Tp .B \-d ! Enables formail to split up digests/articles into their original parts. .Tp .I "\fB\+\fPskip" Skip the first -----------------------------cut here------------------------------ -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net. exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.