#include <sys/types.h>
#include <sys/stat.h>
-#include <sys/fcntl.h>
+#include <fcntl.h>
#include <time.h>
#include <stdio.h>
#include <ctype.h>
int usedns = 0; /* Use DNS to lookup the hostname. */
int useip = 0; /* Print IP address in number format */
int fulltime = 0; /* Print full dates and times */
+int name_len = 8; /* Default print 8 characters of name */
+int domain_len = 16; /* Default print 16 characters of domain */
int oldfmt = 0; /* Use old libc5 format? */
char **show = NULL; /* What do they want us to show */
char *ufile; /* Filename of this file */
struct sockaddr_in6 sin6;
struct sockaddr *sa;
int salen, flags;
- unsigned int topnibble;
- unsigned int azero = 0, sitelocal = 0;
int mapped = 0;
flags = useip ? NI_NUMERICHOST : 0;
/*
- * IPv4 or IPv6 ? We use 2 heuristics:
- * 1. Current IPv6 range uses 2000-3fff or fec0-feff.
- * Outside of that is illegal and must be IPv4.
- * 2. If last 3 bytes are 0, must be IPv4
- * 3. If IPv6 in IPv4, handle as IPv4
+ * IPv4 or IPv6 ?
+ * 1. If last 3 4bytes are 0, must be IPv4
+ * 2. If IPv6 in IPv4, handle as IPv4
+ * 3. Anything else is IPv6
*
* Ugly.
*/
- if (a[0] == 0 && a[1] == 0 && a[2] == htonl (0xffff))
+ if (a[0] == 0 && a[1] == 0 && a[2] == (int32_t)htonl (0xffff))
mapped = 1;
- topnibble = ntohl((unsigned int)a[0]) >> 28;
- azero = ntohl((unsigned int)a[0]) >> 16;
- sitelocal = (azero >= 0xfec0 && azero <= 0xfeff) ? 1 : 0;
-
- if (((topnibble < 2 || topnibble > 3) && (!sitelocal)) || mapped ||
- (a[1] == 0 && a[2] == 0 && a[3] == 0)) {
+ if (mapped || (a[1] == 0 && a[2] == 0 && a[3] == 0)) {
/* IPv4 */
sin.sin_family = AF_INET;
sin.sin_port = 0;
char logintime[32];
char logouttime[32];
char length[32];
- char final[128];
+ char final[512];
char utline[UT_LINESIZE+1];
char domain[256];
char *s, **walk;
* Calculate times
*/
tmp = (time_t)p->ut_time;
- strcpy(logintime, ctime(&tmp));
+ strncpy(logintime, ctime(&tmp), sizeof(logintime));
+ logintime[sizeof(logintime)-1] = 0; /* enforce null termination */
if (fulltime)
sprintf(logouttime, "- %s", ctime(&t));
else {
r = dns_lookup(domain, sizeof(domain), useip, p->ut_addr_v6);
if (r < 0) {
len = UT_HOSTSIZE;
- if (len >= sizeof(domain)) len = sizeof(domain) - 1;
+ if (len >= (int)sizeof(domain)) len = sizeof(domain) - 1;
domain[0] = 0;
strncat(domain, p->ut_host, len);
}
strcmp(s + 1, domainname) == 0) *s = 0;
#endif
if (!altlist) {
- snprintf(final, sizeof(final),
+ len = snprintf(final, sizeof(final),
fulltime ?
- "%-8.8s %-12.12s %-16.16s %-24.24s %-26.26s %-12.12s\n" :
- "%-8.8s %-12.12s %-16.16s %-16.16s %-7.7s %-12.12s\n",
- p->ut_name, utline,
- domain, logintime, logouttime, length);
+ "%-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",
+ name_len, p->ut_name, utline,
+ domain_len, domain, logintime, logouttime, length);
} else {
- snprintf(final, sizeof(final),
+ len = snprintf(final, sizeof(final),
fulltime ?
- "%-8.8s %-12.12s %-24.24s %-26.26s %-12.12s %s\n" :
- "%-8.8s %-12.12s %-16.16s %-7.7s %-12.12s %s\n",
- p->ut_name, utline,
+ "%-8.*s %-12.12s %-24.24s %-26.26s %-12.12s %s\n" :
+ "%-8.*s %-12.12s %-16.16s %-7.7s %-12.12s %s\n",
+ name_len, p->ut_name, utline,
logintime, logouttime, length, domain);
}
} else
- snprintf(final, sizeof(final),
+ len = snprintf(final, sizeof(final),
fulltime ?
- "%-8.8s %-12.12s %-24.24s %-26.26s %-12.12s\n" :
- "%-8.8s %-12.12s %-16.16s %-7.7s %-12.12s\n",
- p->ut_name, utline,
+ "%-8.*s %-12.12s %-24.24s %-26.26s %-12.12s\n" :
+ "%-8.*s %-12.12s %-16.16s %-7.7s %-12.12s\n",
+ name_len, p->ut_name, utline,
logintime, logouttime, length);
+#if defined(__GLIBC__)
+# if (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)
+ final[sizeof(final)-1] = '\0';
+# endif
+#endif
+
/*
* Print out "final" string safely.
*/
putchar('*');
}
+ if (len < 0 || (size_t)len >= sizeof(final))
+ putchar('\n');
+
recsdone++;
if (maxrecs && recsdone >= maxrecs)
return 1;
{
fprintf(stderr, "Usage: %s [-num | -n num] [-f file] "
"[-t YYYYMMDDHHMMSS] "
- "[-R] [-adioxF] [username..] [tty..]\n", s);
+ "[-R] [-adioxFw] [username..] [tty..]\n", s);
exit(1);
}
progname = mybasename(argv[0]);
/* Process the arguments. */
- while((c = getopt(argc, argv, "f:n:RxadFiot:0123456789")) != EOF)
+ while((c = getopt(argc, argv, "f:n:RxadFiot:0123456789w")) != EOF)
switch(c) {
case 'R':
showhost = 0;
usage(progname);
}
break;
+ case 'w':
+ if (UT_NAMESIZE > name_len)
+ name_len = UT_NAMESIZE;
+ if (UT_HOSTSIZE > domain_len)
+ domain_len = UT_HOSTSIZE;
+ break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
maxrecs = 10*maxrecs + c - '0';