summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2020-09-11 08:16:15 +0000
committermpi <mpi@openbsd.org>2020-09-11 08:16:15 +0000
commitccff7ee95f2b063e019a53cd60b7a82d3db94148 (patch)
tree967f1e08c73191ebd612c14aa1afbc748df0b261
parentIf we get messages but they are not ntp replies (e.g. caused by (diff)
downloadwireguard-openbsd-ccff7ee95f2b063e019a53cd60b7a82d3db94148.tar.xz
wireguard-openbsd-ccff7ee95f2b063e019a53cd60b7a82d3db94148.zip
Support '-p' a flag to filter all actions by PID.
-rw-r--r--usr.sbin/btrace/btrace.89
-rw-r--r--usr.sbin/btrace/btrace.c32
2 files changed, 29 insertions, 12 deletions
diff --git a/usr.sbin/btrace/btrace.8 b/usr.sbin/btrace/btrace.8
index b9fdc8faae4..1a998d3b168 100644
--- a/usr.sbin/btrace/btrace.8
+++ b/usr.sbin/btrace/btrace.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: btrace.8,v 1.1 2020/01/21 16:24:55 mpi Exp $
+.\" $OpenBSD: btrace.8,v 1.2 2020/09/11 08:16:15 mpi Exp $
.\"
.\" Copyright (c) 2019 Martin Pieuchot <mpi@openbsd.org>
.\"
@@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: January 21 2020 $
+.Dd $Mdocdate: September 11 2020 $
.Dt BTRACE 8
.Os
.Sh NAME
@@ -23,6 +23,7 @@
.Sh SYNOPSIS
.Nm btrace
.Op Fl lv
+.Op Fl p Ar pid
.Op Fl e Ar program | Ar file
.Sh DESCRIPTION
The
@@ -45,6 +46,10 @@ Execute
.Ar program .
.It Fl l
List all available probes.
+.It Fl p Ar pid
+Enable tracing on the indicated process ID (only one
+.Fl p
+flag is permitted).
.It Fl v
Verbose mode.
Causes
diff --git a/usr.sbin/btrace/btrace.c b/usr.sbin/btrace/btrace.c
index e8f8cfc1db4..3c7e44230cf 100644
--- a/usr.sbin/btrace/btrace.c
+++ b/usr.sbin/btrace/btrace.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: btrace.c,v 1.23 2020/08/13 11:35:21 mpi Exp $ */
+/* $OpenBSD: btrace.c,v 1.24 2020/09/11 08:16:15 mpi Exp $ */
/*
* Copyright (c) 2019 - 2020 Martin Pieuchot <mpi@openbsd.org>
@@ -67,8 +67,8 @@ struct dtioc_probe_info *dtpi_get_by_value(const char *, const char *,
/*
* Main loop and rule evaluation.
*/
-void rules_do(int);
-void rules_setup(int);
+void rules_do(int, int);
+void rules_setup(int, int);
void rules_apply(struct dt_evt *);
void rules_teardown(int);
void rule_eval(struct bt_rule *, struct dt_evt *);
@@ -122,7 +122,8 @@ main(int argc, char *argv[])
{
int fd = -1, ch, error = 0;
const char *filename = NULL, *btscript = NULL;
- int showprobes = 0;
+ const char *errstr;
+ int showprobes = 0, tracepid = -1;
setlocale(LC_ALL, "");
@@ -131,7 +132,7 @@ main(int argc, char *argv[])
err(1, "pledge");
#endif
- while ((ch = getopt(argc, argv, "e:lv")) != -1) {
+ while ((ch = getopt(argc, argv, "e:lp:v")) != -1) {
switch (ch) {
case 'e':
btscript = optarg;
@@ -139,6 +140,13 @@ main(int argc, char *argv[])
case 'l':
showprobes = 1;
break;
+ case 'p':
+ if (tracepid != -1)
+ usage();
+ tracepid = strtonum(optarg, 1, INT_MAX, &errstr);
+ if (errstr != NULL)
+ errx(1, "invalid pid %s: %s", optarg, errstr);
+ break;
case 'v':
verbose++;
break;
@@ -181,7 +189,7 @@ main(int argc, char *argv[])
}
if (!TAILQ_EMPTY(&g_rules))
- rules_do(fd);
+ rules_do(fd, tracepid);
if (fd != -1)
close(fd);
@@ -192,7 +200,7 @@ main(int argc, char *argv[])
__dead void
usage(void)
{
- fprintf(stderr, "usage: %s [-lv] [-e program|file]\n",
+ fprintf(stderr, "usage: %s [-lv] [-p pid] [-e program|file]\n",
getprogname());
exit(1);
}
@@ -316,7 +324,7 @@ dtpi_get_by_value(const char *prov, const char *func, const char *name)
}
void
-rules_do(int fd)
+rules_do(int fd, int tracepid)
{
struct sigaction sa;
@@ -327,7 +335,7 @@ rules_do(int fd)
if (sigaction(SIGINT, &sa, NULL))
err(1, "sigaction");
- rules_setup(fd);
+ rules_setup(fd, tracepid);
while (!quit_pending && g_nprobes > 0) {
static struct dt_evt devtbuf[64];
@@ -391,7 +399,7 @@ dvar2dt(enum bt_filtervar var)
void
-rules_setup(int fd)
+rules_setup(int fd, int tracepid)
{
struct dtioc_probe_info *dtpi;
struct dtioc_req *dtrq;
@@ -429,6 +437,10 @@ rules_setup(int fd)
dtrq->dtrq_filter.dtf_operand = dop2dt(df->bf_op);
dtrq->dtrq_filter.dtf_variable = dvar2dt(df->bf_var);
dtrq->dtrq_filter.dtf_value = df->bf_val;
+ } else if (tracepid != -1) {
+ dtrq->dtrq_filter.dtf_operand = DT_OP_EQ;
+ dtrq->dtrq_filter.dtf_variable = DT_FV_PID;
+ dtrq->dtrq_filter.dtf_value = tracepid;
}
dtrq->dtrq_rate = r->br_probe->bp_rate;