summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/app_queue.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 13577cc68..963ac24a3 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -1014,8 +1014,6 @@ static char *app_ql = "QueueLog" ;
/*! \brief Persistent Members astdb family */
static const char * const pm_family = "Queue/PersistentMembers";
-/* The maximum length of each persistent member queue database entry */
-#define PM_MAX_LEN 8192
/*! \brief queues.conf [general] option */
static int queue_persistent_members = 0;
@@ -5815,17 +5813,19 @@ static struct member *interface_exists(struct call_queue *q, const char *interfa
static void dump_queue_members(struct call_queue *pm_queue)
{
struct member *cur_member;
- char value[PM_MAX_LEN];
- int value_len = 0;
- int res;
+ struct ast_str *value;
struct ao2_iterator mem_iter;
- memset(value, 0, sizeof(value));
-
if (!pm_queue) {
return;
}
+ /* 4K is a reasonable default for most applications, but we grow to
+ * accommodate more if necessary. */
+ if (!(value = ast_str_create(4096))) {
+ return;
+ }
+
mem_iter = ao2_iterator_init(pm_queue->members, 0);
while ((cur_member = ao2_iterator_next(&mem_iter))) {
if (!cur_member->dynamic) {
@@ -5833,26 +5833,28 @@ static void dump_queue_members(struct call_queue *pm_queue)
continue;
}
- res = snprintf(value + value_len, sizeof(value) - value_len, "%s%s;%d;%d;%s;%s",
- value_len ? "|" : "", cur_member->interface, cur_member->penalty, cur_member->paused, cur_member->membername, cur_member->state_interface);
+ ast_str_append(&value, 0, "%s%s;%d;%d;%s;%s",
+ ast_str_strlen(value) ? "|" : "",
+ cur_member->interface,
+ cur_member->penalty,
+ cur_member->paused,
+ cur_member->membername,
+ cur_member->state_interface);
ao2_ref(cur_member, -1);
-
- if (res != strlen(value + value_len)) {
- ast_log(LOG_WARNING, "Could not create persistent member string, out of space\n");
- break;
- }
- value_len += res;
}
ao2_iterator_destroy(&mem_iter);
-
- if (value_len && !cur_member) {
- if (ast_db_put(pm_family, pm_queue->name, value))
- ast_log(LOG_WARNING, "failed to create persistent dynamic entry!\n");
+
+ if (ast_str_strlen(value) && !cur_member) {
+ if (ast_db_put(pm_family, pm_queue->name, ast_str_buffer(value))) {
+ ast_log(LOG_WARNING, "failed to create persistent dynamic entry!\n");
+ }
} else {
/* Delete the entry if the queue is empty or there is an error */
ast_db_del(pm_family, pm_queue->name);
}
+
+ ast_free(value);
}
/*! \brief Remove member from queue
@@ -6356,7 +6358,7 @@ static void reload_queue_members(void)
struct ast_db_entry *db_tree;
struct ast_db_entry *entry;
struct call_queue *cur_queue;
- char queue_data[PM_MAX_LEN];
+ char *queue_data;
/* Each key in 'pm_family' is the name of a queue */
db_tree = ast_db_gettree(pm_family, NULL);
@@ -6383,7 +6385,7 @@ static void reload_queue_members(void)
continue;
}
- if (ast_db_get(pm_family, queue_name, queue_data, PM_MAX_LEN)) {
+ if (ast_db_get_allocated(pm_family, queue_name, &queue_data)) {
queue_t_unref(cur_queue, "Expire reload reference");
continue;
}
@@ -6428,6 +6430,7 @@ static void reload_queue_members(void)
}
}
queue_t_unref(cur_queue, "Expire reload reference");
+ ast_free(queue_data);
}
if (db_tree) {