1 /************************************************************************
2  *	recommend	Analyses the installation, and makes		*
3  *			recommendations about suid/sgid modes		*
4  ************************************************************************/
5 /*$Id: recommend.c,v 1.16 1999/10/20 04:47:45 guenther Exp $*/
6 #include "includes.h"
7 
8 #define PERMIS	(S_IRWXU|S_IRWXG&~S_IWGRP|S_IRWXO&~S_IWOTH)
9 
10 char mailspooldir[]=MAILSPOOLDIR;
11 const char dirsep[]=DIRSEP,
12  *const checkf[]={"/bin/mail","/bin/lmail","/usr/lib/sendmail",
13  "/usr/lib/smail",0};
14 
main(argc,argv)15 int main(argc,argv)const int argc;const char*const argv[];
16 { struct group*grp;struct stat stbuf;gid_t gid=(gid_t)-1;
17   const char*const*p;mode_t sgid=0;int chmdir=0;
18   if(argc!=3)
19    { fprintf(stderr,"Please run this program via 'make recommend'\n");
20      return EX_USAGE;
21    }
22   for(p=checkf;*p;p++)
23      if(!stat(*p,&stbuf)&&stbuf.st_mode&S_ISGID)
24       { if(stbuf.st_mode&S_ISGID)
25 	   sgid=S_ISGID,gid=stbuf.st_gid;
26 	break;
27       }
28   if(!stat(mailspooldir,&stbuf)&&!(stbuf.st_mode&S_IWOTH))
29      if(stbuf.st_mode&S_ISVTX)
30 	chmdir=2;
31      else
32       { if(!(stbuf.st_mode&S_IWGRP))
33 	   chmdir=1;
34 	sgid=S_ISGID;gid=stbuf.st_gid;
35       }
36   if(gid!=stbuf.st_gid)
37      sgid=0;
38   printf("chown root %s\n",argv[1]);
39   if(sgid)
40      if(grp=getgrgid(gid))
41 	printf("chgrp %s %s %s\n",grp->gr_name,argv[1],argv[2]);
42      else
43 	printf("chgrp %u %s %s\n",(unsigned)gid,argv[1],argv[2]);
44   printf("chmod %lo %s\n",(unsigned long)(sgid|S_ISUID|PERMIS),argv[1]);
45   if(sgid)
46      printf("chmod %lo %s\n",(unsigned long)(sgid|PERMIS),argv[2]);
47   else if(chmdir==1)
48      goto nogchmod;
49   if(chmdir)
50      printf("chmod %c+w %s/.\n",chmdir==1?'g':'a',mailspooldir);
51 nogchmod:
52   return EXIT_SUCCESS;
53 }
54