ls(1): Add -_ option to include nanotime in ls -l.
authorzrj <rimvydas.jasinskas@gmail.com>
Tue, 26 Dec 2017 09:23:49 +0000 (11:23 +0200)
committerzrj <zrj@dragonflybsd.org>
Tue, 26 Dec 2017 11:49:11 +0000 (13:49 +0200)
Very useful when debugging Makefile races in rules with
vfs.timestamp_precision=1 set.
Yes, ls -l_ seems strage, but we are running out of letters and
FreeBSD already has the "-," flag in their ls(1).

bin/ls/ls.1
bin/ls/ls.c
bin/ls/ls.h
bin/ls/print.c
bin/ls/util.c

index 121caa1..eef0cac 100644 (file)
@@ -39,7 +39,7 @@
 .Nd list directory contents
 .Sh SYNOPSIS
 .Nm
-.Op Fl 1ABCFGHILPRSTWabcdfghiklmnopqrstuwxy
+.Op Fl 1ABCFGHILPRSTW_abcdfghiklmnopqrstuwxy
 .Op Fl D Ar format
 .Op Ar
 .Sh DESCRIPTION
@@ -291,6 +291,10 @@ Force output to be
 one entry per line.
 This is the default when
 output is not to a terminal.
+.It Fl _
+(underscore) When printing in the long
+.Pq Fl l
+format, use GMT based date and time output with nanotime timestamp.
 .El
 .Pp
 The
@@ -668,6 +672,8 @@ utility conforms to
 .St -p1003.1-2001 .
 The options
 .Fl B , D , G , I , T , W , b , h , w , y
+and
+.Fl _
 are compatible extensions not defined in
 .St -p1003.1-2001 .
 .Sh HISTORY
index 1f8ebce..f4d79fd 100644 (file)
@@ -101,6 +101,7 @@ static int f_kblocks;               /* print size in kilobytes */
 static int f_listdir;          /* list actual directory, not contents */
 static int f_listdot;          /* list files beginning with . */
        int f_longform;         /* long listing format */
+       int f_nanotime;         /* include nanotime in long format */
        int f_nonprint;         /* show unprintables as ? */
 static int f_nosort;           /* don't sort output */
        int f_notabs;           /* don't use tab-separated multi-col output */
@@ -140,6 +141,7 @@ main(int argc, char *argv[])
        struct winsize win;
        int ch, fts_options, notused;
        char *p;
+       const char nanotime_format[] = "%Y-%m-%d %H:%M:%S";
 #ifdef COLORLS
        char termcapbuf[1024];  /* termcap definition buffer */
        char tcapbuf[512];      /* capability buffer */
@@ -173,7 +175,7 @@ main(int argc, char *argv[])
 
        fts_options = FTS_PHYSICAL;
        while ((ch = getopt(argc, argv,
-           "1ABCD:FGHILPRSTWabcdfghiklmnopqrstuwxy")) != -1) {
+           "1ABCD:FGHILPRSTW_abcdfghiklmnopqrstuwxy")) != -1) {
                switch (ch) {
                /*
                 * The -1, -C, -x and -l options all override each other so
@@ -322,6 +324,10 @@ main(int argc, char *argv[])
                        f_octal = 0;
                        f_octal_escape = 0;
                        break;
+               case '_':
+                       f_nanotime = 1;
+                       f_timeformat = nanotime_format;
+                       break;
                default:
                case '?':
                        usage();
index 7809edf..279d950 100644 (file)
@@ -45,6 +45,7 @@ extern int f_inode;           /* print inode */
 extern int f_longform;         /* long listing format */
 extern int f_octal;            /* print unprintables in octal */
 extern int f_octal_escape;     /* like f_octal but use C escapes if possible */
+extern int f_nanotime;         /* include nanotime in long format */
 extern int f_nonprint;         /* show unprintables as ? */
 extern int f_sectime;          /* print the real time for all files */
 extern int f_size;             /* list size in short listing */
index 8b8ee2f..6068937 100644 (file)
@@ -58,7 +58,7 @@
 
 static int     printaname(const FTSENT *, u_long, u_long);
 static void    printlink(const FTSENT *);
-static void    printtime(time_t);
+static void    printtime(const struct timespec);
 static int     printtype(u_int);
 static void    printsize(size_t, off_t);
 #ifdef COLORLS
@@ -166,11 +166,11 @@ printlong(const DISPLAY *dp)
                else
                        printsize(dp->s_size, sp->st_size);
                if (f_accesstime)
-                       printtime(sp->st_atime);
+                       printtime(sp->st_atim);
                else if (f_statustime)
-                       printtime(sp->st_ctime);
+                       printtime(sp->st_ctim);
                else
-                       printtime(sp->st_mtime);
+                       printtime(sp->st_mtim);
                putchar(' ');
 #ifdef COLORLS
                if (f_color)
@@ -346,10 +346,11 @@ printaname(const FTSENT *p, u_long inodefield, u_long sizefield)
 }
 
 static void
-printtime(time_t ftime)
+printtime(const struct timespec stt)
 {
        char longstring[80];
        static time_t now;
+       const struct tm *ptime;
        const char *format;
        static char *lc_time;
        static int posix_time;
@@ -384,7 +385,7 @@ printtime(time_t ftime)
                 *        If file was modified within the past 6 months,
                 *        return equivalent of: date "+%b %e %H:%M"
                 */
-               if ((ftime > now) || (ftime < now - SIXMONTHS))
+               if ((stt.tv_sec > now) || (stt.tv_sec < now - SIXMONTHS))
                        format = "%b %e  %Y";
                else
                        format = "%b %e %R";
@@ -396,9 +397,18 @@ printtime(time_t ftime)
                format = "%d-%b-%Y %H:%M";
        }
 
-       strftime_l(longstring, sizeof(longstring), format, localtime(&ftime),
-            NULL);
+       /*
+        * If printing the nanotime field, always use GMT time
+        */
+       if (f_nanotime)
+               ptime = gmtime(&(stt.tv_sec));
+       else
+               ptime = localtime(&(stt.tv_sec));
+
+       strftime_l(longstring, sizeof(longstring), format, ptime, NULL);
        fputs(longstring, stdout);
+       if (f_nanotime)
+               printf(".%09ju", stt.tv_nsec);
 }
 
 static int
index 1bc8a4e..ff788aa 100644 (file)
@@ -217,9 +217,9 @@ usage(void)
 {
        fprintf(stderr,
 #ifdef COLORLS
-       "usage: ls [-1ABCFGHILPRSTWabcdfghiklmnopqrstuwxy] [-D format]"
+       "usage: ls [-1ABCFGHILPRSTW_abcdfghiklmnopqrstuwxy] [-D format]"
 #else
-       "usage: ls [-1ABCFHILPRSTWabcdfghiklmnopqrstuwxy] [-D format]"
+       "usage: ls [-1ABCFHILPRSTW_abcdfghiklmnopqrstuwxy] [-D format]"
 #endif
                      " [file ...]\n");
        exit(1);