diff --git a/server/core/filter.c b/server/core/filter.c index aef124331..837e204c9 100644 --- a/server/core/filter.c +++ b/server/core/filter.c @@ -304,6 +304,40 @@ int i; spinlock_release(&filter->spin); } +/** + * Load a filter module for use and create an instance of it for a service. + * @param filter Filter definition + * @return True if module was successfully loaded, false if an error occurred + */ +bool filter_load(FILTER_DEF* filter) +{ + bool rval = false; + if (filter) + { + if (filter->obj == NULL) + { + /* Filter not yet loaded */ + if ((filter->obj = load_module(filter->module, MODULE_FILTER)) == NULL) + { + MXS_ERROR("Failed to load filter module '%s'.", filter->module); + return false; + } + } + + if ((filter->filter = (filter->obj->createInstance)(filter->options, + filter->parameters))) + { + rval = true; + } + else + { + MXS_ERROR("Failed to create filter '%s' instance.", filter->name); + } + + } + return rval; +} + /** * Connect the downstream filter chain for a filter. * @@ -319,29 +353,8 @@ int i; DOWNSTREAM * filterApply(FILTER_DEF *filter, SESSION *session, DOWNSTREAM *downstream) { -DOWNSTREAM *me; + DOWNSTREAM *me; - if (filter == NULL) - return NULL; - - if (filter->obj == NULL) - { - /* Filter not yet loaded */ - if ((filter->obj = load_module(filter->module, - MODULE_FILTER)) == NULL) - { - return NULL; - } - } - - if (filter->filter == NULL) - { - if ((filter->filter = (filter->obj->createInstance)(filter->options, - filter->parameters)) == NULL) - { - return NULL; - } - } if ((me = (DOWNSTREAM *)calloc(1, sizeof(DOWNSTREAM))) == NULL) { char errbuf[STRERROR_BUFLEN]; diff --git a/server/core/service.c b/server/core/service.c index e22484c99..4f2453a90 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -1092,12 +1092,19 @@ int n = 0; MXS_ERROR("Out of memory adding filters to service."); return; } - if ((flist[n-1] = filter_find(trim(ptr))) == NULL) + char *filter_name = trim(ptr); + if ((flist[n-1] = filter_find(filter_name)) == NULL) { MXS_WARNING("Unable to find filter '%s' for service '%s'\n", - trim(ptr), service->name); + filter_name, service->name); n--; } + else if (!filter_load(flist[n - 1])) + { + MXS_ERROR("Failed to load filter '%s' for service '%s'.", + filter_name, service->name); + } + flist[n] = NULL; ptr = strtok_r(NULL, "|", &brkt); } diff --git a/server/include/filter.h b/server/include/filter.h index ad0b9a21a..853e1628c 100644 --- a/server/include/filter.h +++ b/server/include/filter.h @@ -107,6 +107,7 @@ typedef struct filter_def { FILTER_DEF *filter_alloc(char *, char *); void filter_free(FILTER_DEF *); +bool filter_load(FILTER_DEF* filter); FILTER_DEF *filter_find(char *); void filterAddOption(FILTER_DEF *, char *); void filterAddParameter(FILTER_DEF *, char *, char *);