This commit was manufactured by cvs2svn to create tag 'FreeBSD-release/1.0'.
[unix-history] / usr.sbin / mtree / compare.c
index 6de8e14..f33695a 100644 (file)
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)compare.c  5.7 (Berkeley) 5/25/90";
+static char sccsid[] = "@(#)compare.c  5.10 (Berkeley) 3/31/92";
 #endif /* not lint */
 
 #include <sys/param.h>
 #include <sys/stat.h>
 #endif /* not lint */
 
 #include <sys/param.h>
 #include <sys/stat.h>
+#include <fcntl.h>
 #include <fts.h>
 #include <errno.h>
 #include <stdio.h>
 #include <time.h>
 #include <fts.h>
 #include <errno.h>
 #include <stdio.h>
 #include <time.h>
+#include <unistd.h>
 #include "mtree.h"
 #include "mtree.h"
+#include "extern.h"
 
 
+extern int uflag;
+
+static char *ftype __P((u_int));
+
+#define        INDENTNAMELEN   8
 #define        LABEL \
 #define        LABEL \
-       if (!label++) \
-               (void)printf("%s: ", RP(p)); \
+       if (!label++) { \
+               len = printf("%s: ", RP(p)); \
+               if (len > INDENTNAMELEN) { \
+                       tab = "\t"; \
+                       (void)printf("\n"); \
+               } else { \
+                       tab = ""; \
+                       (void)printf("%*s", INDENTNAMELEN - len, ""); \
+               } \
+       }
 
 
+int
 compare(name, s, p)
        char *name;
        register NODE *s;
        register FTSENT *p;
 {
 compare(name, s, p)
        char *name;
        register NODE *s;
        register FTSENT *p;
 {
-       extern int exitval, uflag;
-       int label;
-       char *ftype(), *inotype(), *rlink();
+       extern int uflag;
+       u_long len, val;
+       int fd, label;
+       char *cp, *tab;
 
        label = 0;
        switch(s->type) {
        case F_BLOCK:
 
        label = 0;
        switch(s->type) {
        case F_BLOCK:
-               if (!S_ISBLK(p->fts_statb.st_mode))
+               if (!S_ISBLK(p->fts_statp->st_mode))
                        goto typeerr;
                break;
        case F_CHAR:
                        goto typeerr;
                break;
        case F_CHAR:
-               if (!S_ISCHR(p->fts_statb.st_mode))
+               if (!S_ISCHR(p->fts_statp->st_mode))
                        goto typeerr;
                break;
        case F_DIR:
                        goto typeerr;
                break;
        case F_DIR:
-               if (!S_ISDIR(p->fts_statb.st_mode))
+               if (!S_ISDIR(p->fts_statp->st_mode))
                        goto typeerr;
                break;
        case F_FIFO:
                        goto typeerr;
                break;
        case F_FIFO:
-               if (!S_ISFIFO(p->fts_statb.st_mode))
+               if (!S_ISFIFO(p->fts_statp->st_mode))
                        goto typeerr;
                break;
        case F_FILE:
                        goto typeerr;
                break;
        case F_FILE:
-               if (!S_ISREG(p->fts_statb.st_mode))
+               if (!S_ISREG(p->fts_statp->st_mode))
                        goto typeerr;
                break;
        case F_LINK:
                        goto typeerr;
                break;
        case F_LINK:
-               if (!S_ISLNK(p->fts_statb.st_mode))
+               if (!S_ISLNK(p->fts_statp->st_mode))
                        goto typeerr;
                break;
        case F_SOCK:
                        goto typeerr;
                break;
        case F_SOCK:
-               if (!S_ISFIFO(p->fts_statb.st_mode)) {
+               if (!S_ISSOCK(p->fts_statp->st_mode)) {
 typeerr:               LABEL;
 typeerr:               LABEL;
-                       (void)printf("\n\ttype (%s, %s)",
-                           ftype(s->type), inotype(p->fts_statb.st_mode));
+                       (void)printf("\ttype (%s, %s)\n",
+                           ftype(s->type), inotype(p->fts_statp->st_mode));
                }
                break;
        }
                }
                break;
        }
-       if (s->flags & F_MODE && s->st_mode != (p->fts_statb.st_mode & MBITS)) {
+       /* 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;
                LABEL;
-               (void)printf("\n\tpermissions (%#o, %#o%s",
-                   s->st_mode, p->fts_statb.st_mode & MBITS, uflag ? "" : ")");
+               (void)printf("%suser (%u, %u",
+                   tab, s->st_uid, p->fts_statp->st_uid);
                if (uflag)
                if (uflag)
-                       if (chmod(p->fts_accpath, s->st_mode))
-                               (void)printf(", not modified: %s)",
+                       if (chown(p->fts_accpath, s->st_uid, -1))
+                               (void)printf(", not modified: %s)\n",
                                    strerror(errno));
                        else
                                    strerror(errno));
                        else
-                               (void)printf(", modified)");
+                               (void)printf(", modified)\n");
+               else
+                       (void)printf(")\n");
+               tab = "\t";
        }
        }
-       if (s->flags & F_OWNER && s->st_uid != p->fts_statb.st_uid) {
+       if (s->flags & (F_GID | F_GNAME) && s->st_gid != p->fts_statp->st_gid) {
                LABEL;
                LABEL;
-               (void)printf("\n\towner (%u, %u%s",
-                   s->st_uid, p->fts_statb.st_uid, uflag ? "" : ")");
+               (void)printf("%sgid (%u, %u",
+                   tab, s->st_gid, p->fts_statp->st_gid);
                if (uflag)
                if (uflag)
-                       if (chown(p->fts_accpath, s->st_uid, -1))
+                       if (chown(p->fts_accpath, -1, s->st_gid))
                                (void)printf(", not modified: %s)",
                                    strerror(errno));
                        else
                                (void)printf(", modified)");
                                (void)printf(", not modified: %s)",
                                    strerror(errno));
                        else
                                (void)printf(", modified)");
+               else
+                       (void)printf(")\n");
+               tab = "\t";
        }
        }
-       if (s->flags & F_GROUP && s->st_gid != p->fts_statb.st_gid) {
+       if (s->flags & F_MODE &&
+           s->st_mode != (p->fts_statp->st_mode & MBITS)) {
                LABEL;
                LABEL;
-               (void)printf("\n\tgroup (%u, %u%s",
-                   s->st_gid, p->fts_statb.st_gid, uflag ? "" : ")");
+               (void)printf("%spermissions (%#o, %#o",
+                   tab, s->st_mode, p->fts_statp->st_mode & MBITS);
                if (uflag)
                if (uflag)
-                       if (chown(p->fts_accpath, -1, s->st_gid))
+                       if (chmod(p->fts_accpath, s->st_mode))
                                (void)printf(", not modified: %s)",
                                    strerror(errno));
                        else
                                (void)printf(", modified)");
                                (void)printf(", not modified: %s)",
                                    strerror(errno));
                        else
                                (void)printf(", modified)");
+               else
+                       (void)printf(")\n");
+               tab = "\t";
        }
        if (s->flags & F_NLINK && s->type != F_DIR &&
        }
        if (s->flags & F_NLINK && s->type != F_DIR &&
-           s->st_nlink != p->fts_statb.st_nlink) {
+           s->st_nlink != p->fts_statp->st_nlink) {
                LABEL;
                LABEL;
-               (void)printf("\n\tlink count (%u, %u)",
-                   s->st_nlink, p->fts_statb.st_nlink);
+               (void)printf("%slink count (%u, %u)\n",
+                   tab, s->st_nlink, p->fts_statp->st_nlink);
+               tab = "\t";
        }
        }
-       if (s->flags & F_SIZE && s->st_size != p->fts_statb.st_size) {
+       if (s->flags & F_SIZE && s->st_size != p->fts_statp->st_size) {
                LABEL;
                LABEL;
-               (void)printf("\n\tsize (%ld, %ld)",
-                   s->st_size, p->fts_statb.st_size);
+               (void)printf("%ssize (%ld, %ld)\n",
+                   tab, s->st_size, p->fts_statp->st_size);
+               tab = "\t";
        }
        }
-       if (s->flags & F_SLINK) {
-               char *cp;
-
-               if (strcmp(cp = rlink(name), s->slink)) {
+       if (s->flags & F_TIME && s->st_mtime != p->fts_statp->st_mtime) {
+               LABEL;
+               (void)printf("%smodification time (%.24s, ",
+                   tab, ctime(&s->st_mtime));
+               (void)printf("%.24s)\n", ctime(&p->fts_statp->st_mtime));
+               tab = "\t";
+       }
+       if (s->flags & F_CKSUM)
+               if ((fd = open(p->fts_accpath, O_RDONLY, 0)) < 0) {
                        LABEL;
                        LABEL;
-                       (void)printf("\n\tlink ref (%s, %s)", cp, s->slink);
+                       (void)printf("%scksum: %s: %s\n",
+                           tab, p->fts_accpath, strerror(errno));
+                       tab = "\t";
+               } else if (crc(fd, &val, &len)) {
+                       (void)close(fd);
+                       LABEL;
+                       (void)printf("%scksum: %s: %s\n",
+                           tab, p->fts_accpath, strerror(errno));
+                       tab = "\t";
+               } else {
+                       (void)close(fd);
+                       if (s->cksum != val) {
+                               LABEL;
+                               (void)printf("%scksum (%lu, %lu)\n", 
+                                   tab, s->cksum, val);
+                       }
+                       tab = "\t";
                }
                }
-       }
-       if (s->flags & F_TIME && s->st_mtime != p->fts_statb.st_mtime) {
+       if (s->flags & F_SLINK && strcmp(cp = rlink(name), s->slink)) {
                LABEL;
                LABEL;
-               (void)printf("\n\tmodification time (%.24s, ",
-                   ctime(&s->st_mtime));
-               (void)printf("%.24s)", ctime(&p->fts_statb.st_mtime));
-       }
-       if (label) {
-               exitval = 2;
-               putchar('\n');
+               (void)printf("%slink ref (%s, %s)\n", tab, cp, s->slink);
        }
        }
+       return (label);
 }
 
 char *
 inotype(type)
 }
 
 char *
 inotype(type)
-       mode_t type;
+       u_int type;
 {
        switch(type & S_IFMT) {
        case S_IFBLK:
 {
        switch(type & S_IFMT) {
        case S_IFBLK:
-               return("block");
+               return ("block");
        case S_IFCHR:
        case S_IFCHR:
-               return("char");
+               return ("char");
        case S_IFDIR:
        case S_IFDIR:
-               return("dir");
+               return ("dir");
+       case S_IFIFO:
+               return ("fifo");
        case S_IFREG:
        case S_IFREG:
-               return("file");
+               return ("file");
        case S_IFLNK:
        case S_IFLNK:
-               return("link");
+               return ("link");
        case S_IFSOCK:
        case S_IFSOCK:
-               return("socket");
+               return ("socket");
        default:
        default:
-               return("unknown");
+               return ("unknown");
        }
        /* NOTREACHED */
 }
 
        }
        /* NOTREACHED */
 }
 
-char *
+static char *
 ftype(type)
        u_int type;
 {
        switch(type) {
        case F_BLOCK:
 ftype(type)
        u_int type;
 {
        switch(type) {
        case F_BLOCK:
-               return("block");
+               return ("block");
        case F_CHAR:
        case F_CHAR:
-               return("char");
+               return ("char");
        case F_DIR:
        case F_DIR:
-               return("dir");
+               return ("dir");
        case F_FIFO:
        case F_FIFO:
-               return("fifo");
+               return ("fifo");
        case F_FILE:
        case F_FILE:
-               return("file");
+               return ("file");
        case F_LINK:
        case F_LINK:
-               return("link");
+               return ("link");
        case F_SOCK:
        case F_SOCK:
-               return("socket");
+               return ("socket");
        default:
        default:
-               return("unknown");
+               return ("unknown");
        }
        /* NOTREACHED */
 }
        }
        /* NOTREACHED */
 }
@@ -206,15 +254,11 @@ char *
 rlink(name)
        char *name;
 {
 rlink(name)
        char *name;
 {
-       register int len;
        static char lbuf[MAXPATHLEN];
        static char lbuf[MAXPATHLEN];
+       register int len;
 
 
-       len = readlink(name, lbuf, sizeof(lbuf));
-       if (len == -1) {
-               (void)fprintf(stderr, "mtree: %s: %s.\n",
-                   name, strerror(errno));
-               exit(1);
-       }
+       if ((len = readlink(name, lbuf, sizeof(lbuf))) == -1)
+               err("%s: %s", name, strerror(errno));
        lbuf[len] = '\0';
        lbuf[len] = '\0';
-       return(lbuf);
+       return (lbuf);
 }
 }