#include <sys_defs.h>
#include <string.h>
#include <msg.h>
#include <mymalloc.h>
#include <myrand.h>
#include <stringops.h>
#include <dict_random.h>
typedef struct {
DICT dict;
ARGV *replies;
} DICT_RANDOM;
#define STR(x) vstring_str(x)
static const char *dict_random_lookup(DICT *dict, const char *unused_query)
{
DICT_RANDOM *dict_random = (DICT_RANDOM *) dict;
DICT_ERR_VAL_RETURN(dict, DICT_ERR_NONE,
dict_random->replies->argv[myrand() % dict_random->replies->argc]);
}
static void dict_random_close(DICT *dict)
{
DICT_RANDOM *dict_random = (DICT_RANDOM *) dict;
argv_free(dict_random->replies);
dict_free(dict);
}
DICT *dict_random_open(const char *name, int open_flags, int dict_flags)
{
DICT_RANDOM *dict_random;
char *saved_name = 0;
ARGV *argv;
size_t len;
#define DICT_RANDOM_RETURN(x) do { \
if (saved_name != 0) \
myfree(saved_name); \
return (x); \
} while (0)
if (open_flags != O_RDONLY)
DICT_RANDOM_RETURN(dict_surrogate(DICT_TYPE_RANDOM, name,
open_flags, dict_flags,
"%s:%s map requires O_RDONLY access mode",
DICT_TYPE_RANDOM, name));
if ((len = balpar(name, CHARS_BRACE)) == 0 || name[len] != 0
|| *(saved_name = mystrndup(name + 1, len - 2)) == 0
|| ((argv = argv_splitq(saved_name, CHARS_COMMA_SP, CHARS_BRACE)),
(argv->argc == 0)))
DICT_RANDOM_RETURN(dict_surrogate(DICT_TYPE_RANDOM, name,
open_flags, dict_flags,
"bad syntax: \"%s:%s\"; "
"need \"%s:{value...}\"",
DICT_TYPE_RANDOM, name,
DICT_TYPE_RANDOM));
dict_random =
(DICT_RANDOM *) dict_alloc(DICT_TYPE_RANDOM, name, sizeof(*dict_random));
dict_random->dict.lookup = dict_random_lookup;
dict_random->dict.close = dict_random_close;
dict_random->dict.flags = dict_flags | DICT_FLAG_PATTERN;
dict_random->replies = argv;
dict_random->dict.owner.status = DICT_OWNER_TRUSTED;
dict_random->dict.owner.uid = 0;
DICT_RANDOM_RETURN(DICT_DEBUG (&dict_random->dict));
}