diff options
Diffstat (limited to 'src/lastlog.c')
-rw-r--r-- | src/lastlog.c | 25 |
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); |