Author: iratqq
Date: Sun Dec 30 07:06:27 2007
New Revision: 5073
Modified:
trunk/uim/uim-notify.c
Log:
* uim/uim-notify.c
- (uim_notify_load): Plug handle leak.
- (uim_notify_load_stderr): New function.
Modified: trunk/uim/uim-notify.c
==============================================================================
--- trunk/uim/uim-notify.c (original)
+++ trunk/uim/uim-notify.c Sun Dec 30 07:06:27 2007
@@ -67,55 +67,71 @@
static int (*uim_notify_info_func)(const char *, va_list) =
uim_notify_stderr_info;
static int (*uim_notify_fatal_func)(const char *, va_list) =
uim_notify_stderr_fatal;
+static void *notify_dlhandle = NULL;
static char notify_agent_name[PATH_MAX];
+static void
+uim_notify_load_stderr()
+{
+ strlcpy(notify_agent_name, "stderr", sizeof(notify_agent_name));
+ uim_notify_init_func = uim_notify_stderr_init;
+ uim_notify_quit_func = uim_notify_stderr_quit;
+ uim_notify_info_func = uim_notify_stderr_info;
+ uim_notify_fatal_func = uim_notify_stderr_fatal;
+ notify_dlhandle = NULL;
+}
+
int
uim_notify_load(const char *name)
{
if (uim_notify_quit_func == NULL) {
fprintf(stderr, "uim-notify: notify module is not loaded\n");
+ uim_notify_load_stderr();
return 0;
}
uim_notify_quit_func();
+ if (notify_dlhandle != NULL)
+ dlclose(notify_dlhandle);
if (strcmp(name, "stderr") == 0) {
- uim_notify_init_func = uim_notify_stderr_init;
- uim_notify_quit_func = uim_notify_stderr_quit;
- uim_notify_info_func = uim_notify_stderr_info;
- uim_notify_fatal_func = uim_notify_stderr_fatal;
+ uim_notify_load_stderr();
} else if (strcmp(notify_agent_name, name) == 0) {
return 1;
} else {
- void *handle;
char path[PATH_MAX];
const char *str;
snprintf(path, sizeof(path), "%s/%s%s%s", NOTIFY_PLUGIN_PATH,
NOTIFY_PLUGIN_PREFIX, name, NOTIFY_PLUGIN_SUFFIX);
- handle = dlopen(path, RTLD_NOW);
+ notify_dlhandle = dlopen(path, RTLD_NOW);
if ((str = dlerror()) != NULL) {
fprintf(stderr, "uim-notify: load failed %s(%s)\n", path, str);
+ uim_notify_load_stderr();
return 0;
}
- uim_notify_init_func = (int (*)(void))(intptr_t)dlfunc(handle,
"uim_notify_init");
+ uim_notify_init_func = (int (*)(void))(intptr_t)dlfunc(notify_dlhandle,
"uim_notify_init");
if (!uim_notify_init_func) {
fprintf(stderr, "uim-notify: cannot found 'uim_notify_init()'
in %s\n", path);
+ uim_notify_load_stderr();
return 0;
}
- uim_notify_quit_func = (void (*)(void))(intptr_t)dlfunc(handle,
"uim_notify_quit");
+ uim_notify_quit_func = (void (*)(void))(intptr_t)dlfunc(notify_dlhandle,
"uim_notify_quit");
if (!uim_notify_quit_func) {
fprintf(stderr, "uim-notify: cannot found 'uim_notify_quit()'
in %s\n", path);
+ uim_notify_load_stderr();
return 0;
}
- uim_notify_info_func = (int (*)(const char *, va_list))(intptr_t)dlfunc(handle,
"uim_notify_info");
+ uim_notify_info_func = (int (*)(const char *,
va_list))(intptr_t)dlfunc(notify_dlhandle, "uim_notify_info");
if (!uim_notify_info_func) {
fprintf(stderr, "uim-notify: cannot found 'uim_notify_info()'
in %s\n", path);
+ uim_notify_load_stderr();
return 0;
}
- uim_notify_fatal_func = (int (*)(const char *, va_list))(intptr_t)dlfunc(handle,
"uim_notify_fatal");
+ uim_notify_fatal_func = (int (*)(const char *,
va_list))(intptr_t)dlfunc(notify_dlhandle, "uim_notify_fatal");
if (!uim_notify_fatal_func) {
fprintf(stderr, "uim-notify: cannot found 'uim_notify_fatal()'
in %s\n", path);
+ uim_notify_load_stderr();
return 0;
}