[DTrace-devel] [PATCH 2/2 v2] Add freopen() and system() support

Kris Van Hees kris.van.hees at oracle.com
Mon Aug 24 06:39:11 PDT 2020


On Fri, Jul 24, 2020 at 03:50:00PM -0400, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

... but don't forget to look at the small changes I mentiioned for the [1/2]
in this series.  I will resend it following this one.

> ---
>  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
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list