dt_options.c

来自「Sun Solaris 10 中的 DTrace 组件的源代码。请参看: htt」· C语言 代码 · 共 837 行 · 第 1/2 页

C
837
字号
/* * Copyright 2005 Sun Microsystems, Inc.  All rights reserved. * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only. * See the file usr/src/LICENSING.NOTICE in this distribution or * http://www.opensolaris.org/license/ for details. */#pragma ident	"@(#)dt_options.c	1.10	04/10/22 SMI"#include <sys/types.h>#include <sys/resource.h>#include <strings.h>#include <signal.h>#include <stdlib.h>#include <unistd.h>#include <limits.h>#include <alloca.h>#include <errno.h>#include <fcntl.h>#include <dt_impl.h>#include <dt_string.h>static intdt_opt_agg(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	dt_aggregate_t *agp = &dtp->dt_aggregate;	if (arg != NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	agp->dtat_flags |= option;	return (0);}/*ARGSUSED*/static intdt_opt_amin(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	char str[DTRACE_ATTR2STR_MAX];	dtrace_attribute_t attr;	if (arg == NULL || dtrace_str2attr(arg, &attr) == -1)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	dt_dprintf("set compiler attribute minimum to %s\n",	    dtrace_attr2str(attr, str, sizeof (str)));	if (dtp->dt_pcb != NULL) {		dtp->dt_pcb->pcb_cflags |= DTRACE_C_EATTR;		dtp->dt_pcb->pcb_amin = attr;	} else {		dtp->dt_cflags |= DTRACE_C_EATTR;		dtp->dt_amin = attr;	}	return (0);}static voiddt_coredump(void){	const char msg[] = "libdtrace DEBUG: [ forcing coredump ]\n";	struct sigaction act;	struct rlimit lim;	(void) write(STDERR_FILENO, msg, sizeof (msg) - 1);	act.sa_handler = SIG_DFL;	act.sa_flags = 0;	(void) sigemptyset(&act.sa_mask);	(void) sigaction(SIGABRT, &act, NULL);	lim.rlim_cur = RLIM_INFINITY;	lim.rlim_max = RLIM_INFINITY;	(void) setrlimit(RLIMIT_CORE, &lim);	abort();}/*ARGSUSED*/static intdt_opt_core(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	static int enabled = 0;	if (arg != NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (enabled++ || atexit(dt_coredump) == 0)		return (0);	return (dt_set_errno(dtp, errno));}/*ARGSUSED*/static intdt_opt_cpp_hdrs(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	if (arg != NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (dtp->dt_pcb != NULL)		return (dt_set_errno(dtp, EDT_BADOPTCTX));	if (dt_cpp_add_arg(dtp, "-H") == NULL)		return (dt_set_errno(dtp, EDT_NOMEM));	return (0);}/*ARGSUSED*/static intdt_opt_cpp_path(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	char *cpp;	if (arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (dtp->dt_pcb != NULL)		return (dt_set_errno(dtp, EDT_BADOPTCTX));	if ((cpp = strdup(arg)) == NULL)		return (dt_set_errno(dtp, EDT_NOMEM));	dtp->dt_cpp_argv[0] = (char *)strbasename(cpp);	free(dtp->dt_cpp_path);	dtp->dt_cpp_path = cpp;	return (0);}static intdt_opt_cpp_opts(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	char *buf;	size_t len;	const char *opt = (const char *)option;	if (opt == NULL || arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (dtp->dt_pcb != NULL)		return (dt_set_errno(dtp, EDT_BADOPTCTX));	len = strlen(opt) + strlen(arg) + 1;	buf = alloca(len);	(void) strcpy(buf, opt);	(void) strcat(buf, arg);	if (dt_cpp_add_arg(dtp, buf) == NULL)		return (dt_set_errno(dtp, EDT_NOMEM));	return (0);}/*ARGSUSED*/static intdt_opt_ctypes(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	int fd;	if (arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if ((fd = open64(arg, O_CREAT | O_WRONLY, 0666)) == -1)		return (dt_set_errno(dtp, errno));	(void) close(dtp->dt_cdefs_fd);	dtp->dt_cdefs_fd = fd;	return (0);}/*ARGSUSED*/static intdt_opt_dtypes(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	int fd;	if (arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if ((fd = open64(arg, O_CREAT | O_WRONLY, 0666)) == -1)		return (dt_set_errno(dtp, errno));	(void) close(dtp->dt_ddefs_fd);	dtp->dt_ddefs_fd = fd;	return (0);}/*ARGSUSED*/static intdt_opt_debug(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	if (arg != NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	_dtrace_debug = 1;	return (0);}/*ARGSUSED*/static intdt_opt_iregs(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	int n;	if (arg == NULL || (n = atoi(arg)) <= 0)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	dtp->dt_conf.dtc_difintregs = n;	return (0);}/*ARGSUSED*/static intdt_opt_lazyload(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	dtp->dt_lazyload = 1;	return (0);}/*ARGSUSED*/static intdt_opt_ld_path(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	char *ld;	if (arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (dtp->dt_pcb != NULL)		return (dt_set_errno(dtp, EDT_BADOPTCTX));	if ((ld = strdup(arg)) == NULL)		return (dt_set_errno(dtp, EDT_NOMEM));	free(dtp->dt_ld_path);	dtp->dt_ld_path = ld;	return (0);}/*ARGSUSED*/static intdt_opt_libdir(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	dt_dirpath_t *dp;	if (arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if ((dp = malloc(sizeof (dt_dirpath_t))) == NULL ||	    (dp->dir_path = strdup(arg)) == NULL) {		free(dp);		return (dt_set_errno(dtp, EDT_NOMEM));	}	dt_list_append(&dtp->dt_lib_path, dp);	return (0);}/*ARGSUSED*/static intdt_opt_link(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	if (arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (strcmp(arg, "kernel") == 0)		dtp->dt_linkmode = DT_LINK_KERNEL;	else if (strcmp(arg, "primary") == 0)		dtp->dt_linkmode = DT_LINK_PRIMARY;	else if (strcmp(arg, "dynamic") == 0)		dtp->dt_linkmode = DT_LINK_DYNAMIC;	else if (strcmp(arg, "static") == 0)		dtp->dt_linkmode = DT_LINK_STATIC;	else		return (dt_set_errno(dtp, EDT_BADOPTVAL));	return (0);}/*ARGSUSED*/static intdt_opt_evaltime(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	if (arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (strcmp(arg, "exec") == 0)		dtp->dt_prcmode = DT_PROC_STOP_CREATE;	else if (strcmp(arg, "preinit") == 0)		dtp->dt_prcmode = DT_PROC_STOP_PREINIT;	else if (strcmp(arg, "postinit") == 0)		dtp->dt_prcmode = DT_PROC_STOP_POSTINIT;	else if (strcmp(arg, "main") == 0)		dtp->dt_prcmode = DT_PROC_STOP_MAIN;	else		return (dt_set_errno(dtp, EDT_BADOPTVAL));	return (0);}/*ARGSUSED*/static intdt_opt_pgmax(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	int n;	if (arg == NULL || (n = atoi(arg)) < 0)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	dtp->dt_procs->dph_lrulim = n;	return (0);}/*ARGSUSED*/static intdt_opt_stdc(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	if (arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (dtp->dt_pcb != NULL)		return (dt_set_errno(dtp, EDT_BADOPTCTX));	if (strcmp(arg, "a") == 0)		dtp->dt_stdcmode = DT_STDC_XA;	else if (strcmp(arg, "c") == 0)		dtp->dt_stdcmode = DT_STDC_XC;	else if (strcmp(arg, "s") == 0)		dtp->dt_stdcmode = DT_STDC_XS;	else if (strcmp(arg, "t") == 0)		dtp->dt_stdcmode = DT_STDC_XT;	else		return (dt_set_errno(dtp, EDT_BADOPTVAL));	return (0);}/*ARGSUSED*/static intdt_opt_tree(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	int m;	if (arg == NULL || (m = atoi(arg)) <= 0)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	dtp->dt_treedump = m;	return (0);}/*ARGSUSED*/static intdt_opt_tregs(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	int n;	if (arg == NULL || (n = atoi(arg)) <= 0)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	dtp->dt_conf.dtc_diftupregs = n;	return (0);}static intdt_opt_cflags(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	if (arg != NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (dtp->dt_pcb != NULL)		dtp->dt_pcb->pcb_cflags |= option;	else		dtp->dt_cflags |= option;	return (0);}static intdt_opt_invcflags(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	if (arg != NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (dtp->dt_pcb != NULL)		dtp->dt_pcb->pcb_cflags &= ~option;	else		dtp->dt_cflags &= ~option;	return (0);}/*ARGSUSED*/static intdt_opt_version(dtrace_hdl_t *dtp, const char *arg, uintptr_t option){	dt_version_t v;	if (arg == NULL)		return (dt_set_errno(dtp, EDT_BADOPTVAL));	if (dt_version_str2num(arg, &v) == -1)		return (dt_set_errno(dtp, EDT_VERSINVAL));	if (!dt_version_defined(v))		return (dt_set_errno(dtp, EDT_VERSUNDEF));	return (dt_reduce(dtp, v));

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?