|
|
1.1 root 1: /*-
2: * Copyright (c) 1989 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted provided
6: * that: (1) source distributions retain this entire copyright notice and
7: * comment, and (2) distributions including binaries display the following
8: * acknowledgement: ``This product includes software developed by the
9: * University of California, Berkeley and its contributors'' in the
10: * documentation or other materials provided with the distribution and in
11: * all advertising materials mentioning features or use of this software.
12: * Neither the name of the University nor the names of its contributors may
13: * be used to endorse or promote products derived from this software without
14: * specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)compare.c 5.7 (Berkeley) 5/25/90";
22: #endif /* not lint */
23:
24: #include <sys/param.h>
25: #include <sys/stat.h>
26: #include <fts.h>
27: #include <errno.h>
28: #include <stdio.h>
29: #include <time.h>
30: #include "mtree.h"
31:
32: #define LABEL \
33: if (!label++) \
34: (void)printf("%s: ", RP(p)); \
35:
36: compare(name, s, p)
37: char *name;
38: register NODE *s;
39: register FTSENT *p;
40: {
41: extern int exitval, uflag;
42: int label;
43: char *ftype(), *inotype(), *rlink();
44:
45: label = 0;
46: switch(s->type) {
47: case F_BLOCK:
48: if (!S_ISBLK(p->fts_statb.st_mode))
49: goto typeerr;
50: break;
51: case F_CHAR:
52: if (!S_ISCHR(p->fts_statb.st_mode))
53: goto typeerr;
54: break;
55: case F_DIR:
56: if (!S_ISDIR(p->fts_statb.st_mode))
57: goto typeerr;
58: break;
59: case F_FIFO:
60: if (!S_ISFIFO(p->fts_statb.st_mode))
61: goto typeerr;
62: break;
63: case F_FILE:
64: if (!S_ISREG(p->fts_statb.st_mode))
65: goto typeerr;
66: break;
67: case F_LINK:
68: if (!S_ISLNK(p->fts_statb.st_mode))
69: goto typeerr;
70: break;
71: case F_SOCK:
72: if (!S_ISFIFO(p->fts_statb.st_mode)) {
73: typeerr: LABEL;
74: (void)printf("\n\ttype (%s, %s)",
75: ftype(s->type), inotype(p->fts_statb.st_mode));
76: }
77: break;
78: }
79: if (s->flags & F_MODE && s->st_mode != (p->fts_statb.st_mode & MBITS)) {
80: LABEL;
81: (void)printf("\n\tpermissions (%#o, %#o%s",
82: s->st_mode, p->fts_statb.st_mode & MBITS, uflag ? "" : ")");
83: if (uflag)
84: if (chmod(p->fts_accpath, s->st_mode))
85: (void)printf(", not modified: %s)",
86: strerror(errno));
87: else
88: (void)printf(", modified)");
89: }
90: if (s->flags & F_OWNER && s->st_uid != p->fts_statb.st_uid) {
91: LABEL;
92: (void)printf("\n\towner (%u, %u%s",
93: s->st_uid, p->fts_statb.st_uid, uflag ? "" : ")");
94: if (uflag)
95: if (chown(p->fts_accpath, s->st_uid, -1))
96: (void)printf(", not modified: %s)",
97: strerror(errno));
98: else
99: (void)printf(", modified)");
100: }
101: if (s->flags & F_GROUP && s->st_gid != p->fts_statb.st_gid) {
102: LABEL;
103: (void)printf("\n\tgroup (%u, %u%s",
104: s->st_gid, p->fts_statb.st_gid, uflag ? "" : ")");
105: if (uflag)
106: if (chown(p->fts_accpath, -1, s->st_gid))
107: (void)printf(", not modified: %s)",
108: strerror(errno));
109: else
110: (void)printf(", modified)");
111: }
112: if (s->flags & F_NLINK && s->type != F_DIR &&
113: s->st_nlink != p->fts_statb.st_nlink) {
114: LABEL;
115: (void)printf("\n\tlink count (%u, %u)",
116: s->st_nlink, p->fts_statb.st_nlink);
117: }
118: if (s->flags & F_SIZE && s->st_size != p->fts_statb.st_size) {
119: LABEL;
120: (void)printf("\n\tsize (%ld, %ld)",
121: s->st_size, p->fts_statb.st_size);
122: }
123: if (s->flags & F_SLINK) {
124: char *cp;
125:
126: if (strcmp(cp = rlink(name), s->slink)) {
127: LABEL;
128: (void)printf("\n\tlink ref (%s, %s)", cp, s->slink);
129: }
130: }
131: if (s->flags & F_TIME && s->st_mtime != p->fts_statb.st_mtime) {
132: LABEL;
133: (void)printf("\n\tmodification time (%.24s, ",
134: ctime(&s->st_mtime));
135: (void)printf("%.24s)", ctime(&p->fts_statb.st_mtime));
136: }
137: if (label) {
138: exitval = 2;
139: putchar('\n');
140: }
141: }
142:
143: char *
144: inotype(type)
145: mode_t type;
146: {
147: switch(type & S_IFMT) {
148: case S_IFBLK:
149: return("block");
150: case S_IFCHR:
151: return("char");
152: case S_IFDIR:
153: return("dir");
154: case S_IFREG:
155: return("file");
156: case S_IFLNK:
157: return("link");
158: case S_IFSOCK:
159: return("socket");
160: default:
161: return("unknown");
162: }
163: /* NOTREACHED */
164: }
165:
166: char *
167: ftype(type)
168: u_int type;
169: {
170: switch(type) {
171: case F_BLOCK:
172: return("block");
173: case F_CHAR:
174: return("char");
175: case F_DIR:
176: return("dir");
177: case F_FIFO:
178: return("fifo");
179: case F_FILE:
180: return("file");
181: case F_LINK:
182: return("link");
183: case F_SOCK:
184: return("socket");
185: default:
186: return("unknown");
187: }
188: /* NOTREACHED */
189: }
190:
191: char *
192: rlink(name)
193: char *name;
194: {
195: register int len;
196: static char lbuf[MAXPATHLEN];
197:
198: len = readlink(name, lbuf, sizeof(lbuf));
199: if (len == -1) {
200: (void)fprintf(stderr, "mtree: %s: %s.\n",
201: name, strerror(errno));
202: exit(1);
203: }
204: lbuf[len] = '\0';
205: return(lbuf);
206: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.