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 + -
显示快捷键?