From owner-svn-soc-all@FreeBSD.ORG Mon Jul 21 09:47:55 2014 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id C59F5D2D for ; Mon, 21 Jul 2014 09:47:55 +0000 (UTC) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id AF6E12E60 for ; Mon, 21 Jul 2014 09:47:55 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.8/8.14.8) with ESMTP id s6L9lt50064784 for ; Mon, 21 Jul 2014 09:47:55 GMT (envelope-from zkorchev@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.8/8.14.8/Submit) id s6L9lsQ9064777 for svn-soc-all@FreeBSD.org; Mon, 21 Jul 2014 09:47:54 GMT (envelope-from zkorchev@FreeBSD.org) Date: Mon, 21 Jul 2014 09:47:54 GMT Message-Id: <201407210947.s6L9lsQ9064777@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to zkorchev@FreeBSD.org using -f From: zkorchev@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r271186 - soc2014/zkorchev/freebsd_head/usr.bin/w MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Jul 2014 09:47:55 -0000 Author: zkorchev Date: Mon Jul 21 09:47:53 2014 New Revision: 271186 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271186 Log: libsol support for w/uptime Modified: soc2014/zkorchev/freebsd_head/usr.bin/w/Makefile soc2014/zkorchev/freebsd_head/usr.bin/w/extern.h soc2014/zkorchev/freebsd_head/usr.bin/w/pr_time.c soc2014/zkorchev/freebsd_head/usr.bin/w/w.c Modified: soc2014/zkorchev/freebsd_head/usr.bin/w/Makefile ============================================================================== --- soc2014/zkorchev/freebsd_head/usr.bin/w/Makefile Mon Jul 21 08:47:54 2014 (r271185) +++ soc2014/zkorchev/freebsd_head/usr.bin/w/Makefile Mon Jul 21 09:47:53 2014 (r271186) @@ -4,8 +4,9 @@ PROG= w SRCS= fmt.c pr_time.c proc_compare.c w.c MAN= w.1 uptime.1 +CFLAGS+=-DSOL_ON -I/usr/local/include DPADD= ${LIBKVM} ${LIBUTIL} -LDADD= -lkvm -lutil +LDADD= -lkvm -lutil -lsol #BINGRP= kmem #BINMODE=2555 LINKS= ${BINDIR}/w ${BINDIR}/uptime Modified: soc2014/zkorchev/freebsd_head/usr.bin/w/extern.h ============================================================================== --- soc2014/zkorchev/freebsd_head/usr.bin/w/extern.h Mon Jul 21 08:47:54 2014 (r271185) +++ soc2014/zkorchev/freebsd_head/usr.bin/w/extern.h Mon Jul 21 09:47:53 2014 (r271186) @@ -32,6 +32,11 @@ extern int use_ampm; +#if defined(SOL_ON) +extern struct sol_stream sol_stream; +#endif +extern int sol_format; + struct kinfo_proc; int pr_attime(time_t *, time_t *); int pr_idle(time_t); Modified: soc2014/zkorchev/freebsd_head/usr.bin/w/pr_time.c ============================================================================== --- soc2014/zkorchev/freebsd_head/usr.bin/w/pr_time.c Mon Jul 21 08:47:54 2014 (r271185) +++ soc2014/zkorchev/freebsd_head/usr.bin/w/pr_time.c Mon Jul 21 09:47:53 2014 (r271186) @@ -41,6 +41,9 @@ #include #include #include +#if defined(SOL_ON) +# include +#endif #include "extern.h" @@ -56,14 +59,18 @@ time_t diff; const wchar_t *fmt; int len, width, offset = 0; + static char sol_buf[256]; + const char *sol_fmt; tp = *localtime(started); tm = *localtime(now); diff = *now - *started; /* If more than a week, use day-month-year. */ - if (diff > 86400 * 7) + if (diff > 86400 * 7) { fmt = L"%d%b%y"; + sol_fmt = "%d%b%y"; + } /* If not today, use day-hour-am/pm. */ else if (tm.tm_mday != tp.tm_mday || @@ -72,23 +79,36 @@ /* The line below does not take DST into consideration */ /* else if (*now / 86400 != *started / 86400) { */ fmt = use_ampm ? L"%a%I%p" : L"%a%H"; + sol_fmt = use_ampm ? "%a%I%p" : "%a%H"; } /* Default is hh:mm{am,pm}. */ else { fmt = use_ampm ? L"%l:%M%p" : L"%k:%M"; + sol_fmt = use_ampm ? "%l:%M%p" : "%k:%M"; } - (void)wcsftime(buf, sizeof(buf), fmt, &tp); - len = wcslen(buf); - width = wcswidth(buf, len); - if (len == width) - (void)wprintf(L"%-7.7ls", buf); - else if (width < 7) - (void)wprintf(L"%ls%.*s", buf, 7 - width, " "); - else { - (void)wprintf(L"%ls", buf); - offset = width - 7; +#if defined(SOL_ON) + if (sol_format) + { + SOL_MAP_KEYL(&sol_stream, "login"); + strftime(sol_buf, sizeof(sol_buf), sol_fmt, &tp); + sol_string(&sol_stream, sol_buf, strlen(sol_buf)); + } + else +#endif + { + (void)wcsftime(buf, sizeof(buf), fmt, &tp); + len = wcslen(buf); + width = wcswidth(buf, len); + if (len == width) + (void)wprintf(L"%-7.7ls", buf); + else if (width < 7) + (void)wprintf(L"%ls%.*s", buf, 7 - width, " "); + else { + (void)wprintf(L"%ls", buf); + offset = width - 7; + } } return (offset); } @@ -104,7 +124,14 @@ /* If idle more than 36 hours, print as a number of days. */ if (idle >= 36 * 3600) { int days = idle / 86400; - (void)printf(" %dday%s ", days, days > 1 ? "s" : " " ); +#if defined(SOL_ON) + if (sol_format) { + SOL_MAP_KEYL(&sol_stream, "days"); + sol_integer(&sol_stream, days); + } + else +#endif + (void)printf(" %dday%s ", days, days > 1 ? "s" : " " ); if (days >= 100) return (2); if (days >= 10) @@ -112,16 +139,38 @@ } /* If idle more than an hour, print as HH:MM. */ - else if (idle >= 3600) - (void)printf(" %2d:%02d ", - (int)(idle / 3600), (int)((idle % 3600) / 60)); + else if (idle >= 3600) { +#if defined(SOL_ON) + if (sol_format) { + SOL_MAP_KEYL(&sol_stream, "hours"); + sol_integer(&sol_stream, idle / 3600); + SOL_MAP_KEYL(&sol_stream, "minutes"); + sol_integer(&sol_stream, (idle % 3600) / 60); + } + else +#endif + (void)printf(" %2d:%02d ", + (int)(idle / 3600), (int)((idle % 3600) / 60)); + } - else if (idle / 60 == 0) - (void)printf(" - "); + else if (idle / 60 == 0) { +#if defined(SOL_ON) + if (!sol_format) +#endif + (void)printf(" - "); + } /* Else print the minutes idle. */ - else - (void)printf(" %2d ", (int)(idle / 60)); + else { +#if defined(SOL_ON) + if (sol_format) { + SOL_MAP_KEYL(&sol_stream, "minutes"); + sol_integer(&sol_stream, idle / 60); + } + else +#endif + (void)printf(" %2d ", (int)(idle / 60)); + } return (0); /* not idle longer than 9 days */ } Modified: soc2014/zkorchev/freebsd_head/usr.bin/w/w.c ============================================================================== --- soc2014/zkorchev/freebsd_head/usr.bin/w/w.c Mon Jul 21 08:47:54 2014 (r271185) +++ soc2014/zkorchev/freebsd_head/usr.bin/w/w.c Mon Jul 21 09:47:53 2014 (r271186) @@ -82,6 +82,9 @@ #include #include #include +#if defined(SOL_ON) +# include +#endif #include "extern.h" @@ -99,6 +102,11 @@ static int use_comma; /* use comma as floats separator */ static char **sel_users; /* login array of particular users selected */ +#if defined(SOL_ON) +struct sol_stream sol_stream; +#endif +int sol_format; + /* * One of these per active utmp entry. */ @@ -254,10 +262,21 @@ } endutxent(); +#if defined(SOL_ON) + sol_format = sol_init(&sol_stream); +#endif + +#if defined(SOL_ON) + if ((header && !sol_format) || wcmd == 0) { +#else if (header || wcmd == 0) { +#endif pr_header(&now, nusers); if (wcmd == 0) { (void)kvm_close(kd); +#if defined(SOL_ON) + if (sol_format) sol_term(&sol_stream); +#endif exit(0); } @@ -342,6 +361,9 @@ } } +#if defined(SOL_ON) + if (sol_format) sol_array_start(&sol_stream); +#endif for (ep = ehead; ep != NULL; ep = ep->next) { struct addrinfo hints, *res; struct sockaddr_storage ss; @@ -411,21 +433,56 @@ dkp->ki_pid, ptr); } } - (void)printf("%-*.*s %-*.*s %-*.*s ", - W_DISPUSERSIZE, W_DISPUSERSIZE, ep->utmp.ut_user, - W_DISPLINESIZE, W_DISPLINESIZE, - *ep->utmp.ut_line ? - (strncmp(ep->utmp.ut_line, "tty", 3) && - strncmp(ep->utmp.ut_line, "cua", 3) ? - ep->utmp.ut_line : ep->utmp.ut_line + 3) : "-", - W_DISPHOSTSIZE, W_DISPHOSTSIZE, *p ? p : "-"); +#if defined(SOL_ON) + if (sol_format) + { + SOL_MAP_KEYL(&sol_stream, "user"); + sol_string(&sol_stream, ep->utmp.ut_user, strlen(ep->utmp.ut_user)); + if (*ep->utmp.ut_line) { + const char *tty = ep->utmp.ut_line; + + if (!strncmp(ep->utmp.ut_line, "tty", 3) || !strncmp(ep->utmp.ut_line, "cua", 3)) + tty += 3; + SOL_MAP_KEYL(&sol_stream, "tty"); + sol_string(&sol_stream, tty, strlen(tty)); + } + if (*p) { + SOL_MAP_KEYL(&sol_stream, "from"); + sol_string(&sol_stream, p, strlen(p)); + } + } + else +#endif + { + (void)printf("%-*.*s %-*.*s %-*.*s ", + W_DISPUSERSIZE, W_DISPUSERSIZE, ep->utmp.ut_user, + W_DISPLINESIZE, W_DISPLINESIZE, + *ep->utmp.ut_line ? + (strncmp(ep->utmp.ut_line, "tty", 3) && + strncmp(ep->utmp.ut_line, "cua", 3) ? + ep->utmp.ut_line : ep->utmp.ut_line + 3) : "-", + W_DISPHOSTSIZE, W_DISPHOSTSIZE, *p ? p : "-"); + } t = ep->utmp.ut_tv.tv_sec; longattime = pr_attime(&t, &now); longidle = pr_idle(ep->idle); - (void)printf("%.*s\n", argwidth - longidle - longattime, - ep->args); +#if defined(SOL_ON) + if (sol_format) { + SOL_MAP_KEYL(&sol_stream, "what"); + sol_string(&sol_stream, ep->args, strlen(ep->args)); + } + else +#endif + (void)printf("%.*s\n", argwidth - longidle - longattime, + ep->args); } (void)kvm_close(kd); +#if defined(SOL_ON) + if (sol_format) { + sol_array_end(&sol_stream); + sol_term(&sol_stream); + } +#endif exit(0); } @@ -438,12 +495,24 @@ int days, hrs, i, mins, secs; char buf[256]; +#if defined(SOL_ON) + if (sol_format) sol_map_start(&sol_stream); +#endif + /* * Print time of day. */ if (strftime(buf, sizeof(buf), - use_ampm ? "%l:%M%p" : "%k:%M", localtime(nowp)) != 0) - (void)printf("%s ", buf); + use_ampm ? "%l:%M%p" : "%k:%M", localtime(nowp)) != 0) { +#if defined(SOL_ON) + if (sol_format) { + SOL_MAP_KEYL(&sol_stream, "time"); + sol_string(&sol_stream, buf, strlen(buf)); + } + else +#endif + (void)printf("%s ", buf); + } /* * Print how long system has been up. */ @@ -457,36 +526,92 @@ uptime %= 3600; mins = uptime / 60; secs = uptime % 60; - (void)printf(" up"); - if (days > 0) - (void)printf(" %d day%s,", days, days > 1 ? "s" : ""); - if (hrs > 0 && mins > 0) - (void)printf(" %2d:%02d,", hrs, mins); - else if (hrs > 0) - (void)printf(" %d hr%s,", hrs, hrs > 1 ? "s" : ""); - else if (mins > 0) - (void)printf(" %d min%s,", mins, mins > 1 ? "s" : ""); + +#if defined(SOL_ON) + if (sol_format) + { + SOL_MAP_KEYL(&sol_stream, "uptime"); + sol_map_start(&sol_stream); + if (days > 0) { + SOL_MAP_KEYL(&sol_stream, "days"); + sol_integer(&sol_stream, days); + } + if (hrs > 0) { + SOL_MAP_KEYL(&sol_stream, "hours"); + sol_integer(&sol_stream, hrs); + } + else if (mins > 0) { + SOL_MAP_KEYL(&sol_stream, "minutes"); + sol_integer(&sol_stream, mins); + } + else { + SOL_MAP_KEYL(&sol_stream, "seconds"); + sol_integer(&sol_stream, secs); + } + sol_map_end(&sol_stream); + } else - (void)printf(" %d sec%s,", secs, secs > 1 ? "s" : ""); +#endif + { + (void)printf(" up"); + if (days > 0) + (void)printf(" %d day%s,", days, days > 1 ? "s" : ""); + if (hrs > 0 && mins > 0) + (void)printf(" %2d:%02d,", hrs, mins); + else if (hrs > 0) + (void)printf(" %d hr%s,", hrs, hrs > 1 ? "s" : ""); + else if (mins > 0) + (void)printf(" %d min%s,", mins, mins > 1 ? "s" : ""); + else + (void)printf(" %d sec%s,", secs, secs > 1 ? "s" : ""); + } } /* Print number of users logged in to system */ - (void)printf(" %d user%s", nusers, nusers == 1 ? "" : "s"); +#if defined(SOL_ON) + if (sol_format) { + SOL_MAP_KEYL(&sol_stream, "users"); + sol_integer(&sol_stream, nusers); + } + else +#endif + (void)printf(" %d user%s", nusers, nusers == 1 ? "" : "s"); /* * Print 1, 5, and 15 minute load averages. */ - if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) == -1) - (void)printf(", no load average information available\n"); + if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) == -1) { +#if defined(SOL_ON) + if (!sol_format) +#endif + (void)printf(", no load average information available\n"); + } else { - (void)printf(", load averages:"); - for (i = 0; i < (int)(sizeof(avenrun) / sizeof(avenrun[0])); i++) { - if (use_comma && i > 0) - (void)printf(","); - (void)printf(" %.2f", avenrun[i]); +#if defined(SOL_ON) + if (sol_format) + { + SOL_MAP_KEYL(&sol_stream, "load"); + sol_array_start(&sol_stream); + for (i = 0; i < (int)(sizeof(avenrun) / sizeof(avenrun[0])); i++) + sol_float(&sol_stream, avenrun[i]); + sol_array_end(&sol_stream); + } + else +#endif + { + (void)printf(", load averages:"); + for (i = 0; i < (int)(sizeof(avenrun) / sizeof(avenrun[0])); i++) { + if (use_comma && i > 0) + (void)printf(","); + (void)printf(" %.2f", avenrun[i]); + } + (void)printf("\n"); } - (void)printf("\n"); } + +#if defined(SOL_ON) + if (sol_format) sol_map_end(&sol_stream); +#endif } static struct stat *