#include #include #include #include #include #include "csumconv.h" #include "cmpmark.h" #include "fi.h" #define FI_STRMASKSIZE 10 #define FI_STRMODESIZE 11 #define FI_STRTIMESIZE 20 #define FI_STRFLAGSSIZE 80 #define FI_UINOSIZE 8 #define FI_UMODESIZE 2 #define FI_UNLINKSIZE 2 #define FI_UUIDSIZE 4 #define FI_UGIDSIZE 4 #define FI_UCTIMESIZE 4 #define FI_USIZESIZE 8 #define FI_UFLAGSSIZE 2 #define FI_UCSUMSIZE FI_CSUMSIZE #define FI_UMASKSIZE 2 void fi_stoch(fi, s) const FI *fi; unsigned char *s; { int i, j; ino_t ino; mode_t mode; nlink_t nlink; uid_t uid; gid_t gid; time_t ctime; off_t size; uint32_t flags; uint16_t mask; j=0; for (i=0, ino=fi->fi_ino; ifi_mode; ifi_nlink; ifi_uid; ifi_gid; ifi_ctime; ifi_size; ifi_flags; ifi_sha[i]; } for (i=0, mask=fi->fi_mask; ifi_ino=fi->fi_ino*256 + s[j+i]; } j+=FI_UINOSIZE; for (i=FI_UMODESIZE-1; 0<=i; --i) { fi->fi_mode=fi->fi_mode*256 + s[j+i]; } j+=FI_UMODESIZE; for (i=FI_UNLINKSIZE-1; 0<=i; --i) { fi->fi_nlink=fi->fi_nlink*256 + s[j+i]; } j+=FI_UNLINKSIZE; for (i=FI_UUIDSIZE-1; 0<=i; --i) { fi->fi_uid=fi->fi_uid*256 + s[j+i]; } j+=FI_UUIDSIZE; for (i=FI_UGIDSIZE-1; 0<=i; --i) { fi->fi_gid=fi->fi_gid*256 + s[j+i]; } j+=FI_UGIDSIZE; for (i=FI_UCTIMESIZE-1; 0<=i; --i) { fi->fi_ctime=fi->fi_ctime*256 + s[j+i]; } j+=FI_UCTIMESIZE; for (i=FI_USIZESIZE-1; 0<=i; --i) { fi->fi_size=fi->fi_size*256 + s[j+i]; } j+=FI_USIZESIZE; for (i=FI_UFLAGSSIZE-1; 0<=i; --i) { fi->fi_flags=fi->fi_flags*256 + s[j+i]; } j+=FI_UFLAGSSIZE; for (i=FI_UCSUMSIZE-1; 0<=i; --i) { fi->fi_sha[i]=s[j+i]; } j+=FI_UCSUMSIZE; for (i=FI_UMASKSIZE-1; 0<=i; --i) { fi->fi_mask=fi->fi_mask*256 + s[j+i]; } } static inline char * fi_strmask(mask, s) int mask; char *s; /* FI_STRMASKSIZE */ { s[0]=((mask & FI_MINO) ? 'i': '-'); s[1]=((mask & FI_MNLINK) ? 'l': '-'); s[2]=((mask & FI_MUID) ? 'u': '-'); s[3]=((mask & FI_MGID) ? 'g': '-'); s[4]=((mask & FI_MMODE) ? 'm': '-'); s[5]=((mask & FI_MSIZE) ? 's': '-'); s[6]=((mask & FI_MFLAGS) ? 'f': '-'); s[7]=((mask & FI_MCTIME) ? 't': '-'); s[8]=((mask & FI_MSHA) ? 'c': '-'); s[9]=0x0; return (s); } static inline char * fi_strmode(mode, s) mode_t mode; char *s; /* FI_STRMODESIZE */ { if (S_ISDIR(mode)) s[0]='d'; else if (S_ISCHR(mode)) s[0]='c'; else if (S_ISBLK(mode)) s[0]='b'; else if (S_ISFIFO(mode)) s[0]='f'; else if (S_ISLNK(mode)) s[0]='l'; else if (S_ISSOCK(mode)) s[0]='s'; else s[0]='-'; s[1]=((mode & S_IRUSR) ? 'r' : '-'); s[2]=((mode & S_IWUSR) ? 'w' : '-'); if ((mode & S_IXUSR) && (mode & S_ISUID)) s[3]='S'; else if ((mode & S_IXUSR) && !(mode & S_ISUID)) s[3]='x'; else if (!(mode & S_IXUSR) && (mode & S_ISUID)) s[3]='s'; else s[3]='-'; s[4]=((mode & S_IRGRP) ? 'r' : '-'); s[5]=((mode & S_IWGRP) ? 'w' : '-'); if ((mode & S_IXGRP) && (mode & S_ISGID)) s[6]='S'; else if ((mode & S_IXGRP) && !(mode & S_ISGID)) s[6]='x'; else if (!(mode & S_IXGRP) && (mode & S_ISGID)) s[6]='s'; else s[6]='-'; s[7]=((mode & S_IROTH) ? 'r' : '-'); s[8]=((mode & S_IWOTH) ? 'w' : '-'); s[9]=((mode & S_IXOTH) ? 'x' : '-'); s[10]=0x0; } static inline char * fi_strflags(flags, s) int flags; char *s; /* FI_STRFLAGSSIZE */ { const char *flag; int i=0; #ifdef UF_NODUMP if (flags & UF_NODUMP) { flag="nodump"; strncpy(s+i, flag, strlen(flag)+1); i+=strlen(flag); } #endif #ifdef UF_IMMUTABLE if (flags & UF_IMMUTABLE) { if (0fi_sha, strcsum, FI_STRCSUMSIZE); (void)localtime_r(&fi->fi_ctime, &tm); (void)snprintf(strtime, FI_STRTIMESIZE, "%d-%.2d-%.2d %.2d:%.2d:%.2d", tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); if (mask & FI_MINO) { (void)printf("%lld ", (long long)fi->fi_ino); } if (mask & FI_MNLINK) { (void)printf("%d ", (int)fi->fi_nlink); } if (mask & FI_MUID) { (void)printf("%ld ", (long)fi->fi_uid); } if (mask & FI_MGID) { (void)printf("%ld ", (long)fi->fi_gid); } if (mask & FI_MMODE) { (void)printf("%.6o ", fi->fi_mode); } if (mask & FI_MSIZE) { (void)printf("%lld ", (long long)fi->fi_size); } if (mask & FI_MFLAGS) { (void)printf("%.8x ", fi->fi_flags); } if (mask & FI_MCTIME) { (void)printf("%s ", strtime); } if (mask & FI_MSHA) { (void)printf("%s ", strcsum); } (void)printf("\n"); } void fi_pshow(type, fi, path, mask) int type; const FI *fi; const char *path; { char chtype, strmask[FI_STRMASKSIZE]; switch (type) { case CM_NEW: chtype='N'; break; case CM_DELETED: chtype='D'; break; case CM_CHANGED: chtype='C'; break; default: chtype='?'; break; } (void)fi_strmask(fi->fi_mask, strmask); (void)printf("%c %s %s\n", chtype, strmask, path); fi_pshow_body(&fi[0], mask); if (type==CM_CHANGED) fi_pshow_body(&fi[1], mask); } static inline void fi_hshow_body(fi, mask) const FI *fi; int mask; { struct tm tm; char strtime[FI_STRTIMESIZE], strcsum[FI_STRCSUMSIZE+1]; char strmode[FI_STRMODESIZE]; (void)fi_strmode(fi->fi_mode, strmode); (void)csumconv_btos(fi->fi_sha, strcsum, FI_STRCSUMSIZE); strcsum[FI_STRCSUMSIZE]=(char)0x0; (void)localtime_r(&fi->fi_ctime, &tm); (void)snprintf(strtime, FI_STRTIMESIZE, "%d-%.2d-%.2d %.2d:%.2d:%.2d", tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); if (mask & FI_MINO) { (void)printf("ino:\t%lld\n", (long long)fi->fi_ino); } if (mask & FI_MNLINK) { (void)printf("links:\t%d\n", (int)fi->fi_nlink); } if (mask & FI_MUID) { (void)printf("uid:\t%ld\n", (long)fi->fi_uid); } if (mask & FI_MGID) { (void)printf("gid:\t%ld\n", (long)fi->fi_gid); } if (mask & FI_MMODE) { (void)printf("mode:\t%.6o\n", fi->fi_mode); } if (mask & FI_MSIZE) { (void)printf("size:\t%lld\n", (long long)fi->fi_size); } if (mask & FI_MFLAGS) { (void)printf("flags:\t%.8x\n", fi->fi_flags); } if (mask & FI_MCTIME) { (void)printf("ctime:\t%s\n", strtime); } if (mask & FI_MSHA) { (void)printf("csum:\t%s\n", strcsum); } (void)printf("\n"); } void fi_hshow(type, fi, path, mask) int type, mask; const FI *fi; const char *path; { char chtype, strmask[FI_STRMASKSIZE]; switch (type) { case CM_NEW: chtype='N'; break; case CM_DELETED: chtype='D'; break; case CM_CHANGED: chtype='C'; break; default: chtype='?'; break; } (void)fi_strmask(fi->fi_mask, strmask); (void)printf("%c %s %s\n", chtype, strmask, path); fi_hshow_body(&fi[0], mask); if (type==CM_CHANGED) fi_hshow_body(&fi[1], mask); } static inline void fi_hxshow_body(fi, mask) const FI *fi; int mask; { struct tm tm; char strtime[FI_STRTIMESIZE], strmode[FI_STRMODESIZE]; char strflags[FI_STRFLAGSSIZE], strcsum[FI_STRCSUMSIZE+1]; (void)fi_strmode(fi->fi_mode, strmode); (void)fi_strflags(fi->fi_flags, strflags); (void)csumconv_btos(fi->fi_sha, strcsum, FI_STRCSUMSIZE); strcsum[FI_STRCSUMSIZE]=(char)0x0; (void)localtime_r(&fi->fi_ctime, &tm); (void)snprintf(strtime, 20, "%d-%.2d-%.2d %.2d:%.2d:%.2d", tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); if (mask & FI_MINO) { (void)printf("ino:\t%lld\n", (long long)fi->fi_ino); } if (mask & FI_MNLINK) { (void)printf("links:\t%d\n", (int)fi->fi_nlink); } if (mask & FI_MUID) { (void)printf("uid:\t%ld\n", (long)fi->fi_uid); } if (mask & FI_MGID) { (void)printf("gid:\t%ld\n", (long)fi->fi_gid); } if (mask & FI_MMODE) { (void)printf("mode:\t%.6o (%s)\n", fi->fi_mode, strmode); } if (mask & FI_MSIZE) { (void)printf("size:\t%lld\n", (long long)fi->fi_size); } if (mask & FI_MFLAGS) { (void)printf("flags:\t%.8x (%s)\n", fi->fi_flags, strflags); } if (mask & FI_MCTIME) { (void)printf("ctime:\t%s\n", strtime); } if (mask & FI_MSHA) { (void)printf("csum:\t%s\n", strcsum); } (void)printf("\n"); } void fi_hxshow(type, fi, path, mask) int type, mask; const FI *fi; const char *path; { char chtype, strmask[FI_STRMASKSIZE]; switch (type) { case CM_NEW: chtype='N'; break; case CM_DELETED: chtype='D'; break; case CM_CHANGED: chtype='C'; break; default: chtype='?'; break; } (void)fi_strmask(fi->fi_mask, strmask); (void)printf("%c %s %s\n", chtype, strmask, path); fi_hxshow_body(&fi[0], mask); if (type==CM_CHANGED) fi_hxshow_body(&fi[1], mask); }