class external_acl
{
+/* FIXME: These are not really cbdata, but it is an easy way
+ * to get them pooled, refcounted, accounted and freed properly...
+ */
+ CBDATA_CLASS(external_acl);
public:
+ external_acl();
+ ~external_acl();
+
external_acl *next;
void add(const ExternalACLEntryPointer &);
Ip::Address local_addr;
};
-/* FIXME: These are not really cbdata, but it is an easy way
- * to get them pooled, refcounted, accounted and freed properly...
- */
-CBDATA_TYPE(external_acl);
-
-static void
-free_external_acl(void *data)
+CBDATA_CLASS_INIT(external_acl);
+
+external_acl::external_acl() :
+ ttl(DEFAULT_EXTERNAL_ACL_TTL),
+ negative_ttl(-1),
+ grace(1),
+ name(NULL),
+ cmdline(NULL),
+ children(DEFAULT_EXTERNAL_ACL_CHILDREN),
+ theHelper(NULL),
+ cache(NULL),
+ cache_size(256*1024),
+ cache_entries(0),
+#if USE_AUTH
+ require_auth(0),
+#endif
+ quote(external_acl::QUOTE_METHOD_URL)
{
- external_acl *p = static_cast<external_acl *>(data);
- safe_free(p->name);
-
- p->format = NULL;
-
- wordlistDestroy(&p->cmdline);
+ local_addr.setLocalhost();
+}
- if (p->theHelper) {
- helperShutdown(p->theHelper);
- delete p->theHelper;
- p->theHelper = NULL;
+external_acl::~external_acl()
+{
+ xfree(name);
+ format = NULL;
+ wordlistDestroy(&cmdline);
+
+ if (theHelper) {
+ helperShutdown(theHelper);
+ delete theHelper;
+ theHelper = NULL;
}
- while (p->lru_list.tail) {
- ExternalACLEntryPointer e(static_cast<ExternalACLEntry *>(p->lru_list.tail->data));
- external_acl_cache_delete(p, e);
+ while (lru_list.tail) {
+ ExternalACLEntryPointer e(static_cast<ExternalACLEntry *>(lru_list.tail->data));
+ external_acl_cache_delete(this, e);
+ }
+ if (cache)
+ hashFreeMemory(cache);
+
+ while (next) {
+ external_acl *node = next;
+ next = node->next;
+ node->next = NULL; // prevent recursion
+ delete node;
}
- if (p->cache)
- hashFreeMemory(p->cache);
}
/**
void
parse_externalAclHelper(external_acl ** list)
{
- external_acl *a;
- char *token;
-
- CBDATA_INIT_TYPE_FREECB(external_acl, free_external_acl);
-
- a = cbdataAlloc(external_acl);
-
- /* set defaults */
- a->ttl = DEFAULT_EXTERNAL_ACL_TTL;
- a->negative_ttl = -1;
- a->cache_size = 256*1024;
- a->children.n_max = DEFAULT_EXTERNAL_ACL_CHILDREN;
- a->children.n_startup = a->children.n_max;
- a->children.n_idle = 1;
- a->local_addr.setLocalhost();
- a->quote = external_acl::QUOTE_METHOD_URL;
-
- token = ConfigParser::NextToken();
+ external_acl *a = new external_acl;
+ char *token = ConfigParser::NextToken();
if (!token)
self_destruct();
void
free_externalAclHelper(external_acl ** list)
{
- while (*list) {
- external_acl *node = *list;
- *list = node->next;
- node->next = NULL;
- cbdataFree(node);
- }
+ delete *list;
+ *list = NULL;
}
static external_acl *
* external acl type
*/
-struct _external_acl_data {
+class external_acl_data
+{
+ CBDATA_CLASS(external_acl_data);
+
+public:
+ explicit external_acl_data(external_acl *aDef) : def(cbdataReference(aDef)), name(NULL), arguments(NULL) {}
+ ~external_acl_data();
+
external_acl *def;
const char *name;
wordlist *arguments;
};
-CBDATA_TYPE(external_acl_data);
-static void
-free_external_acl_data(void *data)
+CBDATA_CLASS_INIT(external_acl_data);
+
+external_acl_data::~external_acl_data()
{
- external_acl_data *p = static_cast<external_acl_data *>(data);
- safe_free(p->name);
- wordlistDestroy(&p->arguments);
- cbdataReferenceDone(p->def);
+ xfree(name);
+ wordlistDestroy(&arguments);
+ cbdataReferenceDone(def);
}
void
if (data)
self_destruct();
- CBDATA_INIT_TYPE_FREECB(external_acl_data, free_external_acl_data);
-
- data = cbdataAlloc(external_acl_data);
-
char *token = ConfigParser::strtokFile();
if (!token)
self_destruct();
- data->def = cbdataReference(find_externalAclHelper(token));
+ data = new external_acl_data(find_externalAclHelper(token));
if (!data->def)
self_destruct();
ACLExternal::~ACLExternal()
{
- cbdataFree(data);
- safe_free (class_);
+ delete data;
+ xfree(class_);
}
static void
* external_acl helpers
*/
-typedef struct _externalAclState externalAclState;
+class externalAclState
+{
+ CBDATA_CLASS(externalAclState);
+
+public:
+ externalAclState(external_acl* aDef, const char *aKey) :
+ callback(NULL),
+ callback_data(NULL),
+ key(xstrdup(aKey)),
+ def(cbdataReference(aDef)),
+ queue(NULL)
+ {}
+ ~externalAclState();
-struct _externalAclState {
EAH *callback;
void *callback_data;
char *key;
externalAclState *queue;
};
-CBDATA_TYPE(externalAclState);
-static void
-free_externalAclState(void *data)
+CBDATA_CLASS_INIT(externalAclState);
+
+externalAclState::~externalAclState()
{
- externalAclState *state = static_cast<externalAclState *>(data);
- safe_free(state->key);
- cbdataReferenceDone(state->callback_data);
- cbdataReferenceDone(state->def);
+ xfree(key);
+ cbdataReferenceDone(callback_data);
+ cbdataReferenceDone(def);
}
/*
do {
void *cbdata;
- cbdataReferenceDone(state->def);
-
if (state->callback && cbdataReferenceValidDone(state->callback_data, &cbdata))
state->callback(cbdata, entry);
next = state->queue;
+ state->queue = NULL;
- cbdataFree(state);
+ delete state;
state = next;
} while (state);
return;
}
- externalAclState *state = cbdataAlloc(externalAclState);
- state->def = cbdataReference(def);
-
- state->key = xstrdup(key);
+ externalAclState *state = new externalAclState(def, key);
if (!inBackground) {
state->callback = &ExternalACLLookup::LookupDone;
if (!def->theHelper->trySubmit(buf.buf, externalAclHandleReply, state)) {
debugs(82, 7, HERE << "'" << def->name << "' submit to helper failed");
assert(inBackground); // or the caller should have checked
- cbdataFree(state);
+ delete state;
return;
}
static void
externalAclStats(StoreEntry * sentry)
{
- external_acl *p;
-
- for (p = Config.externalAclHelperList; p; p = p->next) {
+ for (external_acl *p = Config.externalAclHelperList; p; p = p->next) {
storeAppendPrintf(sentry, "External ACL Statistics: %s\n", p->name);
storeAppendPrintf(sentry, "Cache size: %d\n", p->cache->count);
helperStats(sentry, p->theHelper);
void
externalAclInit(void)
{
- static int firstTimeInit = 1;
- external_acl *p;
-
- for (p = Config.externalAclHelperList; p; p = p->next) {
+ for (external_acl *p = Config.externalAclHelperList; p; p = p->next) {
if (!p->cache)
p->cache = hash_create((HASHCMP *) strcmp, hashPrime(1024), hash4);
helperOpenServers(p->theHelper);
}
- if (firstTimeInit) {
- firstTimeInit = 0;
- CBDATA_INIT_TYPE_FREECB(externalAclState, free_externalAclState);
- }
-
externalAclRegisterWithCacheManager();
}