1 #include <errno.h>
2 #include <fcntl.h>
3 #include <stdio.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <unistd.h>
7 #include "installer.h"
8 
9 static struct stat statbuf;
10 
11 int bin;
12 int man;
13 
14 static void diesys(const char* msg)
15 {
16   fprintf(stderr, "installer error: %s:\n  %s\n", msg,
17 	  sys_errlist[errno]);
18   exit(1);
19 }
20 
21 static void diefsys(const char* msg, const char* filename)
22 {
23   fprintf(stderr, "installer error: %s '%s':\n  %s\n", msg, filename,
24 	  sys_errlist[errno]);
25   exit(1);
26 }
27 
28 static void warn(const char* subdir, const char* filename, const char* msg)
29 {
30   printf("instcheck warning: File '%s%s%s' %s.\n",
31 	 subdir ? subdir : "", subdir ? "/" : "", filename, msg);
32 }
33 
34 static void testmode(int dir, const char* subdir, const char* filename,
35 		     unsigned uid, unsigned gid, unsigned mode, unsigned type)
36 {
37   if (fchdir(dir) == -1)
38     diesys("Could not change base directory");
39   if (subdir && chdir(subdir) == -1)
40     return;
41   if (stat(filename, &statbuf) == -1) {
42     if (errno == ENOENT)
43       warn(subdir, filename, "is missing");
44     else
45       diefsys("Could not stat file", filename);
46   }
47   if ((statbuf.st_mode & S_IFMT) != type)
48     warn(subdir, filename, "is the wrong type of file");
49   if (uid != (unsigned)-1 && statbuf.st_uid != uid)
50     warn(subdir, filename, "has wrong owner");
51   if (gid != (unsigned)-1 && statbuf.st_gid != gid)
52     warn(subdir, filename, "has wrong group");
53   if ((statbuf.st_mode & 07777) != mode)
54     warn(subdir, filename, "has wrong permissions");
55 }
56 
57 void c(int dir, const char* subdir, const char* filename,
58        unsigned uid, unsigned gid, unsigned mode)
59 {
60   testmode(dir, subdir, filename, uid, gid, mode, S_IFREG);
61 }
62 
63 void d(int dir, const char* subdir,
64        unsigned uid, unsigned gid, unsigned mode)
65 {
66   testmode(dir, 0, subdir, uid, gid, mode, S_IFDIR);
67 }
68 
69 int opendir(const char* dir)
70 {
71   int fd;
72   if (chdir(dir) == -1)
73     diefsys("Could not change directory to", dir);
74   if ((fd = open(".", O_RDONLY)) == -1)
75     diefsys("Could not open directory", dir);
76   return fd;
77 }
78 
79 int opensubdir(int dir, const char* subdir)
80 {
81   if (fchdir(dir) == -1)
82     diesys("Could not change base directory in opensubdir");
83   return opendir(subdir);
84 }
85 
86 int main(void)
87 {
88   insthier();
89   return 0;
90 }
91