summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2010-05-01 14:36:04 +0000
committerjilles <jilles@FreeBSD.org>2010-05-01 14:36:04 +0000
commit8f3ade4bcf4c8c83f6e2d4e19a405f50bc15289b (patch)
treed4b5ab79880d83107ae9d1b4b38de17fe052ef4c /usr.bin
parentf8b7614cce5b27ad2b4723ef0773a1639e2de7b2 (diff)
downloadFreeBSD-src-8f3ade4bcf4c8c83f6e2d4e19a405f50bc15289b.zip
FreeBSD-src-8f3ade4bcf4c8c83f6e2d4e19a405f50bc15289b.tar.gz
MFC r207153: stat: Allow -f %Sf to display the file flags symbolically.
PR: 124349
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/stat/stat.17
-rw-r--r--usr.bin/stat/stat.c29
2 files changed, 33 insertions, 3 deletions
diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1
index b629341..868f9e9 100644
--- a/usr.bin/stat/stat.1
+++ b/usr.bin/stat/stat.1
@@ -36,7 +36,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 27, 2007
+.Dd April 24, 2010
.Dt STAT 1
.Os
.Sh NAME
@@ -239,6 +239,11 @@ Display date in
format.
.It Cm dr
Display actual device name.
+.It Cm f
+Display the flags of
+.Ar file
+as in
+.Nm ls Fl lTdo .
.It Cm gu
Display group or user name.
.It Cm p
diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c
index 0b32f11..5d75d7c 100644
--- a/usr.bin/stat/stat.c
+++ b/usr.bin/stat/stat.c
@@ -189,6 +189,9 @@ int format1(const struct stat *, /* stat info */
char *, size_t, /* a place to put the output */
int, int, int, int, /* the parsed format */
int, int);
+#if HAVE_STRUCT_STAT_ST_FLAGS
+char *xfflagstostr(unsigned long);
+#endif
char *timefmt;
int linkfail;
@@ -340,6 +343,25 @@ main(int argc, char *argv[])
return (am_readlink ? linkfail : errs);
}
+#if HAVE_STRUCT_STAT_ST_FLAGS
+/*
+ * fflagstostr() wrapper that leaks only once
+ */
+char *
+xfflagstostr(unsigned long fflags)
+{
+ static char *str = NULL;
+
+ if (str != NULL)
+ free(str);
+
+ str = fflagstostr(fflags);
+ if (str == NULL)
+ err(1, "fflagstostr");
+ return (str);
+}
+#endif /* HAVE_STRUCT_STAT_ST_FLAGS */
+
void
usage(const char *synopsis)
{
@@ -732,8 +754,11 @@ format1(const struct stat *st,
case SHOW_st_flags:
small = (sizeof(st->st_flags) == 4);
data = st->st_flags;
- sdata = NULL;
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX;
+ sdata = xfflagstostr(st->st_flags);
+ if (*sdata == '\0')
+ sdata = "-";
+ formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX |
+ FMTF_STRING;
if (ofmt == 0)
ofmt = FMTF_UNSIGNED;
break;
OpenPOWER on IntegriCloud