aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Birrell <jb@FreeBSD.org>2008-04-26 03:39:02 +0000
committerJohn Birrell <jb@FreeBSD.org>2008-04-26 03:39:02 +0000
commita6847cf6de106909716286f90594546153483014 (patch)
treec975835adf4be1a432cc5dbc40b2394be9c1e5ce
parent4257781cdca17c8173bb7206df98ccadcda6d5cf (diff)
downloadsrc-a6847cf6de106909716286f90594546153483014.tar.gz
src-a6847cf6de106909716286f90594546153483014.zip
Apply FreeBSD changes.
There is an incomplete piece of code in here which requires the process handling library which is still under development.
Notes
Notes: svn path=/head/; revision=178537
-rw-r--r--cddl/contrib/opensolaris/cmd/dtrace/dtrace.c72
1 files changed, 66 insertions, 6 deletions
diff --git a/cddl/contrib/opensolaris/cmd/dtrace/dtrace.c b/cddl/contrib/opensolaris/cmd/dtrace/dtrace.c
index 81a6953b63fa..f909e229b5f2 100644
--- a/cddl/contrib/opensolaris/cmd/dtrace/dtrace.c
+++ b/cddl/contrib/opensolaris/cmd/dtrace/dtrace.c
@@ -34,15 +34,20 @@
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
+#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <limits.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
+#if defined(sun)
#include <alloca.h>
+#endif
#include <libgen.h>
+#if defined(sun)
#include <libproc.h>
+#endif
typedef struct dtrace_cmd {
void (*dc_func)(struct dtrace_cmd *); /* function to compile arg */
@@ -92,8 +97,9 @@ static int g_mode = DMODE_EXEC;
static int g_status = E_SUCCESS;
static int g_grabanon = 0;
static const char *g_ofile = NULL;
-static FILE *g_ofp = stdout;
+static FILE *g_ofp;
static dtrace_hdl_t *g_dtp;
+#if defined(sun)
static char *g_etcfile = "/etc/system";
static const char *g_etcbegin = "* vvvv Added by DTrace";
static const char *g_etcend = "* ^^^^ Added by DTrace";
@@ -108,6 +114,7 @@ static const char *g_etc[] = {
"* chapter of the Solaris Dynamic Tracing Guide for details.",
"*",
NULL };
+#endif
static int
usage(FILE *fp)
@@ -195,6 +202,10 @@ fatal(const char *fmt, ...)
static void
dfatal(const char *fmt, ...)
{
+#if !defined(sun) && defined(NEED_ERRLOC)
+ char *p_errfile = NULL;
+ int errline = 0;
+#endif
va_list ap;
va_start(ap, fmt);
@@ -212,6 +223,11 @@ dfatal(const char *fmt, ...)
(void) fprintf(stderr, "%s\n",
dtrace_errmsg(g_dtp, dtrace_errno(g_dtp)));
}
+#if !defined(sun) && defined(NEED_ERRLOC)
+ dt_get_errloc(g_dtp, &p_errfile, &errline);
+ if (p_errfile != NULL)
+ printf("File '%s', line %d\n", p_errfile, errline);
+#endif
/*
* Close the DTrace handle to ensure that any controlled processes are
@@ -372,6 +388,7 @@ dof_prune(const char *fname)
free(buf);
}
+#if defined(sun)
static void
etcsystem_prune(void)
{
@@ -482,6 +499,7 @@ etcsystem_add(void)
error("added forceload directives to %s\n", g_ofile);
}
+#endif
static void
print_probe_info(const dtrace_probeinfo_t *p)
@@ -611,12 +629,26 @@ anon_prog(const dtrace_cmd_t *dcp, dof_hdr_t *dof, int n)
p = (uchar_t *)dof;
q = p + dof->dofh_loadsz;
+#if defined(sun)
oprintf("dof-data-%d=0x%x", n, *p++);
while (p < q)
oprintf(",0x%x", *p++);
oprintf(";\n");
+#else
+ /*
+ * On FreeBSD, the DOF data is handled as a kernel environment (kenv)
+ * string. We use two hex characters per DOF byte.
+ */
+ oprintf("dof-data-%d=%02x", n, *p++);
+
+ while (p < q)
+ oprintf("%02x", *p++);
+
+ oprintf("\n");
+#endif
+
dtrace_dof_destroy(g_dtp, dof);
}
@@ -741,6 +773,8 @@ compile_str(dtrace_cmd_t *dcp)
static void
prochandler(struct ps_prochandle *P, const char *msg, void *arg)
{
+fatal("DOODAD in function %s, file %s, line %d\n",__FUNCTION__,__FILE__,__LINE__);
+#ifdef DOODAD
const psinfo_t *prp = Ppsinfo(P);
int pid = Pstatus(P)->pr_pid;
char name[SIG2STR_MAX];
@@ -778,6 +812,7 @@ prochandler(struct ps_prochandle *P, const char *msg, void *arg)
g_pslive--;
break;
}
+#endif
}
/*ARGSUSED*/
@@ -1159,9 +1194,10 @@ main(int argc, char *argv[])
dtrace_optval_t opt;
dtrace_cmd_t *dcp;
+ g_ofp = stdout;
int done = 0, mode = 0;
- int err, i;
- char c, *p, **v;
+ int err, i, c;
+ char *p, **v;
struct ps_prochandle *P;
pid_t pid;
@@ -1188,7 +1224,7 @@ main(int argc, char *argv[])
* options into g_argv[], and abort if any invalid options are found.
*/
for (optind = 1; optind < argc; optind++) {
- while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) {
+ while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != -1) {
switch (c) {
case '3':
if (strcmp(optarg, "2") != 0) {
@@ -1337,8 +1373,14 @@ main(int argc, char *argv[])
dtrace_errmsg(NULL, err));
}
+#if defined(__i386__)
+ /* XXX The 32-bit seems to need more buffer space by default -sson */
+ (void) dtrace_setopt(g_dtp, "bufsize", "12m");
+ (void) dtrace_setopt(g_dtp, "aggsize", "12m");
+#else
(void) dtrace_setopt(g_dtp, "bufsize", "4m");
(void) dtrace_setopt(g_dtp, "aggsize", "4m");
+#endif
/*
* If -G is specified, enable -xlink=dynamic and -xunodefs to permit
@@ -1371,7 +1413,7 @@ main(int argc, char *argv[])
* this time; these will compiled as part of the fourth processing pass.
*/
for (optind = 1; optind < argc; optind++) {
- while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) {
+ while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != -1) {
switch (c) {
case 'a':
if (dtrace_setopt(g_dtp, "grabanon", 0) != 0)
@@ -1528,7 +1570,7 @@ main(int argc, char *argv[])
* may been affected by any library options set by the second pass.
*/
for (optind = 1; optind < argc; optind++) {
- while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) {
+ while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != -1) {
switch (c) {
case 'c':
if ((v = make_argv(optarg)) == NULL)
@@ -1616,10 +1658,21 @@ main(int argc, char *argv[])
case DMODE_ANON:
if (g_ofile == NULL)
+#if defined(sun)
g_ofile = "/kernel/drv/dtrace.conf";
+#else
+ /*
+ * On FreeBSD, anonymous DOF data is written to
+ * the DTrace DOF file that the boot loader will
+ * read if booting with the DTrace option.
+ */
+ g_ofile = "/boot/dtrace.dof";
+#endif
dof_prune(g_ofile); /* strip out any old DOF directives */
+#if defined(sun)
etcsystem_prune(); /* string out any forceload directives */
+#endif
if (g_cmdc == 0) {
dtrace_close(g_dtp);
@@ -1650,8 +1703,10 @@ main(int argc, char *argv[])
* that itself contains a #pragma D option quiet.
*/
error("saved anonymous enabling in %s\n", g_ofile);
+#if defined(sun)
etcsystem_add();
error("run update_drv(1M) or reboot to enable changes\n");
+#endif
dtrace_close(g_dtp);
return (g_status);
@@ -1780,6 +1835,11 @@ main(int argc, char *argv[])
if (sigaction(SIGTERM, NULL, &oact) == 0 && oact.sa_handler != SIG_IGN)
(void) sigaction(SIGTERM, &act, NULL);
+#if !defined(sun)
+ if (sigaction(SIGUSR1, NULL, &oact) == 0 && oact.sa_handler != SIG_IGN)
+ (void) sigaction(SIGUSR1, &act, NULL);
+#endif
+
/*
* Now that tracing is active and we are ready to consume trace data,
* continue any grabbed or created processes, setting them running