diff options
| -rw-r--r-- | filter.c | 78 | 
1 files changed, 42 insertions, 36 deletions
| @@ -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; | 
