On Sun, 1 Aug 1999, Keith Stevenson wrote:
> the features that were requested. I honestly haven't figured out how to
> implement the display of selected fields yet. I realize that this isn't a
Attached is a diff that takes care of that. Basically, the user can
specify a format that looks like "%f\t%U\t%A" to get the files name, the
username of the owner, and the last access time seperated by tabs
followed by a new line. All of the supported format specifiers are
documented in the man page. I looked around for another version of stat
that does this but could not locate one; therefore the format specifiers
are what made sense to me. There is also limited support for C-style
escape sequences (no \nnn).
Have a nice day!
Jamie
diff -c stat/stat.1 stat-jph/stat.1
*** stat/stat.1 Sun Aug 1 23:18:48 1999
--- stat-jph/stat.1 Sun Aug 1 23:50:31 1999
***************
*** 42,71 ****
The options are as follows:
.Bl -tag -width Fl
.It Fl d
! dereference symlinks
.It Fl f
! read filenames to be stat-ed from file ( - means stdin)
.It Fl g
! show time elements in GMT time zone. (implies -s)
.It Fl h
! print usage summary
.It Fl i
! ignore errors
.It Fl l
! display one element per line
.It Fl s
! print mode, uid, gid, and times as strings
.It Fl t
! terse output
.It Fl o Ar opts
! output only selected elements of struct stat
.It Fl f Ar file
! read filenames to be stat-ed from file ( - means stdin)
.El
.Sh EXAMPLES
An example or two will go here
.Pp
.Sh SEE ALSO
.Xr stat 2
.Rs
.Sh AUTHORS
--- 42,107 ----
The options are as follows:
.Bl -tag -width Fl
.It Fl d
! Follow symbolic links.
.It Fl f
! Read filenames to be stat-ed from file ( - means stdin).
.It Fl g
! Show time elements in GMT time zone. (implies -s)
.It Fl h
! Print usage summary.
.It Fl i
! Ignore errors.
.It Fl l
! Display one element per line.
.It Fl s
! Print mode, uid, gid, and times as strings.
.It Fl t
! Terse output.
.It Fl o Ar opts
! Output only selected elements of struct stat. The following
! formatting tags are permitted:
! .Bl -tag -width Fl
! .It Ar %A
! last access time
! .It Ar %C
! file creation time
! .It Ar %G
! file group (group name)
! .It Ar %M
! last modify time
! .It Ar %P
! file permission mode (symbolic)
! .It Ar %U
! file owner (username)
! .It Ar %b
! blocks allocated for file
! .It Ar %d
! device file is on
! .It Ar %f
! file name
! .It Ar %g
! file group (gid)
! .It Ar %i
! inode
! .It Ar %l
! number of hard links to file
! .It Ar %p
! file permission mode (octal)
! .It Ar %s
! file size in blocks
! .It Ar %t
! type of file
! .It Ar %u
! file owner (uid)
! .El
.It Fl f Ar file
! Read filenames to be stat-ed from file ( - means stdin).
.El
.Sh EXAMPLES
An example or two will go here
.Pp
.Sh SEE ALSO
+ .Xr ls 1 ,
.Xr stat 2
.Rs
.Sh AUTHORS
***************
*** 73,76 ****
.Sh DIAGNOSTICS
Most errors are the result of bad filenames.
.Sh BUGS
! Some features (-f, -i, & -o) are currently unimplemented
--- 109,112 ----
.Sh DIAGNOSTICS
Most errors are the result of bad filenames.
.Sh BUGS
! Some features (-f and -i) are currently unimplemented
diff -c stat/stat.c stat-jph/stat.c
*** stat/stat.c Sun Aug 1 23:17:14 1999
--- stat-jph/stat.c Sun Aug 1 23:34:29 1999
***************
*** 57,62 ****
--- 57,65 ----
void terseprint(const char*, const char*, const char*, const char*,
struct stat*, struct group*, struct passwd*, struct tm*,
struct tm*, struct tm*, int);
+ void customprint(const char *, const char*, const char*, const char*,
+ const char*, struct stat*, struct group*, struct passwd*,
+ struct tm*, struct tm*, struct tm*, int);
int vstat(const char*, struct stat*, int);
***************
*** 78,85 ****
struct stat inode;
struct tm *atime, *mtime, *ctime;
! extern char *optarg;
! extern int optind;
/* flags */
--- 81,87 ----
struct stat inode;
struct tm *atime, *mtime, *ctime;
! char *oformat;
/* flags */
***************
*** 113,122 ****
f_listout = 1;
break;
case 'o':
- printf("Unimplemented.\n");
- exit(EX_OK);
f_customout = 1;
f_listout = 1;
break;
case 's':
f_stringout = 1;
--- 115,123 ----
f_listout = 1;
break;
case 'o':
f_customout = 1;
f_listout = 1;
+ oformat = optarg;
break;
case 's':
f_stringout = 1;
***************
*** 253,264 ****
strcat(fflags, " sunlnk");
/* Generate output */
! if ((!f_customout) && (!f_listout) && (!f_terseout)) {
prettyprint(argv[count], ftype, fmode, fflags,
&inode, gp, pw, atime, mtime, ctime);
}
! if (f_listout && (!f_terseout)) {
listprint(argv[count], ftype, fmode, fflags,
&inode, gp, pw, atime, mtime, ctime,
f_stringout);
}
--- 254,270 ----
strcat(fflags, " sunlnk");
/* Generate output */
! if ((!f_customout) && (!f_listout) && (!f_terseout) &&
(!f_customout)) {
prettyprint(argv[count], ftype, fmode, fflags,
&inode, gp, pw, atime, mtime, ctime);
}
! if (f_listout && (!f_terseout) && (!f_customout)) {
listprint(argv[count], ftype, fmode, fflags,
+ &inode, gp, pw, atime, mtime, ctime,
+ f_stringout);
+ }
+ if (f_customout && (!f_terseout)) {
+ customprint(oformat, argv[count], ftype, fmode, fflags,
&inode, gp, pw, atime, mtime, ctime,
f_stringout);
}
diff -c stat/util.c stat-jph/util.c
*** stat/util.c Sun Aug 1 23:18:11 1999
--- stat-jph/util.c Sun Aug 1 23:41:04 1999
***************
*** 205,210 ****
--- 205,326 ----
}
}
+ /* customprint: Print in a user specified format */
+ void
+ customprint(const char *fmt, const char *path, const char *ftype,
+ const char *fmode, const char *fflags, struct stat *inode,
+ struct group *gp, struct passwd *pw, struct tm *atime,
+ struct tm *mtime, struct tm *ctime, int f_stringout)
+ {
+ int i, l, newline;
+ char c;
+
+ newline = 1;
+ l = strlen(fmt);
+ for (i = 0; i < l; i++) {
+ c = fmt[i];
+ if (c == '%') {
+ i++;
+ c = fmt[i];
+ switch (c) {
+ case 'A':
+ printf("%s", asctime(atime));
+ break;
+ case 'C':
+ printf("%s\n", asctime(ctime));
+ break;
+ case 'M':
+ printf("%s", asctime(mtime));
+ break;
+ case 'G':
+ if (gp != NULL)
+ printf("%s", gp->gr_name);
+ break;
+ case 'P':
+ printf("%s", fmode);
+ break;
+ case 'U':
+ if (pw != NULL)
+ printf("%s", pw->pw_name);
+ break;
+ case 'b':
+ printf("%qd", inode->st_blocks);
+ break;
+ case 'd':
+ printf("%u", inode->st_dev);
+ break;
+ case 'f':
+ printf("%s", path);
+ break;
+ case 'g':
+ printf("%hu", inode->st_gid);
+ break;
+ case 'i':
+ printf("%u", inode->st_ino);
+ break;
+ case 'l':
+ printf("%hu", inode->st_nlink);
+ break;
+ case 'p':
+ printf("%.4o", inode->st_mode & 07777);
+ break;
+ case 's':
+ printf("%qu", inode->st_size);
+ break;
+ case 't':
+ printf("%s", ftype);
+ break;
+ case 'u':
+ printf("%hu", inode->st_uid);
+ break;
+ default:
+ printf("%c", c);
+ }
+ continue;
+ }
+
+ if (c == '\\') {
+ i++;
+ c = fmt[i];
+ switch (c) {
+ case 'a':
+ putchar('\a');
+ break;
+ case 'b':
+ putchar('\b');
+ break;
+ case 'c':
+ newline = 0;
+ break;
+ case 'f':
+ putchar('\f');
+ break;
+ case 'n':
+ putchar('\n');
+ break;
+ case 'r':
+ putchar('\r');
+ break;
+ case 't':
+ putchar('\t');
+ break;
+ case 'v':
+ putchar('\v');
+ break;
+ default:
+ putchar(c);
+ }
+ continue;
+ }
+ putchar(c);
+ }
+
+ if (newline)
+ putchar('\n');
+
+ return;
+ }
+
/* vstat: Do either a stat(2) or lstat(2) depending on the value of deref */
int
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message