socsvn commit: r271188 - soc2014/zkorchev/freebsd_head/usr.bin/finger
zkorchev at FreeBSD.org
zkorchev at FreeBSD.org
Mon Jul 21 09:48:36 UTC 2014
Author: zkorchev
Date: Mon Jul 21 09:48:34 2014
New Revision: 271188
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271188
Log:
libsol support for finger
Modified:
soc2014/zkorchev/freebsd_head/usr.bin/finger/Makefile
soc2014/zkorchev/freebsd_head/usr.bin/finger/finger.c
soc2014/zkorchev/freebsd_head/usr.bin/finger/finger.h
soc2014/zkorchev/freebsd_head/usr.bin/finger/sprint.c
Modified: soc2014/zkorchev/freebsd_head/usr.bin/finger/Makefile
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/finger/Makefile Mon Jul 21 09:48:13 2014 (r271187)
+++ soc2014/zkorchev/freebsd_head/usr.bin/finger/Makefile Mon Jul 21 09:48:34 2014 (r271188)
@@ -5,4 +5,7 @@
SRCS= finger.c lprint.c net.c sprint.c util.c
MAN= finger.1 finger.conf.5
+LDADD+= -lsol
+CFLAGS+=-DSOL_ON -I/usr/local/include
+
.include <bsd.prog.mk>
Modified: soc2014/zkorchev/freebsd_head/usr.bin/finger/finger.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/finger/finger.c Mon Jul 21 09:48:13 2014 (r271187)
+++ soc2014/zkorchev/freebsd_head/usr.bin/finger/finger.c Mon Jul 21 09:48:34 2014 (r271188)
@@ -81,6 +81,9 @@
#include <unistd.h>
#include <utmpx.h>
#include <locale.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include "finger.h"
#include "pathnames.h"
@@ -94,6 +97,11 @@
char tbuf[1024];
int invoker_root = 0;
+#if defined(SOL_ON)
+struct sol_stream sol_stream;
+#endif
+int sol_format;
+
static void loginlist(void);
static int option(int, char **);
static void usage(void);
@@ -196,6 +204,13 @@
argc -= argcnt;
argv += argcnt;
+#if defined(SOL_ON)
+ // libsol is not useful for "large" format so don't use it with it
+ if (!lflag && (!*argv || sflag)) {
+ sol_format = sol_init(&sol_stream);
+ if (sol_format) sol_array_start(&sol_stream);
+ }
+#endif
(void)time(&now);
setpassent(1);
if (!*argv) {
@@ -207,8 +222,11 @@
if (!lflag)
sflag = 1; /* if -l not explicit, force -s */
loginlist();
- if (entries == 0)
- (void)printf("No one logged on.\n");
+#if defined(SOL_ON)
+ if (sol_format)
+#endif
+ if (entries == 0)
+ (void)printf("No one logged on.\n");
} else {
userlist(argc, argv);
/*
@@ -225,6 +243,12 @@
else
sflag_print();
}
+#if defined(SOL_ON)
+ if (sol_format) {
+ sol_array_end(&sol_stream);
+ sol_term(&sol_stream);
+ }
+#endif
return (0);
}
Modified: soc2014/zkorchev/freebsd_head/usr.bin/finger/finger.h
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/finger/finger.h Mon Jul 21 09:48:13 2014 (r271187)
+++ soc2014/zkorchev/freebsd_head/usr.bin/finger/finger.h Mon Jul 21 09:48:34 2014 (r271188)
@@ -69,4 +69,9 @@
#include "extern.h"
+#if defined(SOL_ON)
+extern struct sol_stream sol_stream;
+#endif
+extern int sol_format;
+
#endif /* !_FINGER_H_ */
Modified: soc2014/zkorchev/freebsd_head/usr.bin/finger/sprint.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/finger/sprint.c Mon Jul 21 09:48:13 2014 (r271187)
+++ soc2014/zkorchev/freebsd_head/usr.bin/finger/sprint.c Mon Jul 21 09:48:34 2014 (r271188)
@@ -50,6 +50,9 @@
#include <string.h>
#include <time.h>
#include <utmpx.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include "finger.h"
static void stimeprint(WHERE *);
@@ -61,6 +64,7 @@
WHERE *w;
int sflag, r, namelen;
char p[80];
+ size_t len;
PERSON *tmp;
DBT data, key;
struct tm *lc;
@@ -85,9 +89,12 @@
*/
#define MAXREALNAME 16
#define MAXHOSTNAME 17 /* in reality, hosts are never longer than 16 */
- (void)printf("%-*s %-*s%s %s\n", MAXLOGNAME, "Login", MAXREALNAME,
- "Name", " TTY Idle Login Time ", (gflag) ? "" :
- oflag ? "Office Phone" : "Where");
+#if defined(SOL_ON)
+ if (!sol_format)
+#endif
+ (void)printf("%-*s %-*s%s %s\n", MAXLOGNAME, "Login", MAXREALNAME,
+ "Name", " TTY Idle Login Time ", (gflag) ? "" :
+ oflag ? "Office Phone" : "Where");
for (sflag = R_FIRST;; sflag = R_NEXT) {
r = (*db->seq)(db, &key, &data, sflag);
@@ -99,62 +106,136 @@
pn = tmp;
for (w = pn->whead; w != NULL; w = w->next) {
- namelen = MAXREALNAME;
- if (w->info == LOGGEDIN && !w->writable)
- --namelen; /* leave space before `*' */
- (void)printf("%-*.*s %-*.*s", MAXLOGNAME, MAXLOGNAME,
- pn->name, MAXREALNAME, namelen,
- pn->realname ? pn->realname : "");
- if (!w->loginat) {
- (void)printf(" * * No logins ");
- goto office;
- }
- (void)putchar(w->info == LOGGEDIN && !w->writable ?
- '*' : ' ');
- if (*w->tty)
- (void)printf("%-7.7s ",
- (strncmp(w->tty, "tty", 3)
- && strncmp(w->tty, "cua", 3))
- ? w->tty : w->tty + 3);
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ char buf[1 + sizeof(((struct utmpx *)0)->ut_line)];
+
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "login");
+ sol_string(&sol_stream, pn->name, strlen(pn->name));
+ if (pn->realname) {
+ SOL_MAP_KEYL(&sol_stream, "name");
+ sol_string(&sol_stream, pn->realname, strlen(pn->realname));
+ }
+ if (!w->loginat) goto office;
+ *buf = (w->info == LOGGEDIN && !w->writable ? '*' : ' ');
+ if (*w->tty)
+ strcpy(buf + 1, w->tty + ((strncmp(w->tty, "tty", 3)
+ && strncmp(w->tty, "cua", 3)) ? 0 : 3));
+ else
+ buf[1] = 0;
+ SOL_MAP_KEYL(&sol_stream, "tty");
+ sol_string(&sol_stream, buf, strlen(buf));
+ }
else
- (void)printf(" ");
+#endif
+ {
+ namelen = MAXREALNAME;
+ if (w->info == LOGGEDIN && !w->writable)
+ --namelen; /* leave space before `*' */
+ (void)printf("%-*.*s %-*.*s", MAXLOGNAME, MAXLOGNAME,
+ pn->name, MAXREALNAME, namelen,
+ pn->realname ? pn->realname : "");
+ if (!w->loginat) {
+ (void)printf(" * * No logins ");
+ goto office;
+ }
+ (void)putchar(w->info == LOGGEDIN && !w->writable ?
+ '*' : ' ');
+ if (*w->tty)
+ (void)printf("%-7.7s ",
+ (strncmp(w->tty, "tty", 3)
+ && strncmp(w->tty, "cua", 3))
+ ? w->tty : w->tty + 3);
+ else
+ (void)printf(" ");
+ }
if (w->info == LOGGEDIN) {
stimeprint(w);
- (void)printf(" ");
+#if defined(SOL_ON)
+ if (!sol_format)
+#endif
+ (void)printf(" ");
} else
- (void)printf(" * ");
+#if defined(SOL_ON)
+ if (!sol_format)
+#endif
+ (void)printf(" * ");
lc = localtime(&w->loginat);
#define SECSPERDAY 86400
#define DAYSPERWEEK 7
#define DAYSPERNYEAR 365
if (now - w->loginat < SECSPERDAY * (DAYSPERWEEK - 1)) {
- (void)strftime(p, sizeof(p), "%a", lc);
+ len = strftime(p, sizeof(p), "%a", lc);
} else {
- (void)strftime(p, sizeof(p),
+ len = strftime(p, sizeof(p),
d_first ? "%e %b" : "%b %e", lc);
}
- (void)printf("%-6.6s", p);
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "login");
+ sol_string(&sol_stream, p, len);
+ }
+ else
+#endif
+ (void)printf("%-6.6s", p);
if (now - w->loginat >= SECSPERDAY * DAYSPERNYEAR / 2) {
- (void)strftime(p, sizeof(p), "%Y", lc);
+ len = strftime(p, sizeof(p), "%Y", lc);
} else {
- (void)strftime(p, sizeof(p), "%R", lc);
+ len = strftime(p, sizeof(p), "%R", lc);
+ }
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "time");
+ sol_string(&sol_stream, p, len);
}
- (void)printf(" %-5.5s", p);
+ else
+#endif
+ (void)printf(" %-5.5s", p);
office:
if (gflag)
goto no_gecos;
- if (oflag) {
- if (pn->office)
- (void)printf(" %-7.7s", pn->office);
- else if (pn->officephone)
- (void)printf(" %-7.7s", " ");
- if (pn->officephone)
- (void)printf(" %-.9s",
- prphone(pn->officephone));
- } else
- (void)printf(" %.*s", MAXHOSTNAME, w->host);
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ if (oflag) {
+ if (pn->office) {
+ SOL_MAP_KEYL(&sol_stream, "office");
+ sol_string(&sol_stream, pn->office, strlen(pn->office));
+ }
+ if (pn->officephone) {
+ const char *phone = prphone(pn->officephone);
+ SOL_MAP_KEYL(&sol_stream, "phone");
+ sol_string(&sol_stream, phone, strlen(phone));
+ }
+ }
+ else {
+ SOL_MAP_KEYL(&sol_stream, "?host");
+ sol_string(&sol_stream, w->host, strlen(w->host));
+ }
+ }
+ else
+#endif
+ {
+ if (oflag) {
+ if (pn->office)
+ (void)printf(" %-7.7s", pn->office);
+ else if (pn->officephone)
+ (void)printf(" %-7.7s", " ");
+ if (pn->officephone)
+ (void)printf(" %-.9s",
+ prphone(pn->officephone));
+ } else
+ (void)printf(" %.*s", MAXHOSTNAME, w->host);
+ }
no_gecos:
- putchar('\n');
+#if defined(SOL_ON)
+ if (sol_format)
+ sol_map_end(&sol_stream);
+ else
+#endif
+ putchar('\n');
}
}
}
@@ -164,6 +245,28 @@
{
struct tm *delta;
+#if defined(SOL_ON)
+ if (sol_format) {
+ if (w->idletime == -1) return;
+ delta = gmtime(&w->idletime);
+ if (delta->tm_yday) {
+ SOL_MAP_KEYL(&sol_stream, "yday");
+ sol_integer(&sol_stream, delta->tm_yday);
+ }
+ else {
+ if (delta->tm_hour) {
+ SOL_MAP_KEYL(&sol_stream, "hour");
+ sol_integer(&sol_stream, delta->tm_hour);
+ }
+ if (delta->tm_min) {
+ SOL_MAP_KEYL(&sol_stream, "minute");
+ sol_integer(&sol_stream, delta->tm_min);
+ }
+ }
+ return;
+ }
+#endif
+
if (w->idletime == -1) {
(void)printf(" ");
return;
More information about the svn-soc-all
mailing list