You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
2.1 KiB
56 lines
2.1 KiB
diff -up util-linux-2.23.2/login-utils/utmpdump.c.kzak util-linux-2.23.2/login-utils/utmpdump.c |
|
--- util-linux-2.23.2/login-utils/utmpdump.c.kzak 2013-10-07 11:56:02.030191040 +0200 |
|
+++ util-linux-2.23.2/login-utils/utmpdump.c 2013-10-07 12:05:08.671171091 +0200 |
|
@@ -85,11 +85,14 @@ static void xcleanse(char *s, int len) |
|
|
|
static void print_utline(struct utmp ut) |
|
{ |
|
- 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); |
|
time_string = timetostr(ut.ut_time); |
|
cleanse(ut.ut_id); |
|
cleanse(ut.ut_user); |
|
@@ -97,7 +100,7 @@ static void print_utline(struct utmp ut) |
|
cleanse(ut.ut_host); |
|
|
|
/* pid id user line host addr time */ |
|
- printf("[%d] [%05d] [%-4.4s] [%-*.*s] [%-*.*s] [%-*.*s] [%-15.15s] [%-28.28s]\n", |
|
+ printf("[%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); |
|
@@ -248,11 +251,10 @@ static int gettok(char *line, char *dest |
|
static void undump(FILE *fp) |
|
{ |
|
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; |
|
|
|
line = linestart = xmalloc(1024 * sizeof(*linestart)); |
|
- s_addr[15] = 0; |
|
s_time[28] = 0; |
|
|
|
while (fgets(linestart, 1023, fp)) { |
|
@@ -267,7 +269,10 @@ static void undump(FILE *fp) |
|
line += gettok(line, s_addr, sizeof(s_addr) - 1, 1); |
|
line += 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)); |
|
ut.ut_time = strtotime(s_time); |
|
|
|
ignore_result( fwrite(&ut, sizeof(ut), 1, stdout) );
|
|
|