summaryrefslogtreecommitdiff
path: root/src/lastlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lastlog.c')
-rw-r--r--src/lastlog.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/lastlog.c b/src/lastlog.c
index c1caedb0..1b1803e1 100644
--- a/src/lastlog.c
+++ b/src/lastlog.c
@@ -42,6 +42,9 @@
#include <sys/types.h>
#include <time.h>
#include <assert.h>
+#ifdef HAVE_LL_HOST
+#include <net/if.h>
+#endif
#include "defines.h"
#include "prototypes.h"
#include "getdef.h"
@@ -59,6 +62,7 @@
* Global variables
*/
const char *Prog; /* Program name */
+FILE *shadow_logfd = NULL;
static FILE *lastlogfile; /* lastlog file stream */
static unsigned long umin; /* if uflg and has_umin, only display users with uid >= umin */
static bool has_umin = false;
@@ -109,6 +113,10 @@ static void print_one (/*@null@*/const struct passwd *pw)
char ptime[80];
#endif
+#ifdef HAVE_LL_HOST
+ int maxIPv6Addrlen;
+#endif
+
if (NULL == pw) {
return;
}
@@ -150,7 +158,17 @@ static void print_one (/*@null@*/const struct passwd *pw)
/* Print the header only once */
if (!once) {
#ifdef HAVE_LL_HOST
- puts (_("Username Port From Latest"));
+ /*
+ * ll_host is in minimized form, thus the maximum IPv6 address possible is
+ * 8*4+7 = 39 characters.
+ * RFC 4291 2.5.6 states that for LL-addresses fe80+only the interface ID is set,
+ * thus having a maximum size of 25+1+IFNAMSIZ.
+ * POSIX says IFNAMSIZ should be 16 characters long including the null byte, thus
+ * 25+1+IFNAMSIZ >= 42 > 39
+ */
+ /* Link-Local address + % + Interfacename */
+ maxIPv6Addrlen = 25+1+IFNAMSIZ;
+ printf (_("Username Port From%*sLatest\n"), maxIPv6Addrlen-3, " ");
#else
puts (_("Username Port Latest"));
#endif
@@ -172,8 +190,8 @@ static void print_one (/*@null@*/const struct passwd *pw)
}
#ifdef HAVE_LL_HOST
- printf ("%-16s %-8.8s %-16.16s %s\n",
- pw->pw_name, ll.ll_line, ll.ll_host, cp);
+ printf ("%-16s %-8.8s %*s%s\n",
+ pw->pw_name, ll.ll_line, -maxIPv6Addrlen, ll.ll_host, cp);
#else
printf ("%-16s\t%-8.8s %s\n",
pw->pw_name, ll.ll_line, cp);
@@ -300,6 +318,7 @@ int main (int argc, char **argv)
* most error messages.
*/
Prog = Basename (argv[0]);
+ shadow_logfd = stderr;
(void) setlocale (LC_ALL, "");
(void) bindtextdomain (PACKAGE, LOCALEDIR);