aboutsummaryrefslogtreecommitdiffstats
path: root/manager.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-10-03 19:40:03 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-10-03 19:40:03 +0000
commit1e8980527e10d2a58599684d28325d359062b6ea (patch)
tree7afb2522d262e31ebee5c50b779aa11b9c25e537 /manager.c
parent997e6dd0d5f6f99b50dc88f06319e027530589f8 (diff)
don't build manager event output until it is needed
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6709 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'manager.c')
-rwxr-xr-xmanager.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/manager.c b/manager.c
index 5e8cac8be..1df35bdae 100755
--- a/manager.c
+++ b/manager.c
@@ -1474,18 +1474,11 @@ int manager_event(int category, char *event, char *fmt, ...)
{
struct mansession *s;
char auth[80];
- char tmp[4096];
+ char tmp[4096] = "";
char *tmp_next = tmp;
size_t tmp_left = sizeof(tmp) - 2;
va_list ap;
- ast_build_string(&tmp_next, &tmp_left, "Event: %s\r\nPrivilege: %s\r\n",
- event, authority_to_str(category, auth, sizeof(auth)));
- va_start(ap, fmt);
- ast_build_string_va(&tmp_next, &tmp_left, fmt, ap);
- va_end(ap);
- strcat(tmp, "\r\n");
-
ast_mutex_lock(&sessionlock);
for (s = sessions; s; s = s->next) {
if ((s->readperm & category) != category)
@@ -1494,10 +1487,21 @@ int manager_event(int category, char *event, char *fmt, ...)
if ((s->send_events & category) != category)
continue;
+ if (ast_strlen_zero(tmp)) {
+ ast_build_string(&tmp_next, &tmp_left, "Event: %s\r\nPrivilege: %s\r\n",
+ event, authority_to_str(category, auth, sizeof(auth)));
+ va_start(ap, fmt);
+ ast_build_string_va(&tmp_next, &tmp_left, fmt, ap);
+ va_end(ap);
+ *tmp_next++ = '\r';
+ *tmp_next++ = '\n';
+ *tmp_next = '\0';
+ }
+
ast_mutex_lock(&s->__lock);
if (s->busy) {
append_event(s, tmp);
- } else if (ast_carefulwrite(s->fd, tmp, sizeof(tmp) - tmp_left + 1, 100) < 0) {
+ } else if (ast_carefulwrite(s->fd, tmp, tmp_next - tmp, 100) < 0) {
ast_log(LOG_WARNING, "Disconnecting slow (or gone) manager session!\n");
s->dead = 1;
pthread_kill(s->t, SIGURG);