From c3ad30063dcbeca46be614c37bd436c39eb76d06 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 14 Apr 2011 15:58:30 +0000 Subject: [PATCH] implement delete UDP command --- daemon/Makefile | 4 +++- daemon/aux.c | 1 - daemon/call.c | 28 +++++++++++++++++++++++++--- daemon/call.h | 1 + daemon/control_udp.c | 12 +++++++----- daemon/main.c | 2 +- 6 files changed, 37 insertions(+), 11 deletions(-) diff --git a/daemon/Makefile b/daemon/Makefile index 18982bfd9..f17fb388b 100644 --- a/daemon/Makefile +++ b/daemon/Makefile @@ -1,5 +1,7 @@ CC= gcc -CFLAGS= -g -Wall `pkg-config --cflags glib-2.0` `pcre-config --cflags` -I/lib/modules/`uname -r`/build/include/ -I../kernel-module/ +CFLAGS= -g -Wall `pkg-config --cflags glib-2.0` `pcre-config --cflags` +CFLAGS+= -I/lib/modules/`uname -r`/build/include/ -I../kernel-module/ +CFLAGS+= -D_GNU_SOURCE #CFLAGS+= -O2 LDFLAGS= `pkg-config --libs glib-2.0` `pcre-config --libs` diff --git a/daemon/aux.c b/daemon/aux.c index 04e65d396..ed98ac1e3 100644 --- a/daemon/aux.c +++ b/daemon/aux.c @@ -1,4 +1,3 @@ -#define _GNU_SOURCE #include #include #include diff --git a/daemon/call.c b/daemon/call.c index 1df213b53..73b063fc7 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -288,9 +288,6 @@ static int info_parse_func(char **a, void **ret, void *p) { static GHashTable *info_parse(const char *s, GHashTable **h) { GQueue *q; - if (!*h) - *h = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); - q = pcre_multi_match(&info_re, &info_ree, "^([^:,]+)(?::(.*?))?(?:$|,)", s, 2, info_parse_func, *h); g_queue_free(q); @@ -317,6 +314,7 @@ static int streams_parse_func(char **a, void **ret, void *p) { return 0; fail: + mylog(LOG_WARNING, "Failed to parse a media stream: %s:%s", a[0], a[1]); free(st->mediatype); free(st); return -1; @@ -889,6 +887,7 @@ static struct call *call_get_or_create(const char *callid, struct callmaster *m) c->callid = strdup(callid); c->callstreams = g_queue_new(); c->created = m->poller->now; + c->infohash = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); g_hash_table_insert(m->callhash, c->callid, c); } @@ -919,6 +918,7 @@ char *call_update_udp(const char **o, struct callmaster *m) { return streams_print(c->callstreams, 1, 0, o[1]); fail: + mylog(LOG_WARNING, "Failed to parse a media stream: %s:%s", o[5], o[6]); return NULL; } @@ -951,6 +951,7 @@ char *call_lookup_udp(const char **o, struct callmaster *m) { return streams_print(c->callstreams, 1, 1, o[1]); fail: + mylog(LOG_WARNING, "Failed to parse a media stream: %s:%s", o[5], o[6]); return NULL; } @@ -990,6 +991,27 @@ char *call_lookup(const char **o, struct callmaster *m) { return streams_print(c->callstreams, num, 1, NULL); } +char *call_delete_udp(const char **o, struct callmaster *m) { + struct call *c; + char *ret; + + c = g_hash_table_lookup(m->callhash, o[11]); + if (!c) + goto err; + + call_destroy(c); + + asprintf(&ret, "%s 0\n", o[1]); + goto out; + +err: + asprintf(&ret, "%s E8\n", o[1]); + goto out; + +out: + return ret; +} + void call_delete(const char **o, struct callmaster *m) { struct call *c; diff --git a/daemon/call.h b/daemon/call.h index 799b67f88..4128f9e7f 100644 --- a/daemon/call.h +++ b/daemon/call.h @@ -92,6 +92,7 @@ char *call_update_udp(const char **, struct callmaster *); char *call_lookup(const char **, struct callmaster *); char *call_lookup_udp(const char **, struct callmaster *); void call_delete(const char **, struct callmaster *); +char *call_delete_udp(const char **, struct callmaster *); void calls_status(struct callmaster *, struct control_stream *); diff --git a/daemon/control_udp.c b/daemon/control_udp.c index 1b043683f..9f62af00a 100644 --- a/daemon/control_udp.c +++ b/daemon/control_udp.c @@ -50,15 +50,15 @@ static void control_udp_incoming(int fd, void *p) { if (!parse_re) { parse_re = pcre_compile( - /* cookie cmd flags callid addr port from_tag to_tag */ - "^(\\S+)\\s+(?:([ul])(\\S*)\\s+(\\S+)\\s+([\\d.]+)\\s+(\\d+)\\s+(\\S+)\\s+(\\S+))", + /* cookie cmd flags callid addr port from_tag to_tag cmd flags callid */ + "^(\\S+)\\s+(?:([ul])(\\S*)\\s+(\\S+)\\s+([\\d.]+)\\s+(\\d+)\\s+(\\S+?)(?:;\\S+)?(?:\\s+(\\S+?)(?:;\\S+)?)?|(d)(\\S*)\\s+(\\S+))", PCRE_DOLLAR_ENDONLY | PCRE_DOTALL | PCRE_CASELESS, &errptr, &erroff, NULL); parse_ree = pcre_study(parse_re, 0, &errptr); } ret = pcre_exec(parse_re, parse_ree, buf, ret, 0, 0, ovec, ARRAY_SIZE(ovec)); if (ret <= 0) { - mylog(LOG_WARNING, "Unable to parse command line from " DF ": %s", DP(sin), buf); + mylog(LOG_WARNING, "Unable to parse command line from udp:" DF ": %s", DP(sin), buf); return; } @@ -76,10 +76,12 @@ static void control_udp_incoming(int fd, void *p) { goto out; } - if (out[1][0] == 'u' || out[1][0] == 'U') + if (out[2][0] == 'u' || out[2][0] == 'U') reply = call_update_udp(out, u->callmaster); - else if (out[1][0] == 'l' || out[1][0] == 'L') + else if (out[2][0] == 'l' || out[2][0] == 'L') reply = call_lookup_udp(out, u->callmaster); + else if (out[9][0] == 'd' || out[9][0] == 'D') + reply = call_delete_udp(out, u->callmaster); if (reply) { sendto(fd, reply, strlen(reply), 0, (struct sockaddr *) &sin, sin_len); diff --git a/daemon/main.c b/daemon/main.c index 14b7af0c5..535e5b3ab 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -123,7 +123,7 @@ static void options(int *argc, char ***argv) { if (!ips) die("Missing option IP\n"); - if (!listenps || !listenudps) + if (!listenps && !listenudps) die("Missing option LISTEN or LISTEN-UDP\n"); ip = inet_addr(ips);