chiark / gitweb /
Merge branches 'idx/verh' and 'idx/qmqpc'
[qmail] / instcheck.c
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include "strerr.h"
4 #include "error.h"
5 #include "readwrite.h"
6 #include "exit.h"
7
8 extern void hier();
9
10 #define FATAL "instcheck: fatal: "
11 #define WARNING "instcheck: warning: "
12
13 void perm(prefix1,prefix2,prefix3,file,type,uid,gid,mode)
14 char *prefix1;
15 char *prefix2;
16 char *prefix3;
17 char *file;
18 int type;
19 int uid;
20 int gid;
21 int mode;
22 {
23   struct stat st;
24
25   if (stat(file,&st) == -1) {
26     if (errno == error_noent)
27       strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," does not exist",0);
28     else
29       strerr_warn4(WARNING,"unable to stat .../",file,": ",&strerr_sys);
30     return;
31   }
32
33   if ((uid != -1) && (st.st_uid != uid))
34     strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," has wrong owner",0);
35   if ((gid != -1) && (st.st_gid != gid))
36     strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," has wrong group",0);
37   if ((st.st_mode & 07777) != mode)
38     strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," has wrong permissions",0);
39   if ((st.st_mode & S_IFMT) != type)
40     strerr_warn6(WARNING,prefix1,prefix2,prefix3,file," has wrong type",0);
41 }
42
43 void h(home,uid,gid,mode)
44 char *home;
45 int uid;
46 int gid;
47 int mode;
48 {
49   perm("","","",home,S_IFDIR,uid,gid,mode);
50 }
51
52 void d(home,subdir,uid,gid,mode)
53 char *home;
54 char *subdir;
55 int uid;
56 int gid;
57 int mode;
58 {
59   if (chdir(home) == -1)
60     strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
61   perm("",home,"/",subdir,S_IFDIR,uid,gid,mode);
62 }
63
64 void p(home,fifo,uid,gid,mode)
65 char *home;
66 char *fifo;
67 int uid;
68 int gid;
69 int mode;
70 {
71   if (chdir(home) == -1)
72     strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
73   perm("",home,"/",fifo,S_IFIFO,uid,gid,mode);
74 }
75
76 void c(home,subdir,file,uid,gid,mode)
77 char *home;
78 char *subdir;
79 char *file;
80 int uid;
81 int gid;
82 int mode;
83 {
84   if (chdir(home) == -1)
85     strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
86   if (chdir(subdir) == -1)
87     strerr_die6sys(111,FATAL,"unable to switch to ",home,"/",subdir,": ");
88   perm(".../",subdir,"/",file,S_IFREG,uid,gid,mode);
89 }
90
91 void z(home,file,len,uid,gid,mode)
92 char *home;
93 char *file;
94 int len;
95 int uid;
96 int gid;
97 int mode;
98 {
99   if (chdir(home) == -1)
100     strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
101   perm("",home,"/",file,S_IFREG,uid,gid,mode);
102 }
103
104 void main(argc,argv)
105 int argc;
106 char *argv[];
107 {
108   char *home = 0;
109   if (argc > 1)
110     home = argv[1];
111   hier(home);
112   _exit(0);
113 }