Merge pull request #259 from Inrin/lastlog_MaxPadding

Add maximum padding to fit IPv6-Addresses
This commit is contained in:
Serge Hallyn 2020-05-28 14:45:23 -05:00 committed by GitHub
commit 9cb21c2bdf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -42,6 +42,9 @@
#include <sys/types.h> #include <sys/types.h>
#include <time.h> #include <time.h>
#include <assert.h> #include <assert.h>
#ifdef HAVE_LL_HOST
#include <net/if.h>
#endif
#include "defines.h" #include "defines.h"
#include "prototypes.h" #include "prototypes.h"
#include "getdef.h" #include "getdef.h"
@ -109,6 +112,10 @@ static void print_one (/*@null@*/const struct passwd *pw)
char ptime[80]; char ptime[80];
#endif #endif
#ifdef HAVE_LL_HOST
int maxIPv6Addrlen;
#endif
if (NULL == pw) { if (NULL == pw) {
return; return;
} }
@ -150,7 +157,17 @@ static void print_one (/*@null@*/const struct passwd *pw)
/* Print the header only once */ /* Print the header only once */
if (!once) { if (!once) {
#ifdef HAVE_LL_HOST #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 #else
puts (_("Username Port Latest")); puts (_("Username Port Latest"));
#endif #endif
@ -172,8 +189,8 @@ static void print_one (/*@null@*/const struct passwd *pw)
} }
#ifdef HAVE_LL_HOST #ifdef HAVE_LL_HOST
printf ("%-16s %-8.8s %-16.16s %s\n", printf ("%-16s %-8.8s %*s%s\n",
pw->pw_name, ll.ll_line, ll.ll_host, cp); pw->pw_name, ll.ll_line, -maxIPv6Addrlen, ll.ll_host, cp);
#else #else
printf ("%-16s\t%-8.8s %s\n", printf ("%-16s\t%-8.8s %s\n",
pw->pw_name, ll.ll_line, cp); pw->pw_name, ll.ll_line, cp);