bin/124349: [patch]: stat(1) should interpret st_flags as it does
with st_mode
Ighighi
ighighi at gmail.com
Fri Jun 6 12:00:12 UTC 2008
>Number: 124349
>Category: bin
>Synopsis: [patch]: stat(1) should interpret st_flags as it does with st_mode
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Jun 06 12:00:11 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Ighighi
>Release: 6.3-STABLE (RELENG_6)
>Organization:
>Environment:
FreeBSD orion 6.3-STABLE FreeBSD 6.3-STABLE #0: Wed May 28 17:18:08 VET 2008
>Description:
Currently, the only output for st_flags in stat(1) is numeric.
I suggest adding support for string output as it's done with
st_mode, st_uid, st_gid, etc, so instead of just:
$ /usr/bin/stat -f '%f %N' /usr/bin/su
131072 /usr/bin/su
we may also see (without the need to use "ls -ldo"):
$ ./stat -f '%Sf %N' /usr/bin/su
schg /usr/bin/su
Quoting stat(1):
The special output specifier S may be used to indicate that the
output, if applicable, should be in string format. May be used
in combination with:
[...]
gu Display group or user name.
p Display the mode of file as in ls -lTd.
I also patched the manpage to add this line:
f Display the flags of file as in ls -lTdo.
>How-To-Repeat:
>Fix:
Available patch built and tested on 6.3-STABLE and -CURRENT
Patch attached with submission follows:
--- src/usr.bin/stat/stat.1.orig 2007-04-27 14:23:32.000000000 -0400
+++ src/usr.bin/stat/stat.1 2008-06-06 07:02:14.415211295 -0430
@@ -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
--- src/usr.bin/stat/stat.c.orig 2003-10-05 21:55:17.000000000 -0400
+++ src/usr.bin/stat/stat.c 2008-06-06 07:07:07.202401287 -0430
@@ -187,6 +187,7 @@ int format1(const struct stat *, /* stat
char *, size_t, /* a place to put the output */
int, int, int, int, /* the parsed format */
int, int);
+char *xfflagstostr(unsigned long);
char *timefmt;
int linkfail;
@@ -329,6 +330,21 @@ main(int argc, char *argv[])
return (am_readlink ? linkfail : errs);
}
+/*
+ * fflagstostr() wrapper that leaks only once
+ */
+char *
+xfflagstostr(unsigned long fflags)
+{
+ static char *str = NULL;
+
+ if (str != NULL)
+ free(str);
+
+ str = fflagstostr(fflags);
+ return (str);
+}
+
void
usage(const char *synopsis)
{
@@ -721,8 +737,9 @@ 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);
+ formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX |
+ FMTF_STRING;
if (ofmt == 0)
ofmt = FMTF_UNSIGNED;
break;
@@ -979,7 +996,7 @@ format1(const struct stat *st,
(void)strcat(lfmt, "ll");
switch (ofmt) {
case FMTF_DECIMAL: (void)strcat(lfmt, "d"); break;
- case FMTF_OCTAL: (void)strcat(lfmt, "o"); break;
+ case FMTF_OCTAL: (void)strcat(lfmt, "o"); break;
case FMTF_UNSIGNED: (void)strcat(lfmt, "u"); break;
case FMTF_HEX: (void)strcat(lfmt, "x"); break;
}
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list