summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2015-09-05 18:36:23 +0000
committerdim <dim@FreeBSD.org>2015-09-05 18:36:23 +0000
commitfe74670889cf92661ccb26dc6bd31e8227b41594 (patch)
treec2636bec23985b92b33023a5ca2e324f89604bfa /usr.bin
parent3cb87c6fdcce3fa2b08afc959741598eb31a8a5c (diff)
parent127f7b062779965375aa7d373ab56614a5d13f16 (diff)
downloadFreeBSD-src-fe74670889cf92661ccb26dc6bd31e8227b41594.zip
FreeBSD-src-fe74670889cf92661ccb26dc6bd31e8227b41594.tar.gz
Merge ^/head r286858 through r287489.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/ar/ar.c5
-rw-r--r--usr.bin/at/Makefile.inc5
-rw-r--r--usr.bin/bluetooth/btsockstat/btsockstat.c14
-rw-r--r--usr.bin/calendar/calendars/calendar.christian6
-rw-r--r--usr.bin/calendar/calendars/calendar.freebsd1
-rw-r--r--usr.bin/iconv/iconv.c8
-rw-r--r--usr.bin/iscsictl/Makefile2
-rw-r--r--usr.bin/netstat/Makefile29
-rw-r--r--usr.bin/netstat/if.c175
-rw-r--r--usr.bin/netstat/inet.c1
-rw-r--r--usr.bin/netstat/inet6.c2
-rw-r--r--usr.bin/netstat/main.c155
-rw-r--r--usr.bin/netstat/mroute.c51
-rw-r--r--usr.bin/netstat/mroute6.c6
-rw-r--r--usr.bin/netstat/netgraph.c1
-rw-r--r--usr.bin/netstat/netisr.c122
-rw-r--r--usr.bin/netstat/netstat.18
-rw-r--r--usr.bin/netstat/netstat.h18
-rw-r--r--usr.bin/netstat/nlist_symbols54
-rw-r--r--usr.bin/netstat/route.c341
-rw-r--r--usr.bin/netstat/sctp.c29
-rw-r--r--usr.bin/procstat/Makefile2
-rw-r--r--usr.bin/procstat/procstat.125
-rw-r--r--usr.bin/procstat/procstat.c61
-rw-r--r--usr.bin/procstat/procstat.h5
-rw-r--r--usr.bin/procstat/procstat_args.c51
-rw-r--r--usr.bin/procstat/procstat_auxv.c93
-rw-r--r--usr.bin/procstat/procstat_basic.c27
-rw-r--r--usr.bin/procstat/procstat_bin.c12
-rw-r--r--usr.bin/procstat/procstat_cred.c32
-rw-r--r--usr.bin/procstat/procstat_cs.c39
-rw-r--r--usr.bin/procstat/procstat_files.c176
-rw-r--r--usr.bin/procstat/procstat_kstack.c60
-rw-r--r--usr.bin/procstat/procstat_rlimit.c27
-rw-r--r--usr.bin/procstat/procstat_rusage.c60
-rw-r--r--usr.bin/procstat/procstat_sigs.c100
-rw-r--r--usr.bin/procstat/procstat_threads.c44
-rw-r--r--usr.bin/procstat/procstat_vm.c89
-rw-r--r--usr.bin/script/script.16
-rw-r--r--usr.bin/sockstat/sockstat.14
-rw-r--r--usr.bin/sockstat/sockstat.c82
-rw-r--r--usr.bin/tftp/main.c7
-rw-r--r--usr.bin/truss/amd64-fbsd.c25
-rw-r--r--usr.bin/truss/amd64-fbsd32.c26
-rw-r--r--usr.bin/truss/amd64-linux32.c29
-rw-r--r--usr.bin/truss/arm-fbsd.c25
-rw-r--r--usr.bin/truss/i386-fbsd.c25
-rw-r--r--usr.bin/truss/i386-linux.c29
-rw-r--r--usr.bin/truss/main.c29
-rw-r--r--usr.bin/truss/mips-fbsd.c25
-rw-r--r--usr.bin/truss/powerpc-fbsd.c25
-rw-r--r--usr.bin/truss/powerpc64-fbsd.c25
-rw-r--r--usr.bin/truss/sparc64-fbsd.c25
-rw-r--r--usr.bin/truss/syscall.h2
-rw-r--r--usr.bin/truss/syscalls.c684
-rw-r--r--usr.bin/vi/catalog/Makefile6
-rw-r--r--usr.bin/vtfontcvt/vtfontcvt.c44
-rw-r--r--usr.bin/w/Makefile2
-rw-r--r--usr.bin/wc/Makefile2
-rw-r--r--usr.bin/whois/whois.c2
-rw-r--r--usr.bin/xargs/tests/regress.n2P0.out4
-rw-r--r--usr.bin/xargs/tests/regress.sh2
-rw-r--r--usr.bin/xo/Makefile2
-rw-r--r--usr.bin/ypcat/ypcat.16
-rw-r--r--usr.bin/ypmatch/ypmatch.16
-rw-r--r--usr.bin/ypwhich/Makefile6
-rw-r--r--usr.bin/ypwhich/ypwhich.114
-rw-r--r--usr.bin/ypwhich/ypwhich.c170
68 files changed, 1756 insertions, 1519 deletions
diff --git a/usr.bin/ar/ar.c b/usr.bin/ar/ar.c
index 4dee029..0c69315 100644
--- a/usr.bin/ar/ar.c
+++ b/usr.bin/ar/ar.c
@@ -144,8 +144,11 @@ main(int argc, char **argv)
if (*argv == NULL)
ranlib_usage();
+ /* Enable determinstic mode unless -U is set. */
+ if (Uflag == 0)
+ bsdar->options |= AR_D;
bsdar->options |= AR_S;
- for (;(bsdar->filename = *argv++) != NULL;)
+ while ((bsdar->filename = *argv++) != NULL)
ar_mode_s(bsdar);
exit(EX_OK);
diff --git a/usr.bin/at/Makefile.inc b/usr.bin/at/Makefile.inc
index ec44e1f..2dab559 100644
--- a/usr.bin/at/Makefile.inc
+++ b/usr.bin/at/Makefile.inc
@@ -1,4 +1,5 @@
-VERSION= 2.9
+# $FreeBSD$
+
LOCKFILE = .lockfile
ATSPOOL_DIR=/var/at/spool
ATJOB_DIR=/var/at/jobs
@@ -13,7 +14,7 @@ PERM_PATH=/var/at
CFLAGS += -DATJOB_DIR=\"$(ATJOB_DIR)/\" \
-DLFILE=\"$(ATJOB_DIR)/$(LOCKFILE)\" \
-DLOADAVG_MX=$(LOADAVG_MX) -DATSPOOL_DIR=\"$(ATSPOOL_DIR)\" \
- -DVERSION=\"$(VERSION)\" -DDAEMON_UID=$(DAEMON_UID) -DDAEMON_GID=$(DAEMON_GID) \
+ -DDAEMON_UID=$(DAEMON_UID) -DDAEMON_GID=$(DAEMON_GID) \
-DDEFAULT_BATCH_QUEUE=\'$(DEFAULT_BATCH_QUEUE)\' \
-DDEFAULT_AT_QUEUE=\'$(DEFAULT_AT_QUEUE)\' -DPERM_PATH=\"$(PERM_PATH)/\"
diff --git a/usr.bin/bluetooth/btsockstat/btsockstat.c b/usr.bin/bluetooth/btsockstat/btsockstat.c
index aa85286..78f6127 100644
--- a/usr.bin/bluetooth/btsockstat/btsockstat.c
+++ b/usr.bin/bluetooth/btsockstat/btsockstat.c
@@ -154,9 +154,9 @@ main(int argc, char *argv[])
* Discard setgid privileges if not the running kernel so that
* bad guys can't print interesting stuff from kernel memory.
*/
-
if (memf != NULL)
- setgid(getgid());
+ if (setgid(getgid()) != 0)
+ err(1, "setgid");
kvmd = kopen(memf);
if (kvmd == NULL)
@@ -583,15 +583,9 @@ kopen(char const *memf)
kvm_t *kvmd = NULL;
char errbuf[_POSIX2_LINE_MAX];
- /*
- * Discard setgid privileges if not the running kernel so that
- * bad guys can't print interesting stuff from kernel memory.
- */
-
- if (memf != NULL)
- setgid(getgid());
-
kvmd = kvm_openfiles(NULL, memf, NULL, O_RDONLY, errbuf);
+ if (setgid(getgid()) != 0)
+ err(1, "setgid");
if (kvmd == NULL) {
warnx("kvm_openfiles: %s", errbuf);
return (NULL);
diff --git a/usr.bin/calendar/calendars/calendar.christian b/usr.bin/calendar/calendars/calendar.christian
index 3365b07..f213594 100644
--- a/usr.bin/calendar/calendars/calendar.christian
+++ b/usr.bin/calendar/calendars/calendar.christian
@@ -5,8 +5,9 @@
*/
#ifndef _calendar_christian_
-#define _calendar_christian_
+#define _calendar_christian_
+01/01 Solemnity of Mary, Mother of God
01/05 Last (twelfth) day of Christmastide
01/06 Epiphany
Easter-47 Shrove Tuesday / Mardi Gras (day before Ash Wednesday)
@@ -21,10 +22,13 @@ Easter+50 Whitmonday
Easter+56 Trinity Sunday (7 days after Pentecost)
Easter+60 Corpus Christi (11 days after Pentecost)
05/28* Rogation Sunday
+08/15 Assumption of the Blessed Virgin Mary
10/18 Feast Day of St. Luke
+11/01 All Saints' Day
11/SunLast First Sunday of Advent (4th Sunday before Christmas)
12/SunFirst First Sunday of Advent (4th Sunday before Christmas)
12/06 St. Nicholas' Day
+12/08 Feast of the Immaculate Conception
12/24 Christmas Eve
12/25 Christmastide begins: First day of Christmas
12/26 Second day of Christmas (Boxing Day)
diff --git a/usr.bin/calendar/calendars/calendar.freebsd b/usr.bin/calendar/calendars/calendar.freebsd
index 4d473c9..6817ce2 100644
--- a/usr.bin/calendar/calendars/calendar.freebsd
+++ b/usr.bin/calendar/calendars/calendar.freebsd
@@ -259,6 +259,7 @@
08/06 Damjan Marion <dmarion@FreeBSD.org> born in Rijeka, Croatia, 1978
08/07 Jonathan Mini <mini@FreeBSD.org> born in San Mateo, California, United States, 1979
08/08 Mikolaj Golub <trociny@FreeBSD.org> born in Kharkov, USSR, 1977
+08/09 Stefan Farfeleder <stefanf@FreeBSD.org> died in Wien, Austria, 2015
08/10 Julio Merino <jmmv@FreeBSD.org> born in Barcelona, Spain, 1984
08/10 Peter Pentchev <roam@FreeBSD.org> born in Sofia, Bulgaria, 1977
08/12 Joe Marcus Clarke <marcus@FreeBSD.org> born in Lakeland, Florida, United States, 1976
diff --git a/usr.bin/iconv/iconv.c b/usr.bin/iconv/iconv.c
index 494aaf7..161b22e 100644
--- a/usr.bin/iconv/iconv.c
+++ b/usr.bin/iconv/iconv.c
@@ -156,11 +156,11 @@ int
main(int argc, char **argv)
{
FILE *fp;
- char *opt_f, *opt_t;
+ const char *opt_f, *opt_t;
int ch, i, res;
bool opt_c = false, opt_s = false;
- opt_f = opt_t = strdup("");
+ opt_f = opt_t = "";
setlocale(LC_ALL, "");
setprogname(argv[0]);
@@ -186,12 +186,12 @@ main(int argc, char **argv)
case 'f':
/* from */
if (optarg != NULL)
- opt_f = strdup(optarg);
+ opt_f = optarg;
break;
case 't':
/* to */
if (optarg != NULL)
- opt_t = strdup(optarg);
+ opt_t = optarg;
break;
default:
usage();
diff --git a/usr.bin/iscsictl/Makefile b/usr.bin/iscsictl/Makefile
index 4437e2d..9b2e1f1 100644
--- a/usr.bin/iscsictl/Makefile
+++ b/usr.bin/iscsictl/Makefile
@@ -6,7 +6,7 @@ CFLAGS+= -I${.CURDIR}
CFLAGS+= -I${.CURDIR}/../../sys/dev/iscsi
MAN= iscsi.conf.5 iscsictl.8
-LIBADD= xo
+LIBADD= xo util
YFLAGS+= -v
LFLAGS+= -i
diff --git a/usr.bin/netstat/Makefile b/usr.bin/netstat/Makefile
index 9c70eb4..abfebf4 100644
--- a/usr.bin/netstat/Makefile
+++ b/usr.bin/netstat/Makefile
@@ -4,9 +4,32 @@
.include <src.opts.mk>
PROG= netstat
-SRCS= if.c inet.c main.c mbuf.c mroute.c netisr.c route.c \
+SRCS= if.c inet.c main.c mbuf.c mroute.c netisr.c nl_symbols.c route.c \
unix.c mroute6.c ipsec.c bpf.c pfkey.c sctp.c \
flowtable.c
+DPSRCS= nl_defs.h
+
+nl_symbols.c: nlist_symbols
+ awk '\
+ BEGIN { \
+ print "#include <sys/param.h>"; \
+ print "#include <nlist.h>"; \
+ print "struct nlist nl[] = {"; \
+ } \
+ !/^\#/ { printf("\t{ .n_name = \"%s\" },\n", $$2); } \
+ END { print "\t{ .n_name = NULL },\n};" } \
+ ' < ${.ALLSRC} > ${.TARGET} || rm -f ${.TARGET}
+nl_defs.h: nlist_symbols
+ awk '\
+ BEGIN { \
+ print "#include <nlist.h>"; \
+ print "extern struct nlist nl[];"; \
+ i = 0; \
+ } \
+ !/^\#/ { printf("\#define\tN%s\t%s\n", toupper($$2), i++); }' \
+ < ${.ALLSRC} > ${.TARGET} || rm -f ${.TARGET}
+CLEANFILES+= nl_symbols.c nl_defs.h
+CFLAGS+= -I${.OBJDIR}
WARNS?= 3
CFLAGS+=-fno-strict-aliasing
@@ -33,7 +56,7 @@ CFLAGS+=-DPF
BINGRP= kmem
BINMODE=2555
-LIBADD= kvm memstat util
+LIBADD= kvm memstat xo util
.if ${MK_NETGRAPH_SUPPORT} != "no"
SRCS+= netgraph.c
@@ -41,6 +64,4 @@ LIBADD+= netgraph
CFLAGS+=-DNETGRAPH
.endif
-LIBADD+= xo
-
.include <bsd.prog.mk>
diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c
index 109ef2d..e98b011 100644
--- a/usr.bin/netstat/if.c
+++ b/usr.bin/netstat/if.c
@@ -75,11 +75,7 @@ __FBSDID("$FreeBSD$");
#include "netstat.h"
-static void sidewaysintpr(int);
-
-#ifdef INET6
-static char addr_buf[NI_MAXHOST]; /* for getnameinfo() */
-#endif
+static void sidewaysintpr(void);
#ifdef PF
static const char* pfsyncacts[] = {
@@ -205,7 +201,7 @@ pfsync_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
*/
static void
show_stat(const char *fmt, int width, const char *name,
- u_long value, short showvalue)
+ u_long value, short showvalue, int div1000)
{
const char *lsep, *rsep;
char newfmt[64];
@@ -242,7 +238,8 @@ show_stat(const char *fmt, int width, const char *name,
/* Format in human readable form. */
humanize_number(buf, sizeof(buf), (int64_t)value, "",
- HN_AUTOSCALE, HN_NOSPACE | HN_DECIMAL);
+ HN_AUTOSCALE, HN_NOSPACE | HN_DECIMAL | \
+ ((div1000) ? HN_DIVISOR_1000 : 0));
maybe_pad(lsep);
snprintf(newfmt, sizeof(newfmt), "{:%s/%%%ds}", name, width);
xo_emit(newfmt, buf);
@@ -280,13 +277,13 @@ next_ifma(struct ifmaddrs *ifma, const char *name, const sa_family_t family)
* Print a description of the network interfaces.
*/
void
-intpr(int interval, void (*pfunc)(char *), int af)
+intpr(void (*pfunc)(char *), int af)
{
struct ifaddrs *ifap, *ifa;
struct ifmaddrs *ifmap, *ifma;
if (interval)
- return sidewaysintpr(interval);
+ return sidewaysintpr();
if (getifaddrs(&ifap) != 0)
err(EX_OSERR, "getifaddrs");
@@ -357,7 +354,7 @@ intpr(int interval, void (*pfunc)(char *), int af)
name, ifa->ifa_flags, xname);
#define IFA_MTU(ifa) (((struct if_data *)(ifa)->ifa_data)->ifi_mtu)
- show_stat("lu", 6, "mtu", IFA_MTU(ifa), IFA_MTU(ifa));
+ show_stat("lu", 6, "mtu", IFA_MTU(ifa), IFA_MTU(ifa), 0);
#undef IFA_MTU
switch (ifa->ifa_addr->sa_family) {
@@ -366,85 +363,79 @@ intpr(int interval, void (*pfunc)(char *), int af)
xo_emit("{:address/%-15.15s} ", "none");
break;
case AF_INET:
- {
- struct sockaddr_in *sin, *mask;
-
- sin = (struct sockaddr_in *)ifa->ifa_addr;
- mask = (struct sockaddr_in *)ifa->ifa_netmask;
- xo_emit("{t:network/%-13.13s} ",
- netname(sin->sin_addr.s_addr,
- mask->sin_addr.s_addr));
- xo_emit("{t:address/%-17.17s} ",
- routename(sin->sin_addr.s_addr));
+ if (Wflag) {
+ xo_emit("{t:network/%-13s} ",
+ netname(ifa->ifa_addr, ifa->ifa_netmask));
+ xo_emit("{t:address/%-17s} ",
+ routename(ifa->ifa_addr, numeric_addr));
+ } else {
+ xo_emit("{t:network/%-13.13s} ",
+ netname(ifa->ifa_addr, ifa->ifa_netmask));
+ xo_emit("{t:address/%-17.17s} ",
+ routename(ifa->ifa_addr, numeric_addr));
+ }
network = true;
break;
- }
#ifdef INET6
case AF_INET6:
- {
- struct sockaddr_in6 *sin6, *mask;
-
- sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
- mask = (struct sockaddr_in6 *)ifa->ifa_netmask;
-
- xo_emit("{t:network/%-13.13s} ",
- netname6(sin6, &mask->sin6_addr));
- getnameinfo(ifa->ifa_addr, ifa->ifa_addr->sa_len,
- addr_buf, sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
- xo_emit("{t:address/%-17.17s} ", addr_buf);
+ if (Wflag) {
+ xo_emit("{t:network/%-13s} ",
+ netname(ifa->ifa_addr, ifa->ifa_netmask));
+ xo_emit("{t:address/%-17s} ",
+ routename(ifa->ifa_addr, numeric_addr));
+ } else {
+ xo_emit("{t:network/%-13.13s} ",
+ netname(ifa->ifa_addr, ifa->ifa_netmask));
+ xo_emit("{t:address/%-17.17s} ",
+ routename(ifa->ifa_addr, numeric_addr));
+ }
- network = 1;
+ network = true;
break;
- }
#endif /* INET6 */
case AF_LINK:
{
struct sockaddr_dl *sdl;
- char *cp, linknum[10];
- int len = 32;
- char buf[len];
- int n, z;
+ char linknum[10];
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
- cp = (char *)LLADDR(sdl);
- n = sdl->sdl_alen;
sprintf(linknum, "<Link#%d>", sdl->sdl_index);
xo_emit("{t:network/%-13.13s} ", linknum);
- buf[0] = '\0';
- z = 0;
- while ((--n >= 0) && (z < len)) {
- snprintf(buf + z, len - z, "%02x%c",
- *cp++ & 0xff, n > 0 ? ':' : ' ');
- z += 3;
- }
- if (z > 0)
- xo_emit("{:address/%*s}", 32 - z, buf);
- else
+ if (sdl->sdl_nlen == 0 &&
+ sdl->sdl_alen == 0 &&
+ sdl->sdl_slen == 0)
xo_emit("{P: }");
- link = 1;
+ else
+ xo_emit("{:address/%*s}",
+ 32 - 3 * sdl->sdl_alen,
+ routename(ifa->ifa_addr, 1));
+ link = true;
break;
}
}
#define IFA_STAT(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
show_stat("lu", 8, "received-packets", IFA_STAT(ipackets),
- link|network);
- show_stat("lu", 5, "received-errors", IFA_STAT(ierrors), link);
- show_stat("lu", 5, "dropped-packets", IFA_STAT(iqdrops), link);
+ link|network, 1);
+ show_stat("lu", 5, "received-errors", IFA_STAT(ierrors),
+ link, 1);
+ show_stat("lu", 5, "dropped-packets", IFA_STAT(iqdrops),
+ link, 1);
if (bflag)
show_stat("lu", 10, "received-bytes", IFA_STAT(ibytes),
- link|network);
+ link|network, 0);
show_stat("lu", 8, "sent-packets", IFA_STAT(opackets),
- link|network);
- show_stat("lu", 5, "send-errors", IFA_STAT(oerrors), link);
+ link|network, 1);
+ show_stat("lu", 5, "send-errors", IFA_STAT(oerrors), link, 1);
if (bflag)
show_stat("lu", 10, "sent-bytes", IFA_STAT(obytes),
- link|network);
- show_stat("NRSlu", 5, "collisions", IFA_STAT(collisions), link);
+ link|network, 0);
+ show_stat("NRSlu", 5, "collisions", IFA_STAT(collisions),
+ link, 1);
if (dflag)
show_stat("LSlu", 5, "dropped-packets",
- IFA_STAT(oqdrops), link);
+ IFA_STAT(oqdrops), link, 1);
xo_emit("\n");
if (!aflag) {
@@ -465,44 +456,30 @@ intpr(int interval, void (*pfunc)(char *), int af)
xo_open_instance("multicast-address");
switch (ifma->ifma_addr->sa_family) {
- case AF_INET:
- {
- struct sockaddr_in *sin;
-
- sin = (struct sockaddr_in *)ifma->ifma_addr;
- fmt = routename(sin->sin_addr.s_addr);
- break;
- }
-#ifdef INET6
- case AF_INET6:
-
- /* in6_fillscopeid(&msa.in6); */
- getnameinfo(ifma->ifma_addr,
- ifma->ifma_addr->sa_len, addr_buf,
- sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
- xo_emit("{P:/%*s }{t:address/%-19.19s}",
- Wflag ? 27 : 25, "", addr_buf);
- break;
-#endif /* INET6 */
case AF_LINK:
{
struct sockaddr_dl *sdl;
sdl = (struct sockaddr_dl *)ifma->ifma_addr;
- switch (sdl->sdl_type) {
- case IFT_ETHER:
- case IFT_FDDI:
- fmt = ether_ntoa(
- (struct ether_addr *)LLADDR(sdl));
+ if (sdl->sdl_type != IFT_ETHER &&
+ sdl->sdl_type != IFT_FDDI)
break;
- }
- break;
}
+ /* FALLTHROUGH */
+ case AF_INET:
+#ifdef INET6
+ case AF_INET6:
+#endif /* INET6 */
+ fmt = routename(ifma->ifma_addr, numeric_addr);
+ break;
}
-
if (fmt) {
- xo_emit("{P:/%*s }{t:address/%-17.17s/}",
- Wflag ? 27 : 25, "", fmt);
+ if (Wflag)
+ xo_emit("{P:/%27s }"
+ "{t:address/%-17s/}", "", fmt);
+ else
+ xo_emit("{P:/%25s }"
+ "{t:address/%-17.17s/}", "", fmt);
if (ifma->ifma_addr->sa_family == AF_LINK) {
xo_emit(" {:received-packets/%8lu}",
IFA_STAT(imcasts));
@@ -596,7 +573,7 @@ catchalarm(int signo __unused)
* First line printed at top of screen is always cumulative.
*/
static void
-sidewaysintpr(int interval)
+sidewaysintpr(void)
{
struct iftot ift[2], *new, *old;
struct itimerval interval_it;
@@ -643,24 +620,24 @@ loop:
xo_open_instance("stats");
show_stat("lu", 10, "received-packets",
- new->ift_ip - old->ift_ip, 1);
+ new->ift_ip - old->ift_ip, 1, 1);
show_stat("lu", 5, "received-errors",
- new->ift_ie - old->ift_ie, 1);
+ new->ift_ie - old->ift_ie, 1, 1);
show_stat("lu", 5, "dropped-packets",
- new->ift_id - old->ift_id, 1);
+ new->ift_id - old->ift_id, 1, 1);
show_stat("lu", 10, "received-bytes",
- new->ift_ib - old->ift_ib, 1);
+ new->ift_ib - old->ift_ib, 1, 0);
show_stat("lu", 10, "sent-packets",
- new->ift_op - old->ift_op, 1);
+ new->ift_op - old->ift_op, 1, 1);
show_stat("lu", 5, "send-errors",
- new->ift_oe - old->ift_oe, 1);
+ new->ift_oe - old->ift_oe, 1, 1);
show_stat("lu", 10, "sent-bytes",
- new->ift_ob - old->ift_ob, 1);
+ new->ift_ob - old->ift_ob, 1, 0);
show_stat("NRSlu", 5, "collisions",
- new->ift_co - old->ift_co, 1);
+ new->ift_co - old->ift_co, 1, 1);
if (dflag)
show_stat("LSlu", 5, "dropped-packets",
- new->ift_od - old->ift_od, 1);
+ new->ift_od - old->ift_od, 1, 1);
xo_close_instance("stats");
xo_emit("\n");
xo_flush();
diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c
index c966bf4..4c3675a 100644
--- a/usr.bin/netstat/inet.c
+++ b/usr.bin/netstat/inet.c
@@ -66,7 +66,6 @@ __FBSDID("$FreeBSD$");
#include <netinet/tcp_fsm.h>
#include <netinet/tcp_timer.h>
#include <netinet/tcp_var.h>
-#include <netinet/tcp_debug.h>
#include <netinet/udp.h>
#include <netinet/udp_var.h>
diff --git a/usr.bin/netstat/inet6.c b/usr.bin/netstat/inet6.c
index 3535f45..6cdc46b 100644
--- a/usr.bin/netstat/inet6.c
+++ b/usr.bin/netstat/inet6.c
@@ -71,8 +71,6 @@ __FBSDID("$FreeBSD$");
#include <libxo/xo.h>
#include "netstat.h"
-struct socket sockb;
-
char *inet6name(struct in6_addr *);
static char ntop_buf[INET6_ADDRSTRLEN];
diff --git a/usr.bin/netstat/main.c b/usr.bin/netstat/main.c
index 477add6..c364543 100644
--- a/usr.bin/netstat/main.c
+++ b/usr.bin/netstat/main.c
@@ -28,7 +28,7 @@
*/
#ifndef lint
-char const copyright[] =
+static char const copyright[] =
"@(#) Copyright (c) 1983, 1988, 1993\n\
Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
@@ -69,95 +69,10 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <unistd.h>
#include "netstat.h"
+#include "nl_defs.h"
#include <libxo/xo.h>
-static struct nlist nl[] = {
-#define N_RTSTAT 0
- { .n_name = "_rtstat" },
-#define N_RTREE 1
- { .n_name = "_rt_tables"},
-#define N_MRTSTAT 2
- { .n_name = "_mrtstat" },
-#define N_MFCHASHTBL 3
- { .n_name = "_mfchashtbl" },
-#define N_VIFTABLE 4
- { .n_name = "_viftable" },
-#define N_NGSOCKS 5
- { .n_name = "_ngsocklist"},
-#define N_IP6STAT 6
- { .n_name = "_ip6stat" },
-#define N_ICMP6STAT 7
- { .n_name = "_icmp6stat" },
-#define N_IPSECSTAT 8
- { .n_name = "_ipsec4stat" },
-#define N_IPSEC6STAT 9
- { .n_name = "_ipsec6stat" },
-#define N_PIM6STAT 10
- { .n_name = "_pim6stat" },
-#define N_MRT6STAT 11
- { .n_name = "_mrt6stat" },
-#define N_MF6CTABLE 12
- { .n_name = "_mf6ctable" },
-#define N_MIF6TABLE 13
- { .n_name = "_mif6table" },
-#define N_PFKEYSTAT 14
- { .n_name = "_pfkeystat" },
-#define N_RTTRASH 15
- { .n_name = "_rttrash" },
-#define N_CARPSTAT 16
- { .n_name = "_carpstats" },
-#define N_PFSYNCSTAT 17
- { .n_name = "_pfsyncstats" },
-#define N_AHSTAT 18
- { .n_name = "_ahstat" },
-#define N_ESPSTAT 19
- { .n_name = "_espstat" },
-#define N_IPCOMPSTAT 20
- { .n_name = "_ipcompstat" },
-#define N_TCPSTAT 21
- { .n_name = "_tcpstat" },
-#define N_UDPSTAT 22
- { .n_name = "_udpstat" },
-#define N_IPSTAT 23
- { .n_name = "_ipstat" },
-#define N_ICMPSTAT 24
- { .n_name = "_icmpstat" },
-#define N_IGMPSTAT 25
- { .n_name = "_igmpstat" },
-#define N_PIMSTAT 26
- { .n_name = "_pimstat" },
-#define N_TCBINFO 27
- { .n_name = "_tcbinfo" },
-#define N_UDBINFO 28
- { .n_name = "_udbinfo" },
-#define N_DIVCBINFO 29
- { .n_name = "_divcbinfo" },
-#define N_RIPCBINFO 30
- { .n_name = "_ripcbinfo" },
-#define N_UNP_COUNT 31
- { .n_name = "_unp_count" },
-#define N_UNP_GENCNT 32
- { .n_name = "_unp_gencnt" },
-#define N_UNP_DHEAD 33
- { .n_name = "_unp_dhead" },
-#define N_UNP_SHEAD 34
- { .n_name = "_unp_shead" },
-#define N_RIP6STAT 36
- { .n_name = "_rip6stat" },
-#define N_SCTPSTAT 36
- { .n_name = "_sctpstat" },
-#define N_MFCTABLESIZE 37
- { .n_name = "_mfctablesize" },
-#define N_ARPSTAT 38
- { .n_name = "_arpstat" },
-#define N_UNP_SPHEAD 39
- { .n_name = "unp_sphead" },
-#define N_SFSTAT 40
- { .n_name = "_sfstat"},
- { .n_name = NULL },
-};
-
-struct protox {
+static struct protox {
int pr_index; /* index into nlist of cb head */
int pr_sindex; /* index into nlist of stat block */
u_char pr_wanted; /* 1 if wanted, 0 otherwise */
@@ -191,7 +106,7 @@ struct protox {
{ N_RIPCBINFO, N_IGMPSTAT, 1, protopr,
igmp_stats, NULL, "igmp", 1, IPPROTO_IGMP },
#ifdef IPSEC
- { -1, N_IPSECSTAT, 1, NULL, /* keep as compat */
+ { -1, N_IPSEC4STAT, 1, NULL, /* keep as compat */
ipsec_stats, NULL, "ipsec", 0, 0},
{ -1, N_AHSTAT, 1, NULL,
ah_stats, NULL, "ah", 0, 0},
@@ -202,10 +117,10 @@ struct protox {
#endif
{ N_RIPCBINFO, N_PIMSTAT, 1, protopr,
pim_stats, NULL, "pim", 1, IPPROTO_PIM },
- { -1, N_CARPSTAT, 1, NULL,
+ { -1, N_CARPSTATS, 1, NULL,
carp_stats, NULL, "carp", 1, 0 },
#ifdef PF
- { -1, N_PFSYNCSTAT, 1, NULL,
+ { -1, N_PFSYNCSTATS, 1, NULL,
pfsync_stats, NULL, "pfsync", 1, 0 },
#endif
{ -1, N_ARPSTAT, 1, NULL,
@@ -215,7 +130,7 @@ struct protox {
};
#ifdef INET6
-struct protox ip6protox[] = {
+static struct protox ip6protox[] = {
{ N_TCBINFO, N_TCPSTAT, 1, protopr,
tcp_stats, NULL, "tcp", 1, IPPROTO_TCP },
{ N_UDBINFO, N_UDPSTAT, 1, protopr,
@@ -244,7 +159,7 @@ struct protox ip6protox[] = {
#endif /*INET6*/
#ifdef IPSEC
-struct protox pfkeyprotox[] = {
+static struct protox pfkeyprotox[] = {
{ -1, N_PFKEYSTAT, 1, NULL,
pfkey_stats, NULL, "pfkey", 0, 0 },
{ -1, -1, 0, NULL,
@@ -253,17 +168,17 @@ struct protox pfkeyprotox[] = {
#endif
#ifdef NETGRAPH
-struct protox netgraphprotox[] = {
- { N_NGSOCKS, -1, 1, netgraphprotopr,
+static struct protox netgraphprotox[] = {
+ { N_NGSOCKLIST, -1, 1, netgraphprotopr,
NULL, NULL, "ctrl", 0, 0 },
- { N_NGSOCKS, -1, 1, netgraphprotopr,
+ { N_NGSOCKLIST, -1, 1, netgraphprotopr,
NULL, NULL, "data", 0, 0 },
{ -1, -1, 0, NULL,
NULL, NULL, NULL, 0, 0 }
};
#endif
-struct protox *protoprotox[] = {
+static struct protox *protoprotox[] = {
protox,
#ifdef INET6
ip6protox,
@@ -278,12 +193,14 @@ static void usage(void);
static struct protox *name2protox(const char *);
static struct protox *knownname(const char *);
+static int kresolve_list(struct nlist *_nl);
+
static kvm_t *kvmd;
static char *nlistf = NULL, *memf = NULL;
int Aflag; /* show addresses of protocol control block */
int aflag; /* show all sockets (including servers) */
-int Bflag; /* show information about bpf consumers */
+static int Bflag; /* show information about bpf consumers */
int bflag; /* show i/f total bytes in/out */
int dflag; /* show i/f dropped packets */
int gflag; /* show group (multicast) routing or stats */
@@ -295,7 +212,7 @@ int noutputs = 0; /* how much outputs before we exit */
int numeric_addr; /* show addresses numerically */
int numeric_port; /* show ports numerically */
static int pflag; /* show given protocol */
-int Qflag; /* show netisr information */
+static int Qflag; /* show netisr information */
int rflag; /* show routing tables (or routing stats) */
int Rflag; /* show flow / RSS statistics */
int sflag; /* show protocol statistics */
@@ -309,7 +226,7 @@ int interval; /* repeat interval for i/f stats */
char *interface; /* desired i/f for stats, or NULL for all i/fs */
int unit; /* unit number for above */
-int af; /* address family */
+static int af; /* address family */
int live; /* true if we are examining a live system */
int
@@ -374,7 +291,8 @@ main(int argc, char *argv[])
else if (strcmp(optarg, "pfkey") == 0)
af = PF_KEY;
#endif
- else if (strcmp(optarg, "unix") == 0)
+ else if (strcmp(optarg, "unix") == 0 ||
+ strcmp(optarg, "local") == 0)
af = AF_UNIX;
#ifdef NETGRAPH
else if (strcmp(optarg, "ng") == 0
@@ -498,8 +416,10 @@ main(int argc, char *argv[])
* guys can't print interesting stuff from kernel memory.
*/
live = (nlistf == NULL && memf == NULL);
- if (!live)
- setgid(getgid());
+ if (!live) {
+ if (setgid(getgid()) != 0)
+ xo_err(-1, "setgid");
+ }
if (xflag && Tflag)
xo_errx(1, "-x and -T are incompatible, pick one.");
@@ -523,9 +443,9 @@ main(int argc, char *argv[])
if (Qflag) {
if (!live) {
if (kread(0, NULL, 0) == 0)
- netisr_stats(kvmd);
+ netisr_stats();
} else
- netisr_stats(NULL);
+ netisr_stats();
xo_finish();
exit(0);
}
@@ -545,7 +465,7 @@ main(int argc, char *argv[])
#endif
if (iflag && !sflag) {
xo_open_container("statistics");
- intpr(interval, NULL, af);
+ intpr(NULL, af);
xo_close_container("statistics");
xo_finish();
exit(0);
@@ -643,7 +563,7 @@ printproto(struct protox *tp, const char *name, bool *first)
if (sflag) {
if (iflag) {
if (tp->pr_istats)
- intpr(interval, tp->pr_istats, af);
+ intpr(tp->pr_istats, af);
else if (pflag)
xo_message("%s: no per-interface stats routine",
tp->pr_name);
@@ -704,7 +624,8 @@ kvmd_init(void)
return (0);
kvmd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf);
- setgid(getgid());
+ if (setgid(getgid()) != 0)
+ xo_err(-1, "setgid");
if (kvmd == NULL) {
xo_warnx("kvm not available: %s", errbuf);
@@ -717,7 +638,7 @@ kvmd_init(void)
/*
* Resolve symbol list, return 0 on success.
*/
-int
+static int
kresolve_list(struct nlist *_nl)
{
@@ -739,6 +660,22 @@ kresolve_list(struct nlist *_nl)
}
/*
+ * Wrapper of kvm_dpcpu_setcpu().
+ */
+void
+kset_dpcpu(u_int cpuid)
+{
+
+ if ((kvmd == NULL) && (kvmd_init() != 0))
+ xo_errx(-1, "%s: kvm is not available", __func__);
+
+ if (kvm_dpcpu_setcpu(kvmd, cpuid) < 0)
+ xo_errx(-1, "%s: kvm_dpcpu_setcpu(%u): %s", __func__,
+ cpuid, kvm_geterr(kvmd));
+ return;
+}
+
+/*
* Read kernel memory, return 0 on success.
*/
int
diff --git a/usr.bin/netstat/mroute.c b/usr.bin/netstat/mroute.c
index 37c8868..93b640c 100644
--- a/usr.bin/netstat/mroute.c
+++ b/usr.bin/netstat/mroute.c
@@ -65,28 +65,14 @@ __FBSDID("$FreeBSD$");
#undef _KERNEL
#include <err.h>
-#include <nlist.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
+#include <string.h>
#include <libxo/xo.h>
#include "netstat.h"
-
-/*
- * kvm(3) bindings for every needed symbol
- */
-static struct nlist mrl[] = {
-#define N_MRTSTAT 0
- { .n_name = "_mrtstat" },
-#define N_MFCHASHTBL 1
- { .n_name = "_mfchashtbl" },
-#define N_VIFTABLE 2
- { .n_name = "_viftable" },
-#define N_MFCTABLESIZE 3
- { .n_name = "_mfctablesize" },
- { .n_name = NULL },
-};
+#include "nl_defs.h"
static void print_bw_meter(struct bw_meter *, int *);
static void print_mfc(struct mfc *, int, int *);
@@ -178,12 +164,17 @@ print_bw_meter(struct bw_meter *bw_meter, int *banner_printed)
static void
print_mfc(struct mfc *m, int maxvif, int *banner_printed)
{
+ struct sockaddr_in sin;
+ struct sockaddr *sa = (struct sockaddr *)&sin;
struct bw_meter bw_meter, *bwm;
int bw_banner_printed;
int error;
vifi_t vifi;
bw_banner_printed = 0;
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_len = sizeof(sin);
+ sin.sin_family = AF_INET;
if (! *banner_printed) {
xo_open_list("multicast-forwarding-entry");
@@ -193,9 +184,11 @@ print_mfc(struct mfc *m, int maxvif, int *banner_printed)
*banner_printed = 1;
}
- xo_emit(" {:origin-address/%-15.15s}", routename(m->mfc_origin.s_addr));
+ memcpy(&sin.sin_addr, &m->mfc_origin, sizeof(sin.sin_addr));
+ xo_emit(" {:origin-address/%-15.15s}", routename(sa, numeric_addr));
+ memcpy(&sin.sin_addr, &m->mfc_mcastgrp, sizeof(sin.sin_addr));
xo_emit(" {:group-address/%-15.15s}",
- routename(m->mfc_mcastgrp.s_addr));
+ routename(sa, numeric_addr));
xo_emit(" {:sent-packets/%9lu}", m->mfc_pkt_cnt);
xo_emit(" {:parent/%3d} ", m->mfc_parent);
xo_open_list("vif-ttl");
@@ -230,6 +223,8 @@ print_mfc(struct mfc *m, int maxvif, int *banner_printed)
void
mroutepr()
{
+ struct sockaddr_in sin;
+ struct sockaddr *sa = (struct sockaddr *)&sin;
struct vif viftable[MAXVIFS];
struct vif *v;
struct mfc *m;
@@ -242,6 +237,10 @@ mroutepr()
saved_numeric_addr = numeric_addr;
numeric_addr = 1;
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_len = sizeof(sin);
+ sin.sin_family = AF_INET;
+
/*
* TODO:
* The VIF table will move to hanging off the struct if_info for
@@ -266,10 +265,9 @@ mroutepr()
return;
}
} else {
- kresolve_list(mrl);
- pmfchashtbl = mrl[N_MFCHASHTBL].n_value;
- pmfctablesize = mrl[N_MFCTABLESIZE].n_value;
- pviftbl = mrl[N_VIFTABLE].n_value;
+ pmfchashtbl = nl[N_MFCHASHTBL].n_value;
+ pmfctablesize = nl[N_MFCTABLESIZE].n_value;
+ pviftbl = nl[N_VIFTABLE].n_value;
if (pmfchashtbl == 0 || pmfctablesize == 0 || pviftbl == 0) {
xo_warnx("No IPv4 MROUTING kernel support.");
@@ -294,12 +292,14 @@ mroutepr()
}
xo_open_instance("vif");
+ memcpy(&sin.sin_addr, &v->v_lcl_addr, sizeof(sin.sin_addr));
xo_emit(" {:vif/%2u} {:threshold/%6u} {:route/%-15.15s}",
/* opposite math of add_vif() */
vifi, v->v_threshold,
- routename(v->v_lcl_addr.s_addr));
+ routename(sa, numeric_addr));
+ memcpy(&sin.sin_addr, &v->v_rmt_addr, sizeof(sin.sin_addr));
xo_emit(" {:source/%-15.15s}", (v->v_flags & VIFF_TUNNEL) ?
- routename(v->v_rmt_addr.s_addr) : "");
+ routename(sa, numeric_addr) : "");
xo_emit(" {:received-packets/%9lu} {:sent-packets/%9lu}\n",
v->v_pkt_in, v->v_pkt_out);
@@ -402,8 +402,7 @@ mrt_stats()
u_long mstaddr;
size_t len = sizeof(mrtstat);
- kresolve_list(mrl);
- mstaddr = mrl[N_MRTSTAT].n_value;
+ mstaddr = nl[N_MRTSTAT].n_value;
if (mstaddr == 0) {
fprintf(stderr, "No IPv4 MROUTING kernel support.\n");
diff --git a/usr.bin/netstat/mroute6.c b/usr.bin/netstat/mroute6.c
index d9c127a..668add4 100644
--- a/usr.bin/netstat/mroute6.c
+++ b/usr.bin/netstat/mroute6.c
@@ -186,9 +186,11 @@ mroute6pr()
xo_open_instance("multicast-forwarding-cache");
xo_emit(" {:origin/%-*.*s}", WID_ORG, WID_ORG,
- routename6(&mfc.mf6c_origin));
+ routename(sin6tosa(&mfc.mf6c_origin),
+ numeric_addr));
xo_emit(" {:group/%-*.*s}", WID_GRP, WID_GRP,
- routename6(&mfc.mf6c_mcastgrp));
+ routename(sin6tosa(&mfc.mf6c_mcastgrp),
+ numeric_addr));
xo_emit(" {:total-packets/%9ju}",
(uintmax_t)mfc.mf6c_pkt_cnt);
diff --git a/usr.bin/netstat/netgraph.c b/usr.bin/netstat/netgraph.c
index e28de2c..dc3ad82 100644
--- a/usr.bin/netstat/netgraph.c
+++ b/usr.bin/netstat/netgraph.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <netgraph/ng_socket.h>
#include <netgraph/ng_socketvar.h>
-#include <nlist.h>
#include <errno.h>
#include <stdint.h>
#include <stdio.h>
diff --git a/usr.bin/netstat/netisr.c b/usr.bin/netstat/netisr.c
index 8f6fe3d..b384d6a 100644
--- a/usr.bin/netstat/netisr.c
+++ b/usr.bin/netstat/netisr.c
@@ -42,7 +42,6 @@ __FBSDID("$FreeBSD$");
#include <net/netisr_internal.h>
#include <err.h>
-#include <kvm.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -50,6 +49,7 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <libxo/xo.h>
#include "netstat.h"
+#include "nl_defs.h"
/*
* Print statistics for the kernel netisr subsystem.
@@ -102,41 +102,18 @@ netisr_dispatch_policy_to_string(u_int policy, char *buf,
snprintf(buf, buflen, "%s", str);
}
-static void
-netisr_load_kvm_uint(kvm_t *kd, const char *name, u_int *p)
-{
- struct nlist nl[] = {
- { .n_name = name },
- { .n_name = NULL },
- };
- int ret;
-
- ret = kvm_nlist(kd, nl);
- if (ret < 0)
- xo_errx(-1, "%s: kvm_nlist(%s): %s", __func__, name,
- kvm_geterr(kd));
- if (ret != 0)
- xo_errx(-1, "%s: kvm_nlist(%s): unresolved symbol", __func__,
- name);
- if (kvm_read(kd, nl[0].n_value, p, sizeof(*p)) != sizeof(*p))
- xo_errx(-1, "%s: kvm_read(%s): %s", __func__, name,
- kvm_geterr(kd));
-}
-
/*
* Load a nul-terminated string from KVM up to 'limit', guarantee that the
* string in local memory is nul-terminated.
*/
static void
-netisr_load_kvm_string(kvm_t *kd, uintptr_t addr, char *dest, u_int limit)
+netisr_load_kvm_string(uintptr_t addr, char *dest, u_int limit)
{
u_int i;
for (i = 0; i < limit; i++) {
- if (kvm_read(kd, addr + i, &dest[i], sizeof(dest[i])) !=
- sizeof(dest[i]))
- xo_err(-1, "%s: kvm_read: %s", __func__,
- kvm_geterr(kd));
+ if (kread(addr + i, &dest[i], sizeof(dest[i])) != 0)
+ xo_errx(-1, "%s: kread()", __func__);
if (dest[i] == '\0')
break;
}
@@ -168,18 +145,18 @@ netisr_protoispresent(u_int proto)
}
static void
-netisr_load_kvm_config(kvm_t *kd)
+netisr_load_kvm_config(void)
{
u_int tmp;
- netisr_load_kvm_uint(kd, "_netisr_bindthreads", &bindthreads);
- netisr_load_kvm_uint(kd, "_netisr_maxthreads", &maxthreads);
- netisr_load_kvm_uint(kd, "_nws_count", &numthreads);
-
- netisr_load_kvm_uint(kd, "_netisr_defaultqlimit", &defaultqlimit);
- netisr_load_kvm_uint(kd, "_netisr_maxqlimit", &maxqlimit);
+ kread(nl[N_NETISR_BINDTHREADS].n_value, &bindthreads, sizeof(u_int));
+ kread(nl[N_NETISR_MAXTHREADS].n_value, &maxthreads, sizeof(u_int));
+ kread(nl[N_NWS_COUNT].n_value, &numthreads, sizeof(u_int));
+ kread(nl[N_NETISR_DEFAULTQLIMIT].n_value, &defaultqlimit,
+ sizeof(u_int));
+ kread(nl[N_NETISR_MAXQLIMIT].n_value, &maxqlimit, sizeof(u_int));
+ kread(nl[N_NETISR_DISPATCH_POLICY].n_value, &tmp, sizeof(u_int));
- netisr_load_kvm_uint(kd, "_netisr_dispatch_policy", &tmp);
netisr_dispatch_policy_to_string(tmp, dispatch_policy,
sizeof(dispatch_policy));
}
@@ -223,41 +200,26 @@ netisr_load_sysctl_config(void)
}
static void
-netisr_load_kvm_proto(kvm_t *kd)
+netisr_load_kvm_proto(void)
{
- struct nlist nl[] = {
-#define NLIST_NETISR_PROTO 0
- { .n_name = "_netisr_proto" },
- { .n_name = NULL },
- };
struct netisr_proto *np_array, *npp;
u_int i, protocount;
struct sysctl_netisr_proto *snpp;
size_t len;
- int ret;
/*
* Kernel compile-time and user compile-time definitions of
* NETISR_MAXPROT must match, as we use that to size work arrays.
*/
- netisr_load_kvm_uint(kd, "_netisr_maxprot", &maxprot);
+ kread(nl[N_NETISR_MAXPROT].n_value, &maxprot, sizeof(u_int));
if (maxprot != NETISR_MAXPROT)
xo_errx(-1, "%s: NETISR_MAXPROT mismatch", __func__);
len = maxprot * sizeof(*np_array);
np_array = malloc(len);
if (np_array == NULL)
xo_err(-1, "%s: malloc", __func__);
- ret = kvm_nlist(kd, nl);
- if (ret < 0)
- xo_errx(-1, "%s: kvm_nlist(_netisr_proto): %s", __func__,
- kvm_geterr(kd));
- if (ret != 0)
- xo_errx(-1, "%s: kvm_nlist(_netisr_proto): unresolved symbol",
- __func__);
- if (kvm_read(kd, nl[NLIST_NETISR_PROTO].n_value, np_array, len) !=
- (ssize_t)len)
- xo_errx(-1, "%s: kvm_read(_netisr_proto): %s", __func__,
- kvm_geterr(kd));
+ if (kread(nl[N_NETISR_PROTO].n_value, np_array, len) != 0)
+ xo_errx(-1, "%s: kread(_netisr_proto)", __func__);
/*
* Size and allocate memory to hold only live protocols.
@@ -278,7 +240,7 @@ netisr_load_kvm_proto(kvm_t *kd)
continue;
snpp = &proto_array[protocount];
snpp->snp_version = sizeof(*snpp);
- netisr_load_kvm_string(kd, (uintptr_t)npp->np_name,
+ netisr_load_kvm_string((uintptr_t)npp->np_name,
snpp->snp_name, sizeof(snpp->snp_name));
snpp->snp_proto = i;
snpp->snp_qlimit = npp->np_qlimit;
@@ -320,35 +282,21 @@ netisr_load_sysctl_proto(void)
}
static void
-netisr_load_kvm_workstream(kvm_t *kd)
+netisr_load_kvm_workstream(void)
{
- struct nlist nl[] = {
-#define NLIST_NWS_ARRAY 0
- { .n_name = "_nws_array" },
- { .n_name = NULL },
- };
struct netisr_workstream nws;
struct sysctl_netisr_workstream *snwsp;
struct sysctl_netisr_work *snwp;
struct netisr_work *nwp;
- struct nlist nl_nws[2];
u_int counter, cpuid, proto, wsid;
size_t len;
- int ret;
len = numthreads * sizeof(*nws_array);
nws_array = malloc(len);
if (nws_array == NULL)
xo_err(-1, "malloc");
- ret = kvm_nlist(kd, nl);
- if (ret < 0)
- xo_errx(-1, "%s: kvm_nlist: %s", __func__, kvm_geterr(kd));
- if (ret != 0)
- xo_errx(-1, "%s: kvm_nlist: unresolved symbol", __func__);
- if (kvm_read(kd, nl[NLIST_NWS_ARRAY].n_value, nws_array, len) !=
- (ssize_t)len)
- xo_errx(-1, "%s: kvm_read(_nws_array): %s", __func__,
- kvm_geterr(kd));
+ if (kread(nl[N_NWS_ARRAY].n_value, nws_array, len) != 0)
+ xo_errx(-1, "%s: kread(_nws_array)", __func__);
workstream_array = calloc(numthreads, sizeof(*workstream_array));
if (workstream_array == NULL)
xo_err(-1, "calloc");
@@ -359,22 +307,9 @@ netisr_load_kvm_workstream(kvm_t *kd)
counter = 0;
for (wsid = 0; wsid < numthreads; wsid++) {
cpuid = nws_array[wsid];
- if (kvm_dpcpu_setcpu(kd, cpuid) < 0)
- xo_errx(-1, "%s: kvm_dpcpu_setcpu(%u): %s", __func__,
- cpuid, kvm_geterr(kd));
- bzero(nl_nws, sizeof(nl_nws));
- nl_nws[0].n_name = "_nws";
- ret = kvm_nlist(kd, nl_nws);
- if (ret < 0)
- xo_errx(-1, "%s: kvm_nlist looking up nws on CPU "
- "%u: %s", __func__, cpuid, kvm_geterr(kd));
- if (ret != 0)
- xo_errx(-1, "%s: kvm_nlist(nws): unresolved symbol on "
- "CPU %u", __func__, cpuid);
- if (kvm_read(kd, nl_nws[0].n_value, &nws, sizeof(nws)) !=
- sizeof(nws))
- xo_errx(-1, "%s: kvm_read(nw): %s", __func__,
- kvm_geterr(kd));
+ kset_dpcpu(cpuid);
+ if (kread(nl[N_NWS].n_value, &nws, sizeof(nws)) != 0)
+ xo_errx(-1, "%s: kread(nw)", __func__);
snwsp = &workstream_array[wsid];
snwsp->snws_version = sizeof(*snwsp);
snwsp->snws_wsid = cpuid;
@@ -507,11 +442,10 @@ netisr_print_workstream(struct sysctl_netisr_workstream *snwsp)
}
void
-netisr_stats(void *kvmd)
+netisr_stats(void)
{
struct sysctl_netisr_workstream *snwsp;
struct sysctl_netisr_proto *snpp;
- kvm_t *kd = kvmd;
u_int i;
if (live) {
@@ -520,11 +454,9 @@ netisr_stats(void *kvmd)
netisr_load_sysctl_workstream();
netisr_load_sysctl_work();
} else {
- if (kd == NULL)
- xo_errx(-1, "netisr_stats: !live but !kd");
- netisr_load_kvm_config(kd);
- netisr_load_kvm_proto(kd);
- netisr_load_kvm_workstream(kd); /* Also does work. */
+ netisr_load_kvm_config();
+ netisr_load_kvm_proto();
+ netisr_load_kvm_workstream(); /* Also does work. */
}
xo_open_container("netisr");
diff --git a/usr.bin/netstat/netstat.1 b/usr.bin/netstat/netstat.1
index c9d3e42..33eb216 100644
--- a/usr.bin/netstat/netstat.1
+++ b/usr.bin/netstat/netstat.1
@@ -28,7 +28,7 @@
.\" @(#)netstat.1 8.8 (Berkeley) 4/18/94
.\" $FreeBSD$
.\"
-.Dd April 7, 2015
+.Dd August 27, 2015
.Dt NETSTAT 1
.Os
.Sh NAME
@@ -217,6 +217,12 @@ queue.
.It Li S-BCNT Ta Send buffer byte count.
.It Li R-BMAX Ta Maximum bytes that can be used in the receive buffer.
.It Li S-BMAX Ta Maximum bytes that can be used in the send buffer.
+.It Li rexmt Ta Time, in seconds, to fire Retransmit Timer, or 0 if not armed.
+.It Li persist Ta Time, in seconds, to fire Retransmit Persistence, or 0 if not armed.
+.It Li keep Ta Time, in seconds, to fire Keep Alive, or 0 if not armed.
+.It Li 2msl Ta Time, in seconds, to fire 2*msl TIME_WAIT Timer, or 0 if not armed.
+.It Li delack Ta Time, in seconds, to fire Delayed ACK Timer, or 0 if not armed.
+.It Li rcvtime Ta Time, in seconds, since last packet received.
.El
.It Fl f Ar protocol_family
Filter by
diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h
index 29e4d0f..ca6da29 100644
--- a/usr.bin/netstat/netstat.h
+++ b/usr.bin/netstat/netstat.h
@@ -32,6 +32,10 @@
#include <sys/cdefs.h>
+#define satosin(sa) ((struct sockaddr_in *)(sa))
+#define satosin6(sa) ((struct sockaddr_in6 *)(sa))
+#define sin6tosa(sin6) ((struct sockaddr *)(sin6))
+
extern int Aflag; /* show addresses of protocol control block */
extern int aflag; /* show all sockets (including servers) */
extern int bflag; /* show i/f total bytes in/out */
@@ -59,11 +63,10 @@ extern int unit; /* unit number for above */
extern int live; /* true if we are examining a live system */
-struct nlist;
int kread(u_long addr, void *buf, size_t size);
uint64_t kread_counter(u_long addr);
int kread_counters(u_long addr, void *buf, size_t size);
-int kresolve_list(struct nlist *);
+void kset_dpcpu(u_int);
const char *plural(uintmax_t);
const char *plurales(uintmax_t);
const char *pluralies(uintmax_t);
@@ -106,8 +109,6 @@ void mrt6_stats(void);
struct sockaddr_in6;
struct in6_addr;
void in6_fillscopeid(struct sockaddr_in6 *);
-char *routename6(struct sockaddr_in6 *);
-const char *netname6(struct sockaddr_in6 *, struct in6_addr *);
void inet6print(const char *, struct in6_addr *, int, const char *, int);
#endif /*INET6*/
@@ -117,20 +118,19 @@ void pfkey_stats(u_long, const char *, int, int);
void mbpr(void *, u_long);
-void netisr_stats(void *);
+void netisr_stats(void);
void hostpr(u_long, u_long);
void impstats(u_long, u_long);
-void intpr(int, void (*)(char *), int);
+void intpr(void (*)(char *), int);
-void pr_rthdr(int);
void pr_family(int);
void rt_stats(void);
void flowtable_stats(void);
-char *routename(in_addr_t);
-char *netname(in_addr_t, in_addr_t);
+char *routename(struct sockaddr *, int);
+const char *netname(struct sockaddr *, struct sockaddr *);
char *ns_print(struct sockaddr *);
void routepr(int, int);
diff --git a/usr.bin/netstat/nlist_symbols b/usr.bin/netstat/nlist_symbols
new file mode 100644
index 0000000..e2b7e2f
--- /dev/null
+++ b/usr.bin/netstat/nlist_symbols
@@ -0,0 +1,54 @@
+# $FreeBSD$
+#
+# module_name symbol_name
+all _ahstat
+all _arpstat
+all _carpstats
+all _divcbinfo
+all _espstat
+all _icmp6stat
+all _icmpstat
+all _igmpstat
+all _ip6stat
+all _ipcompstat
+all _ipsec4stat
+all _ipsec6stat
+all _ipstat
+all _mf6ctable
+all _mfchashtbl
+all _mfctablesize
+all _mif6table
+all _mrt6stat
+all _mrtstat
+all _netisr_bindthreads
+all _netisr_defaultqlimit
+all _netisr_dispatch_policy
+all _netisr_maxprot
+all _netisr_maxqlimit
+all _netisr_maxthreads
+all _netisr_proto
+all _ngsocklist
+all _nws
+all _nws_array
+all _nws_count
+all _pfkeystat
+all _pfsyncstats
+all _pim6stat
+all _pimstat
+all _rip6stat
+all _ripcbinfo
+all _rtree
+all _rtstat
+all _rttrash
+all _sctpstat
+all _sfstat
+all _tcbinfo
+all _tcpstat
+all _udbinfo
+all _udpstat
+all _unp_count
+all _unp_dhead
+all _unp_gencnt
+all _unp_shead
+all _unp_sphead
+all _viftable
diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c
index ab5a3ed..7cb777b 100644
--- a/usr.bin/netstat/route.c
+++ b/usr.bin/netstat/route.c
@@ -56,7 +56,6 @@ __FBSDID("$FreeBSD$");
#include <ifaddrs.h>
#include <libutil.h>
#include <netdb.h>
-#include <nlist.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -67,11 +66,12 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <libxo/xo.h>
#include "netstat.h"
+#include "nl_defs.h"
/*
* Definitions for showing gateway flags.
*/
-struct bits {
+static struct bits {
u_long b_mask;
char b_val;
const char *b_name;
@@ -96,30 +96,15 @@ struct bits {
{ 0 , 0, NULL }
};
-/*
- * kvm(3) bindings for every needed symbol
- */
-static struct nlist rl[] = {
-#define N_RTSTAT 0
- { .n_name = "_rtstat" },
-#define N_RTTRASH 1
- { .n_name = "_rttrash" },
- { .n_name = NULL },
-};
-
-typedef union {
- long dummy; /* Helps align structure. */
- struct sockaddr u_sa;
- u_short u_data[128];
-} sa_u;
-
struct ifmap_entry {
char ifname[IFNAMSIZ];
};
static struct ifmap_entry *ifmap;
static int ifmap_size;
-struct timespec uptime;
+static struct timespec uptime;
+static const char *netname4(in_addr_t, in_addr_t);
+static const char *netname6(struct sockaddr_in6 *, struct sockaddr_in6 *);
static void p_rtable_sysctl(int, int);
static void p_rtentry_sysctl(const char *name, struct rt_msghdr *);
static void p_sockaddr(const char *name, struct sockaddr *, struct sockaddr *,
@@ -130,6 +115,7 @@ static void p_flags(int, const char *);
static const char *fmt_flags(int f);
static void domask(char *, in_addr_t, u_long);
+
/*
* Print routing tables.
*/
@@ -228,12 +214,10 @@ static int wid_expire;
/*
* Print header for routing table columns.
*/
-void
-pr_rthdr(int af1)
+static void
+pr_rthdr(int af1 __unused)
{
- if (Aflag)
- xo_emit("{T:/%-8.8s} ","Address");
if (Wflag) {
xo_emit("{T:/%-*.*s} {T:/%-*.*s} {T:/%-*.*s} {T:/%*.*s} "
"{T:/%*.*s} {T:/%*.*s} {T:/%*s}\n",
@@ -365,30 +349,22 @@ p_rtable_sysctl(int fibnum, int af)
static void
p_rtentry_sysctl(const char *name, struct rt_msghdr *rtm)
{
- struct sockaddr *sa = (struct sockaddr *)(rtm + 1);
+ struct sockaddr *sa, *addr[RTAX_MAX];
char buffer[128];
char prettyname[128];
- sa_u addr, mask, gw;
- unsigned int l;
+ int i;
xo_open_instance(name);
+ sa = (struct sockaddr *)(rtm + 1);
+ for (i = 0; i < RTAX_MAX; i++) {
+ if (rtm->rtm_addrs & (1 << i))
+ addr[i] = sa;
+ sa = (struct sockaddr *)((char *)sa + SA_SIZE(sa));
+ }
-#define GETSA(_s, _f) { \
- bzero(&(_s), sizeof(_s)); \
- if (rtm->rtm_addrs & _f) { \
- l = roundup(sa->sa_len, sizeof(long)); \
- memcpy(&(_s), sa, (l > sizeof(_s)) ? sizeof(_s) : l); \
- sa = (struct sockaddr *)((char *)sa + l); \
- } \
-}
-
- GETSA(addr, RTA_DST);
- GETSA(gw, RTA_GATEWAY);
- GETSA(mask, RTA_NETMASK);
-
- p_sockaddr("destination", &addr.u_sa, &mask.u_sa, rtm->rtm_flags,
- wid_dst);
- p_sockaddr("gateway", &gw.u_sa, NULL, RTF_HOST, wid_gw);
+ p_sockaddr("destination", addr[RTAX_DST], addr[RTAX_NETMASK],
+ rtm->rtm_flags, wid_dst);
+ p_sockaddr("gateway", addr[RTAX_GATEWAY], NULL, RTF_HOST, wid_gw);
snprintf(buffer, sizeof(buffer), "{[:-%d}{:flags/%%s}{]:} ",
wid_flags);
p_flags(rtm->rtm_flags, buffer);
@@ -435,7 +411,7 @@ p_sockaddr(const char *name, struct sockaddr *sa, struct sockaddr *mask,
snprintf(buf, sizeof(buf), "{:%s/%%s} ", name);
xo_emit(buf, cp);
} else {
- if (numeric_addr) {
+ if (Wflag != 0 || numeric_addr) {
snprintf(buf, sizeof(buf), "{[:%d}{:%s/%%s}{]:} ",
-width, name);
xo_emit(buf, cp);
@@ -450,107 +426,67 @@ p_sockaddr(const char *name, struct sockaddr *sa, struct sockaddr *mask,
static const char *
fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags)
{
- static char workbuf[128];
+ static char buf[128];
const char *cp;
if (sa == NULL)
return ("null");
switch(sa->sa_family) {
- case AF_INET:
- {
- struct sockaddr_in *sockin = (struct sockaddr_in *)sa;
-
- if ((sockin->sin_addr.s_addr == INADDR_ANY) &&
- mask &&
- ntohl(((struct sockaddr_in *)mask)->sin_addr.s_addr)
- ==0L)
- cp = "default" ;
- else if (flags & RTF_HOST)
- cp = routename(sockin->sin_addr.s_addr);
- else if (mask)
- cp = netname(sockin->sin_addr.s_addr,
- ((struct sockaddr_in *)mask)->sin_addr.s_addr);
- else
- cp = netname(sockin->sin_addr.s_addr, INADDR_ANY);
- break;
- }
-
#ifdef INET6
case AF_INET6:
- {
- struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa;
-
/*
* The sa6->sin6_scope_id must be filled here because
* this sockaddr is extracted from kmem(4) directly
* and has KAME-specific embedded scope id in
* sa6->sin6_addr.s6_addr[2].
*/
- in6_fillscopeid(sa6);
-
+ in6_fillscopeid(satosin6(sa));
+ /* FALLTHROUGH */
+#endif /*INET6*/
+ case AF_INET:
if (flags & RTF_HOST)
- cp = routename6(sa6);
+ cp = routename(sa, numeric_addr);
else if (mask)
- cp = netname6(sa6,
- &((struct sockaddr_in6 *)mask)->sin6_addr);
- else {
- cp = netname6(sa6, NULL);
- }
+ cp = netname(sa, mask);
+ else
+ cp = netname(sa, NULL);
break;
- }
-#endif /*INET6*/
-
case AF_NETGRAPH:
{
- strlcpy(workbuf, ((struct sockaddr_ng *)sa)->sg_data,
- sizeof(workbuf));
- cp = workbuf;
+ strlcpy(buf, ((struct sockaddr_ng *)sa)->sg_data,
+ sizeof(buf));
+ cp = buf;
break;
}
-
case AF_LINK:
{
+#if 0
struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa;
- if (sdl->sdl_nlen == 0 && sdl->sdl_alen == 0 &&
- sdl->sdl_slen == 0) {
- (void) sprintf(workbuf, "link#%d", sdl->sdl_index);
- cp = workbuf;
- } else
- switch (sdl->sdl_type) {
-
- case IFT_ETHER:
- case IFT_L2VLAN:
- case IFT_BRIDGE:
- if (sdl->sdl_alen == ETHER_ADDR_LEN) {
- cp = ether_ntoa((struct ether_addr *)
- (sdl->sdl_data + sdl->sdl_nlen));
- break;
- }
- /* FALLTHROUGH */
- default:
- cp = link_ntoa(sdl);
- break;
- }
+ /* Interface route. */
+ if (sdl->sdl_nlen)
+ cp = sdl->sdl_data;
+ else
+#endif
+ cp = routename(sa, 1);
break;
}
-
default:
{
u_char *s = (u_char *)sa->sa_data, *slim;
char *cq, *cqlim;
- cq = workbuf;
+ cq = buf;
slim = sa->sa_len + (u_char *) sa;
- cqlim = cq + sizeof(workbuf) - 6;
+ cqlim = cq + sizeof(buf) - 6;
cq += sprintf(cq, "(%d)", sa->sa_family);
while (s < slim && cq < cqlim) {
cq += sprintf(cq, " %02x", *s++);
if (s < slim)
cq += sprintf(cq, "%02x", *s++);
}
- cp = workbuf;
+ cp = buf;
}
}
@@ -586,28 +522,35 @@ fmt_flags(int f)
}
char *
-routename(in_addr_t in)
+routename(struct sockaddr *sa, int flags)
{
- char *cp;
- static char line[MAXHOSTNAMELEN];
- struct hostent *hp;
-
- cp = 0;
- if (!numeric_addr) {
- hp = gethostbyaddr(&in, sizeof (struct in_addr), AF_INET);
- if (hp) {
- cp = hp->h_name;
- trimdomain(cp, strlen(cp));
+ static char line[NI_MAXHOST];
+ int error, f;
+
+ f = (flags) ? NI_NUMERICHOST : 0;
+ error = getnameinfo(sa, sa->sa_len, line, sizeof(line),
+ NULL, 0, f);
+ if (error) {
+ const void *src;
+ switch (sa->sa_family) {
+#ifdef INET
+ case AF_INET:
+ src = &satosin(sa)->sin_addr;
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ src = &satosin6(sa)->sin6_addr;
+ break;
+#endif /* INET6 */
+ default:
+ return(line);
}
+ inet_ntop(sa->sa_family, src, line, sizeof(line) - 1);
+ return (line);
}
- if (cp) {
- strlcpy(line, cp, sizeof(line));
- } else {
-#define C(x) ((x) & 0xff)
- in = ntohl(in);
- sprintf(line, "%u.%u.%u.%u",
- C(in >> 24), C(in >> 16), C(in >> 8), C(in));
- }
+ trimdomain(line, strlen(line));
+
return (line);
}
@@ -622,7 +565,7 @@ domask(char *dst, in_addr_t addr __unused, u_long mask)
{
int b, i;
- if (mask == 0 || (!numeric_addr && NSHIFT(mask) != 0)) {
+ if (mask == 0) {
*dst = '\0';
return;
}
@@ -648,14 +591,41 @@ domask(char *dst, in_addr_t addr __unused, u_long mask)
/*
* Return the name of the network whose address is given.
*/
-char *
-netname(in_addr_t in, in_addr_t mask)
+const char *
+netname(struct sockaddr *sa, struct sockaddr *mask)
+{
+ switch (sa->sa_family) {
+ case AF_INET:
+ if (mask != NULL)
+ return (netname4(satosin(sa)->sin_addr.s_addr,
+ satosin(mask)->sin_addr.s_addr));
+ else
+ return (netname4(satosin(sa)->sin_addr.s_addr,
+ INADDR_ANY));
+ break;
+#ifdef INET6
+ case AF_INET6:
+ return (netname6(satosin6(sa), satosin6(mask)));
+#endif /* INET6 */
+ default:
+ return (NULL);
+ }
+}
+
+static const char *
+netname4(in_addr_t in, in_addr_t mask)
{
char *cp = 0;
- static char line[MAXHOSTNAMELEN];
+ static char line[MAXHOSTNAMELEN + sizeof("/xx")];
+ char nline[INET_ADDRSTRLEN];
struct netent *np = 0;
in_addr_t i;
+ if (in == INADDR_ANY && mask == 0) {
+ strlcpy(line, "default", sizeof(line));
+ return (line);
+ }
+
/* It is ok to supply host address. */
in &= mask;
@@ -667,12 +637,15 @@ netname(in_addr_t in, in_addr_t mask)
trimdomain(cp, strlen(cp));
}
}
+ inet_ntop(AF_INET, &in, nline, sizeof(line));
if (cp != NULL) {
+ if (strcpy(cp, nline) != 0)
+ return (line);
strlcpy(line, cp, sizeof(line));
- } else {
- inet_ntop(AF_INET, &in, line, sizeof(line) - 1);
- }
+ } else
+ strlcpy(line, nline, sizeof(line));
domask(line + strlen(line), i, ntohl(mask));
+
return (line);
}
@@ -698,47 +671,35 @@ in6_fillscopeid(struct sockaddr_in6 *sa6)
#endif
}
-const char *
-netname6(struct sockaddr_in6 *sa6, struct in6_addr *mask)
+/* Mask to length table. To check an invalid value, (length + 1) is used. */
+static int masktolen[256] = {
+ [0xff] = 8 + 1,
+ [0xfe] = 7 + 1,
+ [0xfc] = 6 + 1,
+ [0xf8] = 5 + 1,
+ [0xf0] = 4 + 1,
+ [0xe0] = 3 + 1,
+ [0xc0] = 2 + 1,
+ [0x80] = 1 + 1,
+ [0x00] = 0 + 1,
+};
+
+static const char *
+netname6(struct sockaddr_in6 *sa6, struct sockaddr_in6 *mask)
{
- static char line[MAXHOSTNAMELEN];
- u_char *p = (u_char *)mask;
- u_char *lim;
- int masklen, illegal = 0, flag = 0;
+ static char line[NI_MAXHOST + sizeof("/xxx") - 1];
+ char nline[NI_MAXHOST];
+ u_char *p, *lim;
+ int masklen, illegal = 0;
if (mask) {
+ p = (u_char *)&mask->sin6_addr;
for (masklen = 0, lim = p + 16; p < lim; p++) {
- switch (*p) {
- case 0xff:
- masklen += 8;
- break;
- case 0xfe:
- masklen += 7;
- break;
- case 0xfc:
- masklen += 6;
- break;
- case 0xf8:
- masklen += 5;
- break;
- case 0xf0:
- masklen += 4;
- break;
- case 0xe0:
- masklen += 3;
- break;
- case 0xc0:
- masklen += 2;
- break;
- case 0x80:
- masklen += 1;
- break;
- case 0x00:
- break;
- default:
- illegal ++;
- break;
- }
+ if (masktolen[*p] > 0)
+ /* -1 is required. */
+ masklen += masktolen[*p] - 1;
+ else
+ illegal++;
}
if (illegal)
xo_error("illegal prefixlen\n");
@@ -749,37 +710,17 @@ netname6(struct sockaddr_in6 *sa6, struct in6_addr *mask)
if (masklen == 0 && IN6_IS_ADDR_UNSPECIFIED(&sa6->sin6_addr))
return("default");
+ getnameinfo((struct sockaddr *)sa6, sa6->sin6_len, nline, sizeof(nline),
+ NULL, 0, NI_NUMERICHOST);
if (numeric_addr)
- flag |= NI_NUMERICHOST;
- getnameinfo((struct sockaddr *)sa6, sa6->sin6_len, line, sizeof(line),
- NULL, 0, flag);
-
- if (numeric_addr)
+ strlcpy(line, nline, sizeof(line));
+ else
+ getnameinfo((struct sockaddr *)sa6, sa6->sin6_len, line,
+ sizeof(line), NULL, 0, 0);
+ if (numeric_addr || strcmp(line, nline) == 0)
sprintf(&line[strlen(line)], "/%d", masklen);
- return line;
-}
-
-char *
-routename6(struct sockaddr_in6 *sa6)
-{
- static char line[MAXHOSTNAMELEN];
- int flag = 0;
- /* use local variable for safety */
- struct sockaddr_in6 sa6_local;
-
- sa6_local.sin6_family = AF_INET6;
- sa6_local.sin6_len = sizeof(sa6_local);
- sa6_local.sin6_addr = sa6->sin6_addr;
- sa6_local.sin6_scope_id = sa6->sin6_scope_id;
-
- if (numeric_addr)
- flag |= NI_NUMERICHOST;
-
- getnameinfo((struct sockaddr *)&sa6_local, sa6_local.sin6_len,
- line, sizeof(line), NULL, 0, flag);
-
- return line;
+ return (line);
}
#endif /*INET6*/
@@ -793,13 +734,11 @@ rt_stats(void)
u_long rtsaddr, rttaddr;
int rttrash;
- kresolve_list(rl);
-
- if ((rtsaddr = rl[N_RTSTAT].n_value) == 0) {
+ if ((rtsaddr = nl[N_RTSTAT].n_value) == 0) {
xo_emit("{W:rtstat: symbol not in namelist}\n");
return;
}
- if ((rttaddr = rl[N_RTTRASH].n_value) == 0) {
+ if ((rttaddr = nl[N_RTTRASH].n_value) == 0) {
xo_emit("{W:rttrash: symbol not in namelist}\n");
return;
}
diff --git a/usr.bin/netstat/sctp.c b/usr.bin/netstat/sctp.c
index cdbbc49..f721a96 100644
--- a/usr.bin/netstat/sctp.c
+++ b/usr.bin/netstat/sctp.c
@@ -79,7 +79,7 @@ static void sctp_statesprint(uint32_t state);
#define NETSTAT_SCTP_STATES_SHUTDOWN_ACK_SENT 0x8
#define NETSTAT_SCTP_STATES_SHUTDOWN_PENDING 0x9
-const char *sctpstates[] = {
+static const char *sctpstates[] = {
"CLOSED",
"BOUND",
"LISTEN",
@@ -92,13 +92,13 @@ const char *sctpstates[] = {
"SHUTDOWN_PENDING"
};
-LIST_HEAD(xladdr_list, xladdr_entry) xladdr_head;
+static LIST_HEAD(xladdr_list, xladdr_entry) xladdr_head;
struct xladdr_entry {
struct xsctp_laddr *xladdr;
LIST_ENTRY(xladdr_entry) xladdr_entries;
};
-LIST_HEAD(xraddr_list, xraddr_entry) xraddr_head;
+static LIST_HEAD(xraddr_list, xraddr_entry) xraddr_head;
struct xraddr_entry {
struct xsctp_raddr *xraddr;
LIST_ENTRY(xraddr_entry) xraddr_entries;
@@ -614,25 +614,34 @@ sctp_statesprint(uint32_t state)
int idx;
switch (state) {
- case SCTP_STATE_COOKIE_WAIT:
+ case SCTP_CLOSED:
+ idx = NETSTAT_SCTP_STATES_CLOSED;
+ break;
+ case SCTP_BOUND:
+ idx = NETSTAT_SCTP_STATES_BOUND;
+ break;
+ case SCTP_LISTEN:
+ idx = NETSTAT_SCTP_STATES_LISTEN;
+ break;
+ case SCTP_COOKIE_WAIT:
idx = NETSTAT_SCTP_STATES_COOKIE_WAIT;
break;
- case SCTP_STATE_COOKIE_ECHOED:
+ case SCTP_COOKIE_ECHOED:
idx = NETSTAT_SCTP_STATES_COOKIE_ECHOED;
break;
- case SCTP_STATE_OPEN:
+ case SCTP_ESTABLISHED:
idx = NETSTAT_SCTP_STATES_ESTABLISHED;
break;
- case SCTP_STATE_SHUTDOWN_SENT:
+ case SCTP_SHUTDOWN_SENT:
idx = NETSTAT_SCTP_STATES_SHUTDOWN_SENT;
break;
- case SCTP_STATE_SHUTDOWN_RECEIVED:
+ case SCTP_SHUTDOWN_RECEIVED:
idx = NETSTAT_SCTP_STATES_SHUTDOWN_RECEIVED;
break;
- case SCTP_STATE_SHUTDOWN_ACK_SENT:
+ case SCTP_SHUTDOWN_ACK_SENT:
idx = NETSTAT_SCTP_STATES_SHUTDOWN_ACK_SENT;
break;
- case SCTP_STATE_SHUTDOWN_PENDING:
+ case SCTP_SHUTDOWN_PENDING:
idx = NETSTAT_SCTP_STATES_SHUTDOWN_PENDING;
break;
default:
diff --git a/usr.bin/procstat/Makefile b/usr.bin/procstat/Makefile
index 211ce1a..21f325f 100644
--- a/usr.bin/procstat/Makefile
+++ b/usr.bin/procstat/Makefile
@@ -17,6 +17,6 @@ SRCS= procstat.c \
procstat_threads.c \
procstat_vm.c
-LIBADD+= util procstat
+LIBADD+= procstat xo util sbuf
.include <bsd.prog.mk>
diff --git a/usr.bin/procstat/procstat.1 b/usr.bin/procstat/procstat.1
index 0fd314f..68aaaee 100644
--- a/usr.bin/procstat/procstat.1
+++ b/usr.bin/procstat/procstat.1
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 18, 2015
+.Dd September 5, 2015
.Dt PROCSTAT 1
.Os
.Sh NAME
@@ -33,6 +33,7 @@
.Nd get detailed process information
.Sh SYNOPSIS
.Nm
+.Op Fl -libxo
.Op Fl CHhn
.Op Fl w Ar interval
.Op Fl b | c | e | f | i | j | k | l | r | s | S | t | v | x
@@ -52,6 +53,13 @@ By default, basic process statistics are printed; one of the following
options may be specified in order to select more detailed process information
for printing:
.Bl -tag -width indent
+.It Fl -libxo
+Generate output via
+.Xr libxo 3
+in a selection of different human and machine readable formats.
+See
+.Xr xo_parse_args 3
+for details on command line arguments.
.It Fl b
Display binary information for the process.
.It Fl c
@@ -531,16 +539,19 @@ auxiliary vector value
.Xr cap_enter 2 ,
.Xr cap_rights_limit 2 ,
.Xr libprocstat 3 ,
+.Xr libxo 3 ,
+.Xr xo_parse_args 3 ,
.Xr ddb 4 ,
.Xr stack 9
.Sh AUTHORS
-.An Robert N M Watson
+.An Robert N M Watson Aq Mt rwatson@FreeBSD.org .
+.br
+.Xr libxo 3
+support was added by
+.An -nosplit
+Allan Jude
+.Aq Mt allanjude@FreeBSD.org .
.Sh BUGS
-Some field values may include spaces, which limits the extent to which the
-output of
-.Nm
-may be mechanically parsed.
-.Pp
The display of open file or memory mapping pathnames is implemented using the
kernel's name cache.
If a file system does not use the name cache, or the path to a file is not in
diff --git a/usr.bin/procstat/procstat.c b/usr.bin/procstat/procstat.c
index 48a2135..cafb335 100644
--- a/usr.bin/procstat/procstat.c
+++ b/usr.bin/procstat/procstat.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007, 2011 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -47,17 +48,24 @@ static void
usage(void)
{
- fprintf(stderr, "usage: procstat [-CHhn] [-M core] [-N system] "
- "[-w interval] \n");
- fprintf(stderr, " [-b | -c | -e | -f | -i | -j | -k | "
- "-l | -r | -s | -S | -t | -v | -x]\n");
- fprintf(stderr, " [-a | pid | core ...]\n");
+ xo_error("usage: procstat [-CHhn] [-M core] [-N system] "
+ "[-w interval]\n"
+ " [-b | -c | -e | -f | -i | -j | -k | "
+ "-l | -r | -s | -S | -t | -v | -x]\n"
+ " [-a | pid | core ...]\n");
+ xo_finish();
exit(EX_USAGE);
}
static void
procstat(struct procstat *prstat, struct kinfo_proc *kipp)
{
+ char *pidstr = NULL;
+
+ asprintf(&pidstr, "%d", kipp->ki_pid);
+ if (pidstr == NULL)
+ xo_errc(1, ENOMEM, "Failed to allocate memory in procstat()");
+ xo_open_container(pidstr);
if (bflag)
procstat_bin(prstat, kipp);
@@ -89,6 +97,9 @@ procstat(struct procstat *prstat, struct kinfo_proc *kipp)
procstat_cs(prstat, kipp);
else
procstat_basic(kipp);
+
+ xo_close_container(pidstr);
+ free(pidstr);
}
/*
@@ -126,10 +137,14 @@ main(int argc, char *argv[])
pid_t pid;
char *dummy;
char *nlistf, *memf;
+ const char *xocontainer;
int cnt;
interval = 0;
memf = nlistf = NULL;
+ argc = xo_parse_args(argc, argv);
+ xocontainer = "basic";
+
while ((ch = getopt(argc, argv, "CHN:M:abcefijklhrsStvw:x")) != -1) {
switch (ch) {
case 'C':
@@ -148,6 +163,7 @@ main(int argc, char *argv[])
break;
case 'S':
Sflag++;
+ xocontainer = "cs";
break;
case 'a':
aflag++;
@@ -155,34 +171,42 @@ main(int argc, char *argv[])
case 'b':
bflag++;
+ xocontainer = "binary";
break;
case 'c':
cflag++;
+ xocontainer = "arguments";
break;
case 'e':
eflag++;
+ xocontainer = "environment";
break;
case 'f':
fflag++;
+ xocontainer = "files";
break;
case 'i':
iflag++;
+ xocontainer = "signals";
break;
case 'j':
jflag++;
+ xocontainer = "thread_signals";
break;
case 'k':
kflag++;
+ xocontainer = "kstack";
break;
case 'l':
lflag++;
+ xocontainer = "rlimit";
break;
case 'n':
@@ -195,18 +219,22 @@ main(int argc, char *argv[])
case 'r':
rflag++;
+ xocontainer = "rusage";
break;
case 's':
sflag++;
+ xocontainer = "credentials";
break;
case 't':
tflag++;
+ xocontainer = "threads";
break;
case 'v':
vflag++;
+ xocontainer = "vm";
break;
case 'w':
@@ -220,6 +248,7 @@ main(int argc, char *argv[])
case 'x':
xflag++;
+ xocontainer = "auxv";
break;
case '?':
@@ -254,18 +283,23 @@ main(int argc, char *argv[])
else
prstat = procstat_open_sysctl();
if (prstat == NULL)
- errx(1, "procstat_open()");
+ xo_errx(1, "procstat_open()");
do {
+ xo_set_version(PROCSTAT_XO_VERSION);
+ xo_open_container("procstat");
+ xo_open_container(xocontainer);
+
if (aflag) {
p = procstat_getprocs(prstat, KERN_PROC_PROC, 0, &cnt);
if (p == NULL)
- errx(1, "procstat_getprocs()");
+ xo_errx(1, "procstat_getprocs()");
kinfo_proc_sort(p, cnt);
for (i = 0; i < cnt; i++) {
procstat(prstat, &p[i]);
/* Suppress header after first process. */
hflag = 1;
+ xo_flush();
}
procstat_freeprocs(prstat, p);
}
@@ -276,9 +310,10 @@ main(int argc, char *argv[])
usage();
pid = l;
- p = procstat_getprocs(prstat, KERN_PROC_PID, pid, &cnt);
+ p = procstat_getprocs(prstat, KERN_PROC_PID,
+ pid, &cnt);
if (p == NULL)
- errx(1, "procstat_getprocs()");
+ xo_errx(1, "procstat_getprocs()");
if (cnt != 0)
procstat(prstat, p);
procstat_freeprocs(prstat, p);
@@ -291,7 +326,7 @@ main(int argc, char *argv[])
p = procstat_getprocs(cprstat, KERN_PROC_PID,
-1, &cnt);
if (p == NULL)
- errx(1, "procstat_getprocs()");
+ xo_errx(1, "procstat_getprocs()");
if (cnt != 0)
procstat(cprstat, p);
procstat_freeprocs(cprstat, p);
@@ -300,9 +335,15 @@ main(int argc, char *argv[])
/* Suppress header after first process. */
hflag = 1;
}
+
+ xo_close_container(xocontainer);
+ xo_close_container("procstat");
+ xo_finish();
if (interval)
sleep(interval);
} while (interval);
+
procstat_close(prstat);
+
exit(0);
}
diff --git a/usr.bin/procstat/procstat.h b/usr.bin/procstat/procstat.h
index 5079521..dfdf328 100644
--- a/usr.bin/procstat/procstat.h
+++ b/usr.bin/procstat/procstat.h
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,9 +27,13 @@
* $FreeBSD$
*/
+#include <libxo/xo.h>
+
#ifndef PROCSTAT_H
#define PROCSTAT_H
+#define PROCSTAT_XO_VERSION "1"
+
extern int hflag, nflag, Cflag, Hflag;
struct kinfo_proc;
diff --git a/usr.bin/procstat/procstat_args.c b/usr.bin/procstat/procstat_args.c
index 342b60f..fd5f3d3 100644
--- a/usr.bin/procstat/procstat_args.c
+++ b/usr.bin/procstat/procstat_args.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -40,40 +41,56 @@
#include "procstat.h"
-static void
-do_args(struct procstat *procstat, struct kinfo_proc *kipp, int env)
+void
+procstat_args(struct procstat *procstat, struct kinfo_proc *kipp)
{
int i;
char **args;
if (!hflag) {
- printf("%5s %-16s %-53s\n", "PID", "COMM",
- env ? "ENVIRONMENT" : "ARGS");
+ xo_emit("{T:/%5s %-16s %-53s}\n", "PID", "COMM", "ARGS");
}
- args = env ? procstat_getenvv(procstat, kipp, 0) :
- procstat_getargv(procstat, kipp, 0);
+ args = procstat_getargv(procstat, kipp, 0);
- printf("%5d %-16s", kipp->ki_pid, kipp->ki_comm);
+ xo_emit("{k:process_id/%5d/%d} {:command/%-16s/%s}", kipp->ki_pid,
+ kipp->ki_comm);
if (args == NULL) {
- printf(" -\n");
+ xo_emit(" {d:args/-}\n");
return;
}
+ xo_open_list("arguments");
for (i = 0; args[i] != NULL; i++)
- printf(" %s", args[i]);
- printf("\n");
-}
-
-void
-procstat_args(struct procstat *procstat, struct kinfo_proc *kipp)
-{
- do_args(procstat, kipp, 0);
+ xo_emit(" {l:args/%s}", args[i]);
+ xo_close_list("arguments");
+ xo_emit("\n");
}
void
procstat_env(struct procstat *procstat, struct kinfo_proc *kipp)
{
- do_args(procstat, kipp, 1);
+ int i;
+ char **envs;
+
+ if (!hflag) {
+ xo_emit("{T:/%5s %-16s %-53s}\n", "PID", "COMM", "ENVIRONMENT");
+ }
+
+ envs = procstat_getenvv(procstat, kipp, 0);
+
+ xo_emit("{k:process_id/%5d/%d} {:command/%-16s/%s}", kipp->ki_pid,
+ kipp->ki_comm);
+
+ if (envs == NULL) {
+ xo_emit(" {d:env/-}\n");
+ return;
+ }
+
+ xo_open_list("environment");
+ for (i = 0; envs[i] != NULL; i++)
+ xo_emit(" {l:env/%s}", envs[i]);
+ xo_close_list("environment");
+ xo_emit("\n");
}
diff --git a/usr.bin/procstat/procstat_auxv.c b/usr.bin/procstat/procstat_auxv.c
index aa62594..3509e0d 100644
--- a/usr.bin/procstat/procstat_auxv.c
+++ b/usr.bin/procstat/procstat_auxv.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2011 Mikolaj Golub
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -43,11 +44,6 @@
#include "procstat.h"
-#define PRINT(name, spec, val) \
- printf("%s %-16s " #spec "\n", prefix, #name, (val))
-#define PRINT_UNKNOWN(type, val) \
- printf("%s %16ld %#lx\n", prefix, (long)type, (u_long)(val))
-
void
procstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp)
{
@@ -56,12 +52,18 @@ procstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp)
static char prefix[256];
if (!hflag)
- printf("%5s %-16s %-16s %-16s\n", "PID", "COMM", "AUXV", "VALUE");
+ xo_emit("{T:/%5s %-16s %-16s %-16s}\n", "PID", "COMM", "AUXV",
+ "VALUE");
+
auxv = procstat_getauxv(procstat, kipp, &count);
if (auxv == NULL)
return;
- snprintf(prefix, sizeof(prefix), "%5d %-16s", kipp->ki_pid,
+ snprintf(prefix, sizeof(prefix), "%5d %-16s", kipp->ki_pid,
+ kipp->ki_comm);
+
+ xo_emit("{e:process_id/%5d/%d}{e:command/%-16s/%s}", kipp->ki_pid,
kipp->ki_comm);
+
for (i = 0; i < count; i++) {
switch(auxv[i].a_type) {
case AT_NULL:
@@ -69,92 +71,119 @@ procstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp)
case AT_IGNORE:
break;
case AT_EXECFD:
- PRINT(AT_EXECFD, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EXECFD/%ld}\n",
+ prefix, "AT_EXECFD", (long)auxv[i].a_un.a_val);
break;
case AT_PHDR:
- PRINT(AT_PHDR, %p, auxv[i].a_un.a_ptr);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHDR/%p}\n",
+ prefix, "AT_PHDR", auxv[i].a_un.a_ptr);
break;
case AT_PHENT:
- PRINT(AT_PHENT, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHENT/%ld}\n",
+ prefix, "AT_PHENT", (long)auxv[i].a_un.a_val);
break;
case AT_PHNUM:
- PRINT(AT_PHNUM, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHNUM/%ld}\n",
+ prefix, "AT_PHNUM", (long)auxv[i].a_un.a_val);
break;
case AT_PAGESZ:
- PRINT(AT_PAGESZ, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PAGESZ/%ld}\n",
+ prefix, "AT_PAGESZ", (long)auxv[i].a_un.a_val);
break;
case AT_BASE:
- PRINT(AT_BASE, %p, auxv[i].a_un.a_ptr);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_BASE/%p}\n",
+ prefix, "AT_BASE", auxv[i].a_un.a_ptr);
break;
case AT_FLAGS:
- PRINT(AT_FLAGS, %#lx, (u_long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_FLAGS/%#lx}\n",
+ prefix, "AT_FLAGS", (u_long)auxv[i].a_un.a_val);
break;
case AT_ENTRY:
- PRINT(AT_ENTRY, %p, auxv[i].a_un.a_ptr);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_ENTRY/%p}\n",
+ prefix, "AT_ENTRY", auxv[i].a_un.a_ptr);
break;
#ifdef AT_NOTELF
case AT_NOTELF:
- PRINT(AT_NOTELF, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_NOTELF/%ld}\n",
+ prefix, "AT_NOTELF", (long)auxv[i].a_un.a_val);
break;
#endif
#ifdef AT_UID
case AT_UID:
- PRINT(AT_UID, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_UID/%ld}\n",
+ prefix, "AT_UID", (long)auxv[i].a_un.a_val);
break;
#endif
#ifdef AT_EUID
case AT_EUID:
- PRINT(AT_EUID, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EUID/%ld}\n",
+ prefix, "AT_EUID", (long)auxv[i].a_un.a_val);
break;
#endif
#ifdef AT_GID
case AT_GID:
- PRINT(AT_GID, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_GID/%ld}\n",
+ prefix, "AT_GID", (long)auxv[i].a_un.a_val);
break;
#endif
#ifdef AT_EGID
case AT_EGID:
- PRINT(AT_EGID, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EGID/%ld}\n",
+ prefix, "AT_EGID", (long)auxv[i].a_un.a_val);
break;
#endif
case AT_EXECPATH:
- PRINT(AT_EXECPATH, %p, auxv[i].a_un.a_ptr);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EXECPATH/%p}\n",
+ prefix, "AT_EXECPATH", auxv[i].a_un.a_ptr);
break;
case AT_CANARY:
- PRINT(AT_CANARY, %p, auxv[i].a_un.a_ptr);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_CANARY/%p}\n",
+ prefix, "AT_CANARY", auxv[i].a_un.a_ptr);
break;
case AT_CANARYLEN:
- PRINT(AT_CANARYLEN, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_CANARYLEN/%ld}\n",
+ prefix, "AT_CANARYLEN", (long)auxv[i].a_un.a_val);
break;
case AT_OSRELDATE:
- PRINT(AT_OSRELDATE, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_OSRELDATE/%ld}\n",
+ prefix, "AT_OSRELDATE", (long)auxv[i].a_un.a_val);
break;
case AT_NCPUS:
- PRINT(AT_NCPUS, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_NCPUS/%ld}\n",
+ prefix, "AT_NCPUS", (long)auxv[i].a_un.a_val);
break;
case AT_PAGESIZES:
- PRINT(AT_PAGESIZES, %p, auxv[i].a_un.a_ptr);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PAGESIZES/%p}\n",
+ prefix, "AT_PAGESIZES", auxv[i].a_un.a_ptr);
break;
case AT_PAGESIZESLEN:
- PRINT(AT_PAGESIZESLEN, %ld, (long)auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
+ "{:AT_PAGESIZESLEN/%ld}\n", prefix,
+ "AT_PAGESIZESLEN", (long)auxv[i].a_un.a_val);
break;
case AT_STACKPROT:
if ((auxv[i].a_un.a_val & VM_PROT_EXECUTE) != 0)
- PRINT(AT_STACKPROT, %s, "NONEXECUTABLE");
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
+ "{:AT_STACKPROT/%s}\n", prefix,
+ "AT_STACKPROT", "NONEXECUTABLE");
else
- PRINT(AT_STACKPROT, %s, "EXECUTABLE");
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
+ "{:AT_STACKPROT/%s}\n", prefix,
+ "AT_STACKPROT", "EXECUTABLE");
break;
#ifdef AT_TIMEKEEP
case AT_TIMEKEEP:
- PRINT(AT_TIMEKEEP, %p, auxv[i].a_un.a_ptr);
+ xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_TIMEKEEP/%p}\n",
+ prefix, "AT_TIMEKEEP", auxv[i].a_un.a_ptr);
break;
#endif
default:
- PRINT_UNKNOWN(auxv[i].a_type, auxv[i].a_un.a_val);
+ xo_emit("{dw:/%s}{Lw:/%16ld/%ld}{:UNKNOWN/%#lx}\n",
+ prefix, auxv[i].a_type, auxv[i].a_un.a_val);
break;
}
}
- printf("\n");
+ xo_emit("\n");
procstat_freeauxv(procstat, auxv);
}
diff --git a/usr.bin/procstat/procstat_basic.c b/usr.bin/procstat/procstat_basic.c
index af43fd1..75bb7a8 100644
--- a/usr.bin/procstat/procstat_basic.c
+++ b/usr.bin/procstat/procstat_basic.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -42,24 +43,26 @@ procstat_basic(struct kinfo_proc *kipp)
{
if (!hflag)
- printf("%5s %5s %5s %5s %5s %3s %-8s %-9s %-13s %-12s\n",
+ xo_emit("{T:/%5s %5s %5s %5s %5s %3s %-8s %-9s %-13s %-12s}\n",
"PID", "PPID", "PGID", "SID", "TSID", "THR", "LOGIN",
"WCHAN", "EMUL", "COMM");
- printf("%5d ", kipp->ki_pid);
- printf("%5d ", kipp->ki_ppid);
- printf("%5d ", kipp->ki_pgid);
- printf("%5d ", kipp->ki_sid);
- printf("%5d ", kipp->ki_tsid);
- printf("%3d ", kipp->ki_numthreads);
- printf("%-8s ", strlen(kipp->ki_login) ? kipp->ki_login : "-");
+ xo_emit("{k:process_id/%5d/%d} ", kipp->ki_pid);
+ xo_emit("{:parent_process_id/%5d/%d} ", kipp->ki_ppid);
+ xo_emit("{:process_group_id/%5d/%d} ", kipp->ki_pgid);
+ xo_emit("{:session_id/%5d/%d} ", kipp->ki_sid);
+ xo_emit("{:terminal_session_id/%5d/%d} ", kipp->ki_tsid);
+ xo_emit("{:threads/%3d/%d} ", kipp->ki_numthreads);
+ xo_emit("{:login/%-8s/%s} ", strlen(kipp->ki_login) ?
+ kipp->ki_login : "-");
if (kipp->ki_kiflag & KI_LOCKBLOCK) {
- printf("*%-8s ", strlen(kipp->ki_lockname) ?
+ xo_emit("{:lockname/*%-8s/%s} ", strlen(kipp->ki_lockname) ?
kipp->ki_lockname : "-");
} else {
- printf("%-9s ", strlen(kipp->ki_wmesg) ?
+ xo_emit("{:wait_channel/%-9s/%s} ", strlen(kipp->ki_wmesg) ?
kipp->ki_wmesg : "-");
}
- printf("%-13s ", strcmp(kipp->ki_emul, "null") ? kipp->ki_emul : "-");
- printf("%-12s\n", kipp->ki_comm);
+ xo_emit("{:emulation/%-13s/%s} ", strcmp(kipp->ki_emul, "null") ?
+ kipp->ki_emul : "-");
+ xo_emit("{:command/%-12s/%s}\n", kipp->ki_comm);
}
diff --git a/usr.bin/procstat/procstat_bin.c b/usr.bin/procstat/procstat_bin.c
index dc88c38..8b2b8a1 100644
--- a/usr.bin/procstat/procstat_bin.c
+++ b/usr.bin/procstat/procstat_bin.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -46,7 +47,8 @@ procstat_bin(struct procstat *prstat, struct kinfo_proc *kipp)
static char pathname[PATH_MAX];
if (!hflag)
- printf("%5s %-16s %8s %s\n", "PID", "COMM", "OSREL", "PATH");
+ xo_emit("{T:/%5s %-16s %8s %s}\n", "PID", "COMM", "OSREL",
+ "PATH");
if (procstat_getpathname(prstat, kipp, pathname, sizeof(pathname)) != 0)
return;
@@ -55,8 +57,8 @@ procstat_bin(struct procstat *prstat, struct kinfo_proc *kipp)
if (procstat_getosrel(prstat, kipp, &osrel) != 0)
return;
- printf("%5d ", kipp->ki_pid);
- printf("%-16s ", kipp->ki_comm);
- printf("%8d ", osrel);
- printf("%s\n", pathname);
+ xo_emit("{k:process_id/%5d/%d} ", kipp->ki_pid);
+ xo_emit("{:command/%-16s/%s} ", kipp->ki_comm);
+ xo_emit("{:osrel/%8d/%d} ", osrel);
+ xo_emit("{:pathname/%s}\n", pathname);
}
diff --git a/usr.bin/procstat/procstat_cred.c b/usr.bin/procstat/procstat_cred.c
index f9a2241..940c952 100644
--- a/usr.bin/procstat/procstat_cred.c
+++ b/usr.bin/procstat/procstat_cred.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007-2008 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -48,21 +49,22 @@ procstat_cred(struct procstat *procstat, struct kinfo_proc *kipp)
gid_t *groups;
if (!hflag)
- printf("%5s %-16s %5s %5s %5s %5s %5s %5s %5s %5s %-15s\n",
+ xo_emit("{T:/%5s %-16s %5s %5s %5s %5s %5s %5s %5s %5s %-15s}\n",
"PID", "COMM", "EUID", "RUID", "SVUID", "EGID", "RGID",
"SVGID", "UMASK", "FLAGS", "GROUPS");
- printf("%5d ", kipp->ki_pid);
- printf("%-16s ", kipp->ki_comm);
- printf("%5d ", kipp->ki_uid);
- printf("%5d ", kipp->ki_ruid);
- printf("%5d ", kipp->ki_svuid);
- printf("%5d ", kipp->ki_groups[0]);
- printf("%5d ", kipp->ki_rgid);
- printf("%5d ", kipp->ki_svgid);
- printf("%5s ", get_umask(procstat, kipp));
- printf("%s", kipp->ki_cr_flags & CRED_FLAG_CAPMODE ? "C" : "-");
- printf(" ");
+ xo_emit("{k:process_id/%5d/%d} ", kipp->ki_pid);
+ xo_emit("{:command/%-16s/%s} ", kipp->ki_comm);
+ xo_emit("{:uid/%5d} ", kipp->ki_uid);
+ xo_emit("{:ruid/%5d} ", kipp->ki_ruid);
+ xo_emit("{:svuid/%5d} ", kipp->ki_svuid);
+ xo_emit("{:group/%5d} ", kipp->ki_groups[0]);
+ xo_emit("{:rgid/%5d} ", kipp->ki_rgid);
+ xo_emit("{:svgid/%5d} ", kipp->ki_svgid);
+ xo_emit("{:umask/%5s} ", get_umask(procstat, kipp));
+ xo_emit("{:cr_flags/%s}", kipp->ki_cr_flags & CRED_FLAG_CAPMODE ?
+ "C" : "-");
+ xo_emit("{P: }");
groups = NULL;
/*
@@ -76,12 +78,14 @@ procstat_cred(struct procstat *procstat, struct kinfo_proc *kipp)
ngroups = kipp->ki_ngroups;
groups = kipp->ki_groups;
}
+ xo_open_list("groups");
for (i = 0; i < ngroups; i++)
- printf("%s%d", (i > 0) ? "," : "", groups[i]);
+ xo_emit("{D:/%s}{l:groups/%d}", (i > 0) ? "," : "", groups[i]);
if (groups != kipp->ki_groups)
procstat_freegroups(procstat, groups);
- printf("\n");
+ xo_close_list("groups");
+ xo_emit("\n");
}
static const char *
diff --git a/usr.bin/procstat/procstat_cs.c b/usr.bin/procstat/procstat_cs.c
index 8ccf1ea..bbf9d05 100644
--- a/usr.bin/procstat/procstat_cs.c
+++ b/usr.bin/procstat/procstat_cs.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -28,6 +29,7 @@
#include <sys/param.h>
#include <sys/cpuset.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/user.h>
@@ -46,11 +48,12 @@ procstat_cs(struct procstat *procstat, struct kinfo_proc *kipp)
cpusetid_t cs;
cpuset_t mask;
struct kinfo_proc *kip;
+ struct sbuf *cpusetbuf;
unsigned int count, i;
int once, twice, lastcpu, cpu;
if (!hflag)
- printf("%5s %6s %-16s %-16s %2s %4s %-7s\n", "PID",
+ xo_emit("{T:/%5s %6s %-16s %-16s %2s %4s %-7s}\n", "PID",
"TID", "COMM", "TDNAME", "CPU", "CSID", "CPU MASK");
kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
@@ -60,49 +63,57 @@ procstat_cs(struct procstat *procstat, struct kinfo_proc *kipp)
kinfo_proc_sort(kip, count);
for (i = 0; i < count; i++) {
kipp = &kip[i];
- printf("%5d ", kipp->ki_pid);
- printf("%6d ", kipp->ki_tid);
- printf("%-16s ", strlen(kipp->ki_comm) ?
+ xo_emit("{k:process_id/%5d/%d} ", kipp->ki_pid);
+ xo_emit("{:thread_id/%6d/%d} ", kipp->ki_tid);
+ xo_emit("{:command/%-16s/%s} ", strlen(kipp->ki_comm) ?
kipp->ki_comm : "-");
- printf("%-16s ", (strlen(kipp->ki_tdname) &&
+ xo_emit("{:thread_name/%-16s/%s} ", (strlen(kipp->ki_tdname) &&
(strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ?
kipp->ki_tdname : "-");
if (kipp->ki_oncpu != 255)
- printf("%3d ", kipp->ki_oncpu);
+ xo_emit("{:cpu/%3d/%d} ", kipp->ki_oncpu);
else if (kipp->ki_lastcpu != 255)
- printf("%3d ", kipp->ki_lastcpu);
+ xo_emit("{:cpu/%3d/%d} ", kipp->ki_lastcpu);
else
- printf("%3s ", "-");
+ xo_emit("{:cpu/%3s/%s} ", "-");
if (cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID,
kipp->ki_tid, &cs) != 0) {
cs = CPUSET_INVALID;
}
- printf("%4d ", cs);
+ xo_emit("{:cpu_set_id/%4d/%d} ", cs);
if ((cs != CPUSET_INVALID) &&
(cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
kipp->ki_tid, sizeof(mask), &mask) == 0)) {
lastcpu = -1;
once = 0;
twice = 0;
+ cpusetbuf = sbuf_new_auto();
for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {
if (CPU_ISSET(cpu, &mask)) {
if (once == 0) {
- printf("%d", cpu);
+ sbuf_printf(cpusetbuf, "%d",
+ cpu);
once = 1;
} else if (cpu == lastcpu + 1) {
twice = 1;
} else if (twice == 1) {
- printf("-%d,%d", lastcpu, cpu);
+ sbuf_printf(cpusetbuf, "-%d,%d",
+ lastcpu, cpu);
twice = 0;
} else
- printf(",%d", cpu);
+ sbuf_printf(cpusetbuf, ",%d",
+ cpu);
lastcpu = cpu;
}
}
if (once && twice)
- printf("-%d", lastcpu);
+ sbuf_printf(cpusetbuf, "-%d", lastcpu);
+ if (sbuf_finish(cpusetbuf) != 0)
+ xo_err(1, "Could not generate output");
+ xo_emit("{:cpu_set/%s}", sbuf_data(cpusetbuf));
+ sbuf_delete(cpusetbuf);
}
- printf("\n");
+ xo_emit("\n");
}
procstat_freeprocs(procstat, kip);
}
diff --git a/usr.bin/procstat/procstat_files.c b/usr.bin/procstat/procstat_files.c
index 85c51f3..ae7928d 100644
--- a/usr.bin/procstat/procstat_files.c
+++ b/usr.bin/procstat/procstat_files.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007-2011 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -123,15 +124,6 @@ addr_to_string(struct sockaddr_storage *ss, char *buffer, int buflen)
}
}
-static void
-print_address(struct sockaddr_storage *ss)
-{
- char addr[PATH_MAX];
-
- addr_to_string(ss, addr, sizeof(addr));
- printf("%s", addr);
-}
-
static struct cap_desc {
uint64_t cd_right;
const char *cd_desc;
@@ -158,11 +150,13 @@ static struct cap_desc {
{ CAP_FSTAT, "fs" },
{ CAP_FSTATFS, "sf" },
{ CAP_FUTIMES, "fu" },
- { CAP_LINKAT, "li" },
+ { CAP_LINKAT_SOURCE, "ls" },
+ { CAP_LINKAT_TARGET, "lt" },
{ CAP_MKDIRAT, "md" },
{ CAP_MKFIFOAT, "mf" },
{ CAP_MKNODAT, "mn" },
- { CAP_RENAMEAT, "rn" },
+ { CAP_RENAMEAT_SOURCE, "rs" },
+ { CAP_RENAMEAT_TARGET, "rt" },
{ CAP_SYMLINKAT, "sl" },
{ CAP_UNLINKAT, "un" },
@@ -271,19 +265,22 @@ print_capability(cap_rights_t *rightsp, u_int capwidth)
width = 0;
for (i = width_capability(rightsp); i < capwidth; i++) {
if (i != 0)
- printf(" ");
+ xo_emit(" ");
else
- printf("-");
+ xo_emit("-");
}
+ xo_open_list("capabilities");
for (i = 0; i < cap_desc_count; i++) {
if (cap_rights_is_set(rightsp, cap_desc[i].cd_right)) {
- printf("%s%s", count ? "," : "", cap_desc[i].cd_desc);
+ xo_emit("{D:/%s}{l:capabilities/%s}", count ? "," : "",
+ cap_desc[i].cd_desc);
width += strlen(cap_desc[i].cd_desc);
if (count)
width++;
count++;
}
}
+ xo_close_list("capabilities");
}
void
@@ -296,6 +293,8 @@ procstat_files(struct procstat *procstat, struct kinfo_proc *kipp)
struct vnstat vn;
u_int capwidth, width;
int error;
+ char src_addr[PATH_MAX];
+ char dst_addr[PATH_MAX];
/*
* To print the header in capability mode, we need to know the width
@@ -317,84 +316,103 @@ procstat_files(struct procstat *procstat, struct kinfo_proc *kipp)
if (!hflag) {
if (Cflag)
- printf("%5s %-16s %5s %1s %-8s %-*s "
- "%-3s %-12s\n", "PID", "COMM", "FD", "T",
+ xo_emit("{T:/%5s %-16s %5s %1s %-8s %-*s "
+ "%-3s %-12s}\n", "PID", "COMM", "FD", "T",
"FLAGS", capwidth, "CAPABILITIES", "PRO",
"NAME");
else
- printf("%5s %-16s %5s %1s %1s %-8s "
- "%3s %7s %-3s %-12s\n", "PID", "COMM", "FD", "T",
+ xo_emit("{T:/%5s %-16s %5s %1s %1s %-8s "
+ "%3s %7s %-3s %-12s}\n", "PID", "COMM", "FD", "T",
"V", "FLAGS", "REF", "OFFSET", "PRO", "NAME");
}
if (head == NULL)
return;
+ xo_emit("{ek:process_id/%5d/%d}", kipp->ki_pid);
+ xo_emit("{e:command/%-16s/%s}", kipp->ki_comm);
+ xo_open_list("files");
STAILQ_FOREACH(fst, head, next) {
- printf("%5d ", kipp->ki_pid);
- printf("%-16s ", kipp->ki_comm);
+ xo_open_instance("files");
+ xo_emit("{dk:process_id/%5d/%d} ", kipp->ki_pid);
+ xo_emit("{d:command/%-16s/%s} ", kipp->ki_comm);
if (fst->fs_uflags & PS_FST_UFLAG_CTTY)
- printf(" ctty ");
+ xo_emit("{P: }{:fd/%s} ", "ctty");
else if (fst->fs_uflags & PS_FST_UFLAG_CDIR)
- printf(" cwd ");
+ xo_emit("{P: }{:fd/%s} ", "cwd");
else if (fst->fs_uflags & PS_FST_UFLAG_JAIL)
- printf(" jail ");
+ xo_emit("{P: }{:fd/%s} ", "jail");
else if (fst->fs_uflags & PS_FST_UFLAG_RDIR)
- printf(" root ");
+ xo_emit("{P: }{:fd/%s} ", "root");
else if (fst->fs_uflags & PS_FST_UFLAG_TEXT)
- printf(" text ");
+ xo_emit("{P: }{:fd/%s} ", "text");
else if (fst->fs_uflags & PS_FST_UFLAG_TRACE)
- printf("trace ");
+ xo_emit("{:fd/%s} ", "trace");
else
- printf("%5d ", fst->fs_fd);
+ xo_emit("{:fd/%5d} ", fst->fs_fd);
switch (fst->fs_type) {
case PS_FST_TYPE_VNODE:
str = "v";
+ xo_emit("{eq:fd_type/vnode}");
break;
case PS_FST_TYPE_SOCKET:
str = "s";
+ xo_emit("{eq:fd_type/socket}");
break;
case PS_FST_TYPE_PIPE:
str = "p";
+ xo_emit("{eq:fd_type/pipe}");
break;
case PS_FST_TYPE_FIFO:
str = "f";
+ xo_emit("{eq:fd_type/fifo}");
break;
case PS_FST_TYPE_KQUEUE:
str = "k";
+ xo_emit("{eq:fd_type/kqueue}");
break;
case PS_FST_TYPE_CRYPTO:
str = "c";
+ xo_emit("{eq:fd_type/crypto}");
break;
case PS_FST_TYPE_MQUEUE:
str = "m";
+ xo_emit("{eq:fd_type/mqueue}");
break;
case PS_FST_TYPE_SHM:
str = "h";
+ xo_emit("{eq:fd_type/shm}");
break;
case PS_FST_TYPE_PTS:
str = "t";
+ xo_emit("{eq:fd_type/pts}");
break;
case PS_FST_TYPE_SEM:
str = "e";
+ xo_emit("{eq:fd_type/sem}");
break;
case PS_FST_TYPE_NONE:
+ str = "?";
+ xo_emit("{eq:fd_type/none}");
+ break;
+
case PS_FST_TYPE_UNKNOWN:
default:
str = "?";
+ xo_emit("{eq:fd_type/unknown}");
break;
}
- printf("%1s ", str);
+ xo_emit("{d:fd_type/%1s/%s} ", str);
if (!Cflag) {
str = "-";
if (fst->fs_type == PS_FST_TYPE_VNODE) {
@@ -403,74 +421,118 @@ procstat_files(struct procstat *procstat, struct kinfo_proc *kipp)
switch (vn.vn_type) {
case PS_FST_VTYPE_VREG:
str = "r";
+ xo_emit("{eq:vode_type/regular}");
break;
case PS_FST_VTYPE_VDIR:
str = "d";
+ xo_emit("{eq:vode_type/directory}");
break;
case PS_FST_VTYPE_VBLK:
str = "b";
+ xo_emit("{eq:vode_type/block}");
break;
case PS_FST_VTYPE_VCHR:
str = "c";
+ xo_emit("{eq:vode_type/character}");
break;
case PS_FST_VTYPE_VLNK:
str = "l";
+ xo_emit("{eq:vode_type/link}");
break;
case PS_FST_VTYPE_VSOCK:
str = "s";
+ xo_emit("{eq:vode_type/socket}");
break;
case PS_FST_VTYPE_VFIFO:
str = "f";
+ xo_emit("{eq:vode_type/fifo}");
break;
case PS_FST_VTYPE_VBAD:
str = "x";
+ xo_emit("{eq:vode_type/revoked_device}");
break;
case PS_FST_VTYPE_VNON:
+ str = "?";
+ xo_emit("{eq:vode_type/non}");
+ break;
+
case PS_FST_VTYPE_UNKNOWN:
default:
str = "?";
+ xo_emit("{eq:vode_type/unknown}");
break;
}
}
- printf("%1s ", str);
+ xo_emit("{d:vnode_type/%1s/%s} ", str);
}
- printf("%s", fst->fs_fflags & PS_FST_FFLAG_READ ? "r" : "-");
- printf("%s", fst->fs_fflags & PS_FST_FFLAG_WRITE ? "w" : "-");
- printf("%s", fst->fs_fflags & PS_FST_FFLAG_APPEND ? "a" : "-");
- printf("%s", fst->fs_fflags & PS_FST_FFLAG_ASYNC ? "s" : "-");
- printf("%s", fst->fs_fflags & PS_FST_FFLAG_SYNC ? "f" : "-");
- printf("%s", fst->fs_fflags & PS_FST_FFLAG_NONBLOCK ? "n" : "-");
- printf("%s", fst->fs_fflags & PS_FST_FFLAG_DIRECT ? "d" : "-");
- printf("%s", fst->fs_fflags & PS_FST_FFLAG_HASLOCK ? "l" : "-");
- printf(" ");
+
+ xo_emit("{d:/%s}", fst->fs_fflags & PS_FST_FFLAG_READ ?
+ "r" : "-");
+ xo_emit("{d:/%s}", fst->fs_fflags & PS_FST_FFLAG_WRITE ?
+ "w" : "-");
+ xo_emit("{d:/%s}", fst->fs_fflags & PS_FST_FFLAG_APPEND ?
+ "a" : "-");
+ xo_emit("{d:/%s}", fst->fs_fflags & PS_FST_FFLAG_ASYNC ?
+ "s" : "-");
+ xo_emit("{d:/%s}", fst->fs_fflags & PS_FST_FFLAG_SYNC ?
+ "f" : "-");
+ xo_emit("{d:/%s}", fst->fs_fflags & PS_FST_FFLAG_NONBLOCK ?
+ "n" : "-");
+ xo_emit("{d:/%s}", fst->fs_fflags & PS_FST_FFLAG_DIRECT ?
+ "d" : "-");
+ xo_emit("{d:/%s}", fst->fs_fflags & PS_FST_FFLAG_HASLOCK ?
+ "l" : "-");
+ xo_emit(" ");
+ xo_open_list("fd_flags");
+ if (fst->fs_fflags & PS_FST_FFLAG_READ)
+ xo_emit("{elq:fd_flags/read}");
+ if (fst->fs_fflags & PS_FST_FFLAG_WRITE)
+ xo_emit("{elq:fd_flags/write}");
+ if (fst->fs_fflags & PS_FST_FFLAG_APPEND)
+ xo_emit("{elq:fd_flags/append}");
+ if (fst->fs_fflags & PS_FST_FFLAG_ASYNC)
+ xo_emit("{elq:fd_flags/async}");
+ if (fst->fs_fflags & PS_FST_FFLAG_SYNC)
+ xo_emit("{elq:fd_flags/fsync}");
+ if (fst->fs_fflags & PS_FST_FFLAG_NONBLOCK)
+ xo_emit("{elq:fd_flags/nonblocking}");
+ if (fst->fs_fflags & PS_FST_FFLAG_DIRECT)
+ xo_emit("{elq:fd_flags/direct_io}");
+ if (fst->fs_fflags & PS_FST_FFLAG_HASLOCK)
+ xo_emit("{elq:fd_flags/lock_held}");
+ xo_close_list("fd_flags");
+
if (!Cflag) {
if (fst->fs_ref_count > -1)
- printf("%3d ", fst->fs_ref_count);
+ xo_emit("{:ref_count/%3d/%d} ",
+ fst->fs_ref_count);
else
- printf("%3c ", '-');
+ xo_emit("{q:ref_count/%3c/%c} ", '-');
if (fst->fs_offset > -1)
- printf("%7jd ", (intmax_t)fst->fs_offset);
+ xo_emit("{:offset/%7jd/%jd} ",
+ (intmax_t)fst->fs_offset);
else
- printf("%7c ", '-');
+ xo_emit("{q:offset/%7c/%c} ", '-');
}
if (Cflag) {
print_capability(&fst->fs_cap_rights, capwidth);
- printf(" ");
+ xo_emit(" ");
}
switch (fst->fs_type) {
case PS_FST_TYPE_SOCKET:
- error = procstat_get_socket_info(procstat, fst, &sock, NULL);
+ error = procstat_get_socket_info(procstat, fst, &sock,
+ NULL);
if (error != 0)
break;
- printf("%-3s ",
+ xo_emit("{:protocol/%-3s/%s} ",
protocol_to_string(sock.dom_family,
sock.type, sock.proto));
/*
@@ -485,22 +547,30 @@ procstat_files(struct procstat *procstat, struct kinfo_proc *kipp)
(struct sockaddr_un *)&sock.sa_local;
if (sun->sun_path[0] != 0)
- print_address(&sock.sa_local);
+ addr_to_string(&sock.sa_local,
+ src_addr, sizeof(src_addr));
else
- print_address(&sock.sa_peer);
+ addr_to_string(&sock.sa_peer,
+ src_addr, sizeof(src_addr));
+ xo_emit("{:path/%s}", src_addr);
} else {
- print_address(&sock.sa_local);
- printf(" ");
- print_address(&sock.sa_peer);
+ addr_to_string(&sock.sa_local, src_addr,
+ sizeof(src_addr));
+ addr_to_string(&sock.sa_peer, dst_addr,
+ sizeof(dst_addr));
+ xo_emit("{:path/%s %s}", src_addr, dst_addr);
}
break;
default:
- printf("%-3s ", "-");
- printf("%-18s", fst->fs_path != NULL ? fst->fs_path : "-");
+ xo_emit("{:protocol/%-3s/%s} ", "-");
+ xo_emit("{:path/%-18s/%s}", fst->fs_path != NULL ?
+ fst->fs_path : "-");
}
- printf("\n");
+ xo_emit("\n");
+ xo_close_instance("files");
}
+ xo_close_list("files");
procstat_freefiles(procstat, head);
}
diff --git a/usr.bin/procstat/procstat_kstack.c b/usr.bin/procstat/procstat_kstack.c
index 8ffa4f9..cf32447 100644
--- a/usr.bin/procstat/procstat_kstack.c
+++ b/usr.bin/procstat/procstat_kstack.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -105,6 +106,42 @@ kstack_cleanup(const char *old, char *new, int kflag)
*cp_new = '\0';
}
+static void
+kstack_cleanup_encoded(const char *old, char *new, int kflag)
+{
+ enum trace_state old_ts, ts;
+ const char *cp_old;
+ char *cp_new, *cp_loop, *cp_tofree, *cp_line;
+
+ ts = TS_FRAMENUM;
+ if (kflag == 1) {
+ for (cp_old = old, cp_new = new; *cp_old != '\0'; cp_old++) {
+ switch (*cp_old) {
+ case '\n':
+ *cp_new = *cp_old;
+ cp_new++;
+ case ' ':
+ case '+':
+ old_ts = ts;
+ ts = kstack_nextstate(old_ts);
+ continue;
+ }
+ if (ts == TS_FUNC) {
+ *cp_new = *cp_old;
+ cp_new++;
+ }
+ }
+ cp_tofree = cp_loop = strdup(new);
+ } else
+ cp_tofree = cp_loop = strdup(old);
+ while ((cp_line = strsep(&cp_loop, "\n")) != NULL) {
+ if (strlen(cp_line) != 0 && *cp_line != 127)
+ xo_emit("{le:token/%s}", cp_line);
+ }
+ *cp_new = '\0';
+ free(cp_tofree);
+}
+
/*
* Sort threads by tid.
*/
@@ -129,12 +166,12 @@ procstat_kstack(struct procstat *procstat, struct kinfo_proc *kipp, int kflag)
{
struct kinfo_kstack *kkstp, *kkstp_free;
struct kinfo_proc *kip, *kip_free;
- char trace[KKST_MAXLEN];
+ char trace[KKST_MAXLEN], encoded_trace[KKST_MAXLEN];
unsigned int i, j;
unsigned int kip_count, kstk_count;
if (!hflag)
- printf("%5s %6s %-16s %-16s %-29s\n", "PID", "TID", "COMM",
+ xo_emit("{T:/%5s %6s %-16s %-16s %-29s}\n", "PID", "TID", "COMM",
"TDNAME", "KSTACK");
kkstp = kkstp_free = procstat_getkstack(procstat, kipp, &kstk_count);
@@ -169,27 +206,27 @@ procstat_kstack(struct procstat *procstat, struct kinfo_proc *kipp, int kflag)
if (kipp == NULL)
continue;
- printf("%5d ", kipp->ki_pid);
- printf("%6d ", kkstp->kkst_tid);
- printf("%-16s ", kipp->ki_comm);
- printf("%-16s ", (strlen(kipp->ki_tdname) &&
+ xo_emit("{k:process_id/%5d/%d} ", kipp->ki_pid);
+ xo_emit("{:thread_id/%6d/%d} ", kkstp->kkst_tid);
+ xo_emit("{:command/%-16s/%s} ", kipp->ki_comm);
+ xo_emit("{:thread_name/%-16s/%s} ", (strlen(kipp->ki_tdname) &&
(strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ?
kipp->ki_tdname : "-");
switch (kkstp->kkst_state) {
case KKST_STATE_RUNNING:
- printf("%-29s\n", "<running>");
+ xo_emit("{:state/%-29s/%s}\n", "<running>");
continue;
case KKST_STATE_SWAPPED:
- printf("%-29s\n", "<swapped>");
+ xo_emit("{:state/%-29s/%s}\n", "<swapped>");
continue;
case KKST_STATE_STACKOK:
break;
default:
- printf("%-29s\n", "<unknown>");
+ xo_emit("{:state/%-29s/%s}\n", "<unknown>");
continue;
}
@@ -199,7 +236,10 @@ procstat_kstack(struct procstat *procstat, struct kinfo_proc *kipp, int kflag)
* returns to spaces.
*/
kstack_cleanup(kkstp->kkst_trace, trace, kflag);
- printf("%-29s\n", trace);
+ xo_open_list("trace");
+ kstack_cleanup_encoded(kkstp->kkst_trace, encoded_trace, kflag);
+ xo_close_list("trace");
+ xo_emit("{d:trace/%-29s}\n", trace);
}
procstat_freekstack(procstat, kkstp_free);
procstat_freeprocs(procstat, kip_free);
diff --git a/usr.bin/procstat/procstat_rlimit.c b/usr.bin/procstat/procstat_rlimit.c
index f7f67af..5e7d12e 100644
--- a/usr.bin/procstat/procstat_rlimit.c
+++ b/usr.bin/procstat/procstat_rlimit.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2011 Mikolaj Golub
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -93,15 +94,33 @@ procstat_rlimit(struct procstat *prstat, struct kinfo_proc *kipp)
int i;
if (!hflag) {
- printf("%5s %-16s %-16s %16s %16s\n",
+ xo_emit("{T:/%5s %-16s %-16s %16s %16s}\n",
"PID", "COMM", "RLIMIT", "SOFT ", "HARD ");
}
+ xo_emit("{ek:process_id/%5d}{e:command/%-16s/%s}", kipp->ki_pid,
+ kipp->ki_comm);
for (i = 0; i < RLIM_NLIMITS; i++) {
if (procstat_getrlimit(prstat, kipp, i, &rlimit) == -1)
return;
- printf("%5d %-16s %-16s ", kipp->ki_pid, kipp->ki_comm,
+ xo_emit("{dk:process_id/%5d} {d:command/%-16s} "
+ "{d:rlimit_param/%-16s} ", kipp->ki_pid, kipp->ki_comm,
rlimit_param[i].name);
- printf("%16s ", humanize_rlimit(i, rlimit.rlim_cur));
- printf("%16s\n", humanize_rlimit(i, rlimit.rlim_max));
+
+ xo_open_container(rlimit_param[i].name);
+ if (rlimit.rlim_cur == RLIM_INFINITY)
+ xo_emit("{e:soft_limit/infinity}");
+ else
+ xo_emit("{e:soft_limit/%U}", rlimit.rlim_cur);
+
+ if (rlimit.rlim_max == RLIM_INFINITY)
+ xo_emit("{e:hard_limit/infinity}");
+ else
+ xo_emit("{e:hard_limit/%U}", rlimit.rlim_max);
+ xo_close_container(rlimit_param[i].name);
+
+ xo_emit("{d:rlim_cur/%16s} ",
+ humanize_rlimit(i, rlimit.rlim_cur));
+ xo_emit("{d:rlim_max/%16s}\n",
+ humanize_rlimit(i, rlimit.rlim_max));
}
}
diff --git a/usr.bin/procstat/procstat_rusage.c b/usr.bin/procstat/procstat_rusage.c
index 63e5ab8..e14ae24 100644
--- a/usr.bin/procstat/procstat_rusage.c
+++ b/usr.bin/procstat/procstat_rusage.c
@@ -1,6 +1,7 @@
/*-
* Copyright (c) 2012 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -35,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <libprocstat.h>
#include <stdbool.h>
#include <stdio.h>
+#include <stdlib.h>
#include <libutil.h>
#include "procstat.h"
@@ -79,7 +81,7 @@ format_time(struct timeval *tv)
else if (days > 0)
used += snprintf(buffer, sizeof(buffer), "%u days ", days);
- snprintf(buffer + used, sizeof(buffer) - used, "%02u:%02u:%02u.%06u ",
+ snprintf(buffer + used, sizeof(buffer) - used, "%02u:%02u:%02u.%06u",
hours, minutes, seconds, (unsigned int)tv->tv_usec);
return (buffer);
}
@@ -103,10 +105,10 @@ static void
print_prefix(struct kinfo_proc *kipp)
{
- printf("%5d ", kipp->ki_pid);
+ xo_emit("{d:process_id/%5d/%d} ", kipp->ki_pid);
if (Hflag)
- printf("%6d ", kipp->ki_tid);
- printf("%-16s ", kipp->ki_comm);
+ xo_emit("{d:thread_id/%6d/%d} ", kipp->ki_tid);
+ xo_emit("{d:command/%-16s/%s} ", kipp->ki_comm);
}
static void
@@ -114,21 +116,48 @@ print_rusage(struct kinfo_proc *kipp)
{
long *lp;
unsigned int i;
+ char *field, *threadid;
print_prefix(kipp);
- printf("%-14s %32s\n", "user time",
+ xo_emit("{d:resource/%-14s} {d:usage/%29s}{P: }\n", "user time",
format_time(&kipp->ki_rusage.ru_utime));
print_prefix(kipp);
- printf("%-14s %32s\n", "system time",
+ xo_emit("{d:resource/%-14s} {d:usage/%29s}{P: }\n", "system time",
format_time(&kipp->ki_rusage.ru_stime));
+
+ if (Hflag) {
+ asprintf(&threadid, "%d", kipp->ki_tid);
+ if (threadid == NULL)
+ xo_errc(1, ENOMEM,
+ "Failed to allocate memory in print_rusage()");
+ xo_open_container(threadid);
+ xo_emit("{e:thread_id/%d}", kipp->ki_tid);
+ } else {
+ xo_emit("{e:process_id/%d}", kipp->ki_pid);
+ xo_emit("{e:command/%s}", kipp->ki_comm);
+ }
+ xo_emit("{e:user time/%s}", format_time(&kipp->ki_rusage.ru_utime));
+ xo_emit("{e:system time/%s}", format_time(&kipp->ki_rusage.ru_stime));
+
lp = &kipp->ki_rusage.ru_maxrss;
for (i = 0; i < nitems(rusage_info); i++) {
print_prefix(kipp);
- printf("%-32s %14s\n", rusage_info[i].ri_name,
+ asprintf(&field, "{e:%s/%%D}", rusage_info[i].ri_name);
+ if (field == NULL)
+ xo_errc(1, ENOMEM,
+ "Failed to allocate memory in print_rusage()");
+ xo_emit(field, *lp);
+ free(field);
+ xo_emit("{d:resource/%-32s} {d:usage/%14s}\n",
+ rusage_info[i].ri_name,
format_value(*lp, rusage_info[i].ri_humanize,
- rusage_info[i].ri_scale));
+ rusage_info[i].ri_scale));
lp++;
}
+ if (Hflag) {
+ xo_close_container(threadid);
+ free(threadid);
+ }
}
void
@@ -138,10 +167,10 @@ procstat_rusage(struct procstat *procstat, struct kinfo_proc *kipp)
unsigned int count, i;
if (!hflag) {
- printf("%5s ", "PID");
+ xo_emit("{d:ta/%5s} ", "PID");
if (Hflag)
- printf("%6s ", "TID");
- printf("%-16s %-32s %14s\n", "COMM", "RESOURCE",
+ xo_emit("{d:tb/%6s} ", "TID");
+ xo_emit("{d:tc/%-16s %-32s %14s}\n", "COMM", "RESOURCE",
"VALUE ");
}
@@ -150,12 +179,19 @@ procstat_rusage(struct procstat *procstat, struct kinfo_proc *kipp)
return;
}
+ xo_emit("{e:process_id/%d}", kipp->ki_pid);
+ xo_emit("{e:command/%s}", kipp->ki_comm);
+ xo_open_container("threads");
+
kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
kipp->ki_pid, &count);
if (kip == NULL)
return;
kinfo_proc_sort(kip, count);
- for (i = 0; i < count; i++)
+ for (i = 0; i < count; i++) {
print_rusage(&kip[i]);
+ }
+
+ xo_close_container("threads");
procstat_freeprocs(procstat, kip);
}
diff --git a/usr.bin/procstat/procstat_sigs.c b/usr.bin/procstat/procstat_sigs.c
index 49e2b19..7bc73ec 100644
--- a/usr.bin/procstat/procstat_sigs.c
+++ b/usr.bin/procstat/procstat_sigs.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2010 Konstantin Belousov
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -51,70 +52,129 @@ procstat_print_signame(int sig)
strlcpy(name, sys_signame[sig], sizeof(name));
for (i = 0; name[i] != 0; i++)
name[i] = toupper(name[i]);
- printf("%-7s ", name);
+ xo_emit("{d:signal/%-7s/%s} ", name);
+ xo_open_container(name);
+ } else {
+ xo_emit("{d:signal/%-7d/%d} ", sig);
+ snprintf(name, 12, "%d", sig);
+ xo_open_container(name);
+ }
+}
+
+static void
+procstat_close_signame(int sig)
+{
+ char name[12];
+ int i;
+
+ if (!nflag && sig < sys_nsig) {
+ strlcpy(name, sys_signame[sig], sizeof(name));
+ for (i = 0; name[i] != 0; i++)
+ name[i] = toupper(name[i]);
+ xo_close_container(name);
} else
- printf("%-7d ", sig);
+ snprintf(name, 12, "%d", sig);
+ xo_close_container(name);
}
static void
procstat_print_sig(const sigset_t *set, int sig, char flag)
{
-
- printf("%c", sigismember(set, sig) ? flag : '-');
+ xo_emit("{d:sigmember/%c}", sigismember(set, sig) ? flag : '-');
+ switch (flag) {
+ case 'B':
+ xo_emit("{en:mask/%s}", sigismember(set, sig) ?
+ "true" : "false");
+ break;
+ case 'C':
+ xo_emit("{en:catch/%s}", sigismember(set, sig) ?
+ "true" : "false");
+ break;
+ case 'P':
+ xo_emit("{en:list/%s}", sigismember(set, sig) ?
+ "true" : "false");
+ break;
+ case 'I':
+ xo_emit("{en:ignore/%s}", sigismember(set, sig) ?
+ "true" : "false");
+ break;
+ default:
+ xo_emit("{en:unknown/%s}", sigismember(set, sig) ?
+ "true" : "false");
+ break;
+ }
}
void
procstat_sigs(struct procstat *prstat __unused, struct kinfo_proc *kipp)
{
int j;
- pid_t pid;
- pid = kipp->ki_pid;
if (!hflag)
- printf("%5s %-16s %-7s %4s\n", "PID", "COMM", "SIG", "FLAGS");
+ xo_emit("{T:/%5s %-16s %-7s %4s}\n", "PID", "COMM", "SIG",
+ "FLAGS");
+ xo_emit("{ek:process_id/%5d/%d}", kipp->ki_pid);
+ xo_emit("{e:command/%-16s/%s}", kipp->ki_comm);
+ xo_open_container("signals");
for (j = 1; j <= _SIG_MAXSIG; j++) {
- printf("%5d ", pid);
- printf("%-16s ", kipp->ki_comm);
+ xo_emit("{dk:process_id/%5d/%d} ", kipp->ki_pid);
+ xo_emit("{d:command/%-16s/%s} ", kipp->ki_comm);
procstat_print_signame(j);
- printf(" ");
+ xo_emit(" ");
procstat_print_sig(&kipp->ki_siglist, j, 'P');
procstat_print_sig(&kipp->ki_sigignore, j, 'I');
procstat_print_sig(&kipp->ki_sigcatch, j, 'C');
- printf("\n");
+ procstat_close_signame(j);
+ xo_emit("\n");
}
+ xo_close_container("signals");
}
void
procstat_threads_sigs(struct procstat *procstat, struct kinfo_proc *kipp)
{
struct kinfo_proc *kip;
- pid_t pid;
int j;
unsigned int count, i;
+ char *threadid;
- pid = kipp->ki_pid;
if (!hflag)
- printf("%5s %6s %-16s %-7s %4s\n", "PID", "TID", "COMM",
+ xo_emit("{T:/%5s %6s %-16s %-7s %4s}\n", "PID", "TID", "COMM",
"SIG", "FLAGS");
kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
- pid, &count);
+ kipp->ki_pid, &count);
if (kip == NULL)
return;
+ xo_emit("{ek:process_id/%5d/%d}", kipp->ki_pid);
+ xo_emit("{e:command/%-16s/%s}", kipp->ki_comm);
+ xo_open_container("threads");
kinfo_proc_sort(kip, count);
for (i = 0; i < count; i++) {
kipp = &kip[i];
+ asprintf(&threadid, "%d", kipp->ki_tid);
+ if (threadid == NULL)
+ xo_errc(1, ENOMEM, "Failed to allocate memory in "
+ "procstat_threads_sigs()");
+ xo_open_container(threadid);
+ xo_emit("{e:thread_id/%6d/%d}", kipp->ki_tid);
+ xo_open_container("signals");
for (j = 1; j <= _SIG_MAXSIG; j++) {
- printf("%5d ", pid);
- printf("%6d ", kipp->ki_tid);
- printf("%-16s ", kipp->ki_comm);
+ xo_emit("{dk:process_id/%5d/%d} ", kipp->ki_pid);
+ xo_emit("{d:thread_id/%6d/%d} ", kipp->ki_tid);
+ xo_emit("{d:command/%-16s/%s} ", kipp->ki_comm);
procstat_print_signame(j);
- printf(" ");
+ xo_emit(" ");
procstat_print_sig(&kipp->ki_siglist, j, 'P');
procstat_print_sig(&kipp->ki_sigmask, j, 'B');
- printf("\n");
+ procstat_close_signame(j);
+ xo_emit("\n");
}
+ xo_close_container("signals");
+ xo_close_container(threadid);
+ free(threadid);
}
+ xo_close_container("threads");
procstat_freeprocs(procstat, kip);
}
diff --git a/usr.bin/procstat/procstat_threads.c b/usr.bin/procstat/procstat_threads.c
index 6bd88da..aa9f9b5 100644
--- a/usr.bin/procstat/procstat_threads.c
+++ b/usr.bin/procstat/procstat_threads.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -45,11 +46,17 @@ procstat_threads(struct procstat *procstat, struct kinfo_proc *kipp)
struct kinfo_proc *kip;
unsigned int count, i;
const char *str;
+ char *threadid;
if (!hflag)
- printf("%5s %6s %-16s %-16s %2s %4s %-7s %-9s\n", "PID",
+ xo_emit("{T:/%5s %6s %-16s %-16s %2s %4s %-7s %-9s}\n", "PID",
"TID", "COMM", "TDNAME", "CPU", "PRI", "STATE", "WCHAN");
+ xo_emit("{ek:process_id/%d}", kipp->ki_pid);
+ xo_emit("{e:command/%s}", strlen(kipp->ki_comm) ?
+ kipp->ki_comm : "-");
+ xo_open_container("threads");
+
kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
kipp->ki_pid, &count);
if (kip == NULL)
@@ -57,20 +64,25 @@ procstat_threads(struct procstat *procstat, struct kinfo_proc *kipp)
kinfo_proc_sort(kip, count);
for (i = 0; i < count; i++) {
kipp = &kip[i];
- printf("%5d ", kipp->ki_pid);
- printf("%6d ", kipp->ki_tid);
- printf("%-16s ", strlen(kipp->ki_comm) ?
+ asprintf(&threadid, "%d", kipp->ki_tid);
+ if (threadid == NULL)
+ xo_errc(1, ENOMEM, "Failed to allocate memory in "
+ "procstat_threads()");
+ xo_open_container(threadid);
+ xo_emit("{dk:process_id/%5d/%d} ", kipp->ki_pid);
+ xo_emit("{:thread_id/%6d/%d} ", kipp->ki_tid);
+ xo_emit("{d:command/%-16s/%s} ", strlen(kipp->ki_comm) ?
kipp->ki_comm : "-");
- printf("%-16s ", (strlen(kipp->ki_tdname) &&
+ xo_emit("{:thread_name/%-16s/%s} ", (strlen(kipp->ki_tdname) &&
(strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ?
kipp->ki_tdname : "-");
if (kipp->ki_oncpu != 255)
- printf("%3d ", kipp->ki_oncpu);
+ xo_emit("{:cpu/%3d/%d} ", kipp->ki_oncpu);
else if (kipp->ki_lastcpu != 255)
- printf("%3d ", kipp->ki_lastcpu);
+ xo_emit("{:cpu/%3d/%d} ", kipp->ki_lastcpu);
else
- printf("%3s ", "-");
- printf("%4d ", kipp->ki_pri.pri_level);
+ xo_emit("{:cpu/%3s/%s} ", "-");
+ xo_emit("{:priority/%4d/%d} ", kipp->ki_pri.pri_level);
switch (kipp->ki_stat) {
case SRUN:
str = "run";
@@ -104,15 +116,19 @@ procstat_threads(struct procstat *procstat, struct kinfo_proc *kipp)
str = "??";
break;
}
- printf("%-7s ", str);
+ xo_emit("{:run_state/%-7s/%s} ", str);
if (kipp->ki_kiflag & KI_LOCKBLOCK) {
- printf("*%-8s ", strlen(kipp->ki_lockname) ?
+ xo_emit("{:lock_name/*%-8s/%s} ",
+ strlen(kipp->ki_lockname) ?
kipp->ki_lockname : "-");
} else {
- printf("%-9s ", strlen(kipp->ki_wmesg) ?
- kipp->ki_wmesg : "-");
+ xo_emit("{:wait_channel/%-9s/%s} ",
+ strlen(kipp->ki_wmesg) ? kipp->ki_wmesg : "-");
}
- printf("\n");
+ xo_close_container(threadid);
+ free(threadid);
+ xo_emit("\n");
}
+ xo_close_container("threads");
procstat_freeprocs(procstat, kip);
}
diff --git a/usr.bin/procstat/procstat_vm.c b/usr.bin/procstat/procstat_vm.c
index e4de492..8c641e5 100644
--- a/usr.bin/procstat/procstat_vm.c
+++ b/usr.bin/procstat/procstat_vm.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -46,70 +47,118 @@ procstat_vm(struct procstat *procstat, struct kinfo_proc *kipp)
struct kinfo_vmentry *freep, *kve;
int ptrwidth;
int i, cnt;
- const char *str;
+ const char *str, *lstr;
ptrwidth = 2*sizeof(void *) + 2;
if (!hflag)
- printf("%5s %*s %*s %3s %4s %4s %3s %3s %-4s %-2s %-s\n",
+ xo_emit("{T:/%5s %*s %*s %3s %4s %4s %3s %3s %-4s %-2s %-s}\n",
"PID", ptrwidth, "START", ptrwidth, "END", "PRT", "RES",
"PRES", "REF", "SHD", "FLAG", "TP", "PATH");
+ xo_emit("{ek:process_id/%d}", kipp->ki_pid);
+
freep = procstat_getvmmap(procstat, kipp, &cnt);
if (freep == NULL)
return;
+ xo_open_list("vm");
for (i = 0; i < cnt; i++) {
+ xo_open_instance("vm");
kve = &freep[i];
- printf("%5d ", kipp->ki_pid);
- printf("%#*jx ", ptrwidth, (uintmax_t)kve->kve_start);
- printf("%#*jx ", ptrwidth, (uintmax_t)kve->kve_end);
- printf("%s", kve->kve_protection & KVME_PROT_READ ? "r" : "-");
- printf("%s", kve->kve_protection & KVME_PROT_WRITE ? "w" : "-");
- printf("%s ", kve->kve_protection & KVME_PROT_EXEC ? "x" : "-");
- printf("%4d ", kve->kve_resident);
- printf("%4d ", kve->kve_private_resident);
- printf("%3d ", kve->kve_ref_count);
- printf("%3d ", kve->kve_shadow_count);
- printf("%-1s", kve->kve_flags & KVME_FLAG_COW ? "C" : "-");
- printf("%-1s", kve->kve_flags & KVME_FLAG_NEEDS_COPY ? "N" :
- "-");
- printf("%-1s", kve->kve_flags & KVME_FLAG_SUPER ? "S" : "-");
- printf("%-1s ", kve->kve_flags & KVME_FLAG_GROWS_UP ? "U" :
- kve->kve_flags & KVME_FLAG_GROWS_DOWN ? "D" : "-");
+ xo_emit("{dk:process_id/%5d} ", kipp->ki_pid);
+ xo_emit("{d:kve_start/%#*jx} ", ptrwidth,
+ (uintmax_t)kve->kve_start);
+ xo_emit("{d:kve_end/%#*jx} ", ptrwidth,
+ (uintmax_t)kve->kve_end);
+ xo_emit("{e:kve_start/%#jx}", (uintmax_t)kve->kve_start);
+ xo_emit("{e:kve_end/%#jx}", (uintmax_t)kve->kve_end);
+ xo_emit("{d:read/%s}", kve->kve_protection & KVME_PROT_READ ?
+ "r" : "-");
+ xo_emit("{d:write/%s}", kve->kve_protection & KVME_PROT_WRITE ?
+ "w" : "-");
+ xo_emit("{d:exec/%s} ", kve->kve_protection & KVME_PROT_EXEC ?
+ "x" : "-");
+ xo_open_container("kve_protection");
+ xo_emit("{en:read/%s}", kve->kve_protection & KVME_PROT_READ ?
+ "true" : "false");
+ xo_emit("{en:write/%s}", kve->kve_protection & KVME_PROT_WRITE ?
+ "true" : "false");
+ xo_emit("{en:exec/%s}", kve->kve_protection & KVME_PROT_EXEC ?
+ "true" : "false");
+ xo_close_container("kve_protection");
+ xo_emit("{:kve_resident/%4d/%d} ", kve->kve_resident);
+ xo_emit("{:kve_private_resident/%4d/%d} ",
+ kve->kve_private_resident);
+ xo_emit("{:kve_ref_count/%3d/%d} ", kve->kve_ref_count);
+ xo_emit("{:kve_shadow_count/%3d/%d} ", kve->kve_shadow_count);
+ xo_emit("{d:copy_on_write/%-1s}", kve->kve_flags &
+ KVME_FLAG_COW ? "C" : "-");
+ xo_emit("{d:need_copy/%-1s}", kve->kve_flags &
+ KVME_FLAG_NEEDS_COPY ? "N" : "-");
+ xo_emit("{d:super_pages/%-1s}", kve->kve_flags &
+ KVME_FLAG_SUPER ? "S" : "-");
+ xo_emit("{d:grows_down/%-1s} ", kve->kve_flags &
+ KVME_FLAG_GROWS_UP ? "U" : kve->kve_flags &
+ KVME_FLAG_GROWS_DOWN ? "D" : "-");
+ xo_open_container("kve_flags");
+ xo_emit("{en:copy_on_write/%s}", kve->kve_flags &
+ KVME_FLAG_COW ? "true" : "false");
+ xo_emit("{en:needs_copy/%s}", kve->kve_flags &
+ KVME_FLAG_NEEDS_COPY ? "true" : "false");
+ xo_emit("{en:super_pages/%s}", kve->kve_flags &
+ KVME_FLAG_SUPER ? "true" : "false");
+ xo_emit("{en:grows_up/%s}", kve->kve_flags &
+ KVME_FLAG_GROWS_UP ? "true" : "false");
+ xo_emit("{en:grows_down/%s}", kve->kve_flags &
+ KVME_FLAG_GROWS_DOWN ? "true" : "false");
+ xo_close_container("kve_flags");
switch (kve->kve_type) {
case KVME_TYPE_NONE:
str = "--";
+ lstr = "none";
break;
case KVME_TYPE_DEFAULT:
str = "df";
+ lstr = "default";
break;
case KVME_TYPE_VNODE:
str = "vn";
+ lstr = "vnode";
break;
case KVME_TYPE_SWAP:
str = "sw";
+ lstr = "swap";
break;
case KVME_TYPE_DEVICE:
str = "dv";
+ lstr = "device";
break;
case KVME_TYPE_PHYS:
str = "ph";
+ lstr = "physical";
break;
case KVME_TYPE_DEAD:
str = "dd";
+ lstr = "dead";
break;
case KVME_TYPE_SG:
str = "sg";
+ lstr = "scatter/gather";
break;
case KVME_TYPE_MGTDEVICE:
str = "md";
+ lstr = "managed_device";
break;
case KVME_TYPE_UNKNOWN:
default:
str = "??";
+ lstr = "unknown";
break;
}
- printf("%-2s ", str);
- printf("%-s\n", kve->kve_path);
+ xo_emit("{d:kve_type/%-2s} ", str);
+ xo_emit("{e:kve_type/%s}", lstr);
+ xo_emit("{:kve_path/%-s/%s}\n", kve->kve_path);
+ xo_close_instance("vm");
}
+ xo_close_list("vm");
free(freep);
}
diff --git a/usr.bin/script/script.1 b/usr.bin/script/script.1
index 239508f..bf33205 100644
--- a/usr.bin/script/script.1
+++ b/usr.bin/script/script.1
@@ -164,13 +164,13 @@ is assumed.
.Pq Most shells set this variable automatically .
.El
.Sh SEE ALSO
-.Xr csh 1 ,
-.Xr filemon 4
+.Xr csh 1
.Po
for the
.Em history
mechanism
-.Pc .
+.Pc ,
+.Xr filemon 4
.Sh HISTORY
The
.Nm
diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1
index 05faf3b..95247e4 100644
--- a/usr.bin/sockstat/sockstat.1
+++ b/usr.bin/sockstat/sockstat.1
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 14, 2015
+.Dd August 27, 2015
.Dt SOCKSTAT 1
.Os
.Sh NAME
@@ -85,7 +85,7 @@ as they are defined in
.Xr protocols 5 .
.It Fl s
Display the protocol state, if applicable.
-This is currently only implemented for TCP.
+This is currently only implemented for SCTP and TCP.
.It Fl u
Show
.Dv AF_LOCAL
diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c
index 2861254..ca13f8d 100644
--- a/usr.bin/sockstat/sockstat.c
+++ b/usr.bin/sockstat/sockstat.c
@@ -332,6 +332,10 @@ gather_sctp(void)
sock->socket = xinpcb->socket;
sock->proto = IPPROTO_SCTP;
sock->protoname = "sctp";
+ if (xinpcb->maxqlen == 0)
+ sock->state = SCTP_CLOSED;
+ else
+ sock->state = SCTP_LISTEN;
if (xinpcb->flags & SCTP_PCB_FLAGS_BOUND_V6) {
sock->family = AF_INET6;
sock->vflag = INP_IPV6;
@@ -421,6 +425,7 @@ gather_sctp(void)
sock->socket = xinpcb->socket;
sock->proto = IPPROTO_SCTP;
sock->protoname = "sctp";
+ sock->state = (int)xstcb->state;
if (xinpcb->flags & SCTP_PCB_FLAGS_BOUND_V6) {
sock->family = AF_INET6;
sock->vflag = INP_IPV6;
@@ -542,9 +547,9 @@ gather_inet(int proto)
const char *varname, *protoname;
size_t len, bufsize;
void *buf;
- int hash, retry, state, vflag;
+ int hash, retry, vflag;
- state = vflag = 0;
+ vflag = 0;
if (opt_4)
vflag |= INP_IPV4;
if (opt_6)
@@ -609,7 +614,6 @@ gather_inet(int proto)
inp = &xtp->xt_inp;
so = &xtp->xt_socket;
protoname = xtp->xt_tp.t_flags & TF_TOE ? "toe" : "tcp";
- state = xtp->xt_tp.t_state;
break;
case IPPROTO_UDP:
case IPPROTO_DIVERT:
@@ -907,11 +911,51 @@ check_ports(struct sock *s)
return (0);
}
+static const char *
+sctp_state(int state)
+{
+ switch (state) {
+ case SCTP_CLOSED:
+ return "CLOSED";
+ break;
+ case SCTP_BOUND:
+ return "BOUND";
+ break;
+ case SCTP_LISTEN:
+ return "LISTEN";
+ break;
+ case SCTP_COOKIE_WAIT:
+ return "COOKIE_WAIT";
+ break;
+ case SCTP_COOKIE_ECHOED:
+ return "COOKIE_ECHOED";
+ break;
+ case SCTP_ESTABLISHED:
+ return "ESTABLISHED";
+ break;
+ case SCTP_SHUTDOWN_SENT:
+ return "SHUTDOWN_SENT";
+ break;
+ case SCTP_SHUTDOWN_RECEIVED:
+ return "SHUTDOWN_RECEIVED";
+ break;
+ case SCTP_SHUTDOWN_ACK_SENT:
+ return "SHUTDOWN_ACK_SENT";
+ break;
+ case SCTP_SHUTDOWN_PENDING:
+ return "SHUTDOWN_PENDING";
+ break;
+ default:
+ return "UNKNOWN";
+ break;
+ }
+}
+
static void
displaysock(struct sock *s, int pos)
{
void *p;
- int hash;
+ int hash, first;
struct addr *laddr, *faddr;
struct sock *s_tmp;
@@ -924,6 +968,7 @@ displaysock(struct sock *s, int pos)
pos += xprintf("6 ");
laddr = s->laddr;
faddr = s->faddr;
+ first = 1;
while (laddr != NULL || faddr != NULL) {
while (pos < 36)
pos += xprintf(" ");
@@ -975,6 +1020,23 @@ displaysock(struct sock *s, int pos)
default:
abort();
}
+ if (first && opt_s &&
+ (s->proto == IPPROTO_SCTP || s->proto == IPPROTO_TCP)) {
+ while (pos < 80)
+ pos += xprintf(" ");
+ switch (s->proto) {
+ case IPPROTO_SCTP:
+ pos += xprintf("%s", sctp_state(s->state));
+ break;
+ case IPPROTO_TCP:
+ if (s->state >= 0 && s->state < TCP_NSTATES)
+ pos +=
+ xprintf("%s", tcpstates[s->state]);
+ else
+ pos += xprintf("?");
+ break;
+ }
+ }
if (laddr != NULL)
laddr = laddr->next;
if (faddr != NULL)
@@ -983,15 +1045,9 @@ displaysock(struct sock *s, int pos)
xprintf("\n");
pos = 0;
}
+ first = 0;
}
- if (opt_s && s->proto == IPPROTO_TCP) {
- while (pos < 80)
- pos += xprintf(" ");
- if (s->state >= 0 && s->state < TCP_NSTATES)
- pos += xprintf("%s", tcpstates[s->state]);
- else
- pos += xprintf("?");
- }
+ xprintf("\n");
}
static void
@@ -1036,7 +1092,6 @@ display(void)
pos += xprintf(" ");
pos += xprintf("%d ", xf->xf_fd);
displaysock(s, pos);
- xprintf("\n");
}
}
if (opt_j >= 0)
@@ -1051,7 +1106,6 @@ display(void)
pos += xprintf("%-8s %-10s %-5s %-2s ",
"?", "?", "?", "?");
displaysock(s, pos);
- xprintf("\n");
}
}
}
diff --git a/usr.bin/tftp/main.c b/usr.bin/tftp/main.c
index 7db7818..7d97a75 100644
--- a/usr.bin/tftp/main.c
+++ b/usr.bin/tftp/main.c
@@ -223,7 +223,7 @@ urihandling(char *URI)
char line[MAXLINE];
int i;
- strncpy(uri, URI, ARG_MAX);
+ strlcpy(uri, URI, ARG_MAX);
host = uri + 7;
if ((s = strchr(host, '/')) == NULL) {
@@ -320,11 +320,10 @@ setpeer0(char *host, const char *lport)
/* res->ai_addr <= sizeof(peeraddr) is guaranteed */
memcpy(&peer_sock, res->ai_addr, res->ai_addrlen);
if (res->ai_canonname) {
- (void) strncpy(hostname, res->ai_canonname,
+ (void) strlcpy(hostname, res->ai_canonname,
sizeof(hostname));
} else
- (void) strncpy(hostname, host, sizeof(hostname));
- hostname[sizeof(hostname)-1] = 0;
+ (void) strlcpy(hostname, host, sizeof(hostname));
connected = 1;
}
diff --git a/usr.bin/truss/amd64-fbsd.c b/usr.bin/truss/amd64-fbsd.c
index d0be3e6..eeea8db 100644
--- a/usr.bin/truss/amd64-fbsd.c
+++ b/usr.bin/truss/amd64-fbsd.c
@@ -64,7 +64,7 @@ static const char rcsid[] =
#include "syscalls.h"
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
+static int nsyscalls = nitems(syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -233,28 +233,6 @@ amd64_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name != NULL && (strcmp(fsc->name, "execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -305,6 +283,7 @@ amd64_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
diff --git a/usr.bin/truss/amd64-fbsd32.c b/usr.bin/truss/amd64-fbsd32.c
index 74d45a2..40aa152 100644
--- a/usr.bin/truss/amd64-fbsd32.c
+++ b/usr.bin/truss/amd64-fbsd32.c
@@ -64,8 +64,7 @@ static const char rcsid[] =
#include "freebsd32_syscalls.h"
-static int nsyscalls = sizeof(freebsd32_syscallnames) /
- sizeof(freebsd32_syscallnames[0]);
+static int nsyscalls = nitems(freebsd32_syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -234,28 +233,6 @@ amd64_fbsd32_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name != NULL && (strcmp(fsc->name, "freebsd32_execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "freebsd32_execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -306,6 +283,7 @@ amd64_fbsd32_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
diff --git a/usr.bin/truss/amd64-linux32.c b/usr.bin/truss/amd64-linux32.c
index 2c025a3..b2d0d04 100644
--- a/usr.bin/truss/amd64-linux32.c
+++ b/usr.bin/truss/amd64-linux32.c
@@ -61,8 +61,7 @@ static const char rcsid[] =
#include "linux32_syscalls.h"
-static int nsyscalls =
- sizeof(linux32_syscallnames) / sizeof(linux32_syscallnames[0]);
+static int nsyscalls = nitems(linux32_syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -207,28 +206,6 @@ amd64_linux32_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name != NULL && (strcmp(fsc->name, "linux_execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "linux_execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -288,6 +265,7 @@ amd64_linux32_syscall_exit(struct trussinfo *trussinfo,
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
@@ -310,8 +288,7 @@ amd64_linux32_syscall_exit(struct trussinfo *trussinfo,
* but that complicates things considerably.
*/
if (errorp) {
- for (i = 0;
- (size_t)i < sizeof(bsd_to_linux_errno) / sizeof(int); i++) {
+ for (i = 0; (size_t)i < nitems(bsd_to_linux_errno); i++) {
if (retval == bsd_to_linux_errno[i])
break;
}
diff --git a/usr.bin/truss/arm-fbsd.c b/usr.bin/truss/arm-fbsd.c
index dd1ae08..8dc4d5b 100644
--- a/usr.bin/truss/arm-fbsd.c
+++ b/usr.bin/truss/arm-fbsd.c
@@ -64,7 +64,7 @@ __FBSDID("$FreeBSD$");
#include "syscalls.h"
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
+static int nsyscalls = nitems(syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -264,28 +264,6 @@ arm_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name != NULL && (strcmp(fsc->name, "execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -336,6 +314,7 @@ arm_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
diff --git a/usr.bin/truss/i386-fbsd.c b/usr.bin/truss/i386-fbsd.c
index 89879d2..ef326f0 100644
--- a/usr.bin/truss/i386-fbsd.c
+++ b/usr.bin/truss/i386-fbsd.c
@@ -64,7 +64,7 @@ static const char rcsid[] =
#include "syscalls.h"
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
+static int nsyscalls = nitems(syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -227,28 +227,6 @@ i386_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name != NULL && (strcmp(fsc->name, "execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -299,6 +277,7 @@ i386_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
diff --git a/usr.bin/truss/i386-linux.c b/usr.bin/truss/i386-linux.c
index 84f1451..6bd9309 100644
--- a/usr.bin/truss/i386-linux.c
+++ b/usr.bin/truss/i386-linux.c
@@ -61,8 +61,7 @@ static const char rcsid[] =
#include "linux_syscalls.h"
-static int nsyscalls =
- sizeof(linux_syscallnames) / sizeof(linux_syscallnames[0]);
+static int nsyscalls = nitems(linux_syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -207,28 +206,6 @@ i386_linux_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name != NULL && (strcmp(fsc->name, "linux_execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "linux_execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -287,6 +264,7 @@ i386_linux_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
@@ -309,8 +287,7 @@ i386_linux_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
* but that complicates things considerably.
*/
if (errorp) {
- for (i = 0;
- (size_t)i < sizeof(bsd_to_linux_errno) / sizeof(int); i++) {
+ for (i = 0; (size_t)i < nitems(bsd_to_linux_errno); i++) {
if (retval == bsd_to_linux_errno[i])
break;
}
diff --git a/usr.bin/truss/main.c b/usr.bin/truss/main.c
index 7792caf..84ae313 100644
--- a/usr.bin/truss/main.c
+++ b/usr.bin/truss/main.c
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -149,15 +150,13 @@ set_etype(struct trussinfo *trussinfo)
char *
strsig(int sig)
{
- char *ret;
+ static char tmp[64];
- ret = NULL;
if (sig > 0 && sig < NSIG) {
- asprintf(&ret, "SIG%s", sys_signame[sig]);
- if (ret == NULL)
- return (NULL);
+ snprintf(tmp, sizeof(tmp), "SIG%s", sys_signame[sig]);
+ return (tmp);
}
- return (ret);
+ return (NULL);
}
int
@@ -325,22 +324,21 @@ START_TRACE:
if (trussinfo->flags & ABSOLUTETIMESTAMPS) {
timespecsubt(&trussinfo->curthread->after,
&trussinfo->start_time, &timediff);
- fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec,
+ fprintf(trussinfo->outfile, "%jd.%09ld ",
+ (intmax_t)timediff.tv_sec,
timediff.tv_nsec);
}
if (trussinfo->flags & RELATIVETIMESTAMPS) {
timespecsubt(&trussinfo->curthread->after,
&trussinfo->curthread->before, &timediff);
- fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec,
+ fprintf(trussinfo->outfile, "%jd.%09ld ",
+ (intmax_t)timediff.tv_sec,
timediff.tv_nsec);
}
signame = strsig(trussinfo->pr_data);
fprintf(trussinfo->outfile,
"SIGNAL %u (%s)\n", trussinfo->pr_data,
signame == NULL ? "?" : signame);
- free(signame);
break;
case S_EXIT:
if (trussinfo->flags & COUNTONLY)
@@ -351,15 +349,16 @@ START_TRACE:
if (trussinfo->flags & ABSOLUTETIMESTAMPS) {
timespecsubt(&trussinfo->curthread->after,
&trussinfo->start_time, &timediff);
- fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec,
+ fprintf(trussinfo->outfile, "%jd.%09ld ",
+ (intmax_t)timediff.tv_sec,
timediff.tv_nsec);
}
if (trussinfo->flags & RELATIVETIMESTAMPS) {
timespecsubt(&trussinfo->curthread->after,
&trussinfo->curthread->before, &timediff);
- fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec, timediff.tv_nsec);
+ fprintf(trussinfo->outfile, "%jd.%09ld ",
+ (intmax_t)timediff.tv_sec,
+ timediff.tv_nsec);
}
fprintf(trussinfo->outfile,
"process exit, rval = %u\n", trussinfo->pr_data);
diff --git a/usr.bin/truss/mips-fbsd.c b/usr.bin/truss/mips-fbsd.c
index 71e9efa..d45241a 100644
--- a/usr.bin/truss/mips-fbsd.c
+++ b/usr.bin/truss/mips-fbsd.c
@@ -68,7 +68,7 @@ static const char rcsid[] =
#include "syscalls.h"
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
+static int nsyscalls = nitems(syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -261,28 +261,6 @@ mips_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name != NULL && (strcmp(fsc->name, "execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -333,6 +311,7 @@ mips_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
diff --git a/usr.bin/truss/powerpc-fbsd.c b/usr.bin/truss/powerpc-fbsd.c
index 990da29..cdbd133 100644
--- a/usr.bin/truss/powerpc-fbsd.c
+++ b/usr.bin/truss/powerpc-fbsd.c
@@ -68,7 +68,7 @@ static const char rcsid[] =
#include "syscalls.h"
#endif
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
+static int nsyscalls = nitems(syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -238,28 +238,6 @@ powerpc_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name != NULL && (strcmp(fsc->name, "execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -318,6 +296,7 @@ powerpc_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
diff --git a/usr.bin/truss/powerpc64-fbsd.c b/usr.bin/truss/powerpc64-fbsd.c
index 9d5cbd9..1f50429 100644
--- a/usr.bin/truss/powerpc64-fbsd.c
+++ b/usr.bin/truss/powerpc64-fbsd.c
@@ -63,7 +63,7 @@ static const char rcsid[] =
#include "syscalls.h"
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
+static int nsyscalls = nitems(syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -226,28 +226,6 @@ powerpc64_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name && (strcmp(fsc->name, "execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -298,6 +276,7 @@ powerpc64_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
diff --git a/usr.bin/truss/sparc64-fbsd.c b/usr.bin/truss/sparc64-fbsd.c
index 3c6de5f..4e64c70 100644
--- a/usr.bin/truss/sparc64-fbsd.c
+++ b/usr.bin/truss/sparc64-fbsd.c
@@ -69,7 +69,7 @@ static const char rcsid[] =
#include "syscalls.h"
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
+static int nsyscalls = nitems(syscallnames);
/*
* This is what this particular file uses to keep track of a system call.
@@ -255,28 +255,6 @@ sparc64_syscall_entry(struct trussinfo *trussinfo, int nargs)
fprintf(trussinfo->outfile, "\n");
#endif
- if (fsc->name != NULL && (strcmp(fsc->name, "execve") == 0 ||
- strcmp(fsc->name, "exit") == 0)) {
- /*
- * XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (strcmp(fsc->name, "execve") == 0) {
- if ((trussinfo->flags & EXECVEARGS) == 0) {
- if (fsc->s_args[1]) {
- free(fsc->s_args[1]);
- fsc->s_args[1] = NULL;
- }
- }
- if ((trussinfo->flags & EXECVEENVS) == 0) {
- if (fsc->s_args[2]) {
- free(fsc->s_args[2]);
- fsc->s_args[2] = NULL;
- }
- }
- }
- }
trussinfo->curthread->fsc = fsc;
}
@@ -327,6 +305,7 @@ sparc64_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
*/
for (i = 0; i < sc->nargs; i++) {
char *temp;
+
if (sc->args[i].type & OUT) {
/*
* If an error occurred, then don't bother
diff --git a/usr.bin/truss/syscall.h b/usr.bin/truss/syscall.h
index db79fef..6f4d9a3 100644
--- a/usr.bin/truss/syscall.h
+++ b/usr.bin/truss/syscall.h
@@ -42,7 +42,7 @@ enum Argtype { None = 1, Hex, Octal, Int, LongHex, Name, Ptr, Stat, Ioctl, Quad,
Fcntlflag, Rusage, BinString, Shutdown, Resource, Rlimit, Timeval2,
Pathconf, Rforkflags, ExitStatus, Waitoptions, Idtype, Procctl,
LinuxSockArgs, Umtxop, Atfd, Atflags, Timespec2, Accessmode, Long,
- Sysarch };
+ Sysarch, ExecArgs, ExecEnv };
#define ARG_MASK 0xff
#define OUT 0x100
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c
index 3132f21..fac47f4 100644
--- a/usr.bin/truss/syscalls.c
+++ b/usr.bin/truss/syscalls.c
@@ -245,11 +245,11 @@ static struct syscall syscalls[] = {
.args = { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 }, { Hex, 3 },
{ Sockaddr | IN, 4 }, { Ptr | IN, 5 } } },
{ .name = "execve", .ret_type = 1, .nargs = 3,
- .args = { { Name | IN, 0 }, { StringArray | IN, 1 },
- { StringArray | IN, 2 } } },
+ .args = { { Name | IN, 0 }, { ExecArgs | IN, 1 },
+ { ExecEnv | IN, 2 } } },
{ .name = "linux_execve", .ret_type = 1, .nargs = 3,
- .args = { { Name | IN, 0 }, { StringArray | IN, 1 },
- { StringArray | IN, 2 } } },
+ .args = { { Name | IN, 0 }, { ExecArgs | IN, 1 },
+ { ExecEnv | IN, 2 } } },
{ .name = "kldload", .ret_type = 0, .nargs = 1,
.args = { { Name | IN, 0 } } },
{ .name = "kldunload", .ret_type = 0, .nargs = 1,
@@ -397,6 +397,30 @@ static struct xlat kevent_flags[] = {
X(EV_DROP) X(EV_FLAG1) X(EV_ERROR) X(EV_EOF) XEND
};
+static struct xlat kevent_user_ffctrl[] = {
+ X(NOTE_FFNOP) X(NOTE_FFAND) X(NOTE_FFOR) X(NOTE_FFCOPY)
+ XEND
+};
+
+static struct xlat kevent_rdwr_fflags[] = {
+ X(NOTE_LOWAT) X(NOTE_FILE_POLL) XEND
+};
+
+static struct xlat kevent_vnode_fflags[] = {
+ X(NOTE_DELETE) X(NOTE_WRITE) X(NOTE_EXTEND) X(NOTE_ATTRIB)
+ X(NOTE_LINK) X(NOTE_RENAME) X(NOTE_REVOKE) XEND
+};
+
+static struct xlat kevent_proc_fflags[] = {
+ X(NOTE_EXIT) X(NOTE_FORK) X(NOTE_EXEC) X(NOTE_TRACK) X(NOTE_TRACKERR)
+ X(NOTE_CHILD) XEND
+};
+
+static struct xlat kevent_timer_fflags[] = {
+ X(NOTE_SECONDS) X(NOTE_MSECONDS) X(NOTE_USECONDS) X(NOTE_NSECONDS)
+ XEND
+};
+
static struct xlat poll_flags[] = {
X(POLLSTANDARD) X(POLLIN) X(POLLPRI) X(POLLOUT) X(POLLERR)
X(POLLHUP) X(POLLNVAL) X(POLLRDNORM) X(POLLRDBAND)
@@ -555,6 +579,11 @@ static struct xlat linux_socketcall_ops[] = {
XEND
};
+static struct xlat sigprocmask_ops[] = {
+ X(SIG_BLOCK) X(SIG_UNBLOCK) X(SIG_SETMASK)
+ XEND
+};
+
#undef X
#undef XEND
@@ -594,9 +623,11 @@ xlookup(struct xlat *xlat, int val)
return (lookup(xlat, val, 16));
}
-/* Searches an xlat array containing bitfield values. Remaining bits
- set after removing the known ones are printed at the end:
- IN|0x400 */
+/*
+ * Searches an xlat array containing bitfield values. Remaining bits
+ * set after removing the known ones are printed at the end:
+ * IN|0x400.
+ */
static char *
xlookup_bits(struct xlat *xlat, int val)
{
@@ -607,15 +638,21 @@ xlookup_bits(struct xlat *xlat, int val)
rem = val;
for (; xlat->str != NULL; xlat++) {
if ((xlat->val & rem) == xlat->val) {
- /* don't print the "all-bits-zero" string unless all
- bits are really zero */
+ /*
+ * Don't print the "all-bits-zero" string unless all
+ * bits are really zero.
+ */
if (xlat->val == 0 && val != 0)
continue;
len += sprintf(str + len, "%s|", xlat->str);
rem &= ~(xlat->val);
}
}
- /* if we have leftover bits or didn't match anything */
+
+ /*
+ * If we have leftover bits or didn't match anything, print
+ * the remainder.
+ */
if (rem || len == 0)
len += sprintf(str + len, "0x%x", rem);
if (len && str[len - 1] == '|')
@@ -628,7 +665,6 @@ xlookup_bits(struct xlat *xlat, int val)
* If/when the list gets big, it might be desirable to do it
* as a hash table or binary search.
*/
-
struct syscall *
get_syscall(const char *name)
{
@@ -646,11 +682,8 @@ get_syscall(const char *name)
}
/*
- * get_struct
- *
* Copy a fixed amount of bytes from the process.
*/
-
static int
get_struct(pid_t pid, void *offset, void *buf, int len)
{
@@ -668,7 +701,6 @@ get_struct(pid_t pid, void *offset, void *buf, int len)
#define MAXSIZE 4096
/*
- * get_string
* Copy a string from the process. Note that it is
* expected to be a C string, but if max is set, it will
* only get that much.
@@ -726,64 +758,126 @@ get_string(pid_t pid, void *addr, int max)
static char *
strsig2(int sig)
{
- char *tmp;
+ static char tmp[sizeof(int) * 3 + 1];
+ char *ret;
- tmp = strsig(sig);
- if (tmp == NULL)
- asprintf(&tmp, "%d", sig);
- return (tmp);
+ ret = strsig(sig);
+ if (ret == NULL) {
+ snprintf(tmp, sizeof(tmp), "%d", sig);
+ ret = tmp;
+ }
+ return (ret);
+}
+
+static void
+print_kevent(FILE *fp, struct kevent *ke, int input)
+{
+
+ switch (ke->filter) {
+ case EVFILT_READ:
+ case EVFILT_WRITE:
+ case EVFILT_VNODE:
+ case EVFILT_PROC:
+ case EVFILT_TIMER:
+ case EVFILT_PROCDESC:
+ fprintf(fp, "%ju", (uintmax_t)ke->ident);
+ break;
+ case EVFILT_SIGNAL:
+ fputs(strsig2(ke->ident), fp);
+ break;
+ default:
+ fprintf(fp, "%p", (void *)ke->ident);
+ }
+ fprintf(fp, ",%s,%s,", xlookup(kevent_filters, ke->filter),
+ xlookup_bits(kevent_flags, ke->flags));
+ switch (ke->filter) {
+ case EVFILT_READ:
+ case EVFILT_WRITE:
+ fputs(xlookup_bits(kevent_rdwr_fflags, ke->fflags), fp);
+ break;
+ case EVFILT_VNODE:
+ fputs(xlookup_bits(kevent_vnode_fflags, ke->fflags), fp);
+ break;
+ case EVFILT_PROC:
+ case EVFILT_PROCDESC:
+ fputs(xlookup_bits(kevent_proc_fflags, ke->fflags), fp);
+ break;
+ case EVFILT_TIMER:
+ fputs(xlookup_bits(kevent_timer_fflags, ke->fflags), fp);
+ break;
+ case EVFILT_USER: {
+ int ctrl, data;
+
+ ctrl = ke->fflags & NOTE_FFCTRLMASK;
+ data = ke->fflags & NOTE_FFLAGSMASK;
+ if (input) {
+ fputs(xlookup(kevent_user_ffctrl, ctrl), fp);
+ if (ke->fflags & NOTE_TRIGGER)
+ fputs("|NOTE_TRIGGER", fp);
+ if (data != 0)
+ fprintf(fp, "|%#x", data);
+ } else {
+ fprintf(fp, "%#x", data);
+ }
+ break;
+ }
+ default:
+ fprintf(fp, "%#x", ke->fflags);
+ }
+ fprintf(fp, ",%p,%p", (void *)ke->data, (void *)ke->udata);
}
/*
- * print_arg
* Converts a syscall argument into a string. Said string is
- * allocated via malloc(), so needs to be free()'d. The file
- * descriptor is for the process' memory (via /proc), and is used
- * to get any data (where the argument is a pointer). sc is
+ * allocated via malloc(), so needs to be free()'d. sc is
* a pointer to the syscall description (see above); args is
* an array of all of the system call arguments.
*/
-
char *
print_arg(struct syscall_args *sc, unsigned long *args, long retval,
struct trussinfo *trussinfo)
{
+ FILE *fp;
char *tmp;
+ size_t tmplen;
pid_t pid;
- tmp = NULL;
+ fp = open_memstream(&tmp, &tmplen);
pid = trussinfo->pid;
switch (sc->type & ARG_MASK) {
case Hex:
- asprintf(&tmp, "0x%x", (int)args[sc->offset]);
+ fprintf(fp, "0x%x", (int)args[sc->offset]);
break;
case Octal:
- asprintf(&tmp, "0%o", (int)args[sc->offset]);
+ fprintf(fp, "0%o", (int)args[sc->offset]);
break;
case Int:
- asprintf(&tmp, "%d", (int)args[sc->offset]);
+ fprintf(fp, "%d", (int)args[sc->offset]);
break;
case LongHex:
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
case Long:
- asprintf(&tmp, "%ld", args[sc->offset]);
+ fprintf(fp, "%ld", args[sc->offset]);
break;
case Name: {
/* NULL-terminated string. */
char *tmp2;
+
tmp2 = get_string(pid, (void*)args[sc->offset], 0);
- asprintf(&tmp, "\"%s\"", tmp2);
+ fprintf(fp, "\"%s\"", tmp2);
free(tmp2);
break;
}
case BinString: {
- /* Binary block of data that might have printable characters.
- XXX If type|OUT, assume that the length is the syscall's
- return value. Otherwise, assume that the length of the block
- is in the next syscall argument. */
+ /*
+ * Binary block of data that might have printable characters.
+ * XXX If type|OUT, assume that the length is the syscall's
+ * return value. Otherwise, assume that the length of the block
+ * is in the next syscall argument.
+ */
int max_string = trussinfo->strsize;
- char tmp2[max_string+1], *tmp3;
+ char tmp2[max_string + 1], *tmp3;
int len;
int truncated = 0;
@@ -792,9 +886,10 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
else
len = args[sc->offset + 1];
- /* Don't print more than max_string characters, to avoid word
- wrap. If we have to truncate put some ... after the string.
- */
+ /*
+ * Don't print more than max_string characters, to avoid word
+ * wrap. If we have to truncate put some ... after the string.
+ */
if (len > max_string) {
len = max_string;
truncated = 1;
@@ -809,107 +904,140 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
len--;
truncated = 1;
};
- asprintf(&tmp, "\"%s\"%s", tmp3, truncated ?
+ fprintf(fp, "\"%s\"%s", tmp3, truncated ?
"..." : "");
free(tmp3);
} else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
}
break;
}
+ case ExecArgs:
+ case ExecEnv:
case StringArray: {
- int num, size, i;
- char *tmp2;
+ uintptr_t addr;
+ union {
+ char *strarray[0];
+ char buf[PAGE_SIZE];
+ } u;
char *string;
- char *strarray[100]; /* XXX This is ugly. */
-
- if (get_struct(pid, (void *)args[sc->offset],
- (void *)&strarray, sizeof(strarray)) == -1)
- err(1, "get_struct %p", (void *)args[sc->offset]);
- num = 0;
- size = 0;
-
- /* Find out how large of a buffer we'll need. */
- while (strarray[num] != NULL) {
- string = get_string(pid, (void*)strarray[num], 0);
- size += strlen(string);
- free(string);
- num++;
+ size_t len;
+ int first, i;
+
+ /*
+ * Only parse argv[] and environment arrays from exec calls
+ * if requested.
+ */
+ if (((sc->type & ARG_MASK) == ExecArgs &&
+ (trussinfo->flags & EXECVEARGS) == 0) ||
+ ((sc->type & ARG_MASK) == ExecEnv &&
+ (trussinfo->flags & EXECVEENVS) == 0)) {
+ fprintf(fp, "0x%lx", args[sc->offset]);
+ break;
}
- size += 4 + (num * 4);
- tmp = (char *)malloc(size);
- tmp2 = tmp;
-
- tmp2 += sprintf(tmp2, " [");
- for (i = 0; i < num; i++) {
- string = get_string(pid, (void*)strarray[i], 0);
- tmp2 += sprintf(tmp2, " \"%s\"%c", string,
- (i + 1 == num) ? ' ' : ',');
+
+ /*
+ * Read a page of pointers at a time. Punt if the top-level
+ * pointer is not aligned. Note that the first read is of
+ * a partial page.
+ */
+ addr = args[sc->offset];
+ if (addr % sizeof(char *) != 0) {
+ fprintf(fp, "0x%lx", args[sc->offset]);
+ break;
+ }
+
+ len = PAGE_SIZE - (addr & PAGE_MASK);
+ if (get_struct(pid, (void *)addr, u.buf, len) == -1) {
+ fprintf(fp, "0x%lx", args[sc->offset]);
+ break;
+ }
+
+ fputc('[', fp);
+ first = 1;
+ i = 0;
+ while (u.strarray[i] != NULL) {
+ string = get_string(pid, u.strarray[i], 0);
+ fprintf(fp, "%s \"%s\"", first ? "" : ",", string);
free(string);
+ first = 0;
+
+ i++;
+ if (i == len / sizeof(char *)) {
+ addr += len;
+ len = PAGE_SIZE;
+ if (get_struct(pid, (void *)addr, u.buf, len) ==
+ -1) {
+ fprintf(fp, ", <inval>");
+ break;
+ }
+ i = 0;
+ }
}
- tmp2 += sprintf(tmp2, "]");
+ fputs(" ]", fp);
break;
}
#ifdef __LP64__
case Quad:
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
#else
case Quad: {
unsigned long long ll;
+
ll = *(unsigned long long *)(args + sc->offset);
- asprintf(&tmp, "0x%llx", ll);
+ fprintf(fp, "0x%llx", ll);
break;
}
#endif
case Ptr:
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
case Readlinkres: {
char *tmp2;
- if (retval == -1) {
- tmp = strdup("");
+
+ if (retval == -1)
break;
- }
tmp2 = get_string(pid, (void*)args[sc->offset], retval);
- asprintf(&tmp, "\"%s\"", tmp2);
+ fprintf(fp, "\"%s\"", tmp2);
free(tmp2);
break;
}
case Ioctl: {
- const char *temp = ioctlname(args[sc->offset]);
+ const char *temp;
+ unsigned long cmd;
+
+ cmd = args[sc->offset];
+ temp = ioctlname(cmd);
if (temp)
- tmp = strdup(temp);
+ fputs(temp, fp);
else {
- unsigned long arg = args[sc->offset];
- asprintf(&tmp, "0x%lx { IO%s%s 0x%lx('%c'), %lu, %lu }",
- arg, arg & IOC_OUT ? "R" : "",
- arg & IOC_IN ? "W" : "", IOCGROUP(arg),
- isprint(IOCGROUP(arg)) ? (char)IOCGROUP(arg) : '?',
- arg & 0xFF, IOCPARM_LEN(arg));
+ fprintf(fp, "0x%lx { IO%s%s 0x%lx('%c'), %lu, %lu }",
+ cmd, cmd & IOC_OUT ? "R" : "",
+ cmd & IOC_IN ? "W" : "", IOCGROUP(cmd),
+ isprint(IOCGROUP(cmd)) ? (char)IOCGROUP(cmd) : '?',
+ cmd & 0xFF, IOCPARM_LEN(cmd));
}
break;
}
case Timespec: {
struct timespec ts;
+
if (get_struct(pid, (void *)args[sc->offset], &ts,
sizeof(ts)) != -1)
- asprintf(&tmp, "{ %ld.%09ld }", (long)ts.tv_sec,
+ fprintf(fp, "{ %jd.%09ld }", (intmax_t)ts.tv_sec,
ts.tv_nsec);
else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case Timespec2: {
struct timespec ts[2];
- FILE *fp;
- size_t len;
const char *sep;
unsigned int i;
if (get_struct(pid, (void *)args[sc->offset], &ts, sizeof(ts))
!= -1) {
- fp = open_memstream(&tmp, &len);
fputs("{ ", fp);
sep = "";
for (i = 0; i < nitems(ts); i++) {
@@ -923,61 +1051,65 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
fprintf(fp, "UTIME_OMIT");
break;
default:
- fprintf(fp, "%ld.%09ld",
- (long)ts[i].tv_sec, ts[i].tv_nsec);
+ fprintf(fp, "%jd.%09ld",
+ (intmax_t)ts[i].tv_sec,
+ ts[i].tv_nsec);
break;
}
}
fputs(" }", fp);
- fclose(fp);
} else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case Timeval: {
struct timeval tv;
+
if (get_struct(pid, (void *)args[sc->offset], &tv, sizeof(tv))
!= -1)
- asprintf(&tmp, "{ %ld.%06ld }", (long)tv.tv_sec,
+ fprintf(fp, "{ %jd.%06ld }", (intmax_t)tv.tv_sec,
tv.tv_usec);
else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case Timeval2: {
struct timeval tv[2];
+
if (get_struct(pid, (void *)args[sc->offset], &tv, sizeof(tv))
!= -1)
- asprintf(&tmp, "{ %ld.%06ld, %ld.%06ld }",
- (long)tv[0].tv_sec, tv[0].tv_usec,
- (long)tv[1].tv_sec, tv[1].tv_usec);
+ fprintf(fp, "{ %jd.%06ld, %jd.%06ld }",
+ (intmax_t)tv[0].tv_sec, tv[0].tv_usec,
+ (intmax_t)tv[1].tv_sec, tv[1].tv_usec);
else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case Itimerval: {
struct itimerval itv;
+
if (get_struct(pid, (void *)args[sc->offset], &itv,
sizeof(itv)) != -1)
- asprintf(&tmp, "{ %ld.%06ld, %ld.%06ld }",
- (long)itv.it_interval.tv_sec,
+ fprintf(fp, "{ %jd.%06ld, %jd.%06ld }",
+ (intmax_t)itv.it_interval.tv_sec,
itv.it_interval.tv_usec,
- (long)itv.it_value.tv_sec,
+ (intmax_t)itv.it_value.tv_sec,
itv.it_value.tv_usec);
else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case LinuxSockArgs:
{
struct linux_socketcall_args largs;
+
if (get_struct(pid, (void *)args[sc->offset], (void *)&largs,
sizeof(largs)) != -1)
- asprintf(&tmp, "{ %s, 0x%lx }",
+ fprintf(fp, "{ %s, 0x%lx }",
lookup(linux_socketcall_ops, largs.what, 10),
(long unsigned int)largs.args);
else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case Pollfd: {
@@ -987,37 +1119,23 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
* syscall.
*/
struct pollfd *pfd;
- int numfds = args[sc->offset+1];
- int bytes = sizeof(struct pollfd) * numfds;
- int i, tmpsize, u, used;
- const int per_fd = 100;
+ int numfds = args[sc->offset + 1];
+ size_t bytes = sizeof(struct pollfd) * numfds;
+ int i;
if ((pfd = malloc(bytes)) == NULL)
- err(1, "Cannot malloc %d bytes for pollfd array",
+ err(1, "Cannot malloc %zu bytes for pollfd array",
bytes);
if (get_struct(pid, (void *)args[sc->offset], pfd, bytes)
!= -1) {
- used = 0;
- tmpsize = 1 + per_fd * numfds + 2;
- if ((tmp = malloc(tmpsize)) == NULL)
- err(1, "Cannot alloc %d bytes for poll output",
- tmpsize);
-
- tmp[used++] = '{';
- tmp[used++] = ' ';
+ fputs("{", fp);
for (i = 0; i < numfds; i++) {
-
- u = snprintf(tmp + used, per_fd, "%s%d/%s",
- i > 0 ? " " : "", pfd[i].fd,
+ fprintf(fp, " %d/%s", pfd[i].fd,
xlookup_bits(poll_flags, pfd[i].events));
- if (u > 0)
- used += u < per_fd ? u : per_fd;
}
- tmp[used++] = ' ';
- tmp[used++] = '}';
- tmp[used++] = '\0';
+ fputs(" }", fp);
} else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
}
free(pfd);
break;
@@ -1030,116 +1148,86 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
*/
fd_set *fds;
int numfds = args[0];
- int bytes = _howmany(numfds, _NFDBITS) * _NFDBITS;
- int i, tmpsize, u, used;
- const int per_fd = 20;
+ size_t bytes = _howmany(numfds, _NFDBITS) * _NFDBITS;
+ int i;
if ((fds = malloc(bytes)) == NULL)
- err(1, "Cannot malloc %d bytes for fd_set array",
+ err(1, "Cannot malloc %zu bytes for fd_set array",
bytes);
if (get_struct(pid, (void *)args[sc->offset], fds, bytes)
!= -1) {
- used = 0;
- tmpsize = 1 + numfds * per_fd + 2;
- if ((tmp = malloc(tmpsize)) == NULL)
- err(1, "Cannot alloc %d bytes for fd_set "
- "output", tmpsize);
-
- tmp[used++] = '{';
- tmp[used++] = ' ';
+ fputs("{", fp);
for (i = 0; i < numfds; i++) {
- if (FD_ISSET(i, fds)) {
- u = snprintf(tmp + used, per_fd, "%d ",
- i);
- if (u > 0)
- used += u < per_fd ? u : per_fd;
- }
+ if (FD_ISSET(i, fds))
+ fprintf(fp, " %d", i);
}
- tmp[used++] = '}';
- tmp[used++] = '\0';
+ fputs(" }", fp);
} else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
free(fds);
break;
}
case Signal:
- tmp = strsig2(args[sc->offset]);
+ fputs(strsig2(args[sc->offset]), fp);
break;
case Sigset: {
long sig;
sigset_t ss;
- int i, used;
- char *signame;
+ int i, first;
sig = args[sc->offset];
if (get_struct(pid, (void *)args[sc->offset], (void *)&ss,
sizeof(ss)) == -1) {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
- tmp = malloc(sys_nsig * 8 + 2); /* 7 bytes avg per signal name */
- used = 0;
- tmp[used++] = '{';
- tmp[used++] = ' ';
+ fputs("{ ", fp);
+ first = 1;
for (i = 1; i < sys_nsig; i++) {
if (sigismember(&ss, i)) {
- signame = strsig(i);
- used += sprintf(tmp + used, "%s|", signame);
- free(signame);
+ fprintf(fp, "%s%s", !first ? "|" : "",
+ strsig(i));
+ first = 0;
}
}
- if (tmp[used - 1] == '|')
- used--;
- tmp[used++] = ' ';
- tmp[used++] = '}';
- tmp[used++] = '\0';
+ if (!first)
+ fputc(' ', fp);
+ fputc('}', fp);
break;
}
case Sigprocmask: {
- switch (args[sc->offset]) {
-#define S(a) case a: tmp = strdup(#a); break;
- S(SIG_BLOCK);
- S(SIG_UNBLOCK);
- S(SIG_SETMASK);
-#undef S
- }
- if (tmp == NULL)
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fputs(xlookup(sigprocmask_ops, args[sc->offset]), fp);
break;
}
case Fcntlflag: {
- /* XXX output depends on the value of the previous argument */
- switch (args[sc->offset-1]) {
+ /* XXX: Output depends on the value of the previous argument. */
+ switch (args[sc->offset - 1]) {
case F_SETFD:
- tmp = strdup(xlookup_bits(fcntlfd_arg,
- args[sc->offset]));
+ fputs(xlookup_bits(fcntlfd_arg, args[sc->offset]), fp);
break;
case F_SETFL:
- tmp = strdup(xlookup_bits(fcntlfl_arg,
- args[sc->offset]));
+ fputs(xlookup_bits(fcntlfl_arg, args[sc->offset]), fp);
break;
case F_GETFD:
case F_GETFL:
case F_GETOWN:
- tmp = strdup("");
break;
default:
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
break;
}
case Open:
- tmp = strdup(xlookup_bits(open_flags, args[sc->offset]));
+ fputs(xlookup_bits(open_flags, args[sc->offset]), fp);
break;
case Fcntl:
- tmp = strdup(xlookup(fcntl_arg, args[sc->offset]));
+ fputs(xlookup(fcntl_arg, args[sc->offset]), fp);
break;
case Mprot:
- tmp = strdup(xlookup_bits(mprot_flags, args[sc->offset]));
+ fputs(xlookup_bits(mprot_flags, args[sc->offset]), fp);
break;
case Mmapflags: {
- char *base, *alignstr;
int align, flags;
/*
@@ -1153,59 +1241,46 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
align = args[sc->offset] & MAP_ALIGNMENT_MASK;
if (align != 0) {
if (align == MAP_ALIGNED_SUPER)
- alignstr = strdup("MAP_ALIGNED_SUPER");
+ fputs("MAP_ALIGNED_SUPER", fp);
else
- asprintf(&alignstr, "MAP_ALIGNED(%d)",
+ fprintf(fp, "MAP_ALIGNED(%d)",
align >> MAP_ALIGNMENT_SHIFT);
- if (flags == 0) {
- tmp = alignstr;
+ if (flags == 0)
break;
- }
- } else
- alignstr = NULL;
- base = strdup(xlookup_bits(mmap_flags, flags));
- if (alignstr == NULL) {
- tmp = base;
- break;
+ fputc('|', fp);
}
- asprintf(&tmp, "%s|%s", alignstr, base);
- free(alignstr);
- free(base);
+ fputs(xlookup_bits(mmap_flags, flags), fp);
break;
}
case Whence:
- tmp = strdup(xlookup(whence_arg, args[sc->offset]));
+ fputs(xlookup(whence_arg, args[sc->offset]), fp);
break;
case Sockdomain:
- tmp = strdup(xlookup(sockdomain_arg, args[sc->offset]));
+ fputs(xlookup(sockdomain_arg, args[sc->offset]), fp);
break;
case Socktype: {
- FILE *fp;
- size_t len;
int type, flags;
flags = args[sc->offset] & (SOCK_CLOEXEC | SOCK_NONBLOCK);
type = args[sc->offset] & ~flags;
- fp = open_memstream(&tmp, &len);
fputs(xlookup(socktype_arg, type), fp);
if (flags & SOCK_CLOEXEC)
fprintf(fp, "|SOCK_CLOEXEC");
if (flags & SOCK_NONBLOCK)
fprintf(fp, "|SOCK_NONBLOCK");
- fclose(fp);
break;
}
case Shutdown:
- tmp = strdup(xlookup(shutdown_arg, args[sc->offset]));
+ fputs(xlookup(shutdown_arg, args[sc->offset]), fp);
break;
case Resource:
- tmp = strdup(xlookup(resource_arg, args[sc->offset]));
+ fputs(xlookup(resource_arg, args[sc->offset]), fp);
break;
case Pathconf:
- tmp = strdup(xlookup(pathconf_arg, args[sc->offset]));
+ fputs(xlookup(pathconf_arg, args[sc->offset]), fp);
break;
case Rforkflags:
- tmp = strdup(xlookup_bits(rfork_flags, args[sc->offset]));
+ fputs(xlookup_bits(rfork_flags, args[sc->offset]), fp);
break;
case Sockaddr: {
struct sockaddr_storage ss;
@@ -1214,19 +1289,20 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
struct sockaddr_in6 *lsin6;
struct sockaddr_un *sun;
struct sockaddr *sa;
- char *p;
u_char *q;
- int i;
if (args[sc->offset] == 0) {
- asprintf(&tmp, "NULL");
+ fputs("NULL", fp);
break;
}
/* yuck: get ss_len */
if (get_struct(pid, (void *)args[sc->offset], (void *)&ss,
- sizeof(ss.ss_len) + sizeof(ss.ss_family)) == -1)
- err(1, "get_struct %p", (void *)args[sc->offset]);
+ sizeof(ss.ss_len) + sizeof(ss.ss_family)) == -1) {
+ fprintf(fp, "0x%lx", args[sc->offset]);
+ break;
+ }
+
/*
* If ss_len is 0, then try to guess from the sockaddr type.
* AF_UNIX may be initialized incorrectly, so always frob
@@ -1237,236 +1313,220 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
case AF_INET:
ss.ss_len = sizeof(*lsin);
break;
+ case AF_INET6:
+ ss.ss_len = sizeof(*lsin6);
+ break;
case AF_UNIX:
ss.ss_len = sizeof(*sun);
break;
default:
- /* hurrrr */
break;
}
}
- if (get_struct(pid, (void *)args[sc->offset], (void *)&ss,
+ if (ss.ss_len != 0 &&
+ get_struct(pid, (void *)args[sc->offset], (void *)&ss,
ss.ss_len) == -1) {
- err(2, "get_struct %p", (void *)args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
+ break;
}
switch (ss.ss_family) {
case AF_INET:
lsin = (struct sockaddr_in *)&ss;
- inet_ntop(AF_INET, &lsin->sin_addr, addr, sizeof addr);
- asprintf(&tmp, "{ AF_INET %s:%d }", addr,
+ inet_ntop(AF_INET, &lsin->sin_addr, addr, sizeof(addr));
+ fprintf(fp, "{ AF_INET %s:%d }", addr,
htons(lsin->sin_port));
break;
case AF_INET6:
lsin6 = (struct sockaddr_in6 *)&ss;
inet_ntop(AF_INET6, &lsin6->sin6_addr, addr,
- sizeof addr);
- asprintf(&tmp, "{ AF_INET6 [%s]:%d }", addr,
+ sizeof(addr));
+ fprintf(fp, "{ AF_INET6 [%s]:%d }", addr,
htons(lsin6->sin6_port));
break;
case AF_UNIX:
sun = (struct sockaddr_un *)&ss;
- asprintf(&tmp, "{ AF_UNIX \"%s\" }", sun->sun_path);
+ fprintf(fp, "{ AF_UNIX \"%s\" }", sun->sun_path);
break;
default:
sa = (struct sockaddr *)&ss;
- asprintf(&tmp, "{ sa_len = %d, sa_family = %d, sa_data "
- "= { %n%*s } }", (int)sa->sa_len,
- (int)sa->sa_family, &i,
- 6 * (int)(sa->sa_len - ((char *)&sa->sa_data -
- (char *)sa)), "");
- if (tmp != NULL) {
- p = tmp + i;
- for (q = (u_char *)&sa->sa_data;
- q < (u_char *)sa + sa->sa_len; q++)
- p += sprintf(p, " %#02x,", *q);
- }
+ fprintf(fp,
+ "{ sa_len = %d, sa_family = %d, sa_data = {",
+ (int)sa->sa_len, (int)sa->sa_family);
+ for (q = (u_char *)sa->sa_data;
+ q < (u_char *)sa + sa->sa_len; q++)
+ fprintf(fp, "%s 0x%02x",
+ q == (u_char *)sa->sa_data ? "" : ",",
+ *q);
+ fputs(" } }", fp);
}
break;
}
case Sigaction: {
struct sigaction sa;
- char *hand;
- const char *h;
if (get_struct(pid, (void *)args[sc->offset], &sa, sizeof(sa))
!= -1) {
- asprintf(&hand, "%p", sa.sa_handler);
+ fputs("{ ", fp);
if (sa.sa_handler == SIG_DFL)
- h = "SIG_DFL";
+ fputs("SIG_DFL", fp);
else if (sa.sa_handler == SIG_IGN)
- h = "SIG_IGN";
+ fputs("SIG_IGN", fp);
else
- h = hand;
-
- asprintf(&tmp, "{ %s %s ss_t }", h,
+ fprintf(fp, "%p", sa.sa_handler);
+ fprintf(fp, " %s ss_t }",
xlookup_bits(sigaction_flags, sa.sa_flags));
- free(hand);
} else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case Kevent: {
/*
- * XXX XXX: the size of the array is determined by either the
- * next syscall argument, or by the syscall returnvalue,
+ * XXX XXX: The size of the array is determined by either the
+ * next syscall argument, or by the syscall return value,
* depending on which argument number we are. This matches the
* kevent syscall, but luckily that's the only syscall that uses
* them.
*/
struct kevent *ke;
int numevents = -1;
- int bytes = 0;
- int i, tmpsize, u, used;
- const int per_ke = 100;
+ size_t bytes;
+ int i;
if (sc->offset == 1)
numevents = args[sc->offset+1];
else if (sc->offset == 3 && retval != -1)
numevents = retval;
- if (numevents >= 0)
+ if (numevents >= 0) {
bytes = sizeof(struct kevent) * numevents;
- if ((ke = malloc(bytes)) == NULL)
- err(1, "Cannot malloc %d bytes for kevent array",
- bytes);
+ if ((ke = malloc(bytes)) == NULL)
+ err(1,
+ "Cannot malloc %zu bytes for kevent array",
+ bytes);
+ } else
+ ke = NULL;
if (numevents >= 0 && get_struct(pid, (void *)args[sc->offset],
ke, bytes) != -1) {
- used = 0;
- tmpsize = 1 + per_ke * numevents + 2;
- if ((tmp = malloc(tmpsize)) == NULL)
- err(1, "Cannot alloc %d bytes for kevent "
- "output", tmpsize);
-
- tmp[used++] = '{';
- tmp[used++] = ' ';
+ fputc('{', fp);
for (i = 0; i < numevents; i++) {
- u = snprintf(tmp + used, per_ke,
- "%s%p,%s,%s,%d,%p,%p",
- i > 0 ? " " : "",
- (void *)ke[i].ident,
- xlookup(kevent_filters, ke[i].filter),
- xlookup_bits(kevent_flags, ke[i].flags),
- ke[i].fflags,
- (void *)ke[i].data,
- (void *)ke[i].udata);
- if (u > 0)
- used += u < per_ke ? u : per_ke;
+ fputc(' ', fp);
+ print_kevent(fp, &ke[i], sc->offset == 1);
}
- tmp[used++] = ' ';
- tmp[used++] = '}';
- tmp[used++] = '\0';
+ fputs(" }", fp);
} else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
}
free(ke);
break;
}
case Stat: {
struct stat st;
+
if (get_struct(pid, (void *)args[sc->offset], &st, sizeof(st))
!= -1) {
char mode[12];
+
strmode(st.st_mode, mode);
- asprintf(&tmp,
- "{ mode=%s,inode=%jd,size=%jd,blksize=%ld }", mode,
- (intmax_t)st.st_ino, (intmax_t)st.st_size,
+ fprintf(fp,
+ "{ mode=%s,inode=%ju,size=%jd,blksize=%ld }", mode,
+ (uintmax_t)st.st_ino, (intmax_t)st.st_size,
(long)st.st_blksize);
} else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
}
break;
}
case Rusage: {
struct rusage ru;
+
if (get_struct(pid, (void *)args[sc->offset], &ru, sizeof(ru))
!= -1) {
- asprintf(&tmp,
- "{ u=%ld.%06ld,s=%ld.%06ld,in=%ld,out=%ld }",
- (long)ru.ru_utime.tv_sec, ru.ru_utime.tv_usec,
- (long)ru.ru_stime.tv_sec, ru.ru_stime.tv_usec,
+ fprintf(fp,
+ "{ u=%jd.%06ld,s=%jd.%06ld,in=%ld,out=%ld }",
+ (intmax_t)ru.ru_utime.tv_sec, ru.ru_utime.tv_usec,
+ (intmax_t)ru.ru_stime.tv_sec, ru.ru_stime.tv_usec,
ru.ru_inblock, ru.ru_oublock);
} else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case Rlimit: {
struct rlimit rl;
+
if (get_struct(pid, (void *)args[sc->offset], &rl, sizeof(rl))
!= -1) {
- asprintf(&tmp, "{ cur=%ju,max=%ju }",
+ fprintf(fp, "{ cur=%ju,max=%ju }",
rl.rlim_cur, rl.rlim_max);
} else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case ExitStatus: {
- char *signame;
int status;
- signame = NULL;
+
if (get_struct(pid, (void *)args[sc->offset], &status,
sizeof(status)) != -1) {
+ fputs("{ ", fp);
if (WIFCONTINUED(status))
- tmp = strdup("{ CONTINUED }");
+ fputs("CONTINUED", fp);
else if (WIFEXITED(status))
- asprintf(&tmp, "{ EXITED,val=%d }",
+ fprintf(fp, "EXITED,val=%d",
WEXITSTATUS(status));
else if (WIFSIGNALED(status))
- asprintf(&tmp, "{ SIGNALED,sig=%s%s }",
- signame = strsig2(WTERMSIG(status)),
+ fprintf(fp, "SIGNALED,sig=%s%s",
+ strsig2(WTERMSIG(status)),
WCOREDUMP(status) ? ",cored" : "");
else
- asprintf(&tmp, "{ STOPPED,sig=%s }",
- signame = strsig2(WTERMSIG(status)));
+ fprintf(fp, "STOPPED,sig=%s",
+ strsig2(WTERMSIG(status)));
+ fputs(" }", fp);
} else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- free(signame);
+ fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case Waitoptions:
- tmp = strdup(xlookup_bits(wait_options, args[sc->offset]));
+ fputs(xlookup_bits(wait_options, args[sc->offset]), fp);
break;
case Idtype:
- tmp = strdup(xlookup(idtype_arg, args[sc->offset]));
+ fputs(xlookup(idtype_arg, args[sc->offset]), fp);
break;
case Procctl:
- tmp = strdup(xlookup(procctl_arg, args[sc->offset]));
+ fputs(xlookup(procctl_arg, args[sc->offset]), fp);
break;
case Umtxop:
- tmp = strdup(xlookup(umtx_ops, args[sc->offset]));
+ fputs(xlookup(umtx_ops, args[sc->offset]), fp);
break;
case Atfd:
if ((int)args[sc->offset] == AT_FDCWD)
- tmp = strdup("AT_FDCWD");
+ fputs("AT_FDCWD", fp);
else
- asprintf(&tmp, "%d", (int)args[sc->offset]);
+ fprintf(fp, "%d", (int)args[sc->offset]);
break;
case Atflags:
- tmp = strdup(xlookup_bits(at_flags, args[sc->offset]));
+ fputs(xlookup_bits(at_flags, args[sc->offset]), fp);
break;
case Accessmode:
if (args[sc->offset] == F_OK)
- tmp = strdup("F_OK");
+ fputs("F_OK", fp);
else
- tmp = strdup(xlookup_bits(access_modes,
- args[sc->offset]));
+ fputs(xlookup_bits(access_modes, args[sc->offset]), fp);
break;
case Sysarch:
- tmp = strdup(xlookup(sysarch_ops, args[sc->offset]));
+ fputs(xlookup(sysarch_ops, args[sc->offset]), fp);
break;
default:
errx(1, "Invalid argument type %d\n", sc->type & ARG_MASK);
}
+ fclose(fp);
return (tmp);
}
/*
- * print_syscall
* Print (to outfile) the system call and its arguments. Note that
* nargs is the number of arguments (not the number of words; this is
* potentially confusing, I know).
*/
-
void
print_syscall(struct trussinfo *trussinfo, const char *name, int nargs,
char **s_args)
@@ -1486,15 +1546,15 @@ print_syscall(struct trussinfo *trussinfo, const char *name, int nargs,
if (trussinfo->flags & ABSOLUTETIMESTAMPS) {
timespecsubt(&trussinfo->curthread->after,
&trussinfo->start_time, &timediff);
- len += fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec, timediff.tv_nsec);
+ len += fprintf(trussinfo->outfile, "%jd.%09ld ",
+ (intmax_t)timediff.tv_sec, timediff.tv_nsec);
}
if (trussinfo->flags & RELATIVETIMESTAMPS) {
timespecsubt(&trussinfo->curthread->after,
&trussinfo->curthread->before, &timediff);
- len += fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec, timediff.tv_nsec);
+ len += fprintf(trussinfo->outfile, "%jd.%09ld ",
+ (intmax_t)timediff.tv_sec, timediff.tv_nsec);
}
len += fprintf(trussinfo->outfile, "%s(", name);
diff --git a/usr.bin/vi/catalog/Makefile b/usr.bin/vi/catalog/Makefile
index 4e21298..b85eaa8 100644
--- a/usr.bin/vi/catalog/Makefile
+++ b/usr.bin/vi/catalog/Makefile
@@ -32,9 +32,9 @@ CAT+= $c.UTF-8
.for c in ${CAT}
${c}: ${c}.base
- @echo "... $c"; \
+ echo "... $c"; \
rm -f $c; \
- sort -u ${.ALLSRC} | \
+ env LANG=C sort -u ${.ALLSRC} | \
awk '{ \
if ($$1 == 1) { \
print "\nMESSAGE NUMBER 1 IS NOT LEGAL"; \
@@ -44,7 +44,7 @@ ${c}: ${c}.base
print "DUPLICATE MESSAGE NUMBER " $$1; \
exit 1; \
} \
- print $0; \
+ print $$0; \
}' | \
sed -e '1s/^/$$set 1~$$quote "~/; 1y/~/\n/' | \
gencat $c /dev/stdin; \
diff --git a/usr.bin/vtfontcvt/vtfontcvt.c b/usr.bin/vtfontcvt/vtfontcvt.c
index 07c3547..4dadee7 100644
--- a/usr.bin/vtfontcvt/vtfontcvt.c
+++ b/usr.bin/vtfontcvt/vtfontcvt.c
@@ -96,6 +96,16 @@ usage(void)
exit(1);
}
+static void *
+xmalloc(size_t size)
+{
+ void *m;
+
+ if ((m = malloc(size)) == NULL)
+ errx(1, "memory allocation failure");
+ return (m);
+}
+
static int
add_mapping(struct glyph *gl, unsigned int c, unsigned int map_idx)
{
@@ -104,7 +114,7 @@ add_mapping(struct glyph *gl, unsigned int c, unsigned int map_idx)
mapping_total++;
- mp = malloc(sizeof *mp);
+ mp = xmalloc(sizeof *mp);
mp->m_char = c;
mp->m_glyph = gl;
mp->m_length = 0;
@@ -163,8 +173,8 @@ add_glyph(const uint8_t *bytes, unsigned int map_idx, int fallback)
}
}
- gl = malloc(sizeof *gl);
- gl->g_data = malloc(wbytes * height);
+ gl = xmalloc(sizeof *gl);
+ gl->g_data = xmalloc(wbytes * height);
memcpy(gl->g_data, bytes, wbytes * height);
if (fallback)
TAILQ_INSERT_HEAD(&glyphs[map_idx], gl, g_list);
@@ -290,17 +300,26 @@ parse_hex(FILE *fp, unsigned int map_idx)
char *ln, *p;
char fmt_str[8];
size_t length;
- uint8_t bytes[wbytes * height], bytes_r[wbytes * height];
+ uint8_t *bytes = NULL, *bytes_r = NULL;
unsigned curchar = 0, i, line, chars_per_row, dwidth;
+ int rv = 0;
while ((ln = fgetln(fp, &length)) != NULL) {
ln[length - 1] = '\0';
if (strncmp(ln, "# Height: ", 10) == 0) {
+ if (bytes != NULL)
+ errx(1, "malformed input: Height tag after font data");
height = atoi(ln + 10);
} else if (strncmp(ln, "# Width: ", 9) == 0) {
+ if (bytes != NULL)
+ errx(1, "malformed input: Width tag after font data");
set_width(atoi(ln + 9));
} else if (sscanf(ln, "%4x:", &curchar)) {
+ if (bytes == NULL) {
+ bytes = xmalloc(wbytes * height);
+ bytes_r = xmalloc(wbytes * height);
+ }
p = ln + 5;
chars_per_row = strlen(p) / height;
dwidth = width;
@@ -313,16 +332,23 @@ parse_hex(FILE *fp, unsigned int map_idx)
sscanf(p, fmt_str, &line);
p += chars_per_row;
if (parse_bitmap_line(bytes + i * wbytes,
- bytes_r + i * wbytes, line, dwidth) != 0)
- return (1);
+ bytes_r + i * wbytes, line, dwidth) != 0) {
+ rv = 1;
+ goto out;
+ }
}
if (add_char(curchar, map_idx, bytes,
- dwidth == width * 2 ? bytes_r : NULL) != 0)
- return (1);
+ dwidth == width * 2 ? bytes_r : NULL) != 0) {
+ rv = 1;
+ goto out;
+ }
}
}
- return (0);
+out:
+ free(bytes);
+ free(bytes_r);
+ return (rv);
}
static int
diff --git a/usr.bin/w/Makefile b/usr.bin/w/Makefile
index 0c51463..0bd09ff 100644
--- a/usr.bin/w/Makefile
+++ b/usr.bin/w/Makefile
@@ -4,7 +4,7 @@
PROG= w
SRCS= fmt.c pr_time.c proc_compare.c w.c
MAN= w.1 uptime.1
-LIBADD= kvm sbuf util xo
+LIBADD= kvm sbuf xo util
#BINGRP= kmem
#BINMODE=2555
LINKS= ${BINDIR}/w ${BINDIR}/uptime
diff --git a/usr.bin/wc/Makefile b/usr.bin/wc/Makefile
index 540e33d..6fa21fa 100644
--- a/usr.bin/wc/Makefile
+++ b/usr.bin/wc/Makefile
@@ -2,6 +2,6 @@
# $FreeBSD$
PROG= wc
-LIBADD= xo
+LIBADD= xo util
.include <bsd.prog.mk>
diff --git a/usr.bin/whois/whois.c b/usr.bin/whois/whois.c
index 6ad8826..278b50c 100644
--- a/usr.bin/whois/whois.c
+++ b/usr.bin/whois/whois.c
@@ -454,7 +454,7 @@ done:
if (fp == NULL)
err(EX_OSERR, "fdopen()");
if (strcmp(hostname, GERMNICHOST) == 0) {
- fprintf(fp, "-T dn,ace -C US-ASCII %s\r\n", query);
+ fprintf(fp, "-T dn,ace -C ISO-8859-1 %s\r\n", query);
} else if (strcmp(hostname, "dk" QNICHOST_TAIL) == 0) {
fprintf(fp, "--show-handles %s\r\n", query);
} else {
diff --git a/usr.bin/xargs/tests/regress.n2P0.out b/usr.bin/xargs/tests/regress.n2P0.out
index 4fa3f55..de062b2 100644
--- a/usr.bin/xargs/tests/regress.n2P0.out
+++ b/usr.bin/xargs/tests/regress.n2P0.out
@@ -1,4 +1,4 @@
-quick brown
fox jumped
-over the
lazy dog
+over the
+quick brown
diff --git a/usr.bin/xargs/tests/regress.sh b/usr.bin/xargs/tests/regress.sh
index c75136c..72458a4 100644
--- a/usr.bin/xargs/tests/regress.sh
+++ b/usr.bin/xargs/tests/regress.sh
@@ -12,7 +12,7 @@ REGRESSION_TEST(`P1', `xargs -P1 echo <${SRCDIR}/regress.in')
REGRESSION_TEST(`R', `xargs -I% -R1 echo The % % % %% % % <${SRCDIR}/regress.in')
REGRESSION_TEST(`n1', `xargs -n1 echo <${SRCDIR}/regress.in')
REGRESSION_TEST(`n2', `xargs -n2 echo <${SRCDIR}/regress.in')
-REGRESSION_TEST(`n2P0',`xargs -n2 -P0 echo <${SRCDIR}/regress.in')
+REGRESSION_TEST(`n2P0',`xargs -n2 -P0 echo <${SRCDIR}/regress.in | sort')
REGRESSION_TEST(`n3', `xargs -n3 echo <${SRCDIR}/regress.in')
REGRESSION_TEST(`0', `xargs -0 -n1 echo <${SRCDIR}/regress.0.in')
REGRESSION_TEST(`0I', `xargs -0 -I% echo The % %% % <${SRCDIR}/regress.0.in')
diff --git a/usr.bin/xo/Makefile b/usr.bin/xo/Makefile
index b199207..be22618 100644
--- a/usr.bin/xo/Makefile
+++ b/usr.bin/xo/Makefile
@@ -10,6 +10,6 @@ MAN= xo.1
# XXX For xoversion.h
CFLAGS+=-I${LIBXO}/libxo
-LIBADD= xo
+LIBADD= xo util
.include <bsd.prog.mk>
diff --git a/usr.bin/ypcat/ypcat.1 b/usr.bin/ypcat/ypcat.1
index 7106383..4b156a3 100644
--- a/usr.bin/ypcat/ypcat.1
+++ b/usr.bin/ypcat/ypcat.1
@@ -28,12 +28,12 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 3, 1993
+.Dd September 3, 2015
.Dt YPCAT 1
.Os
.Sh NAME
.Nm ypcat
-.Nd "print the values of all keys in a YP database"
+.Nd print the values of all keys in a NIS database
.Sh SYNOPSIS
.Nm
.Op Fl kt
@@ -45,7 +45,7 @@
The
.Nm
utility prints out the values of all keys from the
-.Tn YP
+.Tn NIS
database specified by
.Ar mapname ,
which may be a map name or a map nickname.
diff --git a/usr.bin/ypmatch/ypmatch.1 b/usr.bin/ypmatch/ypmatch.1
index 4291de2..0a0b6e0 100644
--- a/usr.bin/ypmatch/ypmatch.1
+++ b/usr.bin/ypmatch/ypmatch.1
@@ -28,12 +28,12 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 3, 1993
+.Dd September 3, 2015
.Dt YPMATCH 1
.Os
.Sh NAME
.Nm ypmatch
-.Nd "print the values of one or more keys in a YP database"
+.Nd print the values of one or more keys in a NIS database
.Sh SYNOPSIS
.Nm
.Op Fl kt
@@ -46,7 +46,7 @@
The
.Nm
utility prints out the values of one or more keys from the
-.Tn YP
+.Tn NIS
database specified by
.Ar mapname ,
which may be a map name or a map nickname.
diff --git a/usr.bin/ypwhich/Makefile b/usr.bin/ypwhich/Makefile
index 3f6928f..15dc9f8 100644
--- a/usr.bin/ypwhich/Makefile
+++ b/usr.bin/ypwhich/Makefile
@@ -1,7 +1,13 @@
# from: @(#)Makefile 5.8 (Berkeley) 7/28/90
# $FreeBSD$
+YPSERV=${.CURDIR}/../../usr.sbin/ypserv/common
+.PATH: ${YPSERV}
+
PROG= ypwhich
+SRCS= yplib_host.c ypwhich.c
+
+CFLAGS+= -I${YPSERV} -I.
WARNS?= 2
diff --git a/usr.bin/ypwhich/ypwhich.1 b/usr.bin/ypwhich/ypwhich.1
index fb2891e..009430d 100644
--- a/usr.bin/ypwhich/ypwhich.1
+++ b/usr.bin/ypwhich/ypwhich.1
@@ -30,12 +30,12 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 23, 1994
+.Dd September 3, 2015
.Dt YPWHICH 1
.Os
.Sh NAME
.Nm ypwhich
-.Nd return hostname of YP server of map master
+.Nd return hostname of NIS server of map master
.Sh SYNOPSIS
.Nm
.Op Fl d Ar domain
@@ -49,18 +49,18 @@
The
.Nm
utility tells which
-.Tn YP
+.Tn NIS
server supplies
-.Tn YP
+.Tn NIS
services to a client, or which is the master for a map.
If invoked without arguments, it gives the
-.Tn YP
+.Tn NIS
server for the local machine.
If
.Ar host
is specified, that machine is queried to find out
which
-.Tn YP
+.Tn NIS
server it is using.
.Pp
The options are as follows:
@@ -72,7 +72,7 @@ Inhibit translation of map nicknames
to their corresponding map names.
.It Fl m Op Ar mname
Find the master
-.Tn YP
+.Tn NIS
server for the named map.
No
.Ar host
diff --git a/usr.bin/ypwhich/ypwhich.c b/usr.bin/ypwhich/ypwhich.c
index 4e2c3a0..55e1b13 100644
--- a/usr.bin/ypwhich/ypwhich.c
+++ b/usr.bin/ypwhich/ypwhich.c
@@ -1,5 +1,8 @@
+/* $OpenBSD: ypwhich.c,v 1.23 2015/02/08 23:40:35 deraadt Exp $ */
+/* $NetBSD: ypwhich.c,v 1.6 1996/05/13 02:43:48 thorpej Exp $ */
+
/*
- * Copyright (c) 1992/3 Theo de Raadt <deraadt@fsa.ca>
+ * Copyright (c) 1992, 1993 Theo de Raadt <deraadt@theos.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -10,9 +13,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@@ -34,13 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/socket.h>
-#include <rpc/rpc.h>
-#include <rpc/xdr.h>
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-
#include <netinet/in.h>
-
#include <arpa/inet.h>
#include <ctype.h>
@@ -51,13 +45,12 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <unistd.h>
-#define ERR_USAGE 1 /* bad arguments - display 'usage' message */
-#define ERR_NOSUCHHOST 2 /* no such host */
-#define ERR_NOBINDING 3 /* error from ypbind -- domain not bound */
-#define ERR_NOYPBIND 4 /* ypbind not running */
-#define ERR_NOMASTER 5 /* could not find master server */
+#include <rpc/rpc.h>
+#include <rpc/xdr.h>
+#include <rpcsvc/yp.h>
+#include <rpcsvc/ypclnt.h>
-extern bool_t xdr_domainname();
+#include "yplib_host.h"
static const struct ypalias {
char *alias, *name;
@@ -77,10 +70,11 @@ static const struct ypalias {
static void
usage(void)
{
- fprintf(stderr, "%s\n%s\n",
- "usage: ypwhich [-d domain] [[-t] -m [mname] | host]",
- " ypwhich -x");
- exit(ERR_USAGE);
+ fprintf(stderr,
+ "usage: ypwhich [-t] [-d domain] [[-h] host]\n"
+ " ypwhich [-t] [-d domain] [-h host] -m [mname]\n"
+ " ypwhich -x\n");
+ exit(1);
}
@@ -88,26 +82,28 @@ usage(void)
* Like yp_bind except can query a specific host
*/
static int
-bind_host(char *dom, struct sockaddr_in *lsin)
+bind_host(char *dom, struct sockaddr_in *sin)
{
struct hostent *hent = NULL;
struct ypbind_resp ypbr;
+ struct in_addr ss_addr;
struct timeval tv;
CLIENT *client;
int sock, r;
- struct in_addr ss_addr;
sock = RPC_ANYSOCK;
tv.tv_sec = 15;
tv.tv_usec = 0;
- client = clntudp_create(lsin, YPBINDPROG, YPBINDVERS, tv, &sock);
+ client = clntudp_create(sin, YPBINDPROG, YPBINDVERS, tv, &sock);
+
if (client == NULL) {
- warnx("can't clntudp_create: %s", yperr_string(YPERR_YPBIND));
+ warnx("host is not bound to a ypmaster");
return (YPERR_YPBIND);
}
tv.tv_sec = 5;
tv.tv_usec = 0;
+
r = clnt_call(client, YPBINDPROC_DOMAIN,
(xdrproc_t)xdr_domainname, &dom,
(xdrproc_t)xdr_ypbind_resp, &ypbr, tv);
@@ -118,37 +114,41 @@ bind_host(char *dom, struct sockaddr_in *lsin)
} else {
if (ypbr.ypbind_status != YPBIND_SUCC_VAL) {
warnx("can't yp_bind: reason: %s",
- ypbinderr_string(ypbr.ypbind_respbody.ypbind_error));
+ yperr_string(ypbr.ypbind_status));
clnt_destroy(client);
return (r);
}
}
clnt_destroy(client);
- ss_addr = ypbr.ypbind_respbody.ypbind_bindinfo.ypbind_binding_addr;
- /*printf("%08x\n", ss_addr);*/
- hent = gethostbyaddr((char *)&ss_addr, sizeof(ss_addr), AF_INET);
- if (hent)
+ memmove(&ss_addr.s_addr, &ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr,
+ sizeof (ss_addr));
+
+ hent = gethostbyaddr((char *)&ss_addr.s_addr, sizeof(ss_addr.s_addr),
+ AF_INET);
+ if (hent != NULL)
printf("%s\n", hent->h_name);
else
printf("%s\n", inet_ntoa(ss_addr));
+
return (0);
}
int
main(int argc, char *argv[])
{
- char *domnam = NULL, *master;
- char *map = NULL;
+ char *domain, *master, *map = NULL, *host = NULL;
+ int notrans = 0, mode = 0, c, r, i;
struct ypmaplist *ypml, *y;
+ struct sockaddr_in sin;
struct hostent *hent;
- struct sockaddr_in lsin;
- int notrans, mode;
- int c, r;
- u_int i;
+ CLIENT *client = NULL;
- notrans = mode = 0;
- while ((c = getopt(argc, argv, "xd:mt")) != -1)
+ yp_get_default_domain(&domain);
+ if (domain == NULL)
+ errx(1, "YP domain name not set");
+
+ while ((c = getopt(argc, argv, "xd:h:mt")) != -1)
switch (c) {
case 'x':
for (i = 0; i < nitems(ypaliases); i++)
@@ -156,44 +156,46 @@ main(int argc, char *argv[])
ypaliases[i].alias,
ypaliases[i].name);
exit(0);
+ case 'h':
+ host = optarg;
+ break;
case 'd':
- domnam = optarg;
+ domain = optarg;
break;
case 't':
- notrans++;
+ notrans = 1;
break;
case 'm':
- mode++;
+ mode = 1;
break;
default:
usage();
}
-
- if (domnam == NULL)
- yp_get_default_domain(&domnam);
+ argc -= optind;
+ argv += optind;
if (mode == 0) {
- switch (argc-optind) {
+ switch (argc) {
case 0:
- bzero(&lsin, sizeof lsin);
- lsin.sin_family = AF_INET;
- lsin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ memset(&sin, 0, sizeof sin);
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- if (bind_host(domnam, &lsin))
- exit(ERR_NOBINDING);
+ if (bind_host(domain, &sin))
+ exit(1);
break;
case 1:
- bzero(&lsin, sizeof lsin);
- lsin.sin_family = AF_INET;
- if ((lsin.sin_addr.s_addr = inet_addr(argv[optind])) == INADDR_NONE) {
- hent = gethostbyname(argv[optind]);
- if (!hent)
- errx(ERR_NOSUCHHOST, "host %s unknown", argv[optind]);
- bcopy((char *)hent->h_addr_list[0],
- (char *)&lsin.sin_addr, sizeof lsin.sin_addr);
+ bzero(&sin, sizeof sin);
+ sin.sin_family = AF_INET;
+ if (inet_aton(argv[0], &sin.sin_addr) == 0) {
+ hent = gethostbyname(argv[0]);
+ if (!hent) {
+ errx(1, "host %s unknown",
+ argv[0]);
+ }
}
- if (bind_host(domnam, &lsin))
- exit(ERR_NOBINDING);
+ if (bind_host(domain, &sin))
+ exit(1);
break;
default:
usage();
@@ -201,57 +203,75 @@ main(int argc, char *argv[])
exit(0);
}
- if (argc-optind > 1)
+ if (argc > 1)
usage();
- if (argv[optind]) {
- map = argv[optind];
+ if (host != NULL)
+ client = yp_bind_host(host, YPPROG, YPVERS, 0, 1);
+
+ if (argv[0]) {
+ map = argv[0];
if (notrans == 0) {
for (i = 0; i < nitems(ypaliases); i++)
if (strcmp(map, ypaliases[i].alias) == 0)
map = ypaliases[i].name;
}
- r = yp_master(domnam, map, &master);
+
+ if (host != NULL)
+ r = yp_master_host(client, domain, map, &master);
+ else
+ r = yp_master(domain, map, &master);
+
switch (r) {
case 0:
printf("%s\n", master);
free(master);
break;
case YPERR_YPBIND:
- errx(ERR_NOYPBIND, "not running ypbind");
+ errx(1, "not running ypbind");
default:
- errx(ERR_NOMASTER, "can't find master for map %s: reason: %s",
- map, yperr_string(r));
+ errx(1, "can't find master for map %s: reason: %s",
+ map, yperr_string(r));
}
exit(0);
}
ypml = NULL;
- r = yp_maplist(domnam, &ypml);
+ if (host != NULL)
+ r = yp_maplist_host(client, domain, &ypml);
+ else
+ r = yp_maplist(domain, &ypml);
+
+ r = 0;
switch (r) {
case 0:
- for (y = ypml; y;) {
+ for (y = ypml; y; ) {
ypml = y;
- r = yp_master(domnam, ypml->ypml_name, &master);
+ if (host != NULL) {
+ r = yp_master_host(client,
+ domain, ypml->map, &master);
+ } else {
+ r = yp_master(domain, ypml->map, &master);
+ }
switch (r) {
case 0:
- printf("%s %s\n", ypml->ypml_name, master);
+ printf("%s %s\n", ypml->map, master);
free(master);
break;
default:
warnx("can't find the master of %s: reason: %s",
- ypml->ypml_name, yperr_string(r));
+ ypml->map, yperr_string(r));
break;
}
- y = ypml->ypml_next;
+ y = ypml->next;
free(ypml);
}
break;
case YPERR_YPBIND:
- errx(ERR_NOYPBIND, "not running ypbind");
+ errx(1, "not running ypbind");
default:
- errx(ERR_NOMASTER, "can't get map list for domain %s: reason: %s",
- domnam, yperr_string(r));
+ errx(1, "can't get map list for domain %s: reason: %s",
+ domain, yperr_string(r));
}
exit(0);
}
OpenPOWER on IntegriCloud