Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/lastlogin Size output columns dynamically by defaul...



details:   https://anonhg.NetBSD.org/src/rev/26ebce6bd9e1
branches:  trunk
changeset: 1009876:26ebce6bd9e1
user:      kim <kim%NetBSD.org@localhost>
date:      Wed May 06 11:58:33 2020 +0000

description:
Size output columns dynamically by default to fit contents.

diffstat:

 usr.sbin/lastlogin/lastlogin.8 |    8 +-
 usr.sbin/lastlogin/lastlogin.c |  190 ++++++++++++++++++++++++++++------------
 2 files changed, 137 insertions(+), 61 deletions(-)

diffs (truncated from 352 to 300 lines):

diff -r 3dfc88932a07 -r 26ebce6bd9e1 usr.sbin/lastlogin/lastlogin.8
--- a/usr.sbin/lastlogin/lastlogin.8    Wed May 06 09:18:10 2020 +0000
+++ b/usr.sbin/lastlogin/lastlogin.8    Wed May 06 11:58:33 2020 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: lastlogin.8,v 1.12 2009/04/08 14:20:38 joerg Exp $
+.\"    $NetBSD: lastlogin.8,v 1.13 2020/05/06 11:58:33 kim Exp $
 .\"
 .\" Copyright (c) 1996 John M. Vinopal
 .\" All rights reserved.
@@ -30,7 +30,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd March 4, 2005
+.Dd May 6, 2020
 .Dt LASTLOGIN 8
 .Os
 .Sh NAME
@@ -38,7 +38,7 @@
 .Nd indicate last login time of users
 .Sh SYNOPSIS
 .Nm
-.Op Fl nrt
+.Op Fl Fnrt
 .Op Fl f Ar filename
 .Op Fl H Ar hostsize
 .Op Fl L Ar linesize
@@ -66,6 +66,8 @@
 .Pp
 The following options are available:
 .Bl -tag -width indent
+.It Fl F
+Use fixed widths for all output fields.
 .It Fl f Ar filename
 Process input from
 .Ar filename .
diff -r 3dfc88932a07 -r 26ebce6bd9e1 usr.sbin/lastlogin/lastlogin.c
--- a/usr.sbin/lastlogin/lastlogin.c    Wed May 06 09:18:10 2020 +0000
+++ b/usr.sbin/lastlogin/lastlogin.c    Wed May 06 11:58:33 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lastlogin.c,v 1.15 2011/08/31 13:31:29 joerg Exp $     */
+/*     $NetBSD: lastlogin.c,v 1.16 2020/05/06 11:58:33 kim Exp $       */
 /*
  * Copyright (c) 1996 John M. Vinopal
  * All rights reserved.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: lastlogin.c,v 1.15 2011/08/31 13:31:29 joerg Exp $");
+__RCSID("$NetBSD: lastlogin.c,v 1.16 2020/05/06 11:58:33 kim Exp $");
 #endif
 
 #include <sys/types.h>
@@ -57,12 +57,31 @@
 #include <unistd.h>
 #include <util.h>
 
+#ifndef UT_NAMESIZE
+# define UT_NAMESIZE   8
+#endif
+#ifndef UT_LINESIZE
+# define UT_LINESIZE   8
+#endif
+#ifndef UT_HOSTSIZE
+# define UT_HOSTSIZE   16
+#endif
+
+#ifndef UTX_USERSIZE
+# define UTX_USERSIZE  64
+#endif
+#ifndef UTX_LINESIZE
+# define UTX_LINESIZE  64
+#endif
+#ifndef UTX_HOSTSIZE
+# define UTX_HOSTSIZE  256
+#endif
+
 struct output {
        struct timeval   o_tv;
-       struct sockaddr_storage o_ss;
-       char             o_name[64];
-       char             o_line[64];
-       char             o_host[256];
+       char             o_name[UTX_USERSIZE+1];
+       char             o_line[UTX_LINESIZE+1];
+       char             o_host[UTX_HOSTSIZE+1];
        struct output   *next;
 };
 
@@ -73,24 +92,35 @@
 static int sortlog = SORT_NONE;
 static struct output *outstack = NULL;
 
-static int numeric = 0;
-static size_t namelen = UT_NAMESIZE;
-static size_t linelen = UT_LINESIZE;
-static size_t hostlen = UT_HOSTSIZE;
+static int fixed = 0;
+#define FIXED_NAMELEN  UT_NAMESIZE
+#define FIXED_LINELEN  UT_LINESIZE
+/*
+ * This makes the "fixed" output fit in 79 columns.
+ * Using UT_HOSTSIZE (16) seems too conservative.
+ */
+#define FIXED_HOSTLEN  32
 
-static int     comparelog(const void *, const void *);
-static void    output(struct output *);
+static int numeric = 0;
+static size_t namelen = 0;
+static size_t linelen = 0;
+static size_t hostlen = 0;
+#define SIZECOLUMNS    (!(namelen && linelen && hostlen))
+
+static int             comparelog(const void *, const void *);
+static void            output_record(struct output *);
 #ifdef SUPPORT_UTMP
-static void    process_entry(struct passwd *, struct lastlog *);
-static void    dolastlog(const char *, int, char *[]);
+static void            process_entry(struct passwd *, struct lastlog *);
+static void            dolastlog(const char *, int, char *[]);
 #endif
 #ifdef SUPPORT_UTMPX
-static void    process_entryx(struct passwd *, struct lastlogx *);
-static void    dolastlogx(const char *, int, char *[]);
+static void            process_entryx(struct passwd *, struct lastlogx *);
+static void            dolastlogx(const char *, int, char *[]);
 #endif
-static void    push(struct output *);
-static const char      *gethost(struct output *);
-static void    sortoutput(struct output *);
+static void            push_record(struct output *);
+static void            sizecolumns(struct output *);
+static void            output_stack(struct output *);
+static void            sort_and_output_stack(struct output *);
 __dead static  void    usage(void);
 
 int
@@ -107,7 +137,7 @@
        int     ch;
        size_t  len;
 
-       while ((ch = getopt(argc, argv, "f:H:L:nN:rt")) != -1) {
+       while ((ch = getopt(argc, argv, "f:FH:L:nN:rt")) != -1) {
                switch (ch) {
                case 'H':
                        hostlen = atoi(optarg);
@@ -115,6 +145,9 @@
                case 'f':
                        logfile = optarg;
                        break;
+               case 'F':
+                       fixed++;
+                       break;
                case 'L':
                        linelen = atoi(optarg);
                        break;
@@ -137,6 +170,15 @@
        argc -= optind;
        argv += optind;
 
+       if (fixed) {
+               if (!namelen)
+                       namelen = FIXED_NAMELEN;
+               if (!linelen)
+                       linelen = FIXED_LINELEN;
+               if (!hostlen)
+                       hostlen = FIXED_HOSTLEN;
+       }
+
        len = strlen(logfile);
 
        setpassent(1);  /* Keep passwd file pointers open */
@@ -152,8 +194,15 @@
 
        setpassent(0);  /* Close passwd file pointers */
 
-       if (outstack && DOSORT(sortlog))
-               sortoutput(outstack);
+       if (outstack) {
+               if (SIZECOLUMNS)
+                       sizecolumns(outstack);
+
+               if (DOSORT(sortlog))
+                       sort_and_output_stack(outstack);
+               else
+                       output_stack(outstack);
+       }
 
        return 0;
 }
@@ -224,18 +273,17 @@
        (void)strlcpy(o.o_host, l->ll_host, sizeof(l->ll_host));
        o.o_tv.tv_sec = l->ll_time;
        o.o_tv.tv_usec = 0;
-       (void)memset(&o.o_ss, 0, sizeof(o.o_ss));
        o.next = NULL;
 
        /*
-        * If we are sorting it, we need all the entries in memory so
-        * push the current entry onto a stack.  Otherwise, we can just
-        * output it.
+        * If we are dynamically sizing the columns or sorting the log,
+        * we need all the entries in memory so push the current entry
+        * onto a stack.  Otherwise, we can just output it.
         */
-       if (DOSORT(sortlog))
-               push(&o);
+       if (SIZECOLUMNS || DOSORT(sortlog))
+               push_record(&o);
        else
-               output(&o);
+               output_record(&o);
 }
 #endif
 
@@ -343,25 +391,28 @@
        else
                (void)strlcpy(o.o_name, p->pw_name, sizeof(o.o_name));
        (void)strlcpy(o.o_line, l->ll_line, sizeof(l->ll_line));
-       (void)strlcpy(o.o_host, l->ll_host, sizeof(l->ll_host));
-       (void)memcpy(&o.o_ss, &l->ll_ss, sizeof(o.o_ss));
+       if (!numeric)
+               (void)strlcpy(o.o_host, l->ll_host, sizeof(l->ll_host));
+       else
+               (void)sockaddr_snprintf(o.o_host, sizeof(o.o_host), "%a",
+                   (struct sockaddr *)&l->ll_ss);
        o.o_tv = l->ll_tv;
        o.next = NULL;
 
        /*
-        * If we are sorting it, we need all the entries in memory so
-        * push the current entry onto a stack.  Otherwise, we can just
-        * output it.
+        * If we are dynamically sizing the columns or sorting the log,
+        * we need all the entries in memory so push the current entry
+        * onto a stack.  Otherwise, we can just output it.
         */
-       if (DOSORT(sortlog))
-               push(&o);
+       if (SIZECOLUMNS || DOSORT(sortlog))
+               push_record(&o);
        else
-               output(&o);
+               output_record(&o);
 }
 #endif
 
 static void
-push(struct output *o)
+push_record(struct output *o)
 {
        struct output   *out;
 
@@ -380,7 +431,44 @@
 }
 
 static void
-sortoutput(struct output *o)
+sizecolumns(struct output *stack)
+{
+       struct  output *o;
+       size_t  len;
+
+       if (!namelen)
+               for (o = stack; o; o = o->next) {
+                       len = strlen(o->o_name);
+                       if (namelen < len)
+                               namelen = len;
+               }
+
+       if (!linelen)
+               for (o = stack; o; o = o->next) {
+                       len = strlen(o->o_line);
+                       if (linelen < len)
+                               linelen = len;
+               }
+
+       if (!hostlen)
+               for (o = stack; o; o = o->next) {
+                       len = strlen(o->o_host);
+                       if (hostlen < len)
+                               hostlen = len;
+               }
+}
+
+static void
+output_stack(struct output *stack)
+{
+       struct  output *o;
+
+       for (o = stack; o; o = o->next)
+               output_record(o);
+}
+
+static void
+sort_and_output_stack(struct output *o)
 {
        struct  output **outs;



Home | Main Index | Thread Index | Old Index