#include #include #include #include #include #include #include #include #include "installer.h" #define DENTRY_SLOTS 16 static const char* dentries[DENTRY_SLOTS] = {0}; static int last_dentry = 0; static void showmode(char type, unsigned mode) { putchar(type); putchar((mode & 0400) ? 'r' : '-'); putchar((mode & 0200) ? 'w' : '-'); putchar((mode & 0100) ? (mode & 04000) ? 's' : 'x' : (mode & 04000) ? 'S' : '-'); putchar((mode & 040) ? 'r' : '-'); putchar((mode & 020) ? 'w' : '-'); putchar((mode & 010) ? (mode & 02000) ? 's' : 'x' : (mode & 02000) ? 'S' : '-'); putchar((mode & 04) ? 'r' : '-'); putchar((mode & 02) ? 'w' : '-'); putchar((mode & 01) ? (mode & 01000) ? 't' : 'x' : (mode & 01000) ? 'T' : '-'); } static void show(char type, int dir, const char* filename, unsigned uid, unsigned gid, unsigned mode) { showmode(type, mode); if (uid == (unsigned)-1) fputs(" N/A", stdout); else printf(" %8d", uid); if (gid == (unsigned)-1) fputs(" N/A", stdout); else printf(" %8d", gid); putchar(' '); fputs(dentries[dir], stdout); putchar('/'); puts(filename); } void c(int dir, const char* filename, unsigned uid, unsigned gid, unsigned mode) { show('-', dir, filename, uid, gid, mode); } int d(int dir, const char* subdir, unsigned uid, unsigned gid, unsigned mode) { show('d', dir, subdir, uid, gid, mode); return opensubdir(dir, subdir); } int opendir(const char* dir) { if (last_dentry >= DENTRY_SLOTS) { fputs("instshow: error: Too many open directories!\n", stderr); exit(1); } dentries[last_dentry] = strdup(dir); return last_dentry++; } int opensubdir(int dir, const char* subdir) { char* str; if (last_dentry >= DENTRY_SLOTS) { fputs("instshow: error: Too many open directories!\n", stderr); exit(1); } str = malloc(strlen(dentries[dir])+1+strlen(subdir)+1); strcpy(str, dentries[dir]); strcat(str, "/"); strcat(str, subdir); dentries[last_dentry] = str; return last_dentry++; } int main(void) { puts(" type/mode owner group path"); insthier(); return 0; }