diff options
author | dim <dim@FreeBSD.org> | 2015-09-05 18:36:23 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2015-09-05 18:36:23 +0000 |
commit | fe74670889cf92661ccb26dc6bd31e8227b41594 (patch) | |
tree | c2636bec23985b92b33023a5ca2e324f89604bfa /usr.bin | |
parent | 3cb87c6fdcce3fa2b08afc959741598eb31a8a5c (diff) | |
parent | 127f7b062779965375aa7d373ab56614a5d13f16 (diff) | |
download | FreeBSD-src-fe74670889cf92661ccb26dc6bd31e8227b41594.zip FreeBSD-src-fe74670889cf92661ccb26dc6bd31e8227b41594.tar.gz |
Merge ^/head r286858 through r287489.
Diffstat (limited to 'usr.bin')
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); } |