Skip to content

Commit

Permalink
Moved the common calls to plugin->opensub out of the plugins.
Browse files Browse the repository at this point in the history
  • Loading branch information
bruceg committed Nov 19, 2006
1 parent bbac638 commit b4ce701
Show file tree
Hide file tree
Showing 4 changed files with 248 additions and 351 deletions.
200 changes: 127 additions & 73 deletions lib/initsub.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,82 +3,156 @@
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "case.h"
#include "die.h"
#include "errtxt.h"
#include "str.h"
#include "strerr.h"
#include "sub_std.h"
#include "subscribe.h"
#include "auto_lib.h"

checktag_fn checktag = 0;
closesub_fn closesub = 0;
issub_fn issub = 0;
logmsg_fn logmsg = 0;
putsubs_fn putsubs = 0;
tagmsg_fn tagmsg = 0;
searchlog_fn searchlog = 0;
subscribe_fn subscribe = 0;

static const char *no_logmsg(void) { return 0; }

static void no_closesub(void) { }

static const char *wrap_checktag(const char *dir,
unsigned long msgnum,
unsigned long listno,
const char *action,
const char *seed,
const char *hash)
static stralloc path = {0};
static struct sub_plugin *plugin = 0;

const char *checktag(const char *dir,
unsigned long msgnum,
unsigned long listno,
const char *action,
const char *seed,
const char *hash)
{
return std_checktag(msgnum,action,seed,hash);
(void)dir;
(void)listno;
const char *r = 0;
if (!plugin || (r = plugin->opensub(dir,0)) != 0) {
if (r && *r)
return r;
return std_checktag(msgnum,action,seed,hash);
}
return plugin->checktag(dir,msgnum,listno,action,seed,hash);
}

void closesub(void) {
if (plugin != 0)
plugin->closesub();
}

static unsigned long wrap_putsubs(const char *dir,
const char *subdir,
unsigned long hash_lo,
unsigned long hash_hi,
int subwrite(),
int flagsql)
const char *issub(const char *dir,
const char *subdir,
const char *userhost)
{
return std_putsubs(dir,subdir,hash_lo,hash_hi,subwrite);
(void)flagsql;
const char *r = 0;
if (!plugin || (r = plugin->opensub(dir,subdir)) != 0) {
if (r && *r)
strerr_die2x(111,FATAL,r);
return std_issub(dir,subdir,userhost);
}
return plugin->issub(dir,subdir,userhost);
}

static void wrap_tagmsg(const char *dir,
unsigned long msgnum,
const char *seed,
const char *action,
char *hashout,
unsigned long bodysize,
unsigned long chunk)
const char *logmsg(const char *dir,
unsigned long num,
unsigned long listno,
unsigned long subs,
int done)
{
std_tagmsg(msgnum,seed,action,hashout);
(void)dir;
(void)bodysize;
(void)chunk;
const char *r = 0;
if (!plugin || (r = plugin->opensub(dir,0)) != 0) {
if (r && *r)
return r;
return 0;
}
return plugin->logmsg(dir,num,listno,subs,done);
}

unsigned long putsubs(const char *dir,
const char *subdir,
unsigned long hash_lo,
unsigned long hash_hi,
int subwrite(),
int flagsql)
{
const char *r = 0;
if (!plugin || !flagsql || (r = plugin->opensub(dir,subdir)) != 0) {
if (r && *r)
strerr_die2x(111,FATAL,r);
return std_putsubs(dir,subdir,hash_lo,hash_hi,subwrite);
}
return plugin->putsubs(dir,subdir,hash_lo,hash_hi,subwrite);
}

void searchlog(const char *dir,
const char *subdir,
char *search,
int subwrite())
{
unsigned char *cps;
unsigned char ch;
unsigned int searchlen;
const char *r = 0;

if (!search) search = (char*)""; /* defensive */
searchlen = str_len(search);
case_lowerb(search,searchlen);
cps = (unsigned char *) search;
while ((ch = *(cps++))) { /* search is potentially hostile */
if (ch >= 'a' && ch <= 'z') continue;
if (ch >= '0' && ch <= '9') continue;
if (ch == '.' || ch == '_') continue;
*(cps - 1) = '_'; /* will match char specified as well */
}

if (!plugin || (r = plugin->opensub(dir,subdir)) != 0) {
if (r && *r)
strerr_die2x(111,FATAL,r);
return std_searchlog(dir,subdir,search,subwrite);
}
return plugin->searchlog(dir,subdir,search,subwrite);
}

static int wrap_subscribe(const char *dir,
const char *subdir,
const char *username,
int flagadd,
const char *from,
const char *event,
int flagmysql,
int forcehash)
int subscribe(const char *dir,
const char *subdir,
const char *userhost,
int flagadd,
const char *comment,
const char *event,
int flagsql,
int forcehash)
{
return std_subscribe(dir,subdir,username,flagadd,from,event,forcehash);
(void)flagmysql;
const char *r = 0;

if (userhost[str_chr(userhost,'\n')])
strerr_die2x(100,FATAL,ERR_ADDR_NL);

if (!plugin || !flagsql || (r = plugin->opensub(dir,subdir)) != 0) {
if (r && *r)
strerr_die2x(111,FATAL,r);
return std_subscribe(dir,subdir,userhost,flagadd,comment,event,forcehash);
}
return plugin->subscribe(dir,subdir,userhost,flagadd,comment,event,forcehash);
}

static stralloc path;
void tagmsg(const char *dir,
unsigned long msgnum,
const char *seed,
const char *action,
char *hashout,
unsigned long bodysize,
unsigned long chunk)
{
const char *r = 0;
std_tagmsg(msgnum,seed,action,hashout);
if (!plugin || (r = plugin->opensub(dir,0)) != 0) {
if (r && *r)
strerr_die2x(111,FATAL,r);
return;
}
return plugin->tagmsg(dir,msgnum,seed,action,hashout,bodysize,chunk);
}

void initsub(const char *dir)
{
struct stat st;
void *handle;
struct sub_plugin *plugin;

std_makepath(&path,dir,0,"/sql",0);
if (stat(path.s,&st) == 0) {
Expand All @@ -87,25 +161,5 @@ void initsub(const char *dir)
strerr_die3x(111,FATAL,"Could not load SQL plugin: ",dlerror());
else if ((plugin = dlsym(handle,"sub_plugin")) == 0)
strerr_die3x(111,FATAL,"SQL plugin is missing symbols: ",dlerror());
else {
checktag = plugin->checktag;
closesub = plugin->closesub;
issub = plugin->issub;
logmsg = plugin->logmsg;
putsubs = plugin->putsubs;
tagmsg = plugin->tagmsg;
searchlog = plugin->searchlog;
subscribe = plugin->subscribe;
}
}
else {
checktag = wrap_checktag;
closesub = no_closesub;
issub = std_issub;
logmsg = (logmsg_fn)no_logmsg;
putsubs = wrap_putsubs;
tagmsg = wrap_tagmsg;
searchlog = std_searchlog;
subscribe = wrap_subscribe;
}
}
Loading

0 comments on commit b4ce701

Please sign in to comment.