Source-Changes-HG archive

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

[src/netbsd-9]: src/usr.sbin/lastlogin Pull up following revision(s) (request...



details:   https://anonhg.NetBSD.org/src/rev/da70deb24b33
branches:  netbsd-9
changeset: 963868:da70deb24b33
user:      martin <martin%NetBSD.org@localhost>
date:      Thu May 07 18:19:28 2020 +0000

description:
Pull up following revision(s) (requested by kim in ticket #893):

        usr.sbin/lastlogin/lastlogin.c: revision 1.16
        usr.sbin/lastlogin/lastlogin.c: revision 1.17
        usr.sbin/lastlogin/lastlogin.c: revision 1.18
        usr.sbin/lastlogin/lastlogin.c: revision 1.19
        usr.sbin/lastlogin/lastlogin.c: revision 1.20
        usr.sbin/lastlogin/lastlogin.8: revision 1.13
        usr.sbin/lastlogin/lastlogin.8: revision 1.14

Size output columns dynamically by default to fit contents.

If the passwd entry is not found for a lastlogx entry, cons up a fake
struct passwd where pw_name is the numeric uid in parentheses. This was
already implemented for lastlog entries in revision 1.13.

If -n is specified more than once, also print the user numerically
(ie, uid instead of username) for lastlog entries. This was already
implemented for lastlogx entries in revision 1.13.

Reorder the lastlogx host name numeric condition so it better matches
the user name numeric condition.

Use memcpy for copying out lastlog and lastlogx text
Lastlog and lastlogx text fields are not NUL-terminated when original data
is truncated.

Output records in original order

Append to the list of output records instead of pushing on it, so we
don't reverse the order of records (when not sorting).

New sentence, new line.

Sync usage with man page.

diffstat:

 usr.sbin/lastlogin/lastlogin.8 |   19 +-
 usr.sbin/lastlogin/lastlogin.c |  229 ++++++++++++++++++++++++++++------------
 2 files changed, 168 insertions(+), 80 deletions(-)

diffs (truncated from 437 to 300 lines):

diff -r 05249af335bc -r da70deb24b33 usr.sbin/lastlogin/lastlogin.8
--- a/usr.sbin/lastlogin/lastlogin.8    Thu May 07 17:06:44 2020 +0000
+++ b/usr.sbin/lastlogin/lastlogin.8    Thu May 07 18:19:28 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.12.48.1 2020/05/07 18:19:28 martin 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
@@ -48,15 +48,16 @@
 .Nm
 will list the last login session of specified
 .Ar users ,
-or for all users by default.  Each line of output contains
-the user name, the tty from which the session was conducted, any
-hostname, and the start time for the session.
+or for all users by default.
+Each line of output contains the user name, the tty from which the
+session was conducted, any hostname, and the start time for the
+session.
 .Pp
 If multiple
 .Ar users
 are given, the session information for each user is printed in
-the order given on the command line.  Otherwise, information
-for all users is printed, sorted by uid.
+the order given on the command line.
+Otherwise, information for all users is printed, sorted by uid.
 .Pp
 .Nm
 differs from
@@ -66,6 +67,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 05249af335bc -r da70deb24b33 usr.sbin/lastlogin/lastlogin.c
--- a/usr.sbin/lastlogin/lastlogin.c    Thu May 07 17:06:44 2020 +0000
+++ b/usr.sbin/lastlogin/lastlogin.c    Thu May 07 18:19:28 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.15.44.1 2020/05/07 18:19:28 martin 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.15.44.1 2020/05/07 18:19:28 martin Exp $");
 #endif
 
 #include <sys/types.h>
@@ -57,12 +57,35 @@
 #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
+
+/*
+ * Fields in the structure below are 1 byte longer than the maximum possible
+ * for NUL-termination.
+ */
 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;
 };
 
@@ -72,25 +95,37 @@
 #define DOSORT(x)      ((x) & (SORT_TIME))
 static int sortlog = SORT_NONE;
 static struct output *outstack = NULL;
+static struct output *outstack_p = NULL;
+
+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 numeric = 0;
-static size_t namelen = UT_NAMESIZE;
-static size_t linelen = UT_LINESIZE;
-static size_t hostlen = UT_HOSTSIZE;
+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(struct output *);
+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            append_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 +142,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 +150,9 @@
                case 'f':
                        logfile = optarg;
                        break;
+               case 'F':
+                       fixed++;
+                       break;
                case 'L':
                        linelen = atoi(optarg);
                        break;
@@ -137,6 +175,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 +199,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;
 }
@@ -219,23 +273,26 @@
 {
        struct output   o;
 
-       (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));
+       memset(&o, 0, sizeof(o));
+       if (numeric > 1)
+               (void)snprintf(o.o_name, sizeof(o.o_name), "%d", p->pw_uid);
+       else
+               (void)strlcpy(o.o_name, p->pw_name, sizeof(o.o_name));
+       (void)memcpy(o.o_line, l->ll_line, sizeof(l->ll_line));
+       (void)memcpy(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))
+               append_record(&o);
        else
-               output(&o);
+               output_record(&o);
 }
 #endif
 
@@ -310,9 +367,12 @@
                        (void)memcpy(&uid, key.data, sizeof(uid));
 
                        if ((passwd = getpwuid(uid)) == NULL) {
-                               warnx("Cannot find user for uid %lu",
-                                   (unsigned long)uid);
-                               continue;
+                               static struct passwd p;
+                               static char n[32];
+                               snprintf(n, sizeof(n), "(%d)", i);
+                               p.pw_uid = i;
+                               p.pw_name = n;
+                               passwd = &p;
                        }
                        (void)memcpy(&l, data.data, sizeof(l));
                        process_entryx(passwd, &l);
@@ -338,30 +398,34 @@
 {
        struct output   o;
 
+       memset(&o, 0, sizeof(o));
        if (numeric > 1)
                (void)snprintf(o.o_name, sizeof(o.o_name), "%d", p->pw_uid);
        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));
+       (void)memcpy(o.o_line, l->ll_line, sizeof(l->ll_line));
+       if (numeric)
+               (void)sockaddr_snprintf(o.o_host, sizeof(o.o_host), "%a",
+                   (struct sockaddr *)&l->ll_ss);
+       else
+               (void)memcpy(o.o_host, l->ll_host, sizeof(l->ll_host));
        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.



Home | Main Index | Thread Index | Old Index