#include #include #include #include "exit.h" #include "logmsg.h" #include "hier.h" #define WHO "instcheck" static void perm( char *prefix1, char *prefix2, char *prefix3, char *file, int type, int uid, int gid, int mode) { struct stat st; if (stat(file, &st) == -1) { if (errno == ENOENT) logmsg(WHO, 0, WARN, B("file does nost exist:", prefix1, prefix2, prefix3, file)); else logmsg(WHO, errno, WARN, B("unable to stat: ../", file)); return; } if ((uid != -1) && (st.st_uid != uid)) logmsg(WHO, 0, WARN, B("file has wrong owner: ", prefix1, prefix2, prefix3, file)); if ((gid != -1) && (st.st_gid != gid)) logmsg(WHO, 0, WARN, B("file has wrong group: ", prefix1, prefix2, prefix3, file)); if ((st.st_mode & 07777) != mode) logmsg(WHO, 0, WARN, B("file has wrong permissions: ", prefix1, prefix2, prefix3, file)); if ((st.st_mode & S_IFMT) != type) logmsg(WHO, 0, WARN, B("file has wrong type: ", prefix1, prefix2, prefix3, file)); } void h(const char *home, int uid, int gid, int mode) { perm("", "", "", home, S_IFDIR, uid, gid, mode); } void d(const char *home, char *subdir, int uid, int gid, int mode) { if (chdir(home) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home)); perm("", home, "/", subdir, S_IFDIR, uid, gid, mode); } void p(const char *home, char *fifo, int uid, int gid, int mode) { if (chdir(home) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home)); perm("", home, "/", fifo, S_IFIFO, uid, gid, mode); } void c(const char *home, char *subdir, char *file, int uid, int gid, int mode) { if (chdir(home) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home)); if (chdir(subdir) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home, "/", subdir)); perm(".../", subdir, "/", file, S_IFREG, uid, gid, mode); } void z(const char *home, char *file, int len, int uid, int gid, int mode) { if (chdir(home) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home)); perm("", home, "/", file, S_IFREG, uid, gid, mode); } int main() { hier(); _exit(0); }