Migrate all enumerators to venumerate() interface change
This commit is contained in:
@@ -214,9 +214,11 @@ typedef struct {
|
||||
} array_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, enumerate, bool,
|
||||
array_enumerator_t *this, void **out)
|
||||
array_enumerator_t *this, va_list args)
|
||||
{
|
||||
void *pos;
|
||||
void *pos, **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
if (this->idx >= this->array->count)
|
||||
{
|
||||
@@ -250,7 +252,8 @@ enumerator_t* array_create_enumerator(array_t *array)
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate,
|
||||
.destroy = (void*)free,
|
||||
},
|
||||
.array = array,
|
||||
|
||||
@@ -50,22 +50,24 @@ bool enumerator_enumerate_default(enumerator_t *enumerator, ...)
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_empty().enumerate
|
||||
*/
|
||||
static bool enumerate_empty(enumerator_t *enumerator, ...)
|
||||
METHOD(enumerator_t, enumerate_empty, bool,
|
||||
enumerator_t *enumerator, va_list args)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* See header
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
enumerator_t* enumerator_create_empty()
|
||||
{
|
||||
enumerator_t *this = malloc_thing(enumerator_t);
|
||||
this->enumerate = enumerate_empty;
|
||||
this->destroy = (void*)free;
|
||||
enumerator_t *this;
|
||||
|
||||
INIT(this,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_empty,
|
||||
.destroy = (void*)free,
|
||||
);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -83,32 +85,31 @@ typedef struct {
|
||||
char *full_end;
|
||||
} dir_enum_t;
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_directory().destroy
|
||||
*/
|
||||
static void destroy_dir_enum(dir_enum_t *this)
|
||||
METHOD(enumerator_t, destroy_dir_enum, void,
|
||||
dir_enum_t *this)
|
||||
{
|
||||
closedir(this->dir);
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_directory().enumerate
|
||||
*/
|
||||
static bool enumerate_dir_enum(dir_enum_t *this, char **relative,
|
||||
char **absolute, struct stat *st)
|
||||
METHOD(enumerator_t, enumerate_dir_enum, bool,
|
||||
dir_enum_t *this, va_list args)
|
||||
{
|
||||
struct dirent *entry = readdir(this->dir);
|
||||
struct stat *st;
|
||||
size_t remaining;
|
||||
char **relative, **absolute;
|
||||
int len;
|
||||
|
||||
VA_ARGS_VGET(args, relative, absolute, st);
|
||||
|
||||
if (!entry)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (streq(entry->d_name, ".") || streq(entry->d_name, ".."))
|
||||
{
|
||||
return enumerate_dir_enum(this, relative, absolute, st);
|
||||
return this->public.enumerate(&this->public, relative, absolute, st);
|
||||
}
|
||||
if (relative)
|
||||
{
|
||||
@@ -141,15 +142,21 @@ static bool enumerate_dir_enum(dir_enum_t *this, char **relative,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* See header
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
enumerator_t* enumerator_create_directory(const char *path)
|
||||
{
|
||||
dir_enum_t *this;
|
||||
int len;
|
||||
dir_enum_t *this = malloc_thing(dir_enum_t);
|
||||
this->public.enumerate = (void*)enumerate_dir_enum;
|
||||
this->public.destroy = (void*)destroy_dir_enum;
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_dir_enum,
|
||||
.destroy = _destroy_dir_enum,
|
||||
},
|
||||
);
|
||||
|
||||
if (*path == '\0')
|
||||
{
|
||||
@@ -171,9 +178,10 @@ enumerator_t* enumerator_create_directory(const char *path)
|
||||
this->full_end = &this->full[len];
|
||||
|
||||
this->dir = opendir(path);
|
||||
if (this->dir == NULL)
|
||||
if (!this->dir)
|
||||
{
|
||||
DBG1(DBG_LIB, "opening directory '%s' failed: %s", path, strerror(errno));
|
||||
DBG1(DBG_LIB, "opening directory '%s' failed: %s", path,
|
||||
strerror(errno));
|
||||
free(this);
|
||||
return NULL;
|
||||
}
|
||||
@@ -196,21 +204,21 @@ typedef struct {
|
||||
char full[PATH_MAX];
|
||||
} glob_enum_t;
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_glob().destroy
|
||||
*/
|
||||
static void destroy_glob_enum(glob_enum_t *this)
|
||||
METHOD(enumerator_t, destroy_glob_enum, void,
|
||||
glob_enum_t *this)
|
||||
{
|
||||
globfree(&this->glob);
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_glob().enumerate
|
||||
*/
|
||||
static bool enumerate_glob_enum(glob_enum_t *this, char **file, struct stat *st)
|
||||
METHOD(enumerator_t, enumerate_glob_enum, bool,
|
||||
glob_enum_t *this, va_list args)
|
||||
{
|
||||
struct stat *st;
|
||||
char *match;
|
||||
char **file;
|
||||
|
||||
VA_ARGS_VGET(args, file, st);
|
||||
|
||||
if (this->pos >= this->glob.gl_pathc)
|
||||
{
|
||||
@@ -221,20 +229,17 @@ static bool enumerate_glob_enum(glob_enum_t *this, char **file, struct stat *st)
|
||||
{
|
||||
*file = match;
|
||||
}
|
||||
if (st)
|
||||
if (st && stat(match, st))
|
||||
{
|
||||
if (stat(match, st))
|
||||
{
|
||||
DBG1(DBG_LIB, "stat() on '%s' failed: %s", match,
|
||||
strerror(errno));
|
||||
return FALSE;
|
||||
}
|
||||
DBG1(DBG_LIB, "stat() on '%s' failed: %s", match,
|
||||
strerror(errno));
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* See header
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
enumerator_t* enumerator_create_glob(const char *pattern)
|
||||
{
|
||||
@@ -248,8 +253,9 @@ enumerator_t* enumerator_create_glob(const char *pattern)
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.enumerate = (void*)enumerate_glob_enum,
|
||||
.destroy = (void*)destroy_glob_enum,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_glob_enum,
|
||||
.destroy = _destroy_glob_enum,
|
||||
},
|
||||
);
|
||||
|
||||
@@ -291,24 +297,22 @@ typedef struct {
|
||||
const char *trim;
|
||||
} token_enum_t;
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_token().destroy
|
||||
*/
|
||||
static void destroy_token_enum(token_enum_t *this)
|
||||
METHOD(enumerator_t, destroy_token_enum, void,
|
||||
token_enum_t *this)
|
||||
{
|
||||
free(this->string);
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_token().enumerate
|
||||
*/
|
||||
static bool enumerate_token_enum(token_enum_t *this, char **token)
|
||||
METHOD(enumerator_t, enumerate_token_enum, bool,
|
||||
token_enum_t *this, va_list args)
|
||||
{
|
||||
const char *sep, *trim;
|
||||
char *pos = NULL, *tmp;
|
||||
char *pos = NULL, *tmp, **token;
|
||||
bool last = FALSE;
|
||||
|
||||
VA_ARGS_VGET(args, token);
|
||||
|
||||
/* trim leading characters/separators */
|
||||
while (*this->pos)
|
||||
{
|
||||
@@ -409,52 +413,48 @@ static bool enumerate_token_enum(token_enum_t *this, char **token)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* See header
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
enumerator_t* enumerator_create_token(const char *string, const char *sep,
|
||||
const char *trim)
|
||||
{
|
||||
token_enum_t *enumerator = malloc_thing(token_enum_t);
|
||||
token_enum_t *this;
|
||||
|
||||
enumerator->public.enumerate = (void*)enumerate_token_enum;
|
||||
enumerator->public.destroy = (void*)destroy_token_enum;
|
||||
enumerator->string = strdup(string);
|
||||
enumerator->pos = enumerator->string;
|
||||
enumerator->sep = sep;
|
||||
enumerator->trim = trim;
|
||||
INIT(this,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_token_enum,
|
||||
.destroy = _destroy_token_enum,
|
||||
},
|
||||
.string = strdup(string),
|
||||
.sep = sep,
|
||||
.trim = trim,
|
||||
);
|
||||
this->pos = this->string;
|
||||
|
||||
return &enumerator->public;
|
||||
return &this->public;
|
||||
}
|
||||
|
||||
/**
|
||||
* enumerator for nested enumerations
|
||||
* Enumerator for nested enumerations
|
||||
*/
|
||||
typedef struct {
|
||||
/* implements enumerator_t */
|
||||
enumerator_t public;
|
||||
/* outer enumerator */
|
||||
enumerator_t *outer;
|
||||
/* inner enumerator */
|
||||
enumerator_t *inner;
|
||||
/* constructor for inner enumerator */
|
||||
enumerator_t *(*create_inner)(void *outer, void *data);
|
||||
/* data to pass to constructor above */
|
||||
void *data;
|
||||
/* destructor for data */
|
||||
void (*destroy_data)(void *data);
|
||||
void (*destructor)(void *data);
|
||||
} nested_enumerator_t;
|
||||
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_nested().enumerate()
|
||||
*/
|
||||
static bool enumerate_nested(nested_enumerator_t *this, void *v1, void *v2,
|
||||
void *v3, void *v4, void *v5)
|
||||
METHOD(enumerator_t, enumerate_nested, bool,
|
||||
nested_enumerator_t *this, va_list args)
|
||||
{
|
||||
while (TRUE)
|
||||
{
|
||||
while (this->inner == NULL)
|
||||
while (!this->inner)
|
||||
{
|
||||
void *outer;
|
||||
|
||||
@@ -463,8 +463,13 @@ static bool enumerate_nested(nested_enumerator_t *this, void *v1, void *v2,
|
||||
return FALSE;
|
||||
}
|
||||
this->inner = this->create_inner(outer, this->data);
|
||||
if (this->inner && !this->inner->venumerate)
|
||||
{
|
||||
DBG1(DBG_LIB, "!!! ENUMERATE NESTED: venumerate() missing !!!");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
if (this->inner->enumerate(this->inner, v1, v2, v3, v4, v5))
|
||||
if (this->inner->venumerate(this->inner, args))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
@@ -473,42 +478,43 @@ static bool enumerate_nested(nested_enumerator_t *this, void *v1, void *v2,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_nested().destroy()
|
||||
**/
|
||||
static void destroy_nested(nested_enumerator_t *this)
|
||||
METHOD(enumerator_t, destroy_nested, void,
|
||||
nested_enumerator_t *this)
|
||||
{
|
||||
if (this->destroy_data)
|
||||
if (this->destructor)
|
||||
{
|
||||
this->destroy_data(this->data);
|
||||
this->destructor(this->data);
|
||||
}
|
||||
DESTROY_IF(this->inner);
|
||||
this->outer->destroy(this->outer);
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* See header
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
enumerator_t *enumerator_create_nested(enumerator_t *outer,
|
||||
enumerator_t *(inner_constructor)(void *outer, void *data),
|
||||
void *data, void (*destroy_data)(void *data))
|
||||
void *data, void (*destructor)(void *data))
|
||||
{
|
||||
nested_enumerator_t *enumerator = malloc_thing(nested_enumerator_t);
|
||||
nested_enumerator_t *this;
|
||||
|
||||
enumerator->public.enumerate = (void*)enumerate_nested;
|
||||
enumerator->public.destroy = (void*)destroy_nested;
|
||||
enumerator->outer = outer;
|
||||
enumerator->inner = NULL;
|
||||
enumerator->create_inner = (void*)inner_constructor;
|
||||
enumerator->data = data;
|
||||
enumerator->destroy_data = destroy_data;
|
||||
|
||||
return &enumerator->public;
|
||||
INIT(this,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_nested,
|
||||
.destroy = _destroy_nested,
|
||||
},
|
||||
.outer = outer,
|
||||
.create_inner = inner_constructor,
|
||||
.data = data,
|
||||
.destructor = destructor,
|
||||
);
|
||||
return &this->public;
|
||||
}
|
||||
|
||||
/**
|
||||
* enumerator for filtered enumerator
|
||||
* Enumerator for filtered enumerator
|
||||
*/
|
||||
typedef struct {
|
||||
enumerator_t public;
|
||||
@@ -518,10 +524,8 @@ typedef struct {
|
||||
void (*destructor)(void *data);
|
||||
} filter_enumerator_t;
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_filter().destroy
|
||||
*/
|
||||
static void destroy_filter(filter_enumerator_t *this)
|
||||
METHOD(enumerator_t, destroy_filter, void,
|
||||
filter_enumerator_t *this)
|
||||
{
|
||||
if (this->destructor)
|
||||
{
|
||||
@@ -531,13 +535,14 @@ static void destroy_filter(filter_enumerator_t *this)
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_filter().enumerate
|
||||
*/
|
||||
static bool enumerate_filter(filter_enumerator_t *this, void *o1, void *o2,
|
||||
void *o3, void *o4, void *o5)
|
||||
METHOD(enumerator_t, enumerate_filter, bool,
|
||||
filter_enumerator_t *this, va_list args)
|
||||
{
|
||||
void *i1, *i2, *i3, *i4, *i5;
|
||||
void *o1, *o2, *o3, *o4, *o5;
|
||||
|
||||
/* FIXME: what happens if there are less than five arguments is not defined */
|
||||
VA_ARGS_VGET(args, o1, o2, o3, o4, o5);
|
||||
|
||||
while (this->unfiltered->enumerate(this->unfiltered, &i1, &i2, &i3, &i4, &i5))
|
||||
{
|
||||
@@ -549,27 +554,31 @@ static bool enumerate_filter(filter_enumerator_t *this, void *o1, void *o2,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* see header
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
enumerator_t *enumerator_create_filter(enumerator_t *unfiltered,
|
||||
bool (*filter)(void *data, ...),
|
||||
void *data, void (*destructor)(void *data))
|
||||
{
|
||||
filter_enumerator_t *this = malloc_thing(filter_enumerator_t);
|
||||
|
||||
this->public.enumerate = (void*)enumerate_filter;
|
||||
this->public.destroy = (void*)destroy_filter;
|
||||
this->unfiltered = unfiltered;
|
||||
this->filter = filter;
|
||||
this->data = data;
|
||||
this->destructor = destructor;
|
||||
filter_enumerator_t *this;
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_filter,
|
||||
.destroy = _destroy_filter,
|
||||
},
|
||||
.unfiltered = unfiltered,
|
||||
.filter = filter,
|
||||
.data = data,
|
||||
.destructor = destructor,
|
||||
);
|
||||
return &this->public;
|
||||
}
|
||||
|
||||
/**
|
||||
* enumerator for cleaner enumerator
|
||||
* Enumerator for cleaner enumerator
|
||||
*/
|
||||
typedef struct {
|
||||
enumerator_t public;
|
||||
@@ -578,44 +587,48 @@ typedef struct {
|
||||
void *data;
|
||||
} cleaner_enumerator_t;
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_cleanup().destroy
|
||||
*/
|
||||
static void destroy_cleaner(cleaner_enumerator_t *this)
|
||||
METHOD(enumerator_t, destroy_cleaner, void,
|
||||
cleaner_enumerator_t *this)
|
||||
{
|
||||
this->cleanup(this->data);
|
||||
this->wrapped->destroy(this->wrapped);
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_cleaner().enumerate
|
||||
*/
|
||||
static bool enumerate_cleaner(cleaner_enumerator_t *this, void *v1, void *v2,
|
||||
void *v3, void *v4, void *v5)
|
||||
METHOD(enumerator_t, enumerate_cleaner, bool,
|
||||
cleaner_enumerator_t *this, va_list args)
|
||||
{
|
||||
return this->wrapped->enumerate(this->wrapped, v1, v2, v3, v4, v5);
|
||||
if (!this->wrapped->venumerate)
|
||||
{
|
||||
DBG1(DBG_LIB, "!!! CLEANER ENUMERATOR: venumerate() missing !!!");
|
||||
return FALSE;
|
||||
}
|
||||
return this->wrapped->venumerate(this->wrapped, args);
|
||||
}
|
||||
|
||||
/**
|
||||
* see header
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
enumerator_t *enumerator_create_cleaner(enumerator_t *wrapped,
|
||||
void (*cleanup)(void *data), void *data)
|
||||
{
|
||||
cleaner_enumerator_t *this = malloc_thing(cleaner_enumerator_t);
|
||||
|
||||
this->public.enumerate = (void*)enumerate_cleaner;
|
||||
this->public.destroy = (void*)destroy_cleaner;
|
||||
this->wrapped = wrapped;
|
||||
this->cleanup = cleanup;
|
||||
this->data = data;
|
||||
cleaner_enumerator_t *this;
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_cleaner,
|
||||
.destroy = _destroy_cleaner,
|
||||
},
|
||||
.wrapped = wrapped,
|
||||
.cleanup = cleanup,
|
||||
.data = data,
|
||||
);
|
||||
return &this->public;
|
||||
}
|
||||
|
||||
/**
|
||||
* enumerator for single enumerator
|
||||
* Enumerator for single enumerator
|
||||
*/
|
||||
typedef struct {
|
||||
enumerator_t public;
|
||||
@@ -624,10 +637,8 @@ typedef struct {
|
||||
bool done;
|
||||
} single_enumerator_t;
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_single().destroy
|
||||
*/
|
||||
static void destroy_single(single_enumerator_t *this)
|
||||
METHOD(enumerator_t, destroy_single, void,
|
||||
single_enumerator_t *this)
|
||||
{
|
||||
if (this->cleanup)
|
||||
{
|
||||
@@ -636,11 +647,12 @@ static void destroy_single(single_enumerator_t *this)
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of enumerator_create_single().enumerate
|
||||
*/
|
||||
static bool enumerate_single(single_enumerator_t *this, void **item)
|
||||
METHOD(enumerator_t, enumerate_single, bool,
|
||||
single_enumerator_t *this, va_list args)
|
||||
{
|
||||
void **item;
|
||||
|
||||
VA_ARGS_VGET(args, item);
|
||||
if (this->done)
|
||||
{
|
||||
return FALSE;
|
||||
@@ -650,18 +662,21 @@ static bool enumerate_single(single_enumerator_t *this, void **item)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* see header
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
enumerator_t *enumerator_create_single(void *item, void (*cleanup)(void *item))
|
||||
{
|
||||
single_enumerator_t *this = malloc_thing(single_enumerator_t);
|
||||
|
||||
this->public.enumerate = (void*)enumerate_single;
|
||||
this->public.destroy = (void*)destroy_single;
|
||||
this->item = item;
|
||||
this->cleanup = cleanup;
|
||||
this->done = FALSE;
|
||||
single_enumerator_t *this;
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_single,
|
||||
.destroy = _destroy_single,
|
||||
},
|
||||
.item = item,
|
||||
.cleanup = cleanup,
|
||||
);
|
||||
return &this->public;
|
||||
}
|
||||
|
||||
@@ -172,17 +172,21 @@ enumerator_t* enumerator_create_token(const char *string, const char *sep,
|
||||
/**
|
||||
* Creates an enumerator which enumerates over enumerated enumerators :-).
|
||||
*
|
||||
* The variable argument list of enumeration values is limit to 5.
|
||||
* The outer enumerator is expected to return objects that, when passed to
|
||||
* inner_contructor, will create a new enumerator that will be enumerated until
|
||||
* completion (to this enumerator will the pointer arguments that are passed to
|
||||
* this enumerator be forwarded) at which point a new element from the outer
|
||||
* enumerator is requested to create a new inner enumerator.
|
||||
*
|
||||
* @param outer outer enumerator
|
||||
* @param inner_constructor constructor to inner enumerator
|
||||
* @param inner_constructor constructor to create inner enumerator
|
||||
* @param data data to pass to each inner_constructor call
|
||||
* @param destroy_data destructor to pass to data
|
||||
* @param destructor destructor function to clean up data after use
|
||||
* @return the nested enumerator
|
||||
*/
|
||||
enumerator_t *enumerator_create_nested(enumerator_t *outer,
|
||||
enumerator_t *(*inner_constructor)(void *outer, void *data),
|
||||
void *data, void (*destroy_data)(void *data));
|
||||
void *data, void (*destructor)(void *data));
|
||||
|
||||
/**
|
||||
* Creates an enumerator which filters output of another enumerator.
|
||||
|
||||
@@ -379,8 +379,13 @@ METHOD(hashtable_t, get_count, u_int,
|
||||
}
|
||||
|
||||
METHOD(enumerator_t, enumerate, bool,
|
||||
private_enumerator_t *this, const void **key, void **value)
|
||||
private_enumerator_t *this, va_list args)
|
||||
{
|
||||
const void **key;
|
||||
void **value;
|
||||
|
||||
VA_ARGS_VGET(args, key, value);
|
||||
|
||||
while (this->count && this->row < this->table->capacity)
|
||||
{
|
||||
this->prev = this->current;
|
||||
@@ -417,7 +422,8 @@ METHOD(hashtable_t, create_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.enumerator = {
|
||||
.enumerate = (void*)_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate,
|
||||
.destroy = (void*)free,
|
||||
},
|
||||
.table = this,
|
||||
|
||||
@@ -119,8 +119,12 @@ struct private_enumerator_t {
|
||||
};
|
||||
|
||||
METHOD(enumerator_t, enumerate, bool,
|
||||
private_enumerator_t *this, void **item)
|
||||
private_enumerator_t *this, va_list args)
|
||||
{
|
||||
void **item;
|
||||
|
||||
VA_ARGS_VGET(args, item);
|
||||
|
||||
if (this->finished)
|
||||
{
|
||||
return FALSE;
|
||||
@@ -152,7 +156,8 @@ METHOD(linked_list_t, create_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.enumerator = {
|
||||
.enumerate = (void*)_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate,
|
||||
.destroy = (void*)free,
|
||||
},
|
||||
.list = this,
|
||||
|
||||
@@ -146,12 +146,14 @@ typedef struct {
|
||||
bool enumerated[AUTH_RULE_MAX];
|
||||
} entry_enumerator_t;
|
||||
|
||||
/**
|
||||
* enumerate function for item_enumerator_t
|
||||
*/
|
||||
static bool enumerate(entry_enumerator_t *this, auth_rule_t *type, void **value)
|
||||
METHOD(enumerator_t, enumerate, bool,
|
||||
entry_enumerator_t *this, va_list args)
|
||||
{
|
||||
auth_rule_t *type;
|
||||
entry_t *entry;
|
||||
void **value;
|
||||
|
||||
VA_ARGS_VGET(args, type, value);
|
||||
|
||||
while (this->inner->enumerate(this->inner, &entry))
|
||||
{
|
||||
@@ -174,10 +176,8 @@ static bool enumerate(entry_enumerator_t *this, auth_rule_t *type, void **value)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* destroy function for item_enumerator_t
|
||||
*/
|
||||
static void entry_enumerator_destroy(entry_enumerator_t *this)
|
||||
METHOD(enumerator_t, entry_enumerator_destroy, void,
|
||||
entry_enumerator_t *this)
|
||||
{
|
||||
this->inner->destroy(this->inner);
|
||||
free(this);
|
||||
@@ -190,8 +190,9 @@ METHOD(auth_cfg_t, create_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)enumerate,
|
||||
.destroy = (void*)entry_enumerator_destroy,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate,
|
||||
.destroy = _entry_enumerator_destroy,
|
||||
},
|
||||
.inner = array_create_enumerator(this->entries),
|
||||
);
|
||||
|
||||
@@ -155,8 +155,12 @@ METHOD(credential_manager_t, call_hook, void,
|
||||
}
|
||||
|
||||
METHOD(enumerator_t, sets_enumerate, bool,
|
||||
sets_enumerator_t *this, credential_set_t **set)
|
||||
sets_enumerator_t *this, va_list args)
|
||||
{
|
||||
credential_set_t **set;
|
||||
|
||||
VA_ARGS_VGET(args, set);
|
||||
|
||||
if (this->exclusive)
|
||||
{
|
||||
if (this->exclusive->enumerate(this->exclusive, set))
|
||||
@@ -202,7 +206,8 @@ static enumerator_t *create_sets_enumerator(private_credential_manager_t *this)
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_sets_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _sets_enumerate,
|
||||
.destroy = _sets_destroy,
|
||||
},
|
||||
);
|
||||
@@ -840,9 +845,12 @@ typedef struct {
|
||||
} trusted_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, trusted_enumerate, bool,
|
||||
trusted_enumerator_t *this, certificate_t **cert, auth_cfg_t **auth)
|
||||
trusted_enumerator_t *this, va_list args)
|
||||
{
|
||||
certificate_t *current;
|
||||
certificate_t *current, **cert;
|
||||
auth_cfg_t **auth;
|
||||
|
||||
VA_ARGS_VGET(args, cert, auth);
|
||||
|
||||
DESTROY_IF(this->auth);
|
||||
this->auth = auth_cfg_create();
|
||||
@@ -931,7 +939,8 @@ METHOD(credential_manager_t, create_trusted_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_trusted_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _trusted_enumerate,
|
||||
.destroy = _trusted_destroy,
|
||||
},
|
||||
.this = this,
|
||||
@@ -960,9 +969,13 @@ typedef struct {
|
||||
} public_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, public_enumerate, bool,
|
||||
public_enumerator_t *this, public_key_t **key, auth_cfg_t **auth)
|
||||
public_enumerator_t *this, va_list args)
|
||||
{
|
||||
certificate_t *cert;
|
||||
public_key_t **key;
|
||||
auth_cfg_t **auth;
|
||||
|
||||
VA_ARGS_VGET(args, key, auth);
|
||||
|
||||
while (this->inner->enumerate(this->inner, &cert, auth))
|
||||
{
|
||||
@@ -1001,7 +1014,8 @@ METHOD(credential_manager_t, create_public_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_public_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _public_enumerate,
|
||||
.destroy = _public_destroy,
|
||||
},
|
||||
.inner = create_trusted_enumerator(this, type, id, online),
|
||||
|
||||
@@ -272,8 +272,12 @@ typedef struct {
|
||||
} private_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, signature_schemes_enumerate, bool,
|
||||
private_enumerator_t *this, signature_scheme_t *scheme)
|
||||
private_enumerator_t *this, va_list args)
|
||||
{
|
||||
signature_scheme_t *scheme;
|
||||
|
||||
VA_ARGS_VGET(args, scheme);
|
||||
|
||||
while (++this->index < countof(scheme_map))
|
||||
{
|
||||
if (this->type == scheme_map[this->index].type &&
|
||||
@@ -296,7 +300,8 @@ enumerator_t *signature_schemes_for_key(key_type_t type, int size)
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.enumerate = (void*)_signature_schemes_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _signature_schemes_enumerate,
|
||||
.destroy = (void*)free,
|
||||
},
|
||||
.index = -1,
|
||||
|
||||
@@ -112,15 +112,15 @@ static bool fetch_cert(wrapper_enumerator_t *enumerator,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* enumerate function for wrapper_enumerator_t
|
||||
*/
|
||||
static bool enumerate(wrapper_enumerator_t *this, certificate_t **cert)
|
||||
METHOD(enumerator_t, enumerate, bool,
|
||||
wrapper_enumerator_t *this, va_list args)
|
||||
{
|
||||
auth_rule_t rule;
|
||||
certificate_t *current;
|
||||
certificate_t *current, **cert;
|
||||
public_key_t *public;
|
||||
|
||||
VA_ARGS_VGET(args, cert);
|
||||
|
||||
while (this->inner->enumerate(this->inner, &rule, ¤t))
|
||||
{
|
||||
if (rule == AUTH_HELPER_IM_HASH_URL ||
|
||||
@@ -164,10 +164,8 @@ static bool enumerate(wrapper_enumerator_t *this, certificate_t **cert)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* destroy function for wrapper_enumerator_t
|
||||
*/
|
||||
static void wrapper_enumerator_destroy(wrapper_enumerator_t *this)
|
||||
METHOD(enumerator_t, wrapper_enumerator_destroy, void,
|
||||
wrapper_enumerator_t *this)
|
||||
{
|
||||
this->inner->destroy(this->inner);
|
||||
free(this);
|
||||
@@ -183,14 +181,18 @@ METHOD(credential_set_t, create_enumerator, enumerator_t*,
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
enumerator = malloc_thing(wrapper_enumerator_t);
|
||||
enumerator->auth = this->auth;
|
||||
enumerator->cert = cert;
|
||||
enumerator->key = key;
|
||||
enumerator->id = id;
|
||||
enumerator->inner = this->auth->create_enumerator(this->auth);
|
||||
enumerator->public.enumerate = (void*)enumerate;
|
||||
enumerator->public.destroy = (void*)wrapper_enumerator_destroy;
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate,
|
||||
.destroy = _wrapper_enumerator_destroy,
|
||||
},
|
||||
.auth = this->auth,
|
||||
.cert = cert,
|
||||
.key = key,
|
||||
.id = id,
|
||||
.inner = this->auth->create_enumerator(this->auth),
|
||||
);
|
||||
return &enumerator->public;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,9 +60,12 @@ typedef struct {
|
||||
} shared_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, shared_enumerate, bool,
|
||||
shared_enumerator_t *this, shared_key_t **out,
|
||||
id_match_t *match_me, id_match_t *match_other)
|
||||
shared_enumerator_t *this, va_list args)
|
||||
{
|
||||
shared_key_t **out;
|
||||
id_match_t *match_me, *match_other;
|
||||
|
||||
VA_ARGS_VGET(args, out, match_me, match_other);
|
||||
DESTROY_IF(this->current);
|
||||
this->current = this->this->cb.shared(this->this->data, this->type,
|
||||
this->me, this->other, match_me, match_other);
|
||||
@@ -89,7 +92,8 @@ METHOD(credential_set_t, create_shared_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_shared_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _shared_enumerate,
|
||||
.destroy = _shared_destroy,
|
||||
},
|
||||
.this = this,
|
||||
|
||||
@@ -252,13 +252,14 @@ typedef struct {
|
||||
int locked;
|
||||
} cert_enumerator_t;
|
||||
|
||||
/**
|
||||
* filter function for certs enumerator
|
||||
*/
|
||||
static bool cert_enumerate(cert_enumerator_t *this, certificate_t **out)
|
||||
METHOD(enumerator_t, cert_enumerate, bool,
|
||||
cert_enumerator_t *this, va_list args)
|
||||
{
|
||||
public_key_t *public;
|
||||
relation_t *rel;
|
||||
certificate_t **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
if (this->locked >= 0)
|
||||
{
|
||||
@@ -311,10 +312,8 @@ static bool cert_enumerate(cert_enumerator_t *this, certificate_t **out)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* clean up enumeration data
|
||||
*/
|
||||
static void cert_enumerator_destroy(cert_enumerator_t *this)
|
||||
METHOD(enumerator_t, cert_enumerator_destroy, void,
|
||||
cert_enumerator_t *this)
|
||||
{
|
||||
relation_t *rel;
|
||||
|
||||
@@ -336,16 +335,19 @@ METHOD(credential_set_t, create_enumerator, enumerator_t*,
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
enumerator = malloc_thing(cert_enumerator_t);
|
||||
enumerator->public.enumerate = (void*)cert_enumerate;
|
||||
enumerator->public.destroy = (void*)cert_enumerator_destroy;
|
||||
enumerator->cert = cert;
|
||||
enumerator->key = key;
|
||||
enumerator->id = id;
|
||||
enumerator->relations = this->relations;
|
||||
enumerator->index = -1;
|
||||
enumerator->locked = -1;
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _cert_enumerate,
|
||||
.destroy = _cert_enumerator_destroy,
|
||||
},
|
||||
.cert = cert,
|
||||
.key = key,
|
||||
.id = id,
|
||||
.relations = this->relations,
|
||||
.index = -1,
|
||||
.locked = -1,
|
||||
);
|
||||
return &enumerator->public;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,14 +49,15 @@ typedef struct {
|
||||
identification_t *id;
|
||||
} wrapper_enumerator_t;
|
||||
|
||||
/**
|
||||
* enumerate function wrapper_enumerator_t
|
||||
*/
|
||||
static bool enumerate(wrapper_enumerator_t *this, certificate_t **cert)
|
||||
METHOD(enumerator_t, enumerate, bool,
|
||||
wrapper_enumerator_t *this, va_list args)
|
||||
{
|
||||
certificate_t *current;
|
||||
certificate_t *current, **cert;
|
||||
public_key_t *public;
|
||||
|
||||
|
||||
VA_ARGS_VGET(args, cert);
|
||||
|
||||
while (this->inner->enumerate(this->inner, ¤t))
|
||||
{
|
||||
if (this->cert != CERT_ANY && this->cert != current->get_type(current))
|
||||
@@ -85,10 +86,8 @@ static bool enumerate(wrapper_enumerator_t *this, certificate_t **cert)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* destroy function for wrapper_enumerator_t
|
||||
*/
|
||||
static void enumerator_destroy(wrapper_enumerator_t *this)
|
||||
METHOD(enumerator_t, enumerator_destroy, void,
|
||||
wrapper_enumerator_t *this)
|
||||
{
|
||||
this->inner->destroy(this->inner);
|
||||
free(this);
|
||||
@@ -105,13 +104,17 @@ METHOD(credential_set_t, create_enumerator, enumerator_t*,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
enumerator = malloc_thing(wrapper_enumerator_t);
|
||||
enumerator->cert = cert;
|
||||
enumerator->key = key;
|
||||
enumerator->id = id;
|
||||
enumerator->inner = this->response->create_cert_enumerator(this->response);
|
||||
enumerator->public.enumerate = (void*)enumerate;
|
||||
enumerator->public.destroy = (void*)enumerator_destroy;
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate,
|
||||
.destroy = _enumerator_destroy,
|
||||
},
|
||||
.cert = cert,
|
||||
.key = key,
|
||||
.id = id,
|
||||
.inner = this->response->create_cert_enumerator(this->response),
|
||||
);
|
||||
return &enumerator->public;
|
||||
}
|
||||
|
||||
|
||||
@@ -1026,9 +1026,14 @@ typedef struct {
|
||||
} verify_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, verify_enumerate, bool,
|
||||
verify_enumerator_t *this, u_int *alg, const char **plugin, bool *valid)
|
||||
verify_enumerator_t *this, va_list args)
|
||||
{
|
||||
const char **plugin;
|
||||
entry_t *entry;
|
||||
u_int *alg;
|
||||
bool *valid;
|
||||
|
||||
VA_ARGS_VGET(args, alg, plugin, valid);
|
||||
|
||||
if (!this->inner->enumerate(this->inner, &entry))
|
||||
{
|
||||
@@ -1123,7 +1128,8 @@ METHOD(crypto_factory_t, create_verify_enumerator, enumerator_t*,
|
||||
}
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_verify_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _verify_enumerate,
|
||||
.destroy = _verify_destroy,
|
||||
},
|
||||
.inner = inner,
|
||||
|
||||
@@ -403,10 +403,8 @@ typedef struct {
|
||||
unsigned long *length;
|
||||
} mysql_enumerator_t;
|
||||
|
||||
/**
|
||||
* create a mysql enumerator
|
||||
*/
|
||||
static void mysql_enumerator_destroy(mysql_enumerator_t *this)
|
||||
METHOD(enumerator_t, mysql_enumerator_destroy, void,
|
||||
mysql_enumerator_t *this)
|
||||
{
|
||||
int columns, i;
|
||||
|
||||
@@ -434,13 +432,10 @@ static void mysql_enumerator_destroy(mysql_enumerator_t *this)
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of database.query().enumerate
|
||||
*/
|
||||
static bool mysql_enumerator_enumerate(mysql_enumerator_t *this, ...)
|
||||
METHOD(enumerator_t, mysql_enumerator_enumerate, bool,
|
||||
mysql_enumerator_t *this, va_list args)
|
||||
{
|
||||
int i, columns;
|
||||
va_list args;
|
||||
|
||||
columns = mysql_stmt_field_count(this->stmt);
|
||||
|
||||
@@ -477,7 +472,6 @@ static bool mysql_enumerator_enumerate(mysql_enumerator_t *this, ...)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
va_start(args, this);
|
||||
for (i = 0; i < columns; i++)
|
||||
{
|
||||
switch (this->bind[i].buffer_type)
|
||||
@@ -526,7 +520,6 @@ static bool mysql_enumerator_enumerate(mysql_enumerator_t *this, ...)
|
||||
break;
|
||||
}
|
||||
}
|
||||
va_end(args);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -552,9 +545,9 @@ METHOD(database_t, query, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)mysql_enumerator_enumerate,
|
||||
.destroy = (void*)mysql_enumerator_destroy,
|
||||
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _mysql_enumerator_enumerate,
|
||||
.destroy = _mysql_enumerator_destroy,
|
||||
},
|
||||
.db = this,
|
||||
.stmt = stmt,
|
||||
|
||||
@@ -142,8 +142,14 @@ typedef struct {
|
||||
|
||||
|
||||
METHOD(enumerator_t, crl_enumerate, bool,
|
||||
crl_enumerator_t *this, chunk_t *serial, time_t *date, crl_reason_t *reason)
|
||||
crl_enumerator_t *this, va_list args)
|
||||
{
|
||||
crl_reason_t *reason;
|
||||
chunk_t *serial;
|
||||
time_t *date;
|
||||
|
||||
VA_ARGS_VGET(args, serial, date, reason);
|
||||
|
||||
if (this->i < this->num)
|
||||
{
|
||||
X509_REVOKED *revoked;
|
||||
@@ -188,7 +194,8 @@ METHOD(crl_t, create_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_crl_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _crl_enumerate,
|
||||
.destroy = (void*)free,
|
||||
},
|
||||
.stack = X509_CRL_get_REVOKED(this->crl),
|
||||
|
||||
@@ -136,8 +136,12 @@ METHOD(enumerator_t, cert_destroy, void,
|
||||
}
|
||||
|
||||
METHOD(enumerator_t, cert_enumerate, bool,
|
||||
cert_enumerator_t *this, certificate_t **out)
|
||||
cert_enumerator_t *this, va_list args)
|
||||
{
|
||||
certificate_t **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
if (!this->certs)
|
||||
{
|
||||
return FALSE;
|
||||
@@ -176,7 +180,8 @@ METHOD(pkcs7_t, create_cert_enumerator, enumerator_t*,
|
||||
{
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_cert_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _cert_enumerate,
|
||||
.destroy = _cert_destroy,
|
||||
},
|
||||
.certs = CMS_get1_certs(this->cms),
|
||||
@@ -320,8 +325,12 @@ static bool verify_digest(CMS_ContentInfo *cms, CMS_SignerInfo *si, int hash_oid
|
||||
}
|
||||
|
||||
METHOD(enumerator_t, signature_enumerate, bool,
|
||||
signature_enumerator_t *this, auth_cfg_t **out)
|
||||
signature_enumerator_t *this, va_list args)
|
||||
{
|
||||
auth_cfg_t **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
if (!this->signers)
|
||||
{
|
||||
return FALSE;
|
||||
@@ -382,7 +391,8 @@ METHOD(container_t, create_signature_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_signature_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _signature_enumerate,
|
||||
.destroy = _signature_destroy,
|
||||
},
|
||||
.cms = this->cms,
|
||||
|
||||
@@ -719,12 +719,14 @@ static bool get_attributes(object_enumerator_t *this, CK_OBJECT_HANDLE object)
|
||||
}
|
||||
|
||||
METHOD(enumerator_t, object_enumerate, bool,
|
||||
object_enumerator_t *this, CK_OBJECT_HANDLE *out)
|
||||
object_enumerator_t *this, va_list args)
|
||||
{
|
||||
CK_OBJECT_HANDLE object;
|
||||
CK_OBJECT_HANDLE object, *out;
|
||||
CK_ULONG found;
|
||||
CK_RV rv;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
if (!this->object)
|
||||
{
|
||||
rv = this->lib->f->C_FindObjects(this->session, &object, 1, &found);
|
||||
@@ -786,7 +788,8 @@ METHOD(pkcs11_library_t, create_object_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_object_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _object_enumerate,
|
||||
.destroy = _object_destroy,
|
||||
},
|
||||
.session = session,
|
||||
@@ -806,7 +809,8 @@ METHOD(pkcs11_library_t, create_object_attr_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_object_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _object_enumerate,
|
||||
.destroy = _object_destroy,
|
||||
},
|
||||
.session = session,
|
||||
@@ -838,11 +842,14 @@ typedef struct {
|
||||
} mechanism_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, enumerate_mech, bool,
|
||||
mechanism_enumerator_t *this, CK_MECHANISM_TYPE* type,
|
||||
CK_MECHANISM_INFO *info)
|
||||
mechanism_enumerator_t *this, va_list args)
|
||||
{
|
||||
CK_MECHANISM_INFO *info;
|
||||
CK_MECHANISM_TYPE *type;
|
||||
CK_RV rv;
|
||||
|
||||
VA_ARGS_VGET(args, type, info);
|
||||
|
||||
if (this->current >= this->count)
|
||||
{
|
||||
return FALSE;
|
||||
@@ -876,7 +883,8 @@ METHOD(pkcs11_library_t, create_mechanism_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_enumerate_mech,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_mech,
|
||||
.destroy = _destroy_mech,
|
||||
},
|
||||
.lib = &this->public,
|
||||
|
||||
@@ -265,8 +265,13 @@ typedef struct {
|
||||
} token_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, enumerate_token, bool,
|
||||
token_enumerator_t *this, pkcs11_library_t **out, CK_SLOT_ID *slot)
|
||||
token_enumerator_t *this, va_list args)
|
||||
{
|
||||
pkcs11_library_t **out;
|
||||
CK_SLOT_ID *slot;
|
||||
|
||||
VA_ARGS_VGET(args, out, slot);
|
||||
|
||||
if (this->current >= this->count)
|
||||
{
|
||||
free(this->slots);
|
||||
@@ -301,7 +306,8 @@ METHOD(pkcs11_manager_t, create_token_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_enumerate_token,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate_token,
|
||||
.destroy = _destroy_token,
|
||||
},
|
||||
.inner = this->libs->create_enumerator(this->libs),
|
||||
|
||||
@@ -179,7 +179,7 @@ typedef struct {
|
||||
} signature_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, enumerate, bool,
|
||||
signature_enumerator_t *this, auth_cfg_t **out)
|
||||
signature_enumerator_t *this, va_list args)
|
||||
{
|
||||
signerinfo_t *info;
|
||||
signature_scheme_t scheme;
|
||||
@@ -187,11 +187,13 @@ METHOD(enumerator_t, enumerate, bool,
|
||||
enumerator_t *enumerator;
|
||||
certificate_t *cert;
|
||||
public_key_t *key;
|
||||
auth_cfg_t *auth;
|
||||
auth_cfg_t *auth, **out;
|
||||
chunk_t chunk, hash, content;
|
||||
hasher_t *hasher;
|
||||
bool valid;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
while (this->inner->enumerate(this->inner, &info))
|
||||
{
|
||||
/* clean up previous round */
|
||||
@@ -300,7 +302,8 @@ METHOD(container_t, create_signature_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _enumerate,
|
||||
.destroy = _enumerator_destroy,
|
||||
},
|
||||
.inner = this->signerinfos->create_enumerator(this->signerinfos),
|
||||
|
||||
@@ -174,10 +174,8 @@ typedef struct {
|
||||
private_sqlite_database_t *database;
|
||||
} sqlite_enumerator_t;
|
||||
|
||||
/**
|
||||
* destroy a sqlite enumerator
|
||||
*/
|
||||
static void sqlite_enumerator_destroy(sqlite_enumerator_t *this)
|
||||
METHOD(enumerator_t, sqlite_enumerator_destroy, void,
|
||||
sqlite_enumerator_t *this)
|
||||
{
|
||||
sqlite3_finalize(this->stmt);
|
||||
if (!is_threadsave())
|
||||
@@ -188,13 +186,10 @@ static void sqlite_enumerator_destroy(sqlite_enumerator_t *this)
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of database.query().enumerate
|
||||
*/
|
||||
static bool sqlite_enumerator_enumerate(sqlite_enumerator_t *this, ...)
|
||||
METHOD(enumerator_t, sqlite_enumerator_enumerate, bool,
|
||||
sqlite_enumerator_t *this, va_list args)
|
||||
{
|
||||
int i;
|
||||
va_list args;
|
||||
|
||||
switch (sqlite3_step(this->stmt))
|
||||
{
|
||||
@@ -207,7 +202,7 @@ static bool sqlite_enumerator_enumerate(sqlite_enumerator_t *this, ...)
|
||||
case SQLITE_DONE:
|
||||
return FALSE;
|
||||
}
|
||||
va_start(args, this);
|
||||
|
||||
for (i = 0; i < this->count; i++)
|
||||
{
|
||||
switch (this->columns[i])
|
||||
@@ -245,11 +240,9 @@ static bool sqlite_enumerator_enumerate(sqlite_enumerator_t *this, ...)
|
||||
}
|
||||
default:
|
||||
DBG1(DBG_LIB, "invalid result type supplied");
|
||||
va_end(args);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
va_end(args);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -270,13 +263,17 @@ METHOD(database_t, query, enumerator_t*,
|
||||
stmt = run(this, sql, &args);
|
||||
if (stmt)
|
||||
{
|
||||
enumerator = malloc_thing(sqlite_enumerator_t);
|
||||
enumerator->public.enumerate = (void*)sqlite_enumerator_enumerate;
|
||||
enumerator->public.destroy = (void*)sqlite_enumerator_destroy;
|
||||
enumerator->stmt = stmt;
|
||||
enumerator->count = sqlite3_column_count(stmt);
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _sqlite_enumerator_enumerate,
|
||||
.destroy = _sqlite_enumerator_destroy,
|
||||
},
|
||||
.stmt = stmt,
|
||||
.count = sqlite3_column_count(stmt),
|
||||
.database = this,
|
||||
);
|
||||
enumerator->columns = malloc(sizeof(db_type_t) * enumerator->count);
|
||||
enumerator->database = this;
|
||||
for (i = 0; i < enumerator->count; i++)
|
||||
{
|
||||
enumerator->columns[i] = va_arg(args, db_type_t);
|
||||
|
||||
@@ -744,10 +744,8 @@ typedef struct {
|
||||
hashtable_t *seen;
|
||||
} enumerator_data_t;
|
||||
|
||||
/**
|
||||
* Destroy enumerator data
|
||||
*/
|
||||
static void enumerator_destroy(enumerator_data_t *this)
|
||||
CALLBACK(enumerator_destroy, void,
|
||||
enumerator_data_t *this)
|
||||
{
|
||||
this->settings->lock->unlock(this->settings->lock);
|
||||
this->seen->destroy(this->seen);
|
||||
|
||||
@@ -668,8 +668,12 @@ typedef struct {
|
||||
} frame_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, frame_enumerate, bool,
|
||||
frame_enumerator_t *this, void **addr)
|
||||
frame_enumerator_t *this, va_list args)
|
||||
{
|
||||
void **addr;
|
||||
|
||||
VA_ARGS_VGET(args, addr);
|
||||
|
||||
if (this->i < this->bt->frame_count)
|
||||
{
|
||||
*addr = this->bt->frames[this->i++];
|
||||
@@ -685,7 +689,8 @@ METHOD(backtrace_t, create_frame_enumerator, enumerator_t*,
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_frame_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _frame_enumerate,
|
||||
.destroy = (void*)free,
|
||||
},
|
||||
.bt = this,
|
||||
|
||||
@@ -136,9 +136,12 @@ typedef struct {
|
||||
} rdn_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, rdn_enumerate, bool,
|
||||
rdn_enumerator_t *this, chunk_t *oid, u_char *type, chunk_t *data)
|
||||
rdn_enumerator_t *this, va_list args)
|
||||
{
|
||||
chunk_t rdn;
|
||||
chunk_t rdn, *oid, *data;
|
||||
u_char *type;
|
||||
|
||||
VA_ARGS_VGET(args, oid, type, data);
|
||||
|
||||
/* a DN contains one or more SET, each containing one or more SEQUENCES,
|
||||
* each containing a OID/value RDN */
|
||||
@@ -173,7 +176,8 @@ static enumerator_t* create_rdn_enumerator(chunk_t dn)
|
||||
|
||||
INIT(e,
|
||||
.public = {
|
||||
.enumerate = (void*)_rdn_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _rdn_enumerate,
|
||||
.destroy = (void*)free,
|
||||
},
|
||||
);
|
||||
@@ -199,10 +203,11 @@ typedef struct {
|
||||
} rdn_part_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, rdn_part_enumerate, bool,
|
||||
rdn_part_enumerator_t *this, id_part_t *type, chunk_t *data)
|
||||
rdn_part_enumerator_t *this, va_list args)
|
||||
{
|
||||
int i, known_oid, strtype;
|
||||
chunk_t oid, inner_data;
|
||||
chunk_t oid, inner_data, *data;
|
||||
id_part_t *type;
|
||||
static const struct {
|
||||
int oid;
|
||||
id_part_t type;
|
||||
@@ -228,6 +233,8 @@ METHOD(enumerator_t, rdn_part_enumerate, bool,
|
||||
{OID_EMPLOYEE_NUMBER, ID_PART_RDN_EN},
|
||||
};
|
||||
|
||||
VA_ARGS_VGET(args, type, data);
|
||||
|
||||
while (this->inner->enumerate(this->inner, &oid, &strtype, &inner_data))
|
||||
{
|
||||
known_oid = asn1_known_oid(oid);
|
||||
@@ -263,7 +270,8 @@ METHOD(identification_t, create_part_enumerator, enumerator_t*,
|
||||
INIT(e,
|
||||
.inner = create_rdn_enumerator(this->encoded),
|
||||
.public = {
|
||||
.enumerate = (void*)_rdn_part_enumerate,
|
||||
.enumerate = enumerator_enumerate_default,
|
||||
.venumerate = _rdn_part_enumerate,
|
||||
.destroy = _rdn_part_enumerator_destroy,
|
||||
},
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user