summaryrefslogtreecommitdiffstats
path: root/login-utils/utmpdump.c
diff options
context:
space:
mode:
authorSami Kerola2013-08-29 11:34:00 +0200
committerSami Kerola2013-08-29 19:14:10 +0200
commitee508c153fe25142d3aaafb6b456a592e51d4ac5 (patch)
treecd46608f417432556ca418fb4e601d85a400f199 /login-utils/utmpdump.c
parentlast, utmpdump, agetty, wall, write: avoid compatibility hacks (diff)
downloadkernel-qcow2-util-linux-ee508c153fe25142d3aaafb6b456a592e51d4ac5.tar.gz
kernel-qcow2-util-linux-ee508c153fe25142d3aaafb6b456a592e51d4ac5.tar.xz
kernel-qcow2-util-linux-ee508c153fe25142d3aaafb6b456a592e51d4ac5.zip
utmpdump: make IPv6 addresses work
(unless bug[s]) This change is backwards compatibile. Earlier binary to text dumps can be converted back to binary, or otherway around. The only thing that will not work are IPv6 addresses that possible earlier conversion had broke. Such conversions resulted with random IPv4 in place of IPv6 address in text format, and original information is gone forever. Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'login-utils/utmpdump.c')
-rw-r--r--login-utils/utmpdump.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/login-utils/utmpdump.c b/login-utils/utmpdump.c
index acc10db16..4451363fb 100644
--- a/login-utils/utmpdump.c
+++ b/login-utils/utmpdump.c
@@ -85,11 +85,14 @@ static void xcleanse(char *s, int len)
static void print_utline(struct utmp ut, FILE *out)
{
- char *addr_string, *time_string;
- struct in_addr in;
+ const char *addr_string, *time_string;
+ char buffer[INET6_ADDRSTRLEN];
+
+ if (ut.ut_addr_v6[1] || ut.ut_addr_v6[2] || ut.ut_addr_v6[3])
+ addr_string = inet_ntop(AF_INET6, &(ut.ut_addr_v6), buffer, sizeof(buffer));
+ else
+ addr_string = inet_ntop(AF_INET, &(ut.ut_addr_v6), buffer, sizeof(buffer));
- in.s_addr = ut.ut_addr;
- addr_string = inet_ntoa(in);
#if defined(_HAVE_UT_TV)
time_string = timetostr(ut.ut_tv.tv_sec);
#else
@@ -101,7 +104,7 @@ static void print_utline(struct utmp ut, FILE *out)
cleanse(ut.ut_host);
/* pid id user line host addr time */
- fprintf(out, "[%d] [%05d] [%-4.4s] [%-*.*s] [%-*.*s] [%-*.*s] [%-15.15s] [%-28.28s]\n",
+ fprintf(out, "[%d] [%05d] [%-4.4s] [%-*.*s] [%-*.*s] [%-*.*s] [%-15s] [%-28.28s]\n",
ut.ut_type, ut.ut_pid, ut.ut_id, 8, UT_NAMESIZE, ut.ut_user,
12, UT_LINESIZE, ut.ut_line, 20, UT_HOSTSIZE, ut.ut_host,
addr_string, time_string);
@@ -252,11 +255,10 @@ static int gettok(char *line, char *dest, int size, int eatspace)
static void undump(FILE *in, FILE *out)
{
struct utmp ut;
- char s_addr[16], s_time[29], *linestart, *line;
+ char s_addr[INET6_ADDRSTRLEN + 1], s_time[29], *linestart, *line;
int count = 0;
linestart = xmalloc(1024 * sizeof(*linestart));
- s_addr[15] = 0;
s_time[28] = 0;
while (fgets(linestart, 1023, in)) {
@@ -270,8 +272,10 @@ static void undump(FILE *in, FILE *out)
line += gettok(line, ut.ut_host, sizeof(ut.ut_host), 1);
line += gettok(line, s_addr, sizeof(s_addr) - 1, 1);
gettok(line, s_time, sizeof(s_time) - 1, 0);
-
- ut.ut_addr = inet_addr(s_addr);
+ if (strchr(s_addr, '.'))
+ inet_pton(AF_INET, s_addr, &(ut.ut_addr_v6));
+ else
+ inet_pton(AF_INET6, s_addr, &(ut.ut_addr_v6));
#if defined(_HAVE_UT_TV)
ut.ut_tv.tv_sec = strtotime(s_time);
#else