Deleted Added
full compact
create.c (51705) create.c (54375)
1/*-
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 22 unchanged lines hidden (view full) ---

31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35#if 0
36static char sccsid[] = "@(#)create.c 8.1 (Berkeley) 6/6/93";
37#endif
38static const char rcsid[] =
1/*-
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 22 unchanged lines hidden (view full) ---

31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35#if 0
36static char sccsid[] = "@(#)create.c 8.1 (Berkeley) 6/6/93";
37#endif
38static const char rcsid[] =
39 "$FreeBSD: head/usr.sbin/mtree/create.c 51705 1999-09-27 00:36:03Z billf $";
39 "$FreeBSD: head/usr.sbin/mtree/create.c 54375 1999-12-09 20:38:36Z joe $";
40#endif /* not lint */
41
42#include <sys/param.h>
43#include <sys/stat.h>
44#include <dirent.h>
45#include <err.h>
46#include <errno.h>
47#include <fcntl.h>

--- 24 unchanged lines hidden (view full) ---

72extern int dflag, iflag, nflag, sflag;
73extern u_int keys;
74extern char fullpath[MAXPATHLEN];
75extern int lineno;
76
77static gid_t gid;
78static uid_t uid;
79static mode_t mode;
40#endif /* not lint */
41
42#include <sys/param.h>
43#include <sys/stat.h>
44#include <dirent.h>
45#include <err.h>
46#include <errno.h>
47#include <fcntl.h>

--- 24 unchanged lines hidden (view full) ---

72extern int dflag, iflag, nflag, sflag;
73extern u_int keys;
74extern char fullpath[MAXPATHLEN];
75extern int lineno;
76
77static gid_t gid;
78static uid_t uid;
79static mode_t mode;
80static u_long flags;
80
81static int dsort __P((const FTSENT **, const FTSENT **));
82static void output __P((int, int *, const char *, ...));
81
82static int dsort __P((const FTSENT **, const FTSENT **));
83static void output __P((int, int *, const char *, ...));
83static int statd __P((FTS *, FTSENT *, uid_t *, gid_t *, mode_t *));
84static int statd __P((FTS *, FTSENT *, uid_t *, gid_t *, mode_t *,
85 u_long *));
84static void statf __P((int, FTSENT *));
85
86void
87cwalk()
88{
89 register FTS *t;
90 register FTSENT *p;
91 time_t clock;

--- 14 unchanged lines hidden (view full) ---

106 if (iflag)
107 indent = p->fts_level * 4;
108 switch(p->fts_info) {
109 case FTS_D:
110 if (!dflag)
111 (void)printf("\n");
112 if (!nflag)
113 (void)printf("# %s\n", p->fts_path);
86static void statf __P((int, FTSENT *));
87
88void
89cwalk()
90{
91 register FTS *t;
92 register FTSENT *p;
93 time_t clock;

--- 14 unchanged lines hidden (view full) ---

108 if (iflag)
109 indent = p->fts_level * 4;
110 switch(p->fts_info) {
111 case FTS_D:
112 if (!dflag)
113 (void)printf("\n");
114 if (!nflag)
115 (void)printf("# %s\n", p->fts_path);
114 statd(t, p, &uid, &gid, &mode);
116 statd(t, p, &uid, &gid, &mode, &flags);
115 statf(indent, p);
116 break;
117 case FTS_DP:
118 if (!nflag && (p->fts_level > 0))
119 (void)printf("%*s# %s\n", indent, "", p->fts_path);
120 (void)printf("%*s..\n", indent, "");
121 if (!dflag)
122 (void)printf("\n");

--- 122 unchanged lines hidden (view full) ---

245 } else {
246 output(indent, &offset, "ripemd160digest=%s", digest);
247 }
248 }
249#endif /* RMD160 */
250 if (keys & F_SLINK &&
251 (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE))
252 output(indent, &offset, "link=%s", rlink(p->fts_accpath));
117 statf(indent, p);
118 break;
119 case FTS_DP:
120 if (!nflag && (p->fts_level > 0))
121 (void)printf("%*s# %s\n", indent, "", p->fts_path);
122 (void)printf("%*s..\n", indent, "");
123 if (!dflag)
124 (void)printf("\n");

--- 122 unchanged lines hidden (view full) ---

247 } else {
248 output(indent, &offset, "ripemd160digest=%s", digest);
249 }
250 }
251#endif /* RMD160 */
252 if (keys & F_SLINK &&
253 (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE))
254 output(indent, &offset, "link=%s", rlink(p->fts_accpath));
255 if (keys & F_FLAGS && p->fts_statp->st_flags != flags)
256 output(indent, &offset, "flags=%s",
257 flags_to_string(p->fts_statp->st_flags, "none"));
253 (void)putchar('\n');
254}
255
256#define MAXGID 5000
257#define MAXUID 5000
258#define MAXMODE MBITS + 1
258 (void)putchar('\n');
259}
260
261#define MAXGID 5000
262#define MAXUID 5000
263#define MAXMODE MBITS + 1
264#define MAXFLAGS 256
265#define MAXS 16
259
260static int
266
267static int
261statd(t, parent, puid, pgid, pmode)
268statd(t, parent, puid, pgid, pmode, pflags)
262 FTS *t;
263 FTSENT *parent;
264 uid_t *puid;
265 gid_t *pgid;
266 mode_t *pmode;
269 FTS *t;
270 FTSENT *parent;
271 uid_t *puid;
272 gid_t *pgid;
273 mode_t *pmode;
274 u_long *pflags;
267{
268 register FTSENT *p;
269 register gid_t sgid;
270 register uid_t suid;
271 register mode_t smode;
275{
276 register FTSENT *p;
277 register gid_t sgid;
278 register uid_t suid;
279 register mode_t smode;
280 register u_long sflags;
272 struct group *gr;
273 struct passwd *pw;
274 gid_t savegid = *pgid;
275 uid_t saveuid = *puid;
276 mode_t savemode = *pmode;
281 struct group *gr;
282 struct passwd *pw;
283 gid_t savegid = *pgid;
284 uid_t saveuid = *puid;
285 mode_t savemode = *pmode;
277 u_short maxgid, maxuid, maxmode, g[MAXGID], u[MAXUID], m[MAXMODE];
286 u_long saveflags = 0;
287 u_short maxgid, maxuid, maxmode, maxflags;
288 u_short g[MAXGID], u[MAXUID], m[MAXMODE], f[MAXFLAGS];
278 static int first = 1;
279
280 if ((p = fts_children(t, 0)) == NULL) {
281 if (errno)
282 err(1, "line %d: %s", lineno, RP(parent));
283 return (1);
284 }
285
286 bzero(g, sizeof(g));
287 bzero(u, sizeof(u));
288 bzero(m, sizeof(m));
289 static int first = 1;
290
291 if ((p = fts_children(t, 0)) == NULL) {
292 if (errno)
293 err(1, "line %d: %s", lineno, RP(parent));
294 return (1);
295 }
296
297 bzero(g, sizeof(g));
298 bzero(u, sizeof(u));
299 bzero(m, sizeof(m));
300 bzero(f, sizeof(f));
289
301
290 maxuid = maxgid = maxmode = 0;
302 maxuid = maxgid = maxmode = maxflags = 0;
291 for (; p; p = p->fts_link) {
292 if (!dflag || (dflag && S_ISDIR(p->fts_statp->st_mode))) {
293 smode = p->fts_statp->st_mode & MBITS;
294 if (smode < MAXMODE && ++m[smode] > maxmode) {
295 savemode = smode;
296 maxmode = m[smode];
297 }
298 sgid = p->fts_statp->st_gid;
299 if (sgid < MAXGID && ++g[sgid] > maxgid) {
300 savegid = sgid;
301 maxgid = g[sgid];
302 }
303 suid = p->fts_statp->st_uid;
304 if (suid < MAXUID && ++u[suid] > maxuid) {
305 saveuid = suid;
306 maxuid = u[suid];
307 }
303 for (; p; p = p->fts_link) {
304 if (!dflag || (dflag && S_ISDIR(p->fts_statp->st_mode))) {
305 smode = p->fts_statp->st_mode & MBITS;
306 if (smode < MAXMODE && ++m[smode] > maxmode) {
307 savemode = smode;
308 maxmode = m[smode];
309 }
310 sgid = p->fts_statp->st_gid;
311 if (sgid < MAXGID && ++g[sgid] > maxgid) {
312 savegid = sgid;
313 maxgid = g[sgid];
314 }
315 suid = p->fts_statp->st_uid;
316 if (suid < MAXUID && ++u[suid] > maxuid) {
317 saveuid = suid;
318 maxuid = u[suid];
319 }
320
321 /*
322 * XXX
323 * note that the below will break when file flags
324 * are extended beyond the first 4 bytes of each
325 * half word of the flags
326 */
327#define FLAGS2IDX(f) ((f & 0xf) | ((f >> 12) & 0xf0))
328 sflags = p->fts_statp->st_flags;
329 if (FLAGS2IDX(sflags) < MAXFLAGS &&
330 ++f[FLAGS2IDX(sflags)] > maxflags) {
331 saveflags = sflags;
332 maxflags = u[FLAGS2IDX(sflags)];
333 }
308 }
309 }
310 /*
311 * If the /set record is the same as the last one we do not need to output
312 * a new one. So first we check to see if anything changed. Note that we
313 * always output a /set record for the first directory.
314 */
315 if ((((keys & F_UNAME) | (keys & F_UID)) && (*puid != saveuid)) ||

--- 23 unchanged lines hidden (view full) ---

339 lineno, savegid);
340 }
341 if (keys & F_GID)
342 (void)printf(" gid=%lu", (u_long)savegid);
343 if (keys & F_MODE)
344 (void)printf(" mode=%#o", savemode);
345 if (keys & F_NLINK)
346 (void)printf(" nlink=1");
334 }
335 }
336 /*
337 * If the /set record is the same as the last one we do not need to output
338 * a new one. So first we check to see if anything changed. Note that we
339 * always output a /set record for the first directory.
340 */
341 if ((((keys & F_UNAME) | (keys & F_UID)) && (*puid != saveuid)) ||

--- 23 unchanged lines hidden (view full) ---

365 lineno, savegid);
366 }
367 if (keys & F_GID)
368 (void)printf(" gid=%lu", (u_long)savegid);
369 if (keys & F_MODE)
370 (void)printf(" mode=%#o", savemode);
371 if (keys & F_NLINK)
372 (void)printf(" nlink=1");
373 if (keys & F_FLAGS && saveflags)
374 (void)printf(" flags=%s",
375 flags_to_string(saveflags, "none"));
347 (void)printf("\n");
348 *puid = saveuid;
349 *pgid = savegid;
350 *pmode = savemode;
376 (void)printf("\n");
377 *puid = saveuid;
378 *pgid = savegid;
379 *pmode = savemode;
380 *pflags = saveflags;
351 }
352 return (0);
353}
354
355static int
356dsort(a, b)
357 const FTSENT **a, **b;
358{

--- 41 unchanged lines hidden ---
381 }
382 return (0);
383}
384
385static int
386dsort(a, b)
387 const FTSENT **a, **b;
388{

--- 41 unchanged lines hidden ---