[asterisk-commits] branch oej/aum - r7388 in /team/oej/aum:
configs/ include/asterisk/ res/
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Wed Dec 7 21:24:31 CST 2005
Author: oej
Date: Wed Dec 7 21:24:27 2005
New Revision: 7388
URL: http://svn.digium.com/view/asterisk?rev=7388&view=rev
Log:
Caching realtime users, adding configuration support for more options. (Not tested yet). New function in linkedlists.h: AST_LIST_REMOVE_TAIL
Modified:
team/oej/aum/configs/aum.conf.sample
team/oej/aum/include/asterisk/aum.h
team/oej/aum/include/asterisk/linkedlists.h
team/oej/aum/res/res_aum.c
Modified: team/oej/aum/configs/aum.conf.sample
URL: http://svn.digium.com/view/asterisk/team/oej/aum/configs/aum.conf.sample?rev=7388&r1=7387&r2=7388&view=diff
==============================================================================
--- team/oej/aum/configs/aum.conf.sample (original)
+++ team/oej/aum/configs/aum.conf.sample Wed Dec 7 21:24:27 2005
@@ -1,27 +1,47 @@
;AUM configuration file
+
[general]
-test=test
+;debug=yes ; AUM debugging
+;------------ REALTIME
+;realtimecachelimit = 100 ; Maximum number of users in realtime cache
+ ; Default = 100
+
+;The groups section contain a list of all groups
+; We have to do this to pre-load groups
+; (Looking for another solution)
[groups]
group=edvina
group=digium
+group=asteriskmanagers
+; Group definition
+; Groups are used as templates for users, not as objects in themselves
[digium]
type=group
musicclass=digium-sales-pitch
+setvar=DIGIUMSTAFF=yes
[edvina]
type=group
musicclass=edvina-slow
+deny=all
+permit=192.168.40.0/24
[asteriskmanagers]
type=group
-managerperm=system
+managerperm=system ; Manager permissions for these users
+setvar=SUPERUSER=400
-[admin]
+[admin] ; Admin user
+;Which groups does this user belong to?
group=asteriskmanagers
group=digium
+;Pin code for this user
pincode=1235
+email=postmaster at mylittledomain.com
+firstname=Charlie
+lastname=Root
[nancy]
pincode=1234
Modified: team/oej/aum/include/asterisk/aum.h
URL: http://svn.digium.com/view/asterisk/team/oej/aum/include/asterisk/aum.h?rev=7388&r1=7387&r2=7388&view=diff
==============================================================================
--- team/oej/aum/include/asterisk/aum.h (original)
+++ team/oej/aum/include/asterisk/aum.h Wed Dec 7 21:24:27 2005
@@ -30,6 +30,13 @@
#ifndef _ASTERISK_AUM_H
#define _ASTERISK_AUM_H
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
/*--------------------------- AUM STRING HANDLING -------------------------------- */
/*! Character set definition for some strings */
@@ -116,6 +123,8 @@
AUM_CNF_MANAGERACCESS, /*!< Manager access something */
AUM_CNF_SECRET, /*!< Secret (password) */
AUM_CNF_PIN, /*!< Pin code for authorization by DTMF */
+ AUM_CNF_CALLGROUP, /*!< Calling group */
+ AUM_CNF_PICKUPGROUP, /*!< Pickup group */
AUM_CNF_IAX2KEY, /*!< Name of IAX key */
AUM_CNF_MUSICCLASS, /*!< Default music class when this user puts someone on hold */
AUM_CNF_LDAPDN, /*!< LDAP handle for this user */
@@ -220,6 +229,18 @@
AST_LIST_ENTRY(aum_group_member) list; /*!< List mechanics */
};
+/*! \brief Flags for aum_user flag field */
+enum aum_user_flags {
+ AUM_USER_FLAG_REALTIME = (1 << 0), /*!< User loaded from realtime */
+ AUM_USER_FLAG_DISABLED = (1 << 1), /*!< User disabled */
+};
+
+/*! \brief Flags for aum_group flag field */
+enum aum_group_flags {
+ AUM_GROUP_FLAG_REALTIME = (1 << 0), /*!< Group loaded from realtime */
+ AUM_GROUP_FLAG_DISABLED = (1 << 1), /*!< Group disabled */
+}
+
/*! \brief Declaration of grouplist structure for inclusion in objects */
AST_LIST_HEAD(aum_user_grouplist, aum_group_member);
@@ -235,10 +256,12 @@
*/
struct aum_user {
ASTOBJ_COMPONENTS(struct aum_user); /*!< Generic pointers - name being one */
+ unsigned int flags; /*!< Flags for various stuff, see AUM_USER_FLAG_* */
char mailbox[AST_MAX_EXTENSION]; /*!< Default mailbox */
char default_exten[AST_MAX_EXTENSION]; /*!< Default extension for this user (for callbacks) */
char cid_num[256]; /*!< Default caller ID num (E.164 type) */
char cid_name[256]; /*!< Default caller ID name */
+ int calling_pres; /*!< Default Caller ID presentation */
char accountcode[AST_MAX_ACCOUNT_CODE]; /*!< Default Account code */
char sip_username[256]; /*!< SIP user name (utf8) */
char musicclass[MAX_MUSICCLASS]; /*!< Default musicclass for this user */
@@ -246,35 +269,40 @@
char last_name[80]; /*!< Last name (ISO 8859-1) */
char title[20]; /*!< Title */
char language[MAX_LANGUAGE]; /*!< Default language */
- struct aum_presencelist presence; /*! Presence states */
+ char iax2privatekey[20]; /*!< Private key for this user */
char zonetag[80]; /*!< Time zone */
char numuserid[80]; /*!< Numeric user ID for this user */
char pincode[80]; /*!< Numeric pincode for this user */
char secret[80]; /*!< Secret for this user */
char ldapdn[180]; /*!< LDAP DN */
char registrar[20]; /*!< Who added this object? */
+ ast_group_t callgroup; /*!< Calling group for calls */
+ ast_group_t pickupgroup; /*!< Pickup group */
struct ast_variable *chanvars; /*!< Default channel variables */
+ struct aum_presencelist presence; /*! Presence states */
struct aum_user_contextlist contexts; /*!< Linked list of contexts this user use */
struct aum_user_grouplist groups; /*!< Linked list of groups we are members to */
struct aum_user_addrlist address; /*!< Linked list of addresses of various types */
struct ast_ha *acl; /*!< Access control list for user */
/*!< The highest priority is used as primary group for setting default values */
int managerperm; /*!< If sat, this user can log in to manager with these permissions */
- int calling_pres; /*!< Default Caller ID presentation */
};
/*! \brief the AUM group definition */
struct aum_group {
- ASTOBJ_COMPONENTS(struct aum_group);
+ ASTOBJ_COMPONENTS(struct aum_group); /*! Generic pointers and name field */
+ unsigned int flags; /*!< Flags for various stuff, see AUM_GROUP_FLAG_* */
char sipdomain[120]; /*!< Should be AST_MAX_DOMAIN something */
char incoming_did[AST_MAX_EXTENSION]; /*!< Main DID for this group */
char language[MAX_LANGUAGE]; /*!< Default language for group */
char musicclass[MAX_MUSICCLASS]; /*!< Default musicclass for this group */
+ ast_group_t callgroup; /*!< Calling group for calls */
+ ast_group_t pickupgroup; /*!< Pickup group */
int managerperm; /*!< This group's permissions in manager */
struct aum_user_contextlist contexts; /*!< Linked list of contexts this group use */
struct ast_variable *chanvars;
char *description; /*!< Description */
- struct aum_user_grouplist members;
+ struct aum_user_grouplist members; /*!< Members list */
char language[MAX_LANGUAGE]; /*!< Default language */
char registrar[20]; /*!< Who added this object? */
};
Modified: team/oej/aum/include/asterisk/linkedlists.h
URL: http://svn.digium.com/view/asterisk/team/oej/aum/include/asterisk/linkedlists.h?rev=7388&r1=7387&r2=7388&view=diff
==============================================================================
--- team/oej/aum/include/asterisk/linkedlists.h (original)
+++ team/oej/aum/include/asterisk/linkedlists.h Wed Dec 7 21:24:27 2005
@@ -414,6 +414,27 @@
})
/*!
+ \brief Removes and returns the tail entry from a list.
+ \param head This is a pointer to the list head structure
+ \param field This is the name of the field (declared using AST_LIST_ENTRY())
+ used to link entries of this list together.
+
+ Removes the tail entry from the list, and returns a pointer to it.
+ This macro is safe to call on an empty list.
+ */
+#define AST_LIST_REMOVE_TAIL(head, field) ({ \
+ typeof((head)->first) cur = (head)->last; \
+ if (cur) { \
+ (head)->last = cur->field.prev; \
+ (head)->last->field.next = NULL; \
+ if ((head)->first == cur) \
+ (head)->first = NULL; \
+ } \
+ cur; \
+ })
+
+
+/*!
\brief Removes a specific entry from a list.
\param head This is a pointer to the list head structure
\param elm This is a pointer to the entry to be removed.
Modified: team/oej/aum/res/res_aum.c
URL: http://svn.digium.com/view/asterisk/team/oej/aum/res/res_aum.c?rev=7388&r1=7387&r2=7388&view=diff
==============================================================================
--- team/oej/aum/res/res_aum.c (original)
+++ team/oej/aum/res/res_aum.c Wed Dec 7 21:24:27 2005
@@ -163,6 +163,21 @@
- Current user status can be changed through dialplan functions,
manager or IM channels/gateways (Jabber, SIP, other)
- We need to synch status levels with other IM (SIMPLE/Jabber/XMPP)
+
+ \par Realtime usage
+ AUM uses ARA - the realtime architecture - to load users and groups.
+ The realtime handles for AUM is
+ - \b aumusers For users
+ - \b aumgroups For the realtime groups
+
+ AUM will cache realtime users in memory after we load them.
+ Every time a realtime user is accessed, it's moved to top of
+ the cache. When we reach the maximum number of cached users,
+ AUM mwill delete from the bottom of the cache while adding the
+ missing user to the top.
+
+ The AUM cache size will be configurable in the general
+ section of aum.conf
\par Things to do
- Implement all core AUM api functions from aum.h
@@ -249,6 +264,16 @@
ASTOBJ_CONTAINER_COMPONENTS(struct aum_user);
} aum_userlist;
+/*! \brief the realtime user cache */
+static struct aum_usercache_struct {
+ AST_LIST_ENTRY(aum_usercache) list;
+ struct aum_user *user;
+};
+
+static int aum_usercache_count = 0;
+static int aum_usercache_max = 50;
+static AST_LIST_HEAD_STATIC(aum_usercache_struct, aum_usercache);
+
/*! brief Different config options for address formats */
static struct aum_address_config_struct aum_address_config[] = {
{AUM_ADDR_EMAIL, "email", "E-mail", AUM_CNF_ADDR_EMAIL},
@@ -329,6 +354,8 @@
ast_cli(fd, " Users - realtime: %-10.10d\n", aum_real_users);
if (aum_real_groups_enabled)
ast_cli(fd, " Groups - realtime: %-10.10d\n", aum_real_groups);
+ if (aum_real_users_enabled)
+ ast_cli(fd, " Realtime cache: %d objects (%-10.10d kb) \n", aum_usercache_count, (aum_usercache_count * (sizeof(struct aum_user) + sizeof(struct aum_usercache_struct)) / 1000 ) );
ast_cli(fd, "\n\n");
return RESULT_SUCCESS;
@@ -344,18 +371,21 @@
static int cli_aum_show_users(int fd, int argc, char *argv[])
{
int numusers = 0;
+ int numgroups = 0;
if (argc != 3)
return RESULT_SHOWUSAGE;
- int numgroups = 0;
if (argc != 3)
return RESULT_SHOWUSAGE;
ASTOBJ_CONTAINER_TRAVERSE(&aum_userlist, 1, {
ASTOBJ_RDLOCK(iterator);
- ast_cli(fd, " %-20.20s \n", iterator->name);
- numusers ++;
+ if (!ast_test_flag(iterator, AST_USER_FLAG_REALTIME)) {
+ ast_cli(fd, " %-20.20s: %-10.10s %-15.15s %-10.10s %s\n", iterator->name, iterator->first_name, iterator->last_name, iterator->numuserid, ast_test_flag(iterator, AUM_USER_FLAG_DISABLED) ? "* DISABLED *" : "");
+ if (ast_test_flag(user, AUM_USER_FLAG_DISABLED))
+ numusers ++;
+ }
ASTOBJ_UNLOCK(iterator);
} );
ast_cli(fd, "-- Number of users: %d\n", numusers);
@@ -387,6 +417,21 @@
return RESULT_SUCCESS;
}
ast_cli(fd, "* Userid: %s\n", user->name);
+
+ if (ast_test_flag(user, AUM_USER_FLAG_REALTIME))
+ ast_cli(fd, " Usertype: Realtime (cached)\n");
+ else
+ ast_cli(fd, " Usertype: Static\n");
+
+ if (ast_test_flag(user, AUM_USER_FLAG_DISABLED))
+ ast_cli(fd, " Status: Disabled\n");
+ else
+ ast_cli(fd, " Status: Enabled\n");
+
+ if (!ast_strlen_zero(user->title))
+ ast_cli(fd, " Title: %s\n", user->title);
+ if (!ast_strlen_zero(user->last_name))
+ ast_cli(fd, " Name: %s %s\n", user->first_name, user->last_name);
AST_LIST_TRAVERSE(&user->groups, member, list) {
ast_cli(fd, " Member of : %s\n", member->group->name);
@@ -399,6 +444,11 @@
AST_LIST_TRAVERSE(&user->contexts, context, list) {
ast_cli(fd, " %s Context : %s\n", context_type2str(context->type), context->context);
};
+ ast_cli(fd, " Numeric ID : %s\n", user->numuserid);
+ ast_cli(fd, " Secret : %s\n", !ast_strlen_zero(user->secret) ? "<set>" : "<not set>");
+ ast_cli(fd, " Music class: %s\n", user->musicclass);
+ ast_cli(fd, " Language: %s\n", user->language);
+ ast_cli(fd, " Mailbox: %s\n", user->mailbox);
return RESULT_SUCCESS;
}
@@ -675,6 +725,8 @@
{ AUM_CNF_DENY, "deny" ,AUM_CONFOBJ_USER & AUM_CONFOBJ_GROUP },
{ AUM_CNF_NUMID, "numericid" ,AUM_CONFOBJ_USER },
{ AUM_CNF_SIPDOMAIN, "sipdomain" ,AUM_CONFOBJ_USER & AUM_CONFOBJ_GROUP },
+ { AUM_CNF_CALLGROUP, "callgroup" ,AUM_CONFOBJ_USER & AUM_CONFOBJ_GROUP },
+ { AUM_CNF_PICKUPGROUP, "pickupgroup" ,AUM_CONFOBJ_USER & AUM_CONFOBJ_GROUP },
{ AUM_CNF_GROUPVAR, "changroup" ,AUM_CONFOBJ_USER & AUM_CONFOBJ_GROUP },
{ AUM_CNF_GROUPDESC, "description" ,AUM_CONFOBJ_GROUP },
{ AUM_CNF_TYPE, "type" ,AUM_CONFOBJ_GENERAL },
@@ -832,6 +884,81 @@
return newcontext;
}
+
+/*! \brief Release all cached realtime users */
+static void aum_rtcache_freeall(void) {
+ struct aum_usercache_struct *temp;
+
+ AST_LIST_LOCK(aum_usercache);
+
+ if (!AST_LIST_EMPTY(&aum_usercache) ) {
+ AST_LIST_LOCK(&aum_usercache);
+ while ((temp = AST_LIST_REMOVE_HEAD(&aum_usercache, list)))
+ aum_destroy_user(temp->user);
+ free(temp);
+ AST_LIST_UNLOCK(&aum_usercache);
+ }
+}
+
+/*! \brief Add realtime user to top of the cache
+ If the cache is full, the user at the bottom of the cache is
+ simply removed from memory
+ \param user AUM user to add to the top
+*/
+static void aum_rtcache_add(struct aum_user *user) {
+ struct aum_usercache_struct *temp;
+ struct aum_usercache_struct *aums;
+
+ aums = aum_allocate(sizeof(aum_usercache_struct);
+ if (!aums)
+ return; /* Allocation error */
+
+ aums->user = user;
+
+ /* Check whether we need to clean up before adding to list */
+ if (aum_usercache_count == aum_usercache_max) {
+ /* Remove user from cache and delete */
+ AST_LIST_LOCK(&aum_usercache);
+ temp = AST_LIST_REMOVE_TAIL(&aum_usercache, list);
+ AST_LIST_UNLOCK(&aum_usercache);
+ aum_destroy_user(temp->user);
+ free(temp);
+ aum_usercache_count--;
+ }
+
+ /* Move it into the list */
+ AST_LIST_LOCK(&aum_usercache);
+ AST_LIST_INSERT_HEAD(&aum_usercache, aums, list);
+ AST_LIST_UNLOCK(&aum_usercache);
+ aum_usercache_count++;
+
+ return;
+}
+
+/*! \brief Add realtime user to top of the cache
+ Called when a user object is accessed
+*/
+static void aum_rtcache_movetotop(struct aum_user *user) {
+ struct aum_usercache_struct *temp;
+ struct aum_usercache_struct *top_of_the_class = (struct aum_usercache_struct) NULL;
+
+ /* Find user in cache */
+ AST_LIST_TRAVERSE_SAFE_BEGIN(aum_usercache, temp, list) {
+ if (temp->user == user) {
+ top_of_the_class = temp;
+ /* Remove from current position in list */
+ AST_LIST_LOCK(aum_usercache);
+ AST_LIST_REMOVE_CURRENT();
+ }
+ }
+ /* Add her to top */
+ if (top_of_the_class) {
+ AST_LIST_INSERT_HEAD(aum_usercache, top_of_the_class, list);
+ AST_LIST_UNLOCK(aum_usercache);
+ }
+
+ /* Return */
+}
/*! \brief Parse configuration file and build AUM in-memory user
@@ -905,6 +1032,7 @@
case AUM_CNF_DEFCONTEXT:
case AUM_CNF_SUBSCRIBECONTEXT:
case AUM_CNF_DISACONTEXT:
+ break;
context = build_context(AUM_CONTEXT_NONE, option, x->value);
if (context)
AST_LIST_INSERT_TAIL(&user->contexts, context, list);
@@ -912,23 +1040,38 @@
ast_log(LOG_ERROR, "Context %s not added for user %s\n", x->value, username);
break;
case AUM_CNF_DEFEXTEN:
+ ast_copy_string(&user->default_exten, x->value, sizeof(&user->default_exten);
break;
case AUM_CNF_CID:
+ ast_callerid_split(v->value, user->cid_name, sizeof(user->cid_name), user->cid_num, sizeof(user->cid_num));
break;
case AUM_CNF_CALLERPRES:
+ user->calling_pres = ast_parse_caller_presentation(v->value);
+ if (user->callingpres == -1)
+ user->calling_pres = atoi(v->value);
+
break;
case AUM_CNF_TIMEZONE:
break;
+ case AUM_CNF_CALLGROUP:
+ user->callgroup = ast_get_group(v->value);
+ break;
+ case AUM_CNF_PICKUPGROUP:
+ user->pickupgroup = ast_get_group(v->value);
+ break;
case AUM_CNF_ACCOUNTCODE:
+ ast_copy_string(&user->accountcode, x->value, sizeof(&user->accountcode);
break;
case AUM_CNF_MANAGERACCESS:
break;
case AUM_CNF_SECRET:
+ ast_copy_string(&user->secret, x->value, sizeof(&user->secret);
break;
case AUM_CNF_PIN:
ast_copy_string(user->pincode, x->value, sizeof(user->pincode));
break;
case AUM_CNF_IAX2KEY:
+ ast_copy_string(user->pincode, x->value, sizeof(user->pincode));
break;
case AUM_CNF_MUSICCLASS:
ast_copy_string(user->musicclass, x->value, sizeof(user->musicclass));
@@ -947,22 +1090,36 @@
case AUM_CNF_SOUNDNAME:
break;
case AUM_CNF_CHANVAR:
+ /* Set peer channel variable */
+ varname = ast_strdupa(v->value);
+ if (varname && (varval = strchr(varname,'='))) {
+ struct ast_variable *tmpvar;
+ *varval = '\0';
+ varval++;
+ if ((tmpvar = ast_variable_new(varname, varval))) {
+ tmpvar->next = user->chanvars;
+ user->chanvars = tmpvar;
+ }
+ }
break;
case AUM_CNF_GROUPVAR: /* Channel group to set */
+ // chanvars GROUP
break;
case AUM_CNF_PERMIT:
- break;
case AUM_CNF_DENY:
+ // ACL
+ user->acl = ast_append_ha(v->name, v->value, user->acl);
break;
case AUM_CNF_NUMID:
+ ast_copy_string(user->numuserid, x->value, sizeof(user->numuserid));
+ break;
+ case AUM_CNF_DEBUG: /* GENERAL setting only */
+ break;
+ case AUM_CNF_GROUPDESC: /* Only for groups */
+ break;
+ case AUM_CNF_TYPE: /* NO op */
break;
case AUM_CNF_SIPDOMAIN:
- break;
- case AUM_CNF_DEBUG: /* GENERAL setting only */
- break;
- case AUM_CNF_GROUPDESC: /* Only for groups */
- break;
- case AUM_CNF_TYPE: /* NO op */
break;
case AUM_CNF_NOT_FOUND:
ast_log(LOG_NOTICE, "Configuration label unknown in AUM configuration: %s\n", x->name);
@@ -978,6 +1135,9 @@
x = x->next;
}
ASTOBJ_CONTAINER_LINK(&aum_userlist, user);
+ if (realtime)
+ aum_realtime_cacheadd(user);
+
aum_static_users++;
//ASTOBJ_UNMARK(user);
ast_log(LOG_VERBOSE, "-- == Finished building user: %s\n", username);
@@ -1058,6 +1218,7 @@
if (group) {
ASTOBJ_CONTAINER_LINK(&aum_grouplist, group);
aum_real_groups++;
+ ast_set_flag(group, AUM_GROUP_FLAG_REALTIME);
}
ast_variables_destroy(var);
return group;
@@ -1069,8 +1230,7 @@
\param field name to match on
\param value the value of the field
- */
-
+*/
static struct aum_user *aum_user_realtime_loadbyfield(char *field, char *value)
struct aum_user *user = (struct aum_user *) NULL;
struct ast_variable *var;
@@ -1084,6 +1244,7 @@
if (user) {
ASTOBJ_CONTAINER_LINK(&aum_userlist, user);
aum_real_users++;
+ ast_set_flag(user, AUM_USER_FLAG_REALTIME);
}
ast_variables_destroy(var);
return user;
@@ -1143,6 +1304,9 @@
AST_LIST_UNLOCK(&user->groups);
}
};
+
+ if (ast_test_flag(user, AST_USER_FLAG_REALTIME))
+ aum_rtcache_movetotop(struct aum_user *user);
}
/*! \brief Destroy AUM group object */
@@ -1165,6 +1329,10 @@
AST_LIST_UNLOCK(&group->members);
}
+ /* clear channel variables */
+ if (group->chanvars)
+ ast_variables_destroy(group->chanvars);
+
/* Release the group itself */
aum_free(group);
}
@@ -1205,7 +1373,12 @@
AST_LIST_UNLOCK(&user->contexts);
}
-
+ /* clear channel variables */
+ if (user->chanvars)
+ ast_variables_destroy(user->chanvars);
+
+ /* Clear the ACL */
+ ast_free_ha(user->acl);
/* Release the user itself */
aum_free(user);
@@ -1317,7 +1490,7 @@
ast_config_destroy(cfg);
/* Done, tell the manager */
- //manager_event(EVENT_FLAG_SYSTEM, "ChannelReload", "Channel: SIP\r\nReloadReason: %s\r\nRegistry_Count: %d\r\nPeer_Count: %d\r\nUser_Count: %d\r\n\r\n", modulereloadreason2txt(reason), registry_count, peer_count, user_count);
+ manager_event(EVENT_FLAG_SYSTEM, "ModuleReload", "Module: res_aum.so\r\nReloadReason: %s\r\nAUMUserCount: %d\r\nAUMGroupCount: %d\r\n\r\n\r\n", modulereloadreason2txt(reason), aum_static_users, aum_static_groups);
return 0;
}
@@ -1434,10 +1607,14 @@
{
struct aum_user *res;
+ /* Search among static and cached realtime users */
res = ASTOBJ_CONTAINER_FIND(&aum_userlist, userid);
if (!res && aum_real_users_enabled) {
res = aum_user_realtime_load(username);
- };
+ } else if (res && ast_test_flag(user, AST_USER_FLAG_REALTIME))
+ /* Move user to top of cache */
+ aum_rtcache_movetotop(struct aum_user *user);
+ }
return res;
}
@@ -1475,6 +1652,7 @@
{
initialize_charset_conversion();
reload_config(MODULE__LOAD);
+ aum_rtcache_freeall();
aum_real_groups_enabled = ast_check_realtime("aumgroups");
aum_real_users_enabled = ast_check_realtime("aumgroups");
@@ -1491,6 +1669,7 @@
/* Unregister apps, functions, manager actions, switches */
ast_cli_unregister_multiple(my_clis, sizeof(my_clis)/ sizeof(my_clis[0]));
ast_custom_function_unregister(&aum_user_function);
+ aum_rtcache_freeall();
/* Deallocate iconv conversion descriptors */
iconv_close(ichandler_utf8_to_iso88591);
More information about the asterisk-commits
mailing list