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