stat: Allow -f %Sf to display the file flags symbolically.

I have changed the patch slightly to show '-' if there are no flags just
like ls -ldo does.

PR:		124349
Submitted by:	Ighighi
MFC after:	1 week
This commit is contained in:
Jilles Tjoelker 2010-04-24 13:53:12 +00:00
parent ed7806879b
commit 24d9be57ae
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=207153
2 changed files with 33 additions and 3 deletions

View File

@ -29,7 +29,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd April 27, 2007
.Dd April 24, 2010
.Dt STAT 1
.Os
.Sh NAME
@ -232,6 +232,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

View File

@ -182,6 +182,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;
@ -333,6 +336,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)
{
@ -725,8 +747,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;