1/************************************************************************
2 *	Some routines common to procmail and formail			*
3 *									*
4 *	Copyright (c) 1990-1999, S.R. van den Berg, The Netherlands	*
5 *	#include "../README"						*
6 ************************************************************************/
7#ifdef RCS
8static /*const*/char rcsid[]=
9 "$Id: common.c,v 1.28 2001/06/23 08:18:39 guenther Exp $";
10#endif
11#include "procmail.h"
12#include "sublib.h"
13#include "robust.h"
14#include "shell.h"
15#include "misc.h"
16#include "common.h"
17
18void shexec(argv)const char*const*argv;
19{ int i;char**newargv;const char**p;
20#ifdef SIGXCPU
21  signal(SIGXCPU,SIG_DFL);signal(SIGXFSZ,SIG_DFL);
22#endif
23#ifdef SIGLOST
24  signal(SIGLOST,SIG_DFL);
25#endif						/* or is it a shell script ? */
26  signal(SIGPIPE,SIG_DFL);execvp(*argv,(char*const*)argv);
27  for(p=(const char**)argv,i=1;i++,*p++;);	      /* count the arguments */
28  newargv=malloc(i*sizeof*p);		      /* no shell script? -> trouble */
29  for(*(p=(const char**)newargv)=binsh;*++p= *argv++;);
30  execv(*newargv,newargv);free(newargv);nlog("Failed to execute");
31  logqnl(*argv);
32  exit(EX_UNAVAILABLE);
33}
34
35void detab(p)char*p;
36{ while(p=strpbrk(p,"\t\n\v\f\r"))
37     *p=' ';			     /* take out all tabs and other specials */
38}
39
40char*skpspace(chp)const char*chp;
41{ for(;;chp++)
42     switch(*chp)
43      { case ' ':case '\t':
44	   continue;
45	default:
46	   return (char*)chp;
47      }
48}
49
50#ifdef NOstrcspn
51int strcspn(whole,sub)const char*const whole,*const sub;
52{ const register char*p;
53  p=whole;
54  while(*p&&!strchr(sub,*p))
55     p++;
56  return p-whole;
57}
58#endif
59
60int waitfor(pid)const pid_t pid;	      /* wait for a specific process */
61{ int i;pid_t j;
62  while(pid!=(j=wait(&i))||WIFSTOPPED(i))
63     if(-1==j)
64	return NO_PROCESS;
65     else if(!pid)
66	break;
67  return lexitcode=WIFEXITED(i)?WEXITSTATUS(i):-WTERMSIG(i);
68}
69
70#ifdef NOstrncasecmp
71int strncasecmp(a,b,l)register const char*a,*b;register size_t l;
72{ unsigned i,j;
73  if(l)						 /* case insensitive strncmp */
74     do
75      { while(*a&&*a==*b&&--l)
76	   a++,b++;
77	if(!l)
78	   break;
79	if((i= *a++)-'A'<='Z'-'A')
80	   i+='a'-'A';
81	if((j= *b++)-'A'<='Z'-'A')
82	   j+='a'-'A';
83	if(j!=i)
84	   return i>j?1:-1;
85      }
86     while(i&&j&&--l);
87  return 0;
88}
89#endif
90