Added -l flag to "last" command. When used it allows "last" to

display usernames longer than 8 characters long.
This commit is contained in:
Jesse Smith
2018-10-30 21:46:04 -03:00
parent be8e6b9e1c
commit 44fce86dde
3 changed files with 54 additions and 3 deletions

View File

@ -27,7 +27,9 @@ sysvinit (2.92) unreleased; urgency=low
* shutdown command was setting environment variable INIT_HALT to * shutdown command was setting environment variable INIT_HALT to
"POWERDOWN", this should have been "POWERDOWN" as specified in the "POWERDOWN", this should have been "POWERDOWN" as specified in the
manual page. Fixed code to match manual page and init scripts. manual page. Fixed code to match manual page and init scripts.
Closes Debian bugs #717531 and ##590895
* Added -l flag to "last" command. When used it allows "last" to
display usernames longer than 8 characters long.
sysvinit (2.91) world; urgency=low sysvinit (2.91) world; urgency=low

View File

@ -93,6 +93,10 @@ Print full login and logout times and dates.
.IP \fB\-i\fP .IP \fB\-i\fP
This option is like \fB-d\fP in that it displays the IP number of the remote This option is like \fB-d\fP in that it displays the IP number of the remote
host, but it displays the IP number in numbers-and-dots notation. host, but it displays the IP number in numbers-and-dots notation.
.IP \fB\-l\fP
This option allows the display of usernames longer than 8 characters.
This may mess up formatting in some programs and make the output wider than
the standard 80 characters.
.IP \fB\-o\fP .IP \fB\-o\fP
Read an old-type wtmp file (written by linux-libc5 applications). Read an old-type wtmp file (written by linux-libc5 applications).
.IP \fB\-w\fP .IP \fB\-w\fP

View File

@ -77,6 +77,7 @@ int maxrecs = 0; /* Maximum number of records to list. */
int recsdone = 0; /* Number of records listed */ int recsdone = 0; /* Number of records listed */
int showhost = 1; /* Show hostname too? */ int showhost = 1; /* Show hostname too? */
int altlist = 0; /* Show hostname at the end. */ int altlist = 0; /* Show hostname at the end. */
int allow_long_username = 0; /* Show usernames longer than 8 characters */
int usedns = 0; /* Use DNS to lookup the hostname. */ int usedns = 0; /* Use DNS to lookup the hostname. */
int useip = 0; /* Print IP address in number format */ int useip = 0; /* Print IP address in number format */
int fulltime = 0; /* Print full dates and times */ int fulltime = 0; /* Print full dates and times */
@ -470,28 +471,69 @@ int list(struct utmp *p, time_t t, int what)
if (!usedns && (s = strchr(p->ut_host, '.')) != NULL && if (!usedns && (s = strchr(p->ut_host, '.')) != NULL &&
strcmp(s + 1, domainname) == 0) *s = 0; strcmp(s + 1, domainname) == 0) *s = 0;
#endif #endif
#define str(s) # s
#define xstr(s) str(s)
if (!altlist) { if (!altlist) {
if (allow_long_username)
{
len = snprintf(final, sizeof(final),
oldfmt ? "%-" xstr(OLD_NAMESIZE) "." xstr(OLD_NAMESIZE) "s %-12.12s "
"%-16.16s %-16.16s %-7.7s %-12.12s\n"
: "%-" xstr(UT_NAMESIZE) "." xstr(UT_NAMESIZE) "s %-12.12s "
"%-16.16s %-16.16s %-7.7s %-12.12s\n",
p->ut_name, utline,
domain, logintime, logouttime, length);
}
else /* show short username */
{
len = snprintf(final, sizeof(final), len = snprintf(final, sizeof(final),
fulltime ? fulltime ?
"%-8.*s %-12.12s %-16.*s %-24.24s %-26.26s %-12.12s\n" : "%-8.*s %-12.12s %-16.*s %-24.24s %-26.26s %-12.12s\n" :
"%-8.*s %-12.12s %-16.*s %-16.16s %-7.7s %-12.12s\n", "%-8.*s %-12.12s %-16.*s %-16.16s %-7.7s %-12.12s\n",
name_len, p->ut_name, utline, name_len, p->ut_name, utline,
domain_len, domain, logintime, logouttime, length); domain_len, domain, logintime, logouttime, length);
} /* show short username */
} else { } else {
if (allow_long_username)
{
len = snprintf(final, sizeof(final),
oldfmt ? "%-" xstr(OLD_NAMESIZE) "." xstr(OLD_NAMESIZE) "s %-12.12s "
"%-16.16s %-7.7s %-16.16s %s\n"
: "%-" xstr(UT_NAMESIZE) "." xstr(UT_NAMESIZE) "s %-12.12s "
"%-16.16s %-7.7s %-16.16s %s\n",
p->ut_name, utline,
logintime, logouttime, length, domain);
}
else /* show short username */
{
len = snprintf(final, sizeof(final), len = snprintf(final, sizeof(final),
fulltime ? fulltime ?
"%-8.*s %-12.12s %-24.24s %-26.26s %-12.12s %s\n" : "%-8.*s %-12.12s %-24.24s %-26.26s %-12.12s %s\n" :
"%-8.*s %-12.12s %-16.16s %-7.7s %-12.12s %s\n", "%-8.*s %-12.12s %-16.16s %-7.7s %-12.12s %s\n",
name_len, p->ut_name, utline, name_len, p->ut_name, utline,
logintime, logouttime, length, domain); logintime, logouttime, length, domain);
} /* done showing short username */
} }
} else } else
if (allow_long_username)
{
len = snprintf(final, sizeof(final),
oldfmt ? "%-" xstr(OLD_NAMESIZE) "." xstr(OLD_NAMESIZE) "s %-12.12s "
"%-16.16s %-7.7s %-12.12s\n"
: "%-" xstr(UT_NAMESIZE) "." xstr(UT_NAMESIZE) "s %-12.12s "
"%-16.16s %-7.7s %-12.12s\n",
p->ut_name, utline,
logintime, logouttime, length);
}
else /* show short username */
{
len = snprintf(final, sizeof(final), len = snprintf(final, sizeof(final),
fulltime ? fulltime ?
"%-8.*s %-12.12s %-24.24s %-26.26s %-12.12s\n" : "%-8.*s %-12.12s %-24.24s %-26.26s %-12.12s\n" :
"%-8.*s %-12.12s %-16.16s %-7.7s %-12.12s\n", "%-8.*s %-12.12s %-16.16s %-7.7s %-12.12s\n",
name_len, p->ut_name, utline, name_len, p->ut_name, utline,
logintime, logouttime, length); logintime, logouttime, length);
} /* end of showing short username */
#if defined(__GLIBC__) #if defined(__GLIBC__)
# if (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0) # if (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)
@ -598,7 +640,7 @@ int main(int argc, char **argv)
progname = mybasename(argv[0]); progname = mybasename(argv[0]);
/* Process the arguments. */ /* Process the arguments. */
while((c = getopt(argc, argv, "f:n:RxadFiot:0123456789w")) != EOF) while((c = getopt(argc, argv, "f:n:RxadFliot:0123456789w")) != EOF)
switch(c) { switch(c) {
case 'R': case 'R':
showhost = 0; showhost = 0;
@ -632,6 +674,9 @@ int main(int argc, char **argv)
case 'F': case 'F':
fulltime++; fulltime++;
break; break;
case 'l':
allow_long_username = 1;
break;
case 't': case 't':
if ((until = parsetm(optarg)) == (time_t)-1) { if ((until = parsetm(optarg)) == (time_t)-1) {
fprintf(stderr, "%s: Invalid time value \"%s\"\n", fprintf(stderr, "%s: Invalid time value \"%s\"\n",