Apply FreeBSD changes.

There is an incomplete piece of code in here which requires the process
handling library which is still under development.
This commit is contained in:
John Birrell 2008-04-26 03:39:02 +00:00
parent 4257781cdc
commit a6847cf6de
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=178537

View File

@ -34,15 +34,20 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include <strings.h> #include <strings.h>
#include <unistd.h> #include <unistd.h>
#include <limits.h> #include <limits.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <libgen.h> #include <libgen.h>
#if defined(sun)
#include <libproc.h> #include <libproc.h>
#endif
typedef struct dtrace_cmd { typedef struct dtrace_cmd {
void (*dc_func)(struct dtrace_cmd *); /* function to compile arg */ 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_status = E_SUCCESS;
static int g_grabanon = 0; static int g_grabanon = 0;
static const char *g_ofile = NULL; static const char *g_ofile = NULL;
static FILE *g_ofp = stdout; static FILE *g_ofp;
static dtrace_hdl_t *g_dtp; static dtrace_hdl_t *g_dtp;
#if defined(sun)
static char *g_etcfile = "/etc/system"; static char *g_etcfile = "/etc/system";
static const char *g_etcbegin = "* vvvv Added by DTrace"; static const char *g_etcbegin = "* vvvv Added by DTrace";
static const char *g_etcend = "* ^^^^ 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.", "* chapter of the Solaris Dynamic Tracing Guide for details.",
"*", "*",
NULL }; NULL };
#endif
static int static int
usage(FILE *fp) usage(FILE *fp)
@ -195,6 +202,10 @@ fatal(const char *fmt, ...)
static void static void
dfatal(const char *fmt, ...) dfatal(const char *fmt, ...)
{ {
#if !defined(sun) && defined(NEED_ERRLOC)
char *p_errfile = NULL;
int errline = 0;
#endif
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
@ -212,6 +223,11 @@ dfatal(const char *fmt, ...)
(void) fprintf(stderr, "%s\n", (void) fprintf(stderr, "%s\n",
dtrace_errmsg(g_dtp, dtrace_errno(g_dtp))); 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 * Close the DTrace handle to ensure that any controlled processes are
@ -372,6 +388,7 @@ dof_prune(const char *fname)
free(buf); free(buf);
} }
#if defined(sun)
static void static void
etcsystem_prune(void) etcsystem_prune(void)
{ {
@ -482,6 +499,7 @@ etcsystem_add(void)
error("added forceload directives to %s\n", g_ofile); error("added forceload directives to %s\n", g_ofile);
} }
#endif
static void static void
print_probe_info(const dtrace_probeinfo_t *p) 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; p = (uchar_t *)dof;
q = p + dof->dofh_loadsz; q = p + dof->dofh_loadsz;
#if defined(sun)
oprintf("dof-data-%d=0x%x", n, *p++); oprintf("dof-data-%d=0x%x", n, *p++);
while (p < q) while (p < q)
oprintf(",0x%x", *p++); oprintf(",0x%x", *p++);
oprintf(";\n"); 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); dtrace_dof_destroy(g_dtp, dof);
} }
@ -741,6 +773,8 @@ compile_str(dtrace_cmd_t *dcp)
static void static void
prochandler(struct ps_prochandle *P, const char *msg, void *arg) 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); const psinfo_t *prp = Ppsinfo(P);
int pid = Pstatus(P)->pr_pid; int pid = Pstatus(P)->pr_pid;
char name[SIG2STR_MAX]; char name[SIG2STR_MAX];
@ -778,6 +812,7 @@ prochandler(struct ps_prochandle *P, const char *msg, void *arg)
g_pslive--; g_pslive--;
break; break;
} }
#endif
} }
/*ARGSUSED*/ /*ARGSUSED*/
@ -1159,9 +1194,10 @@ main(int argc, char *argv[])
dtrace_optval_t opt; dtrace_optval_t opt;
dtrace_cmd_t *dcp; dtrace_cmd_t *dcp;
g_ofp = stdout;
int done = 0, mode = 0; int done = 0, mode = 0;
int err, i; int err, i, c;
char c, *p, **v; char *p, **v;
struct ps_prochandle *P; struct ps_prochandle *P;
pid_t pid; pid_t pid;
@ -1188,7 +1224,7 @@ main(int argc, char *argv[])
* options into g_argv[], and abort if any invalid options are found. * options into g_argv[], and abort if any invalid options are found.
*/ */
for (optind = 1; optind < argc; optind++) { for (optind = 1; optind < argc; optind++) {
while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) { while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != -1) {
switch (c) { switch (c) {
case '3': case '3':
if (strcmp(optarg, "2") != 0) { if (strcmp(optarg, "2") != 0) {
@ -1337,8 +1373,14 @@ main(int argc, char *argv[])
dtrace_errmsg(NULL, err)); 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, "bufsize", "4m");
(void) dtrace_setopt(g_dtp, "aggsize", "4m"); (void) dtrace_setopt(g_dtp, "aggsize", "4m");
#endif
/* /*
* If -G is specified, enable -xlink=dynamic and -xunodefs to permit * 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. * this time; these will compiled as part of the fourth processing pass.
*/ */
for (optind = 1; optind < argc; optind++) { for (optind = 1; optind < argc; optind++) {
while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) { while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != -1) {
switch (c) { switch (c) {
case 'a': case 'a':
if (dtrace_setopt(g_dtp, "grabanon", 0) != 0) 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. * may been affected by any library options set by the second pass.
*/ */
for (optind = 1; optind < argc; optind++) { for (optind = 1; optind < argc; optind++) {
while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) { while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != -1) {
switch (c) { switch (c) {
case 'c': case 'c':
if ((v = make_argv(optarg)) == NULL) if ((v = make_argv(optarg)) == NULL)
@ -1616,10 +1658,21 @@ main(int argc, char *argv[])
case DMODE_ANON: case DMODE_ANON:
if (g_ofile == NULL) if (g_ofile == NULL)
#if defined(sun)
g_ofile = "/kernel/drv/dtrace.conf"; 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 */ dof_prune(g_ofile); /* strip out any old DOF directives */
#if defined(sun)
etcsystem_prune(); /* string out any forceload directives */ etcsystem_prune(); /* string out any forceload directives */
#endif
if (g_cmdc == 0) { if (g_cmdc == 0) {
dtrace_close(g_dtp); dtrace_close(g_dtp);
@ -1650,8 +1703,10 @@ main(int argc, char *argv[])
* that itself contains a #pragma D option quiet. * that itself contains a #pragma D option quiet.
*/ */
error("saved anonymous enabling in %s\n", g_ofile); error("saved anonymous enabling in %s\n", g_ofile);
#if defined(sun)
etcsystem_add(); etcsystem_add();
error("run update_drv(1M) or reboot to enable changes\n"); error("run update_drv(1M) or reboot to enable changes\n");
#endif
dtrace_close(g_dtp); dtrace_close(g_dtp);
return (g_status); return (g_status);
@ -1780,6 +1835,11 @@ main(int argc, char *argv[])
if (sigaction(SIGTERM, NULL, &oact) == 0 && oact.sa_handler != SIG_IGN) if (sigaction(SIGTERM, NULL, &oact) == 0 && oact.sa_handler != SIG_IGN)
(void) sigaction(SIGTERM, &act, NULL); (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, * Now that tracing is active and we are ready to consume trace data,
* continue any grabbed or created processes, setting them running * continue any grabbed or created processes, setting them running