Make the output of mtree(8) more systematic and machine readable.
The new format is: filename {changed,missing,extra} $field expected $foo found $bar ... Fix various bugs along the way: Don't complain about directory sizes differing. Correctly check flags.
This commit is contained in:
parent
162080b465
commit
bd39966d9b
@ -68,14 +68,8 @@ static char *ftype __P((u_int));
|
||||
#define INDENTNAMELEN 8
|
||||
#define LABEL \
|
||||
if (!label++) { \
|
||||
len = printf("%s: ", RP(p)); \
|
||||
if (len > INDENTNAMELEN) { \
|
||||
tab = "\t"; \
|
||||
(void)printf("\n"); \
|
||||
} else { \
|
||||
tab = ""; \
|
||||
(void)printf("%*s", INDENTNAMELEN - (int)len, ""); \
|
||||
} \
|
||||
len = printf("%s changed\n", RP(p)); \
|
||||
tab = "\t"; \
|
||||
}
|
||||
|
||||
int
|
||||
@ -119,7 +113,7 @@ compare(name, s, p)
|
||||
case F_SOCK:
|
||||
if (!S_ISSOCK(p->fts_statp->st_mode)) {
|
||||
typeerr: LABEL;
|
||||
(void)printf("\ttype (%s, %s)\n",
|
||||
(void)printf("\ttype expected %s found %s\n",
|
||||
ftype(s->type), inotype(p->fts_statp->st_mode));
|
||||
}
|
||||
break;
|
||||
@ -127,57 +121,58 @@ typeerr: LABEL;
|
||||
/* Set the uid/gid first, then set the mode. */
|
||||
if (s->flags & (F_UID | F_UNAME) && s->st_uid != p->fts_statp->st_uid) {
|
||||
LABEL;
|
||||
(void)printf("%suser (%lu, %lu",
|
||||
(void)printf("%suser expected %lu found %lu",
|
||||
tab, (u_long)s->st_uid, (u_long)p->fts_statp->st_uid);
|
||||
if (uflag)
|
||||
if (chown(p->fts_accpath, s->st_uid, -1))
|
||||
(void)printf(", not modified: %s)\n",
|
||||
(void)printf(" not modified: %s\n",
|
||||
strerror(errno));
|
||||
else
|
||||
(void)printf(", modified)\n");
|
||||
(void)printf(" modified\n");
|
||||
else
|
||||
(void)printf(")\n");
|
||||
(void)printf("\n");
|
||||
tab = "\t";
|
||||
}
|
||||
if (s->flags & (F_GID | F_GNAME) && s->st_gid != p->fts_statp->st_gid) {
|
||||
LABEL;
|
||||
(void)printf("%sgid (%lu, %lu",
|
||||
(void)printf("%sgid expected %lu found %lu",
|
||||
tab, (u_long)s->st_gid, (u_long)p->fts_statp->st_gid);
|
||||
if (uflag)
|
||||
if (chown(p->fts_accpath, -1, s->st_gid))
|
||||
(void)printf(", not modified: %s)\n",
|
||||
(void)printf(" not modified: %s\n",
|
||||
strerror(errno));
|
||||
else
|
||||
(void)printf(", modified)\n");
|
||||
(void)printf(" modified\n");
|
||||
else
|
||||
(void)printf(")\n");
|
||||
(void)printf("\n");
|
||||
tab = "\t";
|
||||
}
|
||||
if (s->flags & F_MODE &&
|
||||
s->st_mode != (p->fts_statp->st_mode & MBITS)) {
|
||||
LABEL;
|
||||
(void)printf("%spermissions (%#o, %#o",
|
||||
(void)printf("%spermissions expected %#o found %#o",
|
||||
tab, s->st_mode, p->fts_statp->st_mode & MBITS);
|
||||
if (uflag)
|
||||
if (chmod(p->fts_accpath, s->st_mode))
|
||||
(void)printf(", not modified: %s)\n",
|
||||
(void)printf(" not modified: %s\n",
|
||||
strerror(errno));
|
||||
else
|
||||
(void)printf(", modified)\n");
|
||||
(void)printf(" modified\n");
|
||||
else
|
||||
(void)printf(")\n");
|
||||
(void)printf("\n");
|
||||
tab = "\t";
|
||||
}
|
||||
if (s->flags & F_NLINK && s->type != F_DIR &&
|
||||
s->st_nlink != p->fts_statp->st_nlink) {
|
||||
LABEL;
|
||||
(void)printf("%slink count (%u, %u)\n",
|
||||
(void)printf("%slink_count expected %u found %u\n",
|
||||
tab, s->st_nlink, p->fts_statp->st_nlink);
|
||||
tab = "\t";
|
||||
}
|
||||
if (s->flags & F_SIZE && s->st_size != p->fts_statp->st_size) {
|
||||
if (s->flags & F_SIZE && s->st_size != p->fts_statp->st_size &&
|
||||
!S_ISDIR(p->fts_statp->st_mode)) {
|
||||
LABEL;
|
||||
(void)printf("%ssize (%qd, %qd)\n",
|
||||
(void)printf("%ssize expected %qd found %qd\n",
|
||||
tab, s->st_size, p->fts_statp->st_size);
|
||||
tab = "\t";
|
||||
}
|
||||
@ -189,9 +184,9 @@ typeerr: LABEL;
|
||||
((s->st_mtimespec.tv_sec != p->fts_statp->st_mtimespec.tv_sec) ||
|
||||
(s->st_mtimespec.tv_nsec != p->fts_statp->st_mtimespec.tv_nsec))) {
|
||||
LABEL;
|
||||
(void)printf("%smodification time (%.24s, ",
|
||||
(void)printf("%smodification time expected %.24s ",
|
||||
tab, ctime(&s->st_mtimespec.tv_sec));
|
||||
(void)printf("%.24s)\n",
|
||||
(void)printf("found %.24s\n",
|
||||
ctime(&p->fts_statp->st_mtimespec.tv_sec));
|
||||
tab = "\t";
|
||||
}
|
||||
@ -211,7 +206,7 @@ typeerr: LABEL;
|
||||
(void)close(fd);
|
||||
if (s->cksum != val) {
|
||||
LABEL;
|
||||
(void)printf("%scksum (%lu, %lu)\n",
|
||||
(void)printf("%scksum expected %lu found %lu\n",
|
||||
tab, s->cksum, val);
|
||||
}
|
||||
tab = "\t";
|
||||
@ -226,21 +221,21 @@ typeerr: LABEL;
|
||||
if ((s->flags & F_FLAGS) && s->st_flags != p->fts_statp->st_flags) {
|
||||
LABEL;
|
||||
fflags = flags_to_string(s->st_flags);
|
||||
(void)printf("%sflags (\"%s\" is not ", tab, fflags);
|
||||
(void)printf("%sflags expected \"%s\"", tab, fflags);
|
||||
free(fflags);
|
||||
|
||||
fflags = flags_to_string(p->fts_statp->st_flags);
|
||||
(void)printf("\"%s\"", fflags);
|
||||
(void)printf(" found \"%s\"", fflags);
|
||||
free(fflags);
|
||||
|
||||
if (uflag)
|
||||
if (chflags(p->fts_accpath, s->st_flags))
|
||||
(void)printf(", not modified: %s)\n",
|
||||
(void)printf(" not modified: %s\n",
|
||||
strerror(errno));
|
||||
else
|
||||
(void)printf(", modified)\n");
|
||||
(void)printf(" modified\n");
|
||||
else
|
||||
(void)printf(")\n");
|
||||
(void)printf("\n");
|
||||
tab = "\t";
|
||||
}
|
||||
#ifdef MD5
|
||||
@ -250,12 +245,12 @@ typeerr: LABEL;
|
||||
new_digest = MD5File(p->fts_accpath, buf);
|
||||
if (!new_digest) {
|
||||
LABEL;
|
||||
printf("%sMD5File: %s: %s\n", tab, p->fts_accpath,
|
||||
printf("%sMD5: %s: %s\n", tab, p->fts_accpath,
|
||||
strerror(errno));
|
||||
tab = "\t";
|
||||
} else if (strcmp(new_digest, s->md5digest)) {
|
||||
LABEL;
|
||||
printf("%sMD5 (%s, %s)\n", tab, s->md5digest,
|
||||
printf("%sMD5 expected %s found %s\n", tab, s->md5digest,
|
||||
new_digest);
|
||||
tab = "\t";
|
||||
}
|
||||
@ -268,13 +263,13 @@ typeerr: LABEL;
|
||||
new_digest = SHA1_File(p->fts_accpath, buf);
|
||||
if (!new_digest) {
|
||||
LABEL;
|
||||
printf("%sSHA1_File: %s: %s\n", tab, p->fts_accpath,
|
||||
printf("%sSHA-1: %s: %s\n", tab, p->fts_accpath,
|
||||
strerror(errno));
|
||||
tab = "\t";
|
||||
} else if (strcmp(new_digest, s->sha1digest)) {
|
||||
LABEL;
|
||||
printf("%sSHA-1 (%s, %s)\n", tab, s->sha1digest,
|
||||
new_digest);
|
||||
printf("%sSHA-1 expected %s found %s\n",
|
||||
tab, s->sha1digest, new_digest);
|
||||
tab = "\t";
|
||||
}
|
||||
}
|
||||
@ -286,13 +281,13 @@ typeerr: LABEL;
|
||||
new_digest = RIPEMD160_File(p->fts_accpath, buf);
|
||||
if (!new_digest) {
|
||||
LABEL;
|
||||
printf("%sRIPEMD160_File: %s: %s\n", tab,
|
||||
printf("%sRIPEMD160: %s: %s\n", tab,
|
||||
p->fts_accpath, strerror(errno));
|
||||
tab = "\t";
|
||||
} else if (strcmp(new_digest, s->rmd160digest)) {
|
||||
LABEL;
|
||||
printf("%sRIPEMD160 (%s, %s)\n", tab, s->rmd160digest,
|
||||
new_digest);
|
||||
printf("%sRIPEMD160 expected %s found %s\n",
|
||||
tab, s->rmd160digest, new_digest);
|
||||
tab = "\t";
|
||||
}
|
||||
}
|
||||
@ -301,7 +296,8 @@ typeerr: LABEL;
|
||||
if (s->flags & F_SLINK &&
|
||||
strcmp(cp = rlink(p->fts_accpath), s->slink)) {
|
||||
LABEL;
|
||||
(void)printf("%slink ref (%s, %s)\n", tab, cp, s->slink);
|
||||
(void)printf("%slink_ref expected %s found %s\n",
|
||||
tab, cp, s->slink);
|
||||
}
|
||||
return (label);
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ extern int lineno;
|
||||
static gid_t gid;
|
||||
static uid_t uid;
|
||||
static mode_t mode;
|
||||
static u_long flags;
|
||||
static u_long flags = 0xffffffff;
|
||||
|
||||
static int dsort __P((const FTSENT **, const FTSENT **));
|
||||
static void output __P((int, int *, const char *, ...));
|
||||
@ -290,7 +290,7 @@ statd(t, parent, puid, pgid, pmode, pflags)
|
||||
gid_t savegid = *pgid;
|
||||
uid_t saveuid = *puid;
|
||||
mode_t savemode = *pmode;
|
||||
u_long saveflags = 0;
|
||||
u_long saveflags = *pflags;
|
||||
u_short maxgid, maxuid, maxmode, maxflags;
|
||||
u_short g[MAXGID], u[MAXUID], m[MAXMODE], f[MAXFLAGS];
|
||||
char *fflags;
|
||||
@ -337,7 +337,7 @@ statd(t, parent, puid, pgid, pmode, pflags)
|
||||
if (FLAGS2IDX(sflags) < MAXFLAGS &&
|
||||
++f[FLAGS2IDX(sflags)] > maxflags) {
|
||||
saveflags = sflags;
|
||||
maxflags = u[FLAGS2IDX(sflags)];
|
||||
maxflags = f[FLAGS2IDX(sflags)];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -348,7 +348,9 @@ statd(t, parent, puid, pgid, pmode, pflags)
|
||||
*/
|
||||
if ((((keys & F_UNAME) | (keys & F_UID)) && (*puid != saveuid)) ||
|
||||
(((keys & F_GNAME) | (keys & F_GID)) && (*pgid != savegid)) ||
|
||||
((keys & F_MODE) && (*pmode != savemode)) || (first)) {
|
||||
((keys & F_MODE) && (*pmode != savemode)) ||
|
||||
((keys & F_FLAGS) && (*pflags != saveflags)) ||
|
||||
(first)) {
|
||||
first = 0;
|
||||
if (dflag)
|
||||
(void)printf("/set type=dir");
|
||||
@ -378,7 +380,7 @@ statd(t, parent, puid, pgid, pmode, pflags)
|
||||
(void)printf(" mode=%#o", savemode);
|
||||
if (keys & F_NLINK)
|
||||
(void)printf(" nlink=1");
|
||||
if (keys & F_FLAGS && saveflags) {
|
||||
if (keys & F_FLAGS) {
|
||||
fflags = flags_to_string(saveflags);
|
||||
(void)printf(" flags=%s", fflags);
|
||||
free(fflags);
|
||||
|
@ -139,7 +139,7 @@ vwalk()
|
||||
continue;
|
||||
extra:
|
||||
if (!eflag) {
|
||||
(void)printf("extra: %s", RP(p));
|
||||
(void)printf("%s extra", RP(p));
|
||||
if (rflag) {
|
||||
if ((S_ISDIR(p->fts_statp->st_mode)
|
||||
? rmdir : unlink)(p->fts_accpath)) {
|
||||
@ -179,7 +179,7 @@ miss(p, tail)
|
||||
if (qflag && stat(path, &statbuf) == 0)
|
||||
p->flags |= F_VISIT;
|
||||
else
|
||||
(void)printf("missing: %s", path);
|
||||
(void)printf("%s missing", path);
|
||||
}
|
||||
if (p->type != F_DIR && p->type != F_LINK) {
|
||||
putchar('\n');
|
||||
|
Loading…
Reference in New Issue
Block a user