#include #include #include #include #include #include #include "perr.h" #include "csumconv.h" #include "fi.h" #include "db.h" #include "cmpmark.h" #define OPT_SHOW_X 0x0001 #define OPT_SHOW_H 0x0002 #define OPT_SHOW_P 0x0004 #define OPT_MASK_SET 0x0010 #define OPT_MASK_AND 0x0020 #define OPT_PATH_EQ 0x0200 #define OPT_PATH_IN 0x0400 typedef struct { int mask; int opt; char path[PATH_MAX+1]; } RSP; int show(dbhead, dbdata, sp) const DBHEAD *dbhead; void *dbdata; void *sp; { RSP *rsp=(RSP *)sp; int marks=dbhead->db_marks; const char *path=dbhead->db_path; int mask; FI fi[2]; if ((rsp->opt & OPT_PATH_EQ) && strncmp(rsp->path, path, PATH_MAX)!=0) return (0); if ((rsp->opt & OPT_PATH_IN) && strncmp(rsp->path, path, strlen(rsp->path))!=0) return (0); fi_chtos(dbdata, &fi[0]); if (marks==CM_CHANGED) fi_chtos((char *)dbdata + FI_CHFISIZE, &fi[1]); if (rsp->opt & OPT_MASK_SET) { mask=rsp->mask; } else if (rsp->opt & OPT_MASK_AND) { mask=fi[0].fi_mask & rsp->mask; } else { mask=fi[0].fi_mask; } if (rsp->opt & OPT_SHOW_P) { fi_pshow(marks, &fi, path, mask); } else if (rsp->opt & OPT_SHOW_H) { if (rsp->opt & OPT_SHOW_X) { fi_hxshow(marks, &fi, path, mask); } else { fi_hshow(marks, &fi, path, mask); } } return (0); } void strmasktomask(s, m) const char *s; int *m; { *m=0x0; for ( ; *s; ++s) { switch (*s) { case 'F': *m=FI_MFULL; break; case 'C': *m=FI_MCHANGE; break; case 'i': *m|=FI_MINO; break; case 'l': *m|=FI_MNLINK; break; case 'u': *m|=FI_MUID; break; case 'g': *m|=FI_MGID; break; case 'm': *m|=FI_MMODE; break; case 's': *m|=FI_MSIZE; break; case 'f': *m|=FI_MFLAGS; break; case 't': *m|=FI_MCTIME; break; case 'c': *m|=FI_MSHA; break; } } } void usage(void) { (void)fprintf(stderr, "usage: fswshow [[-x] -h | -p] [-m mask | -M mask] [-d path | -D path] file\n"); exit (1); } int main(argc, argv) int argc; const char *const *argv; { char dbbuff[2*FI_CHFISIZE]; RSP rsp; int ch; rsp.opt=OPT_SHOW_H; rsp.mask=0x0; while ((ch=getopt(argc, (char *const *)argv, "phxm:M:d:D:"))!=-1) { switch(ch) { case 'p': rsp.opt|=OPT_SHOW_P; break; case 'h': rsp.opt|=OPT_SHOW_H; break; case 'x': rsp.opt|=OPT_SHOW_X; break; case 'm': rsp.opt|=OPT_MASK_AND; strmasktomask(optarg, &rsp.mask); break; case 'M': rsp.opt|=OPT_MASK_SET; strmasktomask(optarg, &rsp.mask); break; case 'd': rsp.opt|=OPT_PATH_IN; (void)strncpy(rsp.path, optarg, PATH_MAX); rsp.path[PATH_MAX-1]=0x0; break; case 'D': rsp.opt|=OPT_PATH_EQ; (void)strncpy(rsp.path, optarg, PATH_MAX); rsp.path[PATH_MAX-1]=0x0; break; default: usage(); break; } } argc-=optind; argv+=optind; if (argc!=1) usage(); if (db_readall(argv[0], &show, &rsp, &dbbuff)!=0) perr2("db_readall", argv[0]); exit (0); }