summaryrefslogtreecommitdiffstats
path: root/usr.sbin/mtree/create.c
diff options
context:
space:
mode:
authorjoe <joe@FreeBSD.org>1999-12-09 20:38:36 +0000
committerjoe <joe@FreeBSD.org>1999-12-09 20:38:36 +0000
commit2d2f34a6b0d504ee514ce90ee4680797ca32254c (patch)
tree67ed32cdc7f451c6623d8ec3550f32874bffbf70 /usr.sbin/mtree/create.c
parentc6d289b2ad57b3e51ea70ee85c86808035d1e10f (diff)
downloadFreeBSD-src-2d2f34a6b0d504ee514ce90ee4680797ca32254c.zip
FreeBSD-src-2d2f34a6b0d504ee514ce90ee4680797ca32254c.tar.gz
Added support for file flags, mostly merged from the NetBSD version.
The way is now open to schg and sappnd key files and directories in our tree. There are recommendations in bin/15229. PR: bin/15229 Reviewed by: imp, brian
Diffstat (limited to 'usr.sbin/mtree/create.c')
-rw-r--r--usr.sbin/mtree/create.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/usr.sbin/mtree/create.c b/usr.sbin/mtree/create.c
index 6075099..72049f4 100644
--- a/usr.sbin/mtree/create.c
+++ b/usr.sbin/mtree/create.c
@@ -77,10 +77,12 @@ extern int lineno;
static gid_t gid;
static uid_t uid;
static mode_t mode;
+static u_long flags;
static int dsort __P((const FTSENT **, const FTSENT **));
static void output __P((int, int *, const char *, ...));
-static int statd __P((FTS *, FTSENT *, uid_t *, gid_t *, mode_t *));
+static int statd __P((FTS *, FTSENT *, uid_t *, gid_t *, mode_t *,
+ u_long *));
static void statf __P((int, FTSENT *));
void
@@ -111,7 +113,7 @@ cwalk()
(void)printf("\n");
if (!nflag)
(void)printf("# %s\n", p->fts_path);
- statd(t, p, &uid, &gid, &mode);
+ statd(t, p, &uid, &gid, &mode, &flags);
statf(indent, p);
break;
case FTS_DP:
@@ -250,31 +252,40 @@ statf(indent, p)
if (keys & F_SLINK &&
(p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE))
output(indent, &offset, "link=%s", rlink(p->fts_accpath));
+ if (keys & F_FLAGS && p->fts_statp->st_flags != flags)
+ output(indent, &offset, "flags=%s",
+ flags_to_string(p->fts_statp->st_flags, "none"));
(void)putchar('\n');
}
#define MAXGID 5000
#define MAXUID 5000
#define MAXMODE MBITS + 1
+#define MAXFLAGS 256
+#define MAXS 16
static int
-statd(t, parent, puid, pgid, pmode)
+statd(t, parent, puid, pgid, pmode, pflags)
FTS *t;
FTSENT *parent;
uid_t *puid;
gid_t *pgid;
mode_t *pmode;
+ u_long *pflags;
{
register FTSENT *p;
register gid_t sgid;
register uid_t suid;
register mode_t smode;
+ register u_long sflags;
struct group *gr;
struct passwd *pw;
gid_t savegid = *pgid;
uid_t saveuid = *puid;
mode_t savemode = *pmode;
- u_short maxgid, maxuid, maxmode, g[MAXGID], u[MAXUID], m[MAXMODE];
+ u_long saveflags = 0;
+ u_short maxgid, maxuid, maxmode, maxflags;
+ u_short g[MAXGID], u[MAXUID], m[MAXMODE], f[MAXFLAGS];
static int first = 1;
if ((p = fts_children(t, 0)) == NULL) {
@@ -286,8 +297,9 @@ statd(t, parent, puid, pgid, pmode)
bzero(g, sizeof(g));
bzero(u, sizeof(u));
bzero(m, sizeof(m));
+ bzero(f, sizeof(f));
- maxuid = maxgid = maxmode = 0;
+ maxuid = maxgid = maxmode = maxflags = 0;
for (; p; p = p->fts_link) {
if (!dflag || (dflag && S_ISDIR(p->fts_statp->st_mode))) {
smode = p->fts_statp->st_mode & MBITS;
@@ -305,6 +317,20 @@ statd(t, parent, puid, pgid, pmode)
saveuid = suid;
maxuid = u[suid];
}
+
+ /*
+ * XXX
+ * note that the below will break when file flags
+ * are extended beyond the first 4 bytes of each
+ * half word of the flags
+ */
+#define FLAGS2IDX(f) ((f & 0xf) | ((f >> 12) & 0xf0))
+ sflags = p->fts_statp->st_flags;
+ if (FLAGS2IDX(sflags) < MAXFLAGS &&
+ ++f[FLAGS2IDX(sflags)] > maxflags) {
+ saveflags = sflags;
+ maxflags = u[FLAGS2IDX(sflags)];
+ }
}
}
/*
@@ -344,10 +370,14 @@ statd(t, parent, puid, pgid, pmode)
(void)printf(" mode=%#o", savemode);
if (keys & F_NLINK)
(void)printf(" nlink=1");
+ if (keys & F_FLAGS && saveflags)
+ (void)printf(" flags=%s",
+ flags_to_string(saveflags, "none"));
(void)printf("\n");
*puid = saveuid;
*pgid = savegid;
*pmode = savemode;
+ *pflags = saveflags;
}
return (0);
}
OpenPOWER on IntegriCloud