v17i032: procmail - mail processing package, Part02/02
Stephen R. van den Berg
berg at marvin.e17.physik.tu-muenchen.de
Sat Mar 2 11:48:14 AEST 1991
Submitted-by: Stephen R. van den Berg <berg at marvin.e17.physik.tu-muenchen.de>
Posting-number: Volume 17, Issue 32
Archive-name: procmail/part02
Supersedes: procmail: Volume 16, Issue 103
---- Cut Here and feed the following to sh ----
#!/bin/sh
# This is part 02 of procmail
# ============= procmail/retint.c ==============
if test ! -d 'procmail'; then
echo 'x - creating directory procmail'
mkdir 'procmail'
fi
if test -f 'procmail/retint.c' -a X"$1" != X"-c"; then
echo 'x - skipping procmail/retint.c (File already exists)'
else
echo 'x - extracting procmail/retint.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'procmail/retint.c' &&
X/************************************************************************
X * Collection of routines that return an int (sort of anyway :-) *
X * *
X * Copyright (c) 1990-1991, S.R.van den Berg, The Netherlands *
X * The sources can be freely copied for non-commercial use. *
X * See the accompanying README file for more info. *
X * *
X * Don't complain about the formatting, I know it's *
X * unconventional, but it's my standard format (I have my *
X * reasons). If you don't like it, feed it through your *
X * favourite C beautifier. *
X ************************************************************************/
X
X#include "config.h"
X#include "procmail.h"
X#include "sysexits.h"
X#include "shell.h"
X
Xsetdef(name,contents)char*name,*contents;{
X strcat(strcat(strcpy(buf2,name),"="),contents);parse();sputenv(buf);}
X
Xskipblanks(){
X fscanf(rc,"%*[ \t]");}
X
Xskiptoeol(){
X fscanf(rc,"%*[^\n]");return fgetc(rc);}
X
Xskipcomment(){char i[2]; /* no comment :-) */
X if(tscrc("%1[\n]",i))
X return 1;
X skipblanks();return scrc("%1[#]",i)?skiptoeol():feof(rc);}
X
Xpipthrough(line,source,len)char*line,*source;long len;{pid_t pidf,pid;
X int pinfd[2],poutfd[2];
X#define PWR2 (pinfd[1])
X#define PRD2 (pinfd[0])
X pipe(poutfd);pipe(pinfd);
X if(!(pidf=sfork())){ /* the filter is started here */
X rclose(PWRITE);redirect(PREAD);rclose(STDOUT);dup(PWR2);rclose(PWR2);
X rclose(PRD2);callnewprog(line);}
X rclose(PREAD);rclose(PWR2);
X if(forkerr(pidf,line)){
X rclose(PRD2);return 1;}
X flaggerd=0;signal(SIGHUP,flagger);
X if(!(pid=sfork())){ /* this process will read back the filtered mail */
X rclose(PWRITE);signal(SIGHUP,flagger);kill(getppid(),SIGHUP);redirect(PRD2);
X if(!pwait&&mother){ /* if the wait chain ends here, notify mother */
X kill(mother,SIGHUP);mother=0;} /* everything ok mam, go ahead and die */
X return 0;} /* we will go ahead however (with or without mother) */
X rclose(PRD2);
X if(forkerr(pid,"procmail")){ /* An ingenious signal communication system */
X kill(pidf,SIGTERM);return 1;} /* will ensure that NO lock file and */
X if(dump(PWRITE,source,len)){ /* NO mail gets lost. */
X kill(pidf,SIGTERM);kill(pid,SIGTERM);writeerr(line);return 1;}
X waitflagger();verrgrandchild=flaggerd=0;signal(SIGQUIT,errgrandchild);
X if(pwait){
X if(waitfor(pidf)!=EX_OK){ /* if pipe fails, we will continue ourselves */
X progerr(line);kill(pid,SIGTERM);return 1;}
X for(kill(pid,SIGHUP),loclock=0;;sleep(SUSPENSION)){
X if(flaggerd)
X break;
X if(verrgrandchild){ /* Check if one of my grandchildren has paniced */
X signal(SIGQUIT,sterminate);return 1;}}}
X else
X kill(pid,SIGHUP); /* if we don't wait, signal that we're bailing out */
X exit(EX_OK);} /* go ahead child, you have control */
X
Xwaitflagger(){
X while(!flaggerd)
X sleep(SUSPENSION);}
X
Xgrepin(expr,source,len,casesens)char*expr,*source;long len;{pid_t pid;
X int poutfd[2];static char*newargv[5]={0,"-e"};
X newargv[3]=casesens?(char*)0:"-i";*newargv=getenv(grep);newargv[2]=expr;
X pipe(poutfd);
X if(!(pid=sfork())){
X rclose(PWRITE);redirect(PREAD);shexec(newargv);}
X rclose(PREAD);dump(PWRITE,source,len);
X if(!forkerr(pid,*newargv))
X return waitfor(pid)!=EX_OK;
X return 127;}
X
Xwaitfor(pid)pid_t pid;{int i;
X while(pid!=wait(&i)||(i&127)==127);
X return i>>8&255;}
X
Xredirect(pip){
X getstdinpipe(pip);fclose(rc);}
X
Xgetstdinpipe(pip){
X rclose(STDIN);dup(pip);rclose(pip);}
X
Xcallnewprog(newname)char*newname;{int argc;char*endp,**newargv;
X register char*p;
X p=newname;
X if(sh){char*newargv[4]; /* should we start a shell? */
X newargv[3]=0;newargv[2]=p;newargv[1]=getenv(shellflags);
X *newargv=getenv(shell);shexec(newargv);}
X argc=2;
X while(*p){ /* If no shell, we'll have to chop up the arguments ourselves */
X if(*p==' '||*p=='\t'){
X argc++;*p='\0';
X while(*++p==' '||*p=='\t')
X *p='\0';
X continue;}
X p++;}
X endp=p;*(newargv=malloc(argc*sizeof*newargv))=p=newname;argc=1;
X for(;;){
X while(*p)
X p++;
X while(!*p){
X if(p==endp){
X newargv[argc]=0;shexec(newargv);}
X p++;}
X newargv[argc++]=p;}}
X
Xparse(){int i;char*org,*dest,*bd; /* Implicitly copies from buf2 to buf */
X dest=buf;org=buf2;
X while(i=*org++)
X if(i!='$')
X *dest++=i;
X else{ /* substitute the thing... */
X bd=buf2;
X while((i=*org)>='A'&&i<='Z'||i>='a'&&i<='z'||i>='0'&&i<='9'||i=='_'){
X *bd++=i;org++;}
X *bd='\0';
X if(bd=getenv(buf2)){
X strcpy(dest,bd);
X while(*dest)
X dest++;}}
X *dest='\0';}
X
Xwriteerr(line)char*line;{
X log("Error while writing to");logqnl(line);}
X
Xforkerr(pid,a)pid_t pid;char*a;{
X if(pid==-1){
X log("Failed forking");logqnl(a);return 1;}
X return 0;}
X
Xprogerr(line)char*line;{
X log("Program failure of");logqnl(line);}
X
Xlog(a)char*a;{char*b;
X b=a-1;
X while(*++b);
X rwrite(STDERR,a,b-a);}
X
Xopena(a)char*a;{
Xreturn open(a,O_WRONLY|O_APPEND|O_CREAT,0666);}
X
Xfdreopena(a,fd)char*a;{ /* Currently only works for 0,1,2 */
X rclose(fd);return opena(a);}
X
Xshexec(argv)char**argv;{int i;char**newargv,**p;
X execvp(*argv,argv); /* if this one fails, we retry it as a shell script */
X for(p=argv,i=1;i++,*p++;);
X newargv=malloc(i*sizeof*p);
X for(*(p=newargv)=binsh;*++p=*++argv;);
X execve(*newargv,newargv,environ); /* no shell script? -> trouble */
X log("Failed to execute");logqnl(*argv);exit(EX_UNAVAILABLE);}
X
Xunlock(lockp)char**lockp;{
X lcking=1;
X if(*lockp){
X if(unlink(*lockp)){
X log("Couldn't unlink");logqnl(*lockp);}
X free(*lockp);*lockp=0;}
X if(nextexit==1){ /* make sure we are not inside terminate already */
X log(newline);terminate();}
X lcking=0;}
X
Xnomemerr(){
X log("Out of memory\nbuffer 0: \"");log(buf);log("\"\nbuffer 1:");
X logqnl(buf2);retval=EX_OSERR;terminate();}
X
Xlogqnl(a)char*a;{
X log(" \"");log(a);log("\"\n");}
X
Xnextrcfile(){char*p; /* find the next rcfile specified on the command line */
X while(p=*gargv){
X gargv++;
X if(!strchr(p,'=')){
X rcfile=p;return 1;}}
X return 0;}
X
Xrclose(fd){int i; /* a sysV secure close (signal immune) */
X while((i=close(fd))&&errno==EINTR);
X return i;}
X
Xrwrite(fd,a,len)void*a;{int i; /* a sysV secure write (signal immune) */
X while(0>(i=write(fd,a,len))&&errno==EINTR);
X return i;}
X
Xlockit(name,lockp)char*name,**lockp;{int i;struct stat stbuf;
X unlock(lockp); /* unlock any previous lockfile FIRST */
X for(lcking=1;;){ /* to prevent deadlocks (I hate deadlocks) */
X if(0<=(i=open(name,O_WRONLY|O_CREAT|O_EXCL|O_SYNC,0))){
X rclose(i);*lockp=tstrdup(name);
Xterm: if(nextexit){
X log(" whilst waiting for lockfile");logqnl(name);terminate();}
X lcking=0;return;}
X if(errno==EEXIST){ /* check if it's time for a lock override */
X if((i=renvint(0,locktimeout))&&!stat(name,&stbuf)&&
X i<time((time_t*)0)-stbuf.st_mtime){
X log("Forcing lock on");logqnl(name);
X if(unlink(name)){
X log("Forced unlock denied on");logqnl(name);}}}
X else{ /* maybe filename too long, shorten and retry */
X if(0<(i=strlen(name)-1)&&name[i-1]!='/'){
X name[i]='\0';continue;}
X log("Lockfailure on");logqnl(name);return;}
X sleep(DEFlocksleep,locksleep);
X if(nextexit)
X goto term;}}
X
Xlcllock(){ /* lock a local file (if need be) */
X if(locknext)
X if(tolock)
X lockit(tolock,&loclock);
X else
X lockit(strcat(buf2,getenv(lockext)),&loclock);}
X
Xsputenv(a)char*a;{ /* smart putenv, the way it was supposed to be */
X static struct lienv{struct lienv*next;char name[255];}*myenv;
X static alloced;int i,remove;char*split,**preenv;struct lienv*curr,**last;
X remove=0;a=strdup(a); /* make working copy */
X if(!(split=strchr(a,'='))){ /* assignment or removal? */
X remove=1;i=strlen(a);*(split=i+(a=realloc(a,i+2)))='=';
X split[1]='\0';}
X i=++split-a;
X for(curr=*(last=&myenv);curr;curr=*(last=&curr->next))
X if(!strncmp(a,curr->name,i)){ /* is it one I created earlier? */
X split=curr->name;*last=curr->next;free(curr);
X for(preenv=environ;*preenv!=split;preenv++);
X goto wipenv;}
X for(preenv=environ;*preenv;preenv++)
X if(!strncmp(a,*preenv,i)){ /* is it in the standard environment? */
Xwipenv:
X while(*preenv=preenv[1]) /* wipe this entry out of the environment */
X preenv++;
X break;}
X if(alloced) /* have we ever alloced the environ array before? */
X environ=realloc(environ,(preenv-environ+2)*sizeof*environ);
X else{
X alloced=1;i=(preenv-environ+2)*sizeof*environ;
X environ=tmemmove(malloc(i),environ,i-sizeof*environ);}
X if(!remove){ /* if not remove, then add it to both environments */
X for(preenv=environ;*preenv;preenv++);
X curr=malloc(curr->name-(char*)curr+strlen(a)+1);
X strcpy(*preenv=curr->name,a);free(a);preenv[1]=0;curr->next=myenv;
X myenv=curr;}}
X
Xrenvint(init,env)char*env;{int i;
X i=init;
X if(env=getenv(env)) /* check if the env var exists */
X sscanf(env,"%i",&i); /* parse it like a C constant */
X return i;}
X
Xterminate(){
X nextexit=2; /* prevent multiple invocations of terminate */
X unlock(&loclock); /* local lock files are removed in any case */
X if(mother&&mother!=getpid())
X if(retval!=EX_OK) /* tell mam we're in trouble, let her clean up the mess */
X kill(mother,SIGQUIT); /* don't try this at home, kids :-) */
X else{
X kill(mother,SIGHUP);goto allok;} /* You can go home mam, everything ok */
X else
Xallok: /* global lockfile should be removed */
X unlock(&globlock); /* by the last surviving procmail */
X sync(); /* sorry, but this is mail we're dealing with, safety first */
X exit(retval);}
SHAR_EOF
chmod 0644 procmail/retint.c ||
echo 'restore of procmail/retint.c failed'
Wc_c="`wc -c < 'procmail/retint.c'`"
test 9549 -eq "$Wc_c" ||
echo 'procmail/retint.c: original size 9549, current size' "$Wc_c"
fi
# ============= procmail/examples/forward ==============
if test ! -d 'procmail/examples'; then
echo 'x - creating directory procmail/examples'
mkdir 'procmail/examples'
fi
if test -f 'procmail/examples/forward' -a X"$1" != X"-c"; then
echo 'x - skipping procmail/examples/forward (File already exists)'
else
echo 'x - extracting procmail/examples/forward (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'procmail/examples/forward' &&
X"|exec /global/bin/procmail"
SHAR_EOF
chmod 0644 procmail/examples/forward ||
echo 'restore of procmail/examples/forward failed'
Wc_c="`wc -c < 'procmail/examples/forward'`"
test 29 -eq "$Wc_c" ||
echo 'procmail/examples/forward: original size 29, current size' "$Wc_c"
fi
# ============= procmail/examples/1rmail ==============
if test -f 'procmail/examples/1rmail' -a X"$1" != X"-c"; then
echo 'x - skipping procmail/examples/1rmail (File already exists)'
else
echo 'x - extracting procmail/examples/1rmail (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'procmail/examples/1rmail' &&
X#!/bin/sh
X#
X# specify the mailbox file you want to read on the command line
X#
XMAILDIR=$HOME/Mail
Xcd $MAILDIR
XLOCKFILE=$HOME/.lockmail
Xif lockfile -! -r1 $LOCKFILE
Xthen
X echo Mail is currently arriving, please wait...
X while
X lockfile -! -4 -r2 $LOCKFILE
X do
X echo Mail is still arriving...
X done
Xfi
X#
X# Call you favourite mailer here.
X#
X/usr/ucb/mail -f $*
X#
X#
X#
Xrm -f $LOCKFILE
SHAR_EOF
chmod 0644 procmail/examples/1rmail ||
echo 'restore of procmail/examples/1rmail failed'
Wc_c="`wc -c < 'procmail/examples/1rmail'`"
test 381 -eq "$Wc_c" ||
echo 'procmail/examples/1rmail: original size 381, current size' "$Wc_c"
fi
# ============= procmail/examples/2procmailrc ==============
if test -f 'procmail/examples/2procmailrc' -a X"$1" != X"-c"; then
echo 'x - skipping procmail/examples/2procmailrc (File already exists)'
else
echo 'x - extracting procmail/examples/2procmailrc (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'procmail/examples/2procmailrc' &&
X# Please check if all the paths in PATH are reachable, remove the ones that
X# are not.
X
XPATH=$HOME/bin:/usr/bin:/global/bin:/usr/ucb:/bin:/usr/local/bin:
XMAILDIR=$HOME/Mail # You'd better make sure it exists
XDEFAULT=$MAILDIR/mbox
XLOGFILE=$MAILDIR/from
X # We don't use a global lockfile here now
X # Instead we use local lockfiles everywhere
X
X# Notice the double : in the next recipe, this will cause a lockfile
X# named "$MAILDIR/todd.lock" to be used if and only if this mail is going
X# into the file "todd".
X
X:: # Anything from thf
X^From.*thf\@somewhere.someplace
Xtodd # will go to $MAILDIR/todd
X
X
X# The next recipe will likewise use $MAILDIR/uunetbox.lock as a lock file.
X
X:: # Anything from people at uunet
X^From.*\@uunet
Xuunetbox # will go to $MAILDIR/uunetbox
X
X
X# And here the lockfile will be $MAILDIR/henries.lock of course.
X
X:I: # Anything from Henry or henry (ignore case)
X^From.*henry
Xhenries # will go to $MAILDIR/henries
X
X
X# But you can specify any lockfile you want, like "myfile". The following
X# recipe will use "$MAILDIR/myfile" as the lock file.
X
X::myfile # All 'questions' will go to
X^Subject:.*questions
Xtoread # $MAILDIR/toread
X
X# Anything that has not been delivered by now will go to $DEFAULT
X# BUT, since we have not specified any global lock file because we
X# were working with local lock files, and since we are sending the mail to
X# $DEFAULT now, we need to specify a lockfile for that too. We use
X# a global lockfile for that (it won't be created until procmail
X# has parsed (needed to parse) up till here.
X
XLOCKFILE=$DEFAULT.lock
SHAR_EOF
chmod 0644 procmail/examples/2procmailrc ||
echo 'restore of procmail/examples/2procmailrc failed'
Wc_c="`wc -c < 'procmail/examples/2procmailrc'`"
test 1587 -eq "$Wc_c" ||
echo 'procmail/examples/2procmailrc: original size 1587, current size' "$Wc_c"
fi
# ============= procmail/examples/3procmailrc ==============
if test -f 'procmail/examples/3procmailrc' -a X"$1" != X"-c"; then
echo 'x - skipping procmail/examples/3procmailrc (File already exists)'
else
echo 'x - extracting procmail/examples/3procmailrc (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'procmail/examples/3procmailrc' &&
X# Please check if all the paths in PATH are reachable, remove the ones that
X# are not.
X
XPATH=$HOME/bin:/usr/bin:/global/bin:/usr/ucb:/bin:/usr/local/bin:
XMAILDIR=$HOME/Mail # You'd better make sure it exists
XDEFAULT=$MAILDIR/mbox
XLOGFILE=$MAILDIR/from
XLOCKFILE=$HOME/.lockmail
X
X # This will create a local lockfile named todd.lock
X:: # *if* the condition matches
X^From.*thf
Xtodd
X
XLOCKFILE=$MAILDIR/whatever # This will remove the global lockfile
X # $HOME/.lockmail and the new lockfile
X # will be $MAILDIR/whatever
X
X
X # The next recipe will
X # filter out all messages from "at"
X # jobs and will put them in a terse format in
X # a file called $MAILDIR/atjunk
X:2fh
X^From root
X^Subject: Output from "at" job
X|echo "From at job";echo;egrep "^Date:"
X:b
X^From at job
Xatjunk
X
X
X
XMAILDIR=$HOME/News # This will change the current directory
X
X
X # The next recipe will create a local lockfile
X # named $HOME/News/dustbin.lock (*if* the condition
X # matches), and will feed the body of the message
X # through `sort` (sorry, couldn't come up with anything
X # better :-), after which the result will be
X # appended to $HOME/News/dustbin
X:b:
X^Subject:.*rubbish
X|sort >>dustbin
X
X# Anything not delivered by now will go to $HOME/Mail/mbox
SHAR_EOF
chmod 0644 procmail/examples/3procmailrc ||
echo 'restore of procmail/examples/3procmailrc failed'
Wc_c="`wc -c < 'procmail/examples/3procmailrc'`"
test 1255 -eq "$Wc_c" ||
echo 'procmail/examples/3procmailrc: original size 1255, current size' "$Wc_c"
fi
# ============= procmail/examples/2rmail ==============
if test -f 'procmail/examples/2rmail' -a X"$1" != X"-c"; then
echo 'x - skipping procmail/examples/2rmail (File already exists)'
else
echo 'x - extracting procmail/examples/2rmail (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'procmail/examples/2rmail' &&
X#!/bin/sh
X#
X# specify the mailbox file you want to read on the command line
X#
XMAILDIR=$HOME/Mail
Xcd $MAILDIR
XLOCKFILE=$1.lock
Xif lockfile -! -r1 $LOCKFILE
Xthen
X echo Mail is currently arriving, please wait...
X while
X lockfile -! -4 -r2 $LOCKFILE
X do
X echo Mail is still arriving...
X done
Xfi
X#
X# Call you favourite mailer here.
X#
X/usr/ucb/mail -f $*
X#
X#
X#
Xrm -f $LOCKFILE
SHAR_EOF
chmod 0644 procmail/examples/2rmail ||
echo 'restore of procmail/examples/2rmail failed'
Wc_c="`wc -c < 'procmail/examples/2rmail'`"
test 373 -eq "$Wc_c" ||
echo 'procmail/examples/2rmail: original size 373, current size' "$Wc_c"
fi
# ============= procmail/examples/3rmail ==============
if test -f 'procmail/examples/3rmail' -a X"$1" != X"-c"; then
echo 'x - skipping procmail/examples/3rmail (File already exists)'
else
echo 'x - extracting procmail/examples/3rmail (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'procmail/examples/3rmail' &&
X#!/bin/sh
X#
X# specify the mailbox file you want to read on the command line
X# Use a relative path from your $HOME directory
X#
X# For this kind of chaotic procmailrc there is no uniform neat solution
X# to determine which lockfiles to use. I'll give just one (suboptimal)
X# solution here. Use your imagination to extend it :-).
X#
XMAILDIR=$HOME/Mail
Xcd $HOME # this means all paths are relative to $HOME
XLOCKFILE=$HOME/.lockmail
XLOCKFILE2=$HOME/Mail/whatever
Xif lockfile -! -r1 $LOCKFILE $LOCKFILE2
Xthen
X echo Mail is currently arriving, please wait...
X while
X lockfile -! -4 -r2 $LOCKFILE $LOCKFILE2
X do
X echo Mail is still arriving...
X done
Xfi
X#
X# Call you favourite mailer here.
X#
X/usr/ucb/mail -f $*
X#
X#
X#
Xrm -f $LOCKFILE $LOCKFILE2
SHAR_EOF
chmod 0644 procmail/examples/3rmail ||
echo 'restore of procmail/examples/3rmail failed'
Wc_c="`wc -c < 'procmail/examples/3rmail'`"
test 738 -eq "$Wc_c" ||
echo 'procmail/examples/3rmail: original size 738, current size' "$Wc_c"
fi
# ============= procmail/examples/1procmailrc ==============
if test -f 'procmail/examples/1procmailrc' -a X"$1" != X"-c"; then
echo 'x - skipping procmail/examples/1procmailrc (File already exists)'
else
echo 'x - extracting procmail/examples/1procmailrc (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'procmail/examples/1procmailrc' &&
X# Please check if all the paths in PATH are reachable, remove the ones that
X# are not.
X
XPATH=$HOME/bin:/usr/bin:/global/bin:/usr/ucb:/bin:/usr/local/bin:
XMAILDIR=$HOME/Mail # You'd better make sure it exists
XDEFAULT=$MAILDIR/mbox
XLOGFILE=$MAILDIR/from
XLOCKFILE=$HOME/.lockmail
X
X: # Anything from thf
X^From.*thf\@somewhere.someplace
Xtodd # will go to $MAILDIR/todd
X
X: # Anything from people at uunet
X^From.*\@uunet
Xuunetbox # will go to $MAILDIR/uunetbox
X
X:I # Anything from Henry or henry (ignore case)
X^From.*henry
Xhenries # will go to $MAILDIR/henries
X
X# Anything that has not been delivered by now will go to $DEFAULT
SHAR_EOF
chmod 0644 procmail/examples/1procmailrc ||
echo 'restore of procmail/examples/1procmailrc failed'
Wc_c="`wc -c < 'procmail/examples/1procmailrc'`"
test 638 -eq "$Wc_c" ||
echo 'procmail/examples/1procmailrc: original size 638, current size' "$Wc_c"
fi
# ============= procmail/includes.h ==============
if test -f 'procmail/includes.h' -a X"$1" != X"-c"; then
echo 'x - skipping procmail/includes.h (File already exists)'
else
echo 'x - extracting procmail/includes.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'procmail/includes.h' &&
X#include <stdio.h>
X#ifndef NO_ANSI_PROT /* define this if your headers are not ansi */
X# include <stdlib.h>
X# include <time.h>
X#else
X# include <malloc.h>
X char*getenv();
X typedef int pid_t;
X#endif
X#include <fcntl.h>
X#include <pwd.h>
X#include <sys/wait.h>
X#ifndef NOuname
X#include <sys/utsname.h>
X#endif
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <sys/time.h>
X#include <signal.h>
X#include <string.h>
X#include <errno.h>
X
X#ifndef SEEK_SET
X#define SEEK_SET 0
X#endif
X#ifndef O_SYNC
X#define O_SYNC 0
X#endif
Xextern char**environ;
X
X#define STDIN 0
X#define STDOUT 1
X#define STDERR 2
SHAR_EOF
chmod 0644 procmail/includes.h ||
echo 'restore of procmail/includes.h failed'
Wc_c="`wc -c < 'procmail/includes.h'`"
test 589 -eq "$Wc_c" ||
echo 'procmail/includes.h: original size 589, current size' "$Wc_c"
fi
exit 0
--
exit 0 # Just in case...
--
Kent Landfield INTERNET: kent at 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 at uunet.uu.net.
More information about the Comp.sources.misc
mailing list