dt_open.c

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

C
1,315
字号
 * to populate the dynamic "C" CTF type container. */static const dt_intrinsic_t _dtrace_intrinsics_64[] = {{ "void", { CTF_INT_SIGNED, 0, 0 }, CTF_K_INTEGER },{ "signed", { CTF_INT_SIGNED, 0, 32 }, CTF_K_INTEGER },{ "unsigned", { 0, 0, 32 }, CTF_K_INTEGER },{ "char", { CTF_INT_SIGNED | CTF_INT_CHAR, 0, 8 }, CTF_K_INTEGER },{ "short", { CTF_INT_SIGNED, 0, 16 }, CTF_K_INTEGER },{ "int", { CTF_INT_SIGNED, 0, 32 }, CTF_K_INTEGER },{ "long", { CTF_INT_SIGNED, 0, 64 }, CTF_K_INTEGER },{ "long long", { CTF_INT_SIGNED, 0, 64 }, CTF_K_INTEGER },{ "signed char", { CTF_INT_SIGNED | CTF_INT_CHAR, 0, 8 }, CTF_K_INTEGER },{ "signed short", { CTF_INT_SIGNED, 0, 16 }, CTF_K_INTEGER },{ "signed int", { CTF_INT_SIGNED, 0, 32 }, CTF_K_INTEGER },{ "signed long", { CTF_INT_SIGNED, 0, 64 }, CTF_K_INTEGER },{ "signed long long", { CTF_INT_SIGNED, 0, 64 }, CTF_K_INTEGER },{ "unsigned char", { CTF_INT_CHAR, 0, 8 }, CTF_K_INTEGER },{ "unsigned short", { 0, 0, 16 }, CTF_K_INTEGER },{ "unsigned int", { 0, 0, 32 }, CTF_K_INTEGER },{ "unsigned long", { 0, 0, 64 }, CTF_K_INTEGER },{ "unsigned long long", { 0, 0, 64 }, CTF_K_INTEGER },{ "_Bool", { CTF_INT_BOOL, 0, 8 }, CTF_K_INTEGER },{ "float", { CTF_FP_SINGLE, 0, 32 }, CTF_K_FLOAT },{ "double", { CTF_FP_DOUBLE, 0, 64 }, CTF_K_FLOAT },{ "long double", { CTF_FP_LDOUBLE, 0, 128 }, CTF_K_FLOAT },{ "float imaginary", { CTF_FP_IMAGRY, 0, 32 }, CTF_K_FLOAT },{ "double imaginary", { CTF_FP_DIMAGRY, 0, 64 }, CTF_K_FLOAT },{ "long double imaginary", { CTF_FP_LDIMAGRY, 0, 128 }, CTF_K_FLOAT },{ "float complex", { CTF_FP_CPLX, 0, 64 }, CTF_K_FLOAT },{ "double complex", { CTF_FP_DCPLX, 0, 128 }, CTF_K_FLOAT },{ "long double complex", { CTF_FP_LDCPLX, 0, 256 }, CTF_K_FLOAT },{ NULL, { 0, 0, 0 }, 0 }};/* * Tables of ILP32 typedefs to use to populate the dynamic "D" CTF container. * These aliases ensure that D definitions can use typical <sys/types.h> names. */static const dt_typedef_t _dtrace_typedefs_32[] = {{ "char", "int8_t" },{ "short", "int16_t" },{ "int", "int32_t" },{ "long long", "int64_t" },{ "int", "intptr_t" },{ "int", "ssize_t" },{ "unsigned char", "uint8_t" },{ "unsigned short", "uint16_t" },{ "unsigned", "uint32_t" },{ "unsigned long long", "uint64_t" },{ "unsigned char", "uchar_t" },{ "unsigned short", "ushort_t" },{ "unsigned", "uint_t" },{ "unsigned long", "ulong_t" },{ "unsigned long long", "u_longlong_t" },{ "int", "ptrdiff_t" },{ "unsigned", "uintptr_t" },{ "unsigned", "size_t" },{ "long", "id_t" },{ "long", "pid_t" },{ NULL, NULL }};/* * Tables of LP64 typedefs to use to populate the dynamic "D" CTF container. * These aliases ensure that D definitions can use typical <sys/types.h> names. */static const dt_typedef_t _dtrace_typedefs_64[] = {{ "char", "int8_t" },{ "short", "int16_t" },{ "int", "int32_t" },{ "long", "int64_t" },{ "long", "intptr_t" },{ "long", "ssize_t" },{ "unsigned char", "uint8_t" },{ "unsigned short", "uint16_t" },{ "unsigned", "uint32_t" },{ "unsigned long", "uint64_t" },{ "unsigned char", "uchar_t" },{ "unsigned short", "ushort_t" },{ "unsigned", "uint_t" },{ "unsigned long", "ulong_t" },{ "unsigned long long", "u_longlong_t" },{ "long", "ptrdiff_t" },{ "unsigned long", "uintptr_t" },{ "unsigned long", "size_t" },{ "int", "id_t" },{ "int", "pid_t" },{ NULL, NULL }};/* * Tables of ILP32 integer type templates used to populate the dtp->dt_ints[] * cache when a new dtrace client open occurs.  Values are set by dtrace_open(). */static const dt_intdesc_t _dtrace_ints_32[] = {{ "int", NULL, CTF_ERR, 0x7fffffffULL },{ "unsigned int", NULL, CTF_ERR, 0xffffffffULL },{ "long", NULL, CTF_ERR, 0x7fffffffULL },{ "unsigned long", NULL, CTF_ERR, 0xffffffffULL },{ "long long", NULL, CTF_ERR, 0x7fffffffffffffffULL },{ "unsigned long long", NULL, CTF_ERR, 0xffffffffffffffffULL }};/* * Tables of LP64 integer type templates used to populate the dtp->dt_ints[] * cache when a new dtrace client open occurs.  Values are set by dtrace_open(). */static const dt_intdesc_t _dtrace_ints_64[] = {{ "int", NULL, CTF_ERR, 0x7fffffffULL },{ "unsigned int", NULL, CTF_ERR, 0xffffffffULL },{ "long", NULL, CTF_ERR, 0x7fffffffffffffffULL },{ "unsigned long", NULL, CTF_ERR, 0xffffffffffffffffULL },{ "long long", NULL, CTF_ERR, 0x7fffffffffffffffULL },{ "unsigned long long", NULL, CTF_ERR, 0xffffffffffffffffULL }};/* * Table of macro variable templates used to populate the macro identifier hash * when a new dtrace client open occurs.  Values are set by dtrace_update(). */static const dt_ident_t _dtrace_macros[] = {{ "egid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "euid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "gid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "pid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "pgid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "ppid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "projid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "sid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "taskid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "target", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ "uid", DT_IDENT_SCALAR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0 },{ NULL, 0, 0, 0, { 0, 0, 0 }, 0 }};/* * Hard-wired definition string to be compiled and cached every time a new * DTrace library handle is initialized.  This string should only be used to * contain definitions that should be present regardless of DTRACE_O_NOLIBS. */static const char _dtrace_hardwire[] = "\inline long NULL = 0; \n\#pragma D binding \"1.0\" NULL\n\";/* * Default DTrace configuration to use when opening libdtrace DTRACE_O_NODEV. * If DTRACE_O_NODEV is not set, we load the configuration from the kernel. * The use of CTF_MODEL_NATIVE is more subtle than it might appear: we are * relying on the fact that when running dtrace(1M), isaexec will invoke the * binary with the same bitness as the kernel, which is what we want by default * when generating our DIF.  The user can override the choice using oflags. */static const dtrace_conf_t _dtrace_conf = {	DIF_VERSION,		/* dtc_difversion */	DIF_DIR_NREGS,		/* dtc_difintregs */	DIF_DTR_NREGS,		/* dtc_diftupregs */	CTF_MODEL_NATIVE	/* dtc_ctfmodel */};const dtrace_attribute_t _dtrace_maxattr = {	DTRACE_STABILITY_MAX,	DTRACE_STABILITY_MAX,	DTRACE_CLASS_MAX};const dtrace_attribute_t _dtrace_defattr = {	DTRACE_STABILITY_STABLE,	DTRACE_STABILITY_STABLE,	DTRACE_CLASS_COMMON};const dtrace_attribute_t _dtrace_symattr = {	DTRACE_STABILITY_PRIVATE,	DTRACE_STABILITY_PRIVATE,	DTRACE_CLASS_UNKNOWN};const dtrace_attribute_t _dtrace_typattr = {	DTRACE_STABILITY_PRIVATE,	DTRACE_STABILITY_PRIVATE,	DTRACE_CLASS_UNKNOWN};const dtrace_attribute_t _dtrace_prvattr = {	DTRACE_STABILITY_PRIVATE,	DTRACE_STABILITY_PRIVATE,	DTRACE_CLASS_UNKNOWN};const char *_dtrace_defcpp = "/usr/ccs/lib/cpp"; /* default cpp(1) to invoke */const char *_dtrace_defld = "/usr/ccs/bin/ld";   /* default ld(1) to invoke */const char *_dtrace_libdir = "/usr/lib/dtrace"; /* default library directory */const char *_dtrace_moddir = "dtrace";		/* kernel module directory */int _dtrace_strbuckets = 211;	/* default number of hash buckets (prime) */int _dtrace_intbuckets = 256;	/* default number of integer buckets (Pof2) */uint_t _dtrace_strsize = 256;	/* default size of string intrinsic type */uint_t _dtrace_stkindent = 14;	/* default whitespace indent for stack/ustack */uint_t _dtrace_pidbuckets = 64; /* default number of pid hash buckets */uint_t _dtrace_pidlrulim = 8;	/* default number of pid handles to cache */int _dtrace_debug = 0;		/* debug messages enabled (off) */const char *const _dtrace_version = DT_VERS_STRING; /* API version string */int _dtrace_rdvers = RD_VERSION; /* rtld_db feature version */typedef struct dt_fdlist {	int *df_fds;		/* array of provider driver file descriptors */	uint_t df_ents;		/* number of valid elements in df_fds[] */	uint_t df_size;		/* size of df_fds[] */} dt_fdlist_t;#pragma init(_dtrace_init)void_dtrace_init(void){	_dtrace_debug = getenv("DTRACE_DEBUG") != NULL;	for (; _dtrace_rdvers > 0; _dtrace_rdvers--) {		if (rd_init(_dtrace_rdvers) == RD_OK)			break;	}}static dtrace_hdl_t *set_open_errno(dtrace_hdl_t *dtp, int *errp, int err){	if (dtp != NULL)		dtrace_close(dtp);	if (errp != NULL)		*errp = err;	return (NULL);}static voiddt_provmod_open(dt_provmod_t **provmod, dt_fdlist_t *dfp, const char *dirname,    const char *subdir, const char *isadir){	dt_provmod_t *prov;	char path[PATH_MAX];	struct dirent *dp, *ep;	DIR *dirp;	int fd;	if (isadir) {		(void) snprintf(path, sizeof (path), "%s/%s/%s",		    dirname, subdir, isadir);	} else {		(void) snprintf(path, sizeof (path), "%s/%s",		    dirname, subdir);	}	if ((dirp = opendir(path)) == NULL)		return; /* failed to open directory; just skip it */	ep = alloca(sizeof (struct dirent) + PATH_MAX + 1);	bzero(ep, sizeof (struct dirent) + PATH_MAX + 1);	while (readdir_r(dirp, ep, &dp) == 0 && dp != NULL) {		if (dp->d_name[0] == '.')			continue; /* skip "." and ".." */		if (dfp->df_ents == dfp->df_size) {			uint_t size = dfp->df_size ? dfp->df_size * 2 : 16;			int *fds = realloc(dfp->df_fds, size * sizeof (int));			if (fds == NULL)				break; /* skip the rest of this directory */			dfp->df_fds = fds;			dfp->df_size = size;		}		(void) snprintf(path, sizeof (path),		    "/devices/pseudo/%s@0:%s", dp->d_name, dp->d_name);		if ((fd = open(path, O_RDONLY)) == -1)			continue; /* failed to open driver; just skip it */		if (((prov = malloc(sizeof (dt_provmod_t))) == NULL) ||		    (prov->dp_name = malloc(strlen(dp->d_name) + 1)) == NULL) {			free(prov);			(void) close(fd);			break;		}		(void) strcpy(prov->dp_name, dp->d_name);		prov->dp_next = *provmod;		*provmod = prov;		dt_dprintf("opened provider %s\n", dp->d_name);		dfp->df_fds[dfp->df_ents++] = fd;	}	(void) closedir(dirp);}static voiddt_provmod_destroy(dt_provmod_t **provmod){	dt_provmod_t *next, *current;	for (current = *provmod; current != NULL; current = next) {		next = current->dp_next;		free(current->dp_name);		free(current);	}	*provmod = NULL;}static const char *dt_get_sysinfo(int cmd, char *buf, size_t len){	ssize_t rv = sysinfo(cmd, buf, len);	char *p = buf;	if (rv < 0 || rv > len)		(void) snprintf(buf, len, "%s", "Unknown");	while ((p = strchr(p, '.')) != NULL)		*p++ = '_';	return (buf);}static dtrace_hdl_t *dt_vopen(int version, int flags, int *errp,

⌨️ 快捷键说明

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