tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[PATCH] mtree: improve output compatiblity for FreeBSD 9



When comparing a directory to an mtree file NetBSD mtree has output like
this:

xxx:    size (4, 5)
        md5digest (0x6de9439834c9147569741d3c9c9fc010, 
0xa5d119ab8edcda0ef7f381da8f52f92f)
./yyy missing

FreeBSD's historical behavior is this:

xxx changed
        size expected 4 found 5
        md5digest expected 6de9439834c9147569741d3c9c9fc010 found 
a5d119ab8edcda0ef7f381da8f52f92f
./yyy missing

FreeBSD's mergemaster -U command depends on the latter behavior so
the following patch alters the freebsd9 mode of mtree to output
that format.  I don't think programs should rely on this output one way
or another since it's clearly meant for humans, but this seems like the
easiest short term fix.

Thanks,
Brooks

diff --git a/contrib/mtree/compare.c b/contrib/mtree/compare.c
index af2fd31..8b20ed9 100644
--- a/contrib/mtree/compare.c
+++ b/contrib/mtree/compare.c
@@ -72,13 +72,18 @@ __RCSID("$NetBSD: compare.c,v 1.56 2013/09/09 23:27:43 
christos Exp $");
 #define        INDENTNAMELEN   8
 #define MARK                                                           \
 do {                                                                   \
-       len = printf("%s: ", RP(p));                                    \
-       if (len > INDENTNAMELEN) {                                      \
+       if (flavor == F_FREEBSD9) {                                     \
+               len = printf("%s changed\n", RP(p));                    \
                tab = "\t";                                             \
-               printf("\n");                                           \
        } else {                                                        \
-               tab = "";                                               \
-               printf("%*s", INDENTNAMELEN - (int)len, "");            \
+               len = printf("%s: ", RP(p));                            \
+               if (len > INDENTNAMELEN) {                              \
+                       tab = "\t";                                     \
+                       printf("\n");                                   \
+               } else {                                                \
+                       tab = "";                                       \
+                       printf("%*s", INDENTNAMELEN - (int)len, "");    \
+               }                                                       \
        }                                                               \
 } while (0)
 #define        LABEL if (!label++) MARK
@@ -171,7 +176,8 @@ compare(NODE *s, FTSENT *p)
                break;
 #endif
 typeerr:               LABEL;
-               printf("\ttype (%s, %s)\n",
+               printf(flavor == F_FREEBSD9 ?
+                   "\ttype expected %s found %s\n" : "\ttype (%s, %s)\n",
                    nodetype(s->type), inotype(p->fts_statp->st_mode));
                return (label);
        }
@@ -193,7 +199,9 @@ typeerr:            LABEL;
            (s->type == F_BLOCK || s->type == F_CHAR) &&
            s->st_rdev != p->fts_statp->st_rdev) {
                LABEL;
-               printf("%sdevice (%#jx, %#jx",
+               printf(flavor == F_FREEBSD9 ?
+                   "%sdevice expected %#jx found %#jx" :
+                   "%sdevice (%#jx, %#jx",
                    tab, (uintmax_t)s->st_rdev,
                    (uintmax_t)p->fts_statp->st_rdev);
                if (uflag) {
@@ -203,10 +211,12 @@ typeerr:          LABEL;
                              s->st_rdev) == -1) ||
                            (lchown(p->fts_accpath, p->fts_statp->st_uid,
                              p->fts_statp->st_gid) == -1) )
-                               printf(", not modified: %s)\n",
-                                   strerror(errno));
+                               printf(", not modified: %s%s\n",
+                                   strerror(errno),
+                                   flavor == F_FREEBSD9 ? "" : ")");
                         else
-                               printf(", modified)\n");
+                               printf(", modified%s\n",
+                                   flavor == F_FREEBSD9 ? "" : ")");
                } else
                        printf(")\n");
                tab = "\t";
@@ -214,28 +224,34 @@ 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;
-               printf("%suser (%lu, %lu",
+               printf(flavor == F_FREEBSD9 ?
+                   "%suser expected %lu found %lu" : "%suser (%lu, %lu",
                    tab, (u_long)s->st_uid, (u_long)p->fts_statp->st_uid);
                if (uflag) {
                        if (lchown(p->fts_accpath, s->st_uid, -1))
-                               printf(", not modified: %s)\n",
-                                   strerror(errno));
+                               printf(", not modified: %s%s\n",
+                                   strerror(errno),
+                                   flavor == F_FREEBSD9 ? "" : ")");
                        else
-                               printf(", modified)\n");
+                               printf(", modified%s\n",
+                                   flavor == F_FREEBSD9 ? "" : ")");
                } else
                        printf(")\n");
                tab = "\t";
        }
        if (s->flags & (F_GID | F_GNAME) && s->st_gid != p->fts_statp->st_gid) {
                LABEL;
-               printf("%sgid (%lu, %lu",
+               printf(flavor == F_FREEBSD9 ?
+                   "%sgid expected %lu found %lu" : "%sgid (%lu, %lu",
                    tab, (u_long)s->st_gid, (u_long)p->fts_statp->st_gid);
                if (uflag) {
                        if (lchown(p->fts_accpath, -1, s->st_gid))
-                               printf(", not modified: %s)\n",
-                                   strerror(errno));
+                               printf(", not modified: %s%s\n",
+                                   strerror(errno),
+                                   flavor == F_FREEBSD9 ? "" : ")");
                        else
-                               printf(", modified)\n");
+                               printf(", modified%s\n",
+                                   flavor == F_FREEBSD9 ? "" : ")");
                }
                else
                        printf(")\n");
@@ -260,15 +276,19 @@ typeerr:          LABEL;
                }
 
                LABEL;
-               printf("%spermissions (%#lo, %#lo",
+               printf(flavor == F_FREEBSD9 ?
+                   "%spermissions expcted %#lo found %#lo" :
+                   "%spermissions (%#lo, %#lo",
                    tab, (u_long)s->st_mode,
                    (u_long)p->fts_statp->st_mode & MBITS);
                if (uflag) {
                        if (lchmod(p->fts_accpath, s->st_mode))
-                               printf(", not modified: %s)\n",
-                                   strerror(errno));
+                               printf(", not modified: %s%s\n",
+                                   strerror(errno),
+                                   flavor == F_FREEBSD9 ? "" : ")");
                        else
-                               printf(", modified)\n");
+                               printf(", modified%s\n",
+                                   flavor == F_FREEBSD9 ? "" : ")");
                }
                else
                        printf(")\n");
@@ -278,13 +298,16 @@ typeerr:          LABEL;
        if (s->flags & F_NLINK && s->type != F_DIR &&
            s->st_nlink != p->fts_statp->st_nlink) {
                LABEL;
-               printf("%slink count (%lu, %lu)\n",
+               printf(flavor == F_FREEBSD9 ?
+                   "%slink count expected %lu found %lu\n" :
+                   "%slink count (%lu, %lu)\n",
                    tab, (u_long)s->st_nlink, (u_long)p->fts_statp->st_nlink);
                tab = "\t";
        }
        if (s->flags & F_SIZE && s->st_size != p->fts_statp->st_size) {
                LABEL;
-               printf("%ssize (%ju, %ju)\n",
+               printf(flavor == F_FREEBSD9 ?
+                   "%ssize expected %ju found %ju\n" : "%ssize (%ju, %ju)\n",
                    tab, (uintmax_t)s->st_size,
                    (uintmax_t)p->fts_statp->st_size);
                tab = "\t";
@@ -319,18 +342,22 @@ typeerr:          LABEL;
                if (tv[0].tv_sec != tv[1].tv_sec ||
                    tv[0].tv_usec != tv[1].tv_usec) {
                        LABEL;
-                       printf("%smodification time (%.24s, ",
+                       printf(flavor == F_FREEBSD9 ?
+                           "%smodification time expected %.24s found " :
+                           "%smodification time (%.24s, ",
                            tab, ctime(&smtime));
                        printf("%.24s", ctime(&pmtime));
                        if (tflag) {
                                tv[1] = tv[0];
                                if (utimes(p->fts_accpath, tv))
-                                       printf(", not modified: %s)\n",
-                                           strerror(errno));
+                                       printf(", not modified: %s%s\n",
+                                           strerror(errno),
+                                           flavor == F_FREEBSD9 ? "" : ")");
                                else
-                                       printf(", modified)\n");
+                                       printf(", modified%s\n",
+                                           flavor == F_FREEBSD9 ? "" : ")");
                        } else
-                               printf(")\n");
+                               printf("%s\n", flavor == F_FREEBSD9 ? "" : ")");
                        tab = "\t";
                }
        }
@@ -347,7 +374,9 @@ typeerr:            LABEL;
                        char *f_s;
                        LABEL;
                        f_s = flags_to_string(s->st_flags, "none");
-                       printf("%sflags (\"%s\" is not ", tab, f_s);
+                       printf(flavor == F_FREEBSD9 ?
+                           "%sflags expected \"%s\" found " :
+                           "%sflags (\"%s\" is not ", tab, f_s);
                        free(f_s);
                        f_s = flags_to_string(p->fts_statp->st_flags, "none");
                        printf("\"%s\"", f_s);
@@ -361,7 +390,7 @@ typeerr:            LABEL;
                        else
                                SETFLAGS(0, (~SP_FLGS & CH_MASK));
                } else
-                       printf(")\n");
+                       printf("%s\n", flavor == F_FREEBSD9 ? "" : ")");
                tab = "\t";
        }
 #endif /* HAVE_STRUCT_STAT_ST_FLAGS */
@@ -387,7 +416,9 @@ typeerr:            LABEL;
                        close(fd);
                        if (s->cksum != val) {
                                LABEL;
-                               printf("%scksum (%lu, %lu)\n",
+                               printf(flavor == F_FREEBSD9 ?
+                                   "%scksum expected %lu found %lu\n" :
+                                   "%scksum (%lu, %lu)\n",
                                    tab, s->cksum, (unsigned long)val);
                        }
                        tab = "\t";
@@ -403,7 +434,9 @@ typeerr:            LABEL;
                } else {
                        if (strcmp(s->md5digest, digestbuf)) {
                                LABEL;
-                               printf("%s%s (0x%s, 0x%s)\n",
+                               printf(flavor == F_FREEBSD9 ?
+                                   "%s%s expected %s found %s\n" :
+                                   "%s%s (0x%s, 0x%s)\n",
                                    tab, MD5KEY, s->md5digest, digestbuf);
                        }
                        tab = "\t";
@@ -421,7 +454,9 @@ typeerr:            LABEL;
                } else {
                        if (strcmp(s->rmd160digest, digestbuf)) {
                                LABEL;
-                               printf("%s%s (0x%s, 0x%s)\n",
+                               printf(flavor == F_FREEBSD9 ?
+                                   "%s%s expected %s found %s\n" :
+                                   "%s%s (0x%s, 0x%s)\n",
                                    tab, RMD160KEY, s->rmd160digest, digestbuf);
                        }
                        tab = "\t";
@@ -439,7 +474,9 @@ typeerr:            LABEL;
                } else {
                        if (strcmp(s->sha1digest, digestbuf)) {
                                LABEL;
-                               printf("%s%s (0x%s, 0x%s)\n",
+                               printf(flavor == F_FREEBSD9 ? 
+                                   "%s%s expected %s found %s\n" :
+                                   "%s%s (0x%s, 0x%s)\n",
                                    tab, SHA1KEY, s->sha1digest, digestbuf);
                        }
                        tab = "\t";
@@ -457,7 +494,9 @@ typeerr:            LABEL;
                } else {
                        if (strcmp(s->sha256digest, digestbuf)) {
                                LABEL;
-                               printf("%s%s (0x%s, 0x%s)\n",
+                               printf(flavor == F_FREEBSD9 ? 
+                                   "%s%s expected %s found %s\n" :
+                                   "%s%s (0x%s, 0x%s)\n",
                                    tab, SHA256KEY, s->sha256digest, digestbuf);
                        }
                        tab = "\t";
@@ -474,7 +513,9 @@ typeerr:            LABEL;
                } else {
                        if (strcmp(s->sha384digest, digestbuf)) {
                                LABEL;
-                               printf("%s%s (0x%s, 0x%s)\n",
+                               printf(flavor == F_FREEBSD9 ? 
+                                   "%s%s expected %s found %s\n" :
+                                   "%s%s (0x%s, 0x%s)\n",
                                    tab, SHA384KEY, s->sha384digest, digestbuf);
                        }
                        tab = "\t";
@@ -491,7 +532,9 @@ typeerr:            LABEL;
                } else {
                        if (strcmp(s->sha512digest, digestbuf)) {
                                LABEL;
-                               printf("%s%s (0x%s, 0x%s)\n",
+                               printf(flavor == F_FREEBSD9 ? 
+                                   "%s%s expected %s found %s\n" :
+                                   "%s%s (0x%s, 0x%s)\n",
                                    tab, SHA512KEY, s->sha512digest, digestbuf);
                        }
                        tab = "\t";
@@ -502,16 +545,20 @@ typeerr:          LABEL;
        if (s->flags & F_SLINK &&
            strcmp(cp = rlink(p->fts_accpath), s->slink)) {
                LABEL;
-               printf("%slink ref (%s, %s", tab, cp, s->slink);
+               printf(flavor == F_FREEBSD9 ? 
+                   "%slink ref expected %s found %s" :
+                   "%slink ref (%s, %s", tab, cp, s->slink);
                if (uflag) {
                        if ((unlink(p->fts_accpath) == -1) ||
                            (symlink(s->slink, p->fts_accpath) == -1) )
-                               printf(", not modified: %s)\n",
-                                   strerror(errno));
+                               printf(", not modified: %s%s\n",
+                                   strerror(errno),
+                                   flavor == F_FREEBSD9 ? "" : ")");
                        else
-                               printf(", modified)\n");
+                               printf(", modified%s\n",
+                                   flavor == F_FREEBSD9 ? "" : ")");
                } else
-                       printf(")\n");
+                       printf("%s\n", flavor == F_FREEBSD9 ? "" : ")");
        }
        return (label);
 }

Attachment: pgp94R3TVaFcJ.pgp
Description: PGP signature



Home | Main Index | Thread Index | Old Index