|
|
|
@ -29,6 +29,7 @@ struct control_stream { |
|
|
|
|
|
|
|
struct control *control; |
|
|
|
struct poller *poller; |
|
|
|
int linked:1; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
@ -52,22 +53,28 @@ struct control { |
|
|
|
static void control_stream_closed(int fd, void *p, uintptr_t u) { |
|
|
|
struct control_stream *s = p; |
|
|
|
struct control *c; |
|
|
|
GList *l; |
|
|
|
GList *l = NULL; |
|
|
|
|
|
|
|
mylog(LOG_INFO, "Control connection from " DF " closed", DP(s->inaddr)); |
|
|
|
|
|
|
|
c = s->control; |
|
|
|
|
|
|
|
restart: |
|
|
|
mutex_lock(&c->lock); |
|
|
|
l = g_list_find(c->streams, s); |
|
|
|
if (l) |
|
|
|
if (s->linked) { |
|
|
|
/* we might get called when it's not quite linked yet */ |
|
|
|
l = g_list_find(c->streams, s); |
|
|
|
if (!l) { |
|
|
|
mutex_unlock(&c->lock); |
|
|
|
goto restart; |
|
|
|
} |
|
|
|
c->streams = g_list_delete_link(c->streams, l); |
|
|
|
s->linked = 0; |
|
|
|
} |
|
|
|
mutex_unlock(&c->lock); |
|
|
|
if (!l) |
|
|
|
return; |
|
|
|
obj_put(s); |
|
|
|
if (poller_del_item(s->poller, fd)) |
|
|
|
abort(); |
|
|
|
if (l) |
|
|
|
obj_put(s); |
|
|
|
poller_del_item(s->poller, fd); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -78,7 +85,9 @@ static void control_list(struct control *c, struct control_stream *s) { |
|
|
|
mutex_lock(&c->lock); |
|
|
|
for (l = c->streams; l; l = l->next) { |
|
|
|
i = l->data; |
|
|
|
mutex_lock(&s->lock); |
|
|
|
streambuf_printf(s->outbuf, DF "\n", DP(i->inaddr)); |
|
|
|
mutex_unlock(&s->lock); |
|
|
|
} |
|
|
|
mutex_unlock(&c->lock); |
|
|
|
|
|
|
|
@ -113,7 +122,7 @@ static int control_stream_parse(struct control_stream *s, char *line) { |
|
|
|
else if (!strcmp(out[RE_TCP_DIV_CMD], "status")) |
|
|
|
calls_status(c->callmaster, s); |
|
|
|
else if (!strcmp(out[RE_TCP_DIV_CMD], "build") | !strcmp(out[RE_TCP_DIV_CMD], "version")) |
|
|
|
streambuf_printf(s->outbuf, "Version: %s\n", MEDIAPROXY_VERSION); |
|
|
|
control_stream_printf(s, "Version: %s\n", MEDIAPROXY_VERSION); |
|
|
|
else if (!strcmp(out[RE_TCP_DIV_CMD], "controls")) |
|
|
|
control_list(c, s); |
|
|
|
else if (!strcmp(out[RE_TCP_DIV_CMD], "quit") || !strcmp(out[RE_TCP_DIV_CMD], "exit")) |
|
|
|
@ -226,6 +235,7 @@ next: |
|
|
|
s->outbuf = streambuf_new(c->poller, nfd); |
|
|
|
memcpy(&s->inaddr, &sin, sizeof(s->inaddr)); |
|
|
|
mutex_init(&s->lock); |
|
|
|
s->linked = 1; |
|
|
|
|
|
|
|
ZERO(i); |
|
|
|
i.fd = nfd; |
|
|
|
|