socsvn commit: r270816 - soc2014/zkorchev/freebsd_head/usr.bin/last

zkorchev at FreeBSD.org zkorchev at FreeBSD.org
Mon Jul 14 10:15:48 UTC 2014


Author: zkorchev
Date: Mon Jul 14 10:15:44 2014
New Revision: 270816
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=270816

Log:
  libsol support for last

Modified:
  soc2014/zkorchev/freebsd_head/usr.bin/last/Makefile
  soc2014/zkorchev/freebsd_head/usr.bin/last/last.c

Modified: soc2014/zkorchev/freebsd_head/usr.bin/last/Makefile
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/last/Makefile	Mon Jul 14 09:52:33 2014	(r270815)
+++ soc2014/zkorchev/freebsd_head/usr.bin/last/Makefile	Mon Jul 14 10:15:44 2014	(r270816)
@@ -3,6 +3,9 @@
 
 PROG=	last
 
+LDADD+=	-lsol
+CFLAGS+=-DSOL_ON -I/usr/local/include
+
 NO_WFORMAT=
 
 .include <bsd.prog.mk>

Modified: soc2014/zkorchev/freebsd_head/usr.bin/last/last.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/last/last.c	Mon Jul 14 09:52:33 2014	(r270815)
+++ soc2014/zkorchev/freebsd_head/usr.bin/last/last.c	Mon Jul 14 10:15:44 2014	(r270816)
@@ -57,6 +57,9 @@
 #include <unistd.h>
 #include <utmpx.h>
 #include <sys/queue.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
 
 #define	NO	0				/* false/no */
 #define	YES	1				/* true/yes */
@@ -94,6 +97,11 @@
 						 * at this snapshot time
 						 */
 
+#if defined(SOL_ON)
+static struct sol_stream sol_stream;
+#endif
+static int sol_format;
+
 static void	 addarg(int, char *);
 static time_t	 dateconv(char *);
 static void	 doentry(struct utmpx *);
@@ -188,7 +196,17 @@
 			addarg(USER_TYPE, *argv);
 		}
 	}
-	wtmp();
+#if defined(SOL_ON)
+	sol_format = sol_init(&sol_stream);
+	if (sol_format) {
+		sol_array_start(&sol_stream);
+		wtmp();
+		sol_array_end(&sol_stream);
+		sol_term(&sol_stream);
+	}
+	else
+#endif
+		wtmp();
 	exit(0);
 }
 
@@ -228,9 +246,11 @@
 	while (amount > 0)
 		doentry(&buf[--amount]);
 
-	tm = localtime(&t);
-	(void) strftime(ct, sizeof(ct), "%+", tm);
-	printf("\n%s begins %s\n", ((file == NULL) ? "utx.log" : file), ct);
+	if (!sol_format) {
+		tm = localtime(&t);
+		(void) strftime(ct, sizeof(ct), "%+", tm);
+		printf("\n%s begins %s\n", ((file == NULL) ? "utx.log" : file), ct);
+	}
 }
 
 /*
@@ -318,58 +338,143 @@
 	struct tm *tm;
 	time_t	delta;				/* time difference */
 	time_t	t;
+	size_t ct_len;
 
 	if (maxrec != -1 && !maxrec--)
 		exit(0);
 	t = bp->ut_tv.tv_sec;
 	tm = localtime(&t);
-	(void) strftime(ct, sizeof(ct), d_first ?
+	ct_len = strftime(ct, sizeof(ct), d_first ?
 	    (yflag ? "%a %e %b %Y %R" : "%a %e %b %R") :
 	    (yflag ? "%a %b %e %Y %R" : "%a %b %e %R"), tm);
-	switch (bp->ut_type) {
-	case BOOT_TIME:
-		printf("%-42s", "boot time");
-		break;
-	case SHUTDOWN_TIME:
-		printf("%-42s", "shutdown time");
-		break;
-	case OLD_TIME:
-		printf("%-42s", "old time");
-		break;
-	case NEW_TIME:
-		printf("%-42s", "new time");
-		break;
-	case USER_PROCESS:
-		printf("%-10s %-8s %-22.22s",
-		    bp->ut_user, bp->ut_line, bp->ut_host);
-		break;
+
+#if defined(SOL_ON)
+	if (sol_format)
+	{
+		sol_map_start(&sol_stream);
+		SOL_MAP_KEYL(&sol_stream, "type");
+		switch (bp->ut_type) {
+		case BOOT_TIME:
+			sol_string(&sol_stream, "boot", 4);
+			break;
+		case SHUTDOWN_TIME:
+			sol_string(&sol_stream, "shutdown", 8);
+			break;
+		case OLD_TIME:
+			sol_string(&sol_stream, "old", 3);
+			break;
+		case NEW_TIME:
+			sol_string(&sol_stream, "new", 3);
+			break;
+		case USER_PROCESS:
+			sol_string(&sol_stream, "login", 5);
+			SOL_MAP_KEYL(&sol_stream, "user");
+			sol_string(&sol_stream, bp->ut_user, strlen(bp->ut_user));
+			SOL_MAP_KEYL(&sol_stream, "line");
+			sol_string(&sol_stream, bp->ut_line, strlen(bp->ut_line));
+			SOL_MAP_KEYL(&sol_stream, "host");
+			sol_string(&sol_stream, bp->ut_host, strlen(bp->ut_host));
+			break;
+		}
+		SOL_MAP_KEYL(&sol_stream, "time");
+		sol_string(&sol_stream, ct, ct_len);
+	}
+	else
+#endif
+	{
+		switch (bp->ut_type) {
+		case BOOT_TIME:
+			printf("%-42s", "boot time");
+			break;
+		case SHUTDOWN_TIME:
+			printf("%-42s", "shutdown time");
+			break;
+		case OLD_TIME:
+			printf("%-42s", "old time");
+			break;
+		case NEW_TIME:
+			printf("%-42s", "new time");
+			break;
+		case USER_PROCESS:
+			printf("%-10s %-8s %-22.22s",
+				bp->ut_user, bp->ut_line, bp->ut_host);
+			break;
+		}
+		printf(" %s%c", ct, tt == NULL ? '\n' : ' ');
 	}
-	printf(" %s%c", ct, tt == NULL ? '\n' : ' ');
-	if (tt == NULL)
+	if (tt == NULL) {
+#if defined(SOL_ON)
+		if (sol_format) sol_map_end(&sol_stream);
+#endif
 		return;
+	}
 	if (!tt->logout) {
-		puts("  still logged in");
+#if defined(SOL_ON)
+		if (sol_format)
+			sol_map_end(&sol_stream);
+		else
+#endif
+			puts("  still logged in");
 		return;
 	}
+#if defined(SOL_ON)
+	if (sol_format) SOL_MAP_KEYL(&sol_stream, "logout");
+#endif
 	if (tt->logout < 0) {
 		tt->logout = -tt->logout;
-		printf("- %s", crmsg);
+#if defined(SOL_ON)
+		if (sol_format)
+			sol_string(&sol_stream, crmsg, strlen(crmsg));
+		else
+#endif
+			printf("- %s", crmsg);
 	} else {
 		tm = localtime(&tt->logout);
-		(void) strftime(ct, sizeof(ct), "%R", tm);
-		printf("- %s", ct);
+		ct_len = strftime(ct, sizeof(ct), "%R", tm);
+#if defined(SOL_ON)
+		if (sol_format)
+			sol_string(&sol_stream, ct, ct_len);
+		else
+#endif
+			printf("- %s", ct);
 	}
 	delta = tt->logout - bp->ut_tv.tv_sec;
+#if defined(SOL_ON)
+	if (sol_format) SOL_MAP_KEYL(&sol_stream, "duration");
+#endif
 	if (sflag) {
-		printf("  (%8ld)\n", (long)delta);
+#if defined(SOL_ON)
+		if (sol_format)
+			sol_integer(&sol_stream, delta);
+		else
+#endif
+			printf("  (%8ld)\n", (long)delta);
 	} else {
 		tm = gmtime(&delta);
-		(void) strftime(ct, sizeof(ct), width >= 8 ? "%T" : "%R", tm);
-		if (delta < 86400)
-			printf("  (%s)\n", ct);
+		ct_len = strftime(ct, sizeof(ct), width >= 8 ? "%T" : "%R", tm);
+#if defined(SOL_ON)
+		if (sol_format)
+		{
+			sol_map_start(&sol_stream);
+			SOL_MAP_KEYL(&sol_stream, "days");
+			sol_integer(&sol_stream, delta / 86400);
+			SOL_MAP_KEYL(&sol_stream, "hours");
+			sol_string(&sol_stream, ct, ct_len);
+			sol_map_end(&sol_stream);
+		}
 		else
-			printf(" (%ld+%s)\n", (long)delta / 86400, ct);
+#endif
+		{
+			if (delta < 86400)
+				printf("  (%s)\n", ct);
+			else
+				printf(" (%ld+%s)\n", (long)delta / 86400, ct);
+		}
 	}
+
+#if defined(SOL_ON)
+	if (sol_format) sol_map_end(&sol_stream);
+#endif
 }
 
 /*


More information about the svn-soc-all mailing list