parent
f6ab7d952e
commit
a0d07f5c79
7 changed files with 343 additions and 11 deletions
@ -1,2 +1,2 @@ |
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
SUBDIRS = bin modules
|
||||
SUBDIRS = bin modules preload
|
||||
|
@ -0,0 +1,227 @@ |
||||
#include "config.h" |
||||
#include "e_precache.h" |
||||
|
||||
|
||||
static void *lib_evas = NULL; |
||||
static void *lib_ecore_file = NULL; |
||||
static void *lib_eet = NULL; |
||||
|
||||
static int *e_precache_end = 0; |
||||
|
||||
/* internal calls */ |
||||
static int log_fd = -1; |
||||
static int do_log = 0; |
||||
|
||||
static void |
||||
log_open(void) |
||||
{ |
||||
char buf[4096], *home; |
||||
|
||||
if (log_fd != -1) return; |
||||
#ifdef HAVE_UNSETENV |
||||
unsetenv("LD_PRELOAD"); |
||||
#else |
||||
if (getenv("LD_PRELOAD")) putenv("LD_PRELOAD"); |
||||
#endif |
||||
home = getenv("HOME"); |
||||
if (home) |
||||
snprintf(buf, sizeof(buf), "%s/.e-precache", home); |
||||
else |
||||
snprintf(buf, sizeof(buf), "/tmp/.e-precache"); |
||||
log_fd = open(buf, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR|S_IWUSR); |
||||
do_log = 1; |
||||
e_precache_end = dlsym(NULL, "e_precache_end"); |
||||
} |
||||
|
||||
static void |
||||
log_close(void) |
||||
{ |
||||
close(log_fd); |
||||
do_log = 0; |
||||
} |
||||
|
||||
static void |
||||
log_write(const char *type, const char *file) |
||||
{ |
||||
static Evas_Hash *s_hash = NULL; |
||||
static Evas_Hash *o_hash = NULL; |
||||
static Evas_Hash *d_hash = NULL; |
||||
char buf[2]; |
||||
|
||||
if ((*e_precache_end) && (*e_precache_end)) |
||||
{ |
||||
log_close(); |
||||
return; |
||||
} |
||||
if (type[0] == 's') |
||||
{ |
||||
if (evas_hash_find(s_hash, file)) return; |
||||
s_hash = evas_hash_add(s_hash, file, (void *)1); |
||||
} |
||||
else if (type[0] == 'o') |
||||
{ |
||||
if (evas_hash_find(o_hash, file)) return; |
||||
o_hash = evas_hash_add(o_hash, file, (void *)1); |
||||
} |
||||
else if (type[0] == 'd') |
||||
{ |
||||
if (evas_hash_find(d_hash, file)) return; |
||||
d_hash = evas_hash_add(d_hash, file, (void *)1); |
||||
}
|
||||
buf[0] = type[0]; buf[1] = ' '; |
||||
write(log_fd, buf, 2); |
||||
write(log_fd, file, strlen(file)); |
||||
write(log_fd, "\n", 1); |
||||
} |
||||
|
||||
|
||||
/* intercepts */ |
||||
void |
||||
evas_object_image_file_set(Evas_Object *obj, const char *file, const char *key) |
||||
{ |
||||
static void (*func) (Evas_Object *obj, const char *file, const char *key) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_evas) |
||||
lib_evas = dlopen("libevas.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_evas, "evas_object_image_file_set"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("o", file); |
||||
(*func) (obj, file, key); |
||||
} |
||||
|
||||
time_t |
||||
ecore_file_mod_time(const char *file) |
||||
{ |
||||
static time_t (*func) (const char *file) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_ecore_file) |
||||
lib_ecore_file = dlopen("libecore_file.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_ecore_file, "ecore_file_mod_time"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("s", file); |
||||
return (*func) (file); |
||||
} |
||||
|
||||
int |
||||
ecore_file_size(const char *file) |
||||
{ |
||||
static int (*func) (const char *file) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_ecore_file) |
||||
lib_ecore_file = dlopen("libecore_file.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_ecore_file, "ecore_file_size"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("s", file); |
||||
return (*func) (file); |
||||
} |
||||
|
||||
int |
||||
ecore_file_exists(const char *file) |
||||
{ |
||||
static int (*func) (const char *file) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_ecore_file) |
||||
lib_ecore_file = dlopen("libecore_file.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_ecore_file, "ecore_file_exists"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("s", file); |
||||
return (*func) (file); |
||||
} |
||||
|
||||
int |
||||
ecore_file_is_dir(const char *file) |
||||
{ |
||||
static int (*func) (const char *file) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_ecore_file) |
||||
lib_ecore_file = dlopen("libecore_file.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_ecore_file, "ecore_file_is_dir"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("s", file); |
||||
return (*func) (file); |
||||
} |
||||
|
||||
int |
||||
ecore_file_can_read(const char *file) |
||||
{ |
||||
static int (*func) (const char *file) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_ecore_file) |
||||
lib_ecore_file = dlopen("libecore_file.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_ecore_file, "ecore_file_can_read"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("s", file); |
||||
return (*func) (file); |
||||
} |
||||
|
||||
int |
||||
ecore_file_can_write(const char *file) |
||||
{ |
||||
static int (*func) (const char *file) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_ecore_file) |
||||
lib_ecore_file = dlopen("libecore_file.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_ecore_file, "ecore_file_can_write"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("s", file); |
||||
return (*func) (file); |
||||
} |
||||
|
||||
int |
||||
ecore_file_can_exec(const char *file) |
||||
{ |
||||
static int (*func) (const char *file) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_ecore_file) |
||||
lib_ecore_file = dlopen("libecore_file.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_ecore_file, "ecore_file_can_exec"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("s", file); |
||||
return (*func) (file); |
||||
} |
||||
|
||||
Ecore_List * |
||||
ecore_file_ls(const char *file) |
||||
{ |
||||
static Ecore_List * (*func) (const char *file) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_ecore_file) |
||||
lib_ecore_file = dlopen("libecore_file.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_ecore_file, "ecore_file_ls"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("d", file); |
||||
return (*func) (file); |
||||
} |
||||
|
||||
Eet_File * |
||||
eet_open(const char *file, Eet_File_Mode mode) |
||||
{ |
||||
static Eet_File * (*func) (const char *file, Eet_File_Mode mode) = NULL; |
||||
if (!func) |
||||
{ |
||||
if (!lib_eet) |
||||
lib_eet = dlopen("libeet.so", RTLD_GLOBAL | RTLD_LAZY); |
||||
func = dlsym(lib_eet, "eet_open"); |
||||
log_open(); |
||||
} |
||||
if (do_log) log_write("o", file); |
||||
return (*func) (file, mode); |
||||
} |
@ -0,0 +1,17 @@ |
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <stdarg.h> |
||||
#include <string.h> |
||||
#include <dlfcn.h> |
||||
#include <unistd.h> |
||||
#include <sys/types.h> |
||||
#include <sys/stat.h> |
||||
#include <sys/utsname.h> |
||||
#include <fcntl.h> |
||||
#ifdef HAVE_ALLOCA_H |
||||
#include <alloca.h> |
||||
#endif |
||||
#include <Evas.h> |
||||
#include <Ecore.h> |
||||
#include <Ecore_File.h> |
||||
#include <Eet.h> |
Loading…
Reference in new issue