[DTrace-devel] [PATCH 2/2 v2] Add freopen() and system() support
eugene.loh at oracle.com
eugene.loh at oracle.com
Fri Jul 24 12:50:00 PDT 2020
From: Eugene Loh <eugene.loh at oracle.com>
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_cg.c | 10 ----------
libdtrace/dt_consume.c | 31 +++++++++++++++++++++++++++----
libdtrace/dt_open.c | 8 ++++++++
3 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 2435b84d..3c454098 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -579,11 +579,6 @@ dt_cg_act_exit(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
dt_regset_free(pcb->pcb_regs, dnp->dn_args->dn_reg);
}
-static void
-dt_cg_act_freopen(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
-{
-}
-
static void
dt_cg_act_ftruncate(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
{
@@ -760,11 +755,6 @@ dt_cg_act_symmod(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
{
}
-static void
-dt_cg_act_system(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
-{
-}
-
static void
dt_cg_act_trace(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
{
diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
index bd54ddee..f94459d9 100644
--- a/libdtrace/dt_consume.c
+++ b/libdtrace/dt_consume.c
@@ -2397,6 +2397,10 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, int cpu, char *buf,
for (i = 0; i < pdat->dtpda_ddesc->dtdd_nrecs; i++) {
int n;
dtrace_recdesc_t *rec;
+ int (*func)(dtrace_hdl_t *, FILE *, void *,
+ const dtrace_probedata_t *,
+ const dtrace_recdesc_t *, uint_t,
+ const void *buf, size_t);
rec = &pdat->dtpda_ddesc->dtdd_recs[i];
if (rec->dtrd_action == DTRACEACT_EXIT)
@@ -2414,13 +2418,32 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, int cpu, char *buf,
if (rval != DTRACE_CONSUME_THIS)
return dt_set_errno(dtp, EDT_BADRVAL);
- if (rec->dtrd_action == DTRACEACT_PRINTF) {
+ switch (rec->dtrd_action) {
+ case DTRACEACT_PRINTF:
+ func = dtrace_fprintf;
+ break;
+/*
+ case DTRACEACT_PRINTA:
+ func = dtrace_fprinta;
+ break;
+*/
+ case DTRACEACT_SYSTEM:
+ func = dtrace_system;
+ break;
+ case DTRACEACT_FREOPEN:
+ func = dtrace_freopen;
+ break;
+ default:
+ func = NULL;
+ break;
+ }
+
+ if (func) {
int nrecs;
nrecs = pdat->dtpda_ddesc->dtdd_nrecs - i;
- n = dtrace_fprintf(dtp, fp, rec->dtrd_format,
- pdat, rec, nrecs, data,
- size);
+ n = (*func)(dtp, fp, rec->dtrd_format, pdat,
+ rec, nrecs, data, size);
if (n < 0)
return -1;
if (n > 0)
diff --git a/libdtrace/dt_open.c b/libdtrace/dt_open.c
index 5db72e45..eb24f141 100644
--- a/libdtrace/dt_open.c
+++ b/libdtrace/dt_open.c
@@ -762,6 +762,14 @@ dt_vopen(int version, int flags, int *errp,
for (i = 0; i < DTRACEOPT_MAX; i++)
dtp->dt_options[i] = DTRACEOPT_UNSET;
+ /* FIXME: the default value of strsize must be set.
+ * In legacy DTrace, the value was read from the kernel
+ * in dt_options_load(). When string handling is done,
+ * we will introduce a real solution suitable for this
+ * version. For now, just set it here.
+ */
+ dtp->dt_options[DTRACEOPT_STRSIZE] = 256;
+
dtp->dt_cpp_argv[0] = (char *)strbasename(dtp->dt_cpp_path);
snprintf(isadef, sizeof(isadef), "-D__SUNW_D_%u",
--
2.18.2
More information about the DTrace-devel
mailing list