filter: don't use dlsym unnecessarily
We only need to hook write() if Lua filter's are in use. If support has been disabled, remove the dependency on dlsym(). Signed-off-by: John Keeping <john@keeping.me.uk>
Этот коммит содержится в:
родитель
7105a78b17
Коммит
0c4d76755b
78
filter.c
78
filter.c
@ -8,17 +8,13 @@
|
||||
|
||||
#include "cgit.h"
|
||||
#include "html.h"
|
||||
#include <dlfcn.h>
|
||||
#ifndef NO_LUA
|
||||
#include <dlfcn.h>
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
#endif
|
||||
|
||||
static ssize_t (*libc_write)(int fd, const void *buf, size_t count);
|
||||
static ssize_t (*filter_write)(struct cgit_filter *base, const void *buf, size_t count) = NULL;
|
||||
static struct cgit_filter *current_write_filter = NULL;
|
||||
|
||||
static inline void reap_filter(struct cgit_filter *filter)
|
||||
{
|
||||
if (filter && filter->cleanup)
|
||||
@ -43,37 +39,6 @@ void cgit_cleanup_filters(void)
|
||||
}
|
||||
}
|
||||
|
||||
void cgit_init_filters(void)
|
||||
{
|
||||
libc_write = dlsym(RTLD_NEXT, "write");
|
||||
if (!libc_write)
|
||||
die("Could not locate libc's write function");
|
||||
}
|
||||
|
||||
ssize_t write(int fd, const void *buf, size_t count)
|
||||
{
|
||||
if (fd != STDOUT_FILENO || !filter_write)
|
||||
return libc_write(fd, buf, count);
|
||||
return filter_write(current_write_filter, buf, count);
|
||||
}
|
||||
|
||||
static inline void hook_write(struct cgit_filter *filter, ssize_t (*new_write)(struct cgit_filter *base, const void *buf, size_t count))
|
||||
{
|
||||
/* We want to avoid buggy nested patterns. */
|
||||
assert(filter_write == NULL);
|
||||
assert(current_write_filter == NULL);
|
||||
current_write_filter = filter;
|
||||
filter_write = new_write;
|
||||
}
|
||||
|
||||
static inline void unhook_write(void)
|
||||
{
|
||||
assert(filter_write != NULL);
|
||||
assert(current_write_filter != NULL);
|
||||
filter_write = NULL;
|
||||
current_write_filter = NULL;
|
||||
}
|
||||
|
||||
static int open_exec_filter(struct cgit_filter *base, va_list ap)
|
||||
{
|
||||
struct cgit_exec_filter *filter = (struct cgit_exec_filter *)base;
|
||||
@ -170,7 +135,48 @@ void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **ar
|
||||
filter->base.argument_count = 0;
|
||||
}
|
||||
|
||||
#ifdef NO_LUA
|
||||
void cgit_init_filters(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef NO_LUA
|
||||
static ssize_t (*libc_write)(int fd, const void *buf, size_t count);
|
||||
static ssize_t (*filter_write)(struct cgit_filter *base, const void *buf, size_t count) = NULL;
|
||||
static struct cgit_filter *current_write_filter = NULL;
|
||||
|
||||
void cgit_init_filters(void)
|
||||
{
|
||||
libc_write = dlsym(RTLD_NEXT, "write");
|
||||
if (!libc_write)
|
||||
die("Could not locate libc's write function");
|
||||
}
|
||||
|
||||
ssize_t write(int fd, const void *buf, size_t count)
|
||||
{
|
||||
if (fd != STDOUT_FILENO || !filter_write)
|
||||
return libc_write(fd, buf, count);
|
||||
return filter_write(current_write_filter, buf, count);
|
||||
}
|
||||
|
||||
static inline void hook_write(struct cgit_filter *filter, ssize_t (*new_write)(struct cgit_filter *base, const void *buf, size_t count))
|
||||
{
|
||||
/* We want to avoid buggy nested patterns. */
|
||||
assert(filter_write == NULL);
|
||||
assert(current_write_filter == NULL);
|
||||
current_write_filter = filter;
|
||||
filter_write = new_write;
|
||||
}
|
||||
|
||||
static inline void unhook_write(void)
|
||||
{
|
||||
assert(filter_write != NULL);
|
||||
assert(current_write_filter != NULL);
|
||||
filter_write = NULL;
|
||||
current_write_filter = NULL;
|
||||
}
|
||||
|
||||
struct lua_filter {
|
||||
struct cgit_filter base;
|
||||
char *script_file;
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user