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