* Try to make utmpdump IPv6 valid, change based on suggestion from
authorDr. Werner Fink <werner@suse.de>
Fri, 11 Mar 2011 16:51:07 +0000 (16:51 +0000)
committerDr. Werner Fink <werner@suse.de>
Fri, 11 Mar 2011 16:51:07 +0000 (16:51 +0000)
  Navdeep Bhatia (see local bug #32429)

git-svn-id: svn://svn.sv.gnu.org/sysvinit/sysvinit/trunk@99 456724a4-4300-0410-8514-c89748c515a2

doc/Changelog
src/utmpdump.c

index 9983501751bbaa6b0707108e7ae61a553d740061..bb68e111147d867c4122cddc030f80399ecb4cad 100644 (file)
@@ -1,6 +1,8 @@
 sysvinit (2.89dsf) UNRELEASED; urgency=low
 
   [ Werner Fink ]
+  * Try to make utmpdump IPv6 valid, change based on suggestion from
+    Navdeep Bhatia (see local bug #32429)
   * Fix signal and alarm handling based on the patch from Florent Viard.
     (was local bug #32304)
   * Add fix for Redhat bug #573346: last incorrectly displays IPv6
index 97f98697350b4b796589b8df678c9abcc9f52eab..cef8cc38e1e4358514399498b817b172ca0861fa 100644 (file)
@@ -128,11 +128,21 @@ unspace(char *s, int len)
 void
 print_utline(struct utmp ut)
 {
-       char *addr_string, *time_string;
-       struct in_addr in;
-
-       in.s_addr = ut.ut_addr;
-       addr_string = inet_ntoa(in);
+       char addr_buf[INET6_ADDRSTRLEN+1];
+       const char *addr_string, *time_string;
+       void *in_addr = &ut.ut_addr_v6;
+       size_t addr_length = INET6_ADDRSTRLEN;
+       int addr_family = AF_INET6;
+
+       if (!ut.ut_addr_v6[1] && !ut.ut_addr_v6[2] && !ut.ut_addr_v6[3]) {
+               addr_family = AF_INET;
+               addr_length = INET_ADDRSTRLEN;
+               in_addr = &ut.ut_addr;
+       }
+       if ((addr_string = inet_ntop(addr_family, in_addr, addr_buf, addr_length)) == 0) {
+               addr_buf[0] = '\0';
+               addr_string = &addr_buf[0];
+       }
        time_string = timetostr(ut.ut_time);
        cleanse(ut.ut_id);
        cleanse(ut.ut_user);