move sigar_dlinfo_modules to util for use with FreeBSD
This commit is contained in:
parent
51a205920f
commit
3cf07fbb30
|
@ -143,6 +143,15 @@ int sigar_cpu_mhz_from_model(char *model);
|
||||||
|
|
||||||
char *sigar_get_self_path(sigar_t *sigar);
|
char *sigar_get_self_path(sigar_t *sigar);
|
||||||
|
|
||||||
|
#if defined(__sun) || defined(__FreeBSD__)
|
||||||
|
|
||||||
|
#define SIGAR_HAS_DLINFO_MODULES
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <link.h>
|
||||||
|
|
||||||
|
int sigar_dlinfo_modules(sigar_t *sigar, sigar_proc_modules_t *procmods);
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct sigar_cache_entry_t sigar_cache_entry_t;
|
typedef struct sigar_cache_entry_t sigar_cache_entry_t;
|
||||||
|
|
||||||
struct sigar_cache_entry_t {
|
struct sigar_cache_entry_t {
|
||||||
|
|
|
@ -1690,6 +1690,11 @@ int sigar_proc_exe_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
int sigar_proc_modules_get(sigar_t *sigar, sigar_pid_t pid,
|
int sigar_proc_modules_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
sigar_proc_modules_t *procmods)
|
sigar_proc_modules_t *procmods)
|
||||||
{
|
{
|
||||||
|
#ifdef SIGAR_HAS_DLINFO_MODULES
|
||||||
|
if (pid == sigar_pid_get(sigar)) {
|
||||||
|
return sigar_dlinfo_modules(sigar, procmods);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return SIGAR_ENOTIMPL;
|
return SIGAR_ENOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -626,37 +626,6 @@ static int sigar_pgrab(sigar_t *sigar, sigar_pid_t pid,
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sigar_dlinfo_get(sigar_t *sigar, const char *func,
|
|
||||||
void **handle, Link_map **map)
|
|
||||||
{
|
|
||||||
Dl_info dli;
|
|
||||||
|
|
||||||
if (!dladdr((void *)((uintptr_t)sigar_dlinfo_get), &dli)) {
|
|
||||||
sigar_log_printf(sigar, SIGAR_LOG_ERROR,
|
|
||||||
"[%s] dladdr(%s) = %s",
|
|
||||||
func, SIGAR_FUNC, dlerror());
|
|
||||||
return ESRCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(*handle = dlopen(dli.dli_fname, RTLD_LAZY))) {
|
|
||||||
sigar_log_printf(sigar, SIGAR_LOG_ERROR,
|
|
||||||
"[%s] dlopen(%s) = %s",
|
|
||||||
func, dli.dli_fname, dlerror());
|
|
||||||
return ESRCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
dlinfo(*handle, RTLD_DI_LINKMAP, map);
|
|
||||||
|
|
||||||
if (!map) {
|
|
||||||
sigar_log_printf(sigar, SIGAR_LOG_ERROR,
|
|
||||||
"[%s] dlinfo = %s",
|
|
||||||
func, dlerror());
|
|
||||||
return ESRCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SIGAR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sigar_os_proc_list_get(sigar_t *sigar,
|
int sigar_os_proc_list_get(sigar_t *sigar,
|
||||||
sigar_proc_list_t *proclist)
|
sigar_proc_list_t *proclist)
|
||||||
{
|
{
|
||||||
|
@ -1238,33 +1207,6 @@ static int sigar_pgrab_modules(sigar_t *sigar, sigar_pid_t pid,
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sigar_dlinfo_modules(sigar_t *sigar, sigar_proc_modules_t *procmods)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
void *handle;
|
|
||||||
Link_map *map;
|
|
||||||
|
|
||||||
status = sigar_dlinfo_get(sigar, SIGAR_FUNC, &handle, &map);
|
|
||||||
if (status != SIGAR_OK) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
int status =
|
|
||||||
procmods->module_getter(procmods->data,
|
|
||||||
map->l_name, strlen(map->l_name));
|
|
||||||
|
|
||||||
if (status != SIGAR_OK) {
|
|
||||||
/* not an error; just stop iterating */
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
} while ((map = map->l_next));
|
|
||||||
|
|
||||||
dlclose(handle);
|
|
||||||
|
|
||||||
return SIGAR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sigar_proc_modules_get(sigar_t *sigar, sigar_pid_t pid,
|
int sigar_proc_modules_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
sigar_proc_modules_t *procmods)
|
sigar_proc_modules_t *procmods)
|
||||||
{
|
{
|
||||||
|
|
|
@ -782,6 +782,68 @@ char *sigar_get_self_path(sigar_t *sigar)
|
||||||
return sigar->self_path;
|
return sigar->self_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SIGAR_HAS_DLINFO_MODULES
|
||||||
|
|
||||||
|
static int sigar_dlinfo_get(sigar_t *sigar, const char *func,
|
||||||
|
void **handle, Link_map **map)
|
||||||
|
{
|
||||||
|
Dl_info dli;
|
||||||
|
|
||||||
|
if (!dladdr((void *)((uintptr_t)sigar_dlinfo_get), &dli)) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_ERROR,
|
||||||
|
"[%s] dladdr(%s) = %s",
|
||||||
|
func, SIGAR_FUNC, dlerror());
|
||||||
|
return ESRCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(*handle = dlopen(dli.dli_fname, RTLD_LAZY))) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_ERROR,
|
||||||
|
"[%s] dlopen(%s) = %s",
|
||||||
|
func, dli.dli_fname, dlerror());
|
||||||
|
return ESRCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
dlinfo(*handle, RTLD_DI_LINKMAP, map);
|
||||||
|
|
||||||
|
if (!map) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_ERROR,
|
||||||
|
"[%s] dlinfo = %s",
|
||||||
|
func, dlerror());
|
||||||
|
return ESRCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sigar_dlinfo_modules(sigar_t *sigar, sigar_proc_modules_t *procmods)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
void *handle;
|
||||||
|
Link_map *map;
|
||||||
|
|
||||||
|
status = sigar_dlinfo_get(sigar, SIGAR_FUNC, &handle, &map);
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
int status =
|
||||||
|
procmods->module_getter(procmods->data,
|
||||||
|
(char *)map->l_name,
|
||||||
|
strlen(map->l_name));
|
||||||
|
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
/* not an error; just stop iterating */
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
} while ((map = map->l_next));
|
||||||
|
|
||||||
|
dlclose(handle);
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
SIGAR_DECLARE(void) sigar_log_printf(sigar_t *sigar, int level,
|
SIGAR_DECLARE(void) sigar_log_printf(sigar_t *sigar, int level,
|
||||||
const char *format, ...)
|
const char *format, ...)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue