diff --git a/src/Main.c b/src/Main.c index 7538431..78da1f0 100644 --- a/src/Main.c +++ b/src/Main.c @@ -34,21 +34,8 @@ SignalHandler(int signal) return; } /* Create a loopback stanza, forcing the thread to die */ - from = StrConcat(2, "jabber_die@", jabber->host); - message = XMLCreateTag("message"); - XMLAddAttr(message, "from", from); - XMLAddAttr(message, "to", from); - XMLAddAttr(message, "type", "kill_parsee"); - body = XMLCreateTag("body"); - XMLAddChild(message, body); - - XMLEncode(jabber->stream, message); - StreamFlush(jabber->stream); - XMLFreeElement(message); - Free(from); - + XMPPKillThread(jabber); HttpServerStop(server); - //pthread_cancel(xmpp_thr); break; } } @@ -84,6 +71,7 @@ Main(void) )) { Log(LOG_ERR, "Could not connect to XMPP..."); + XMPPEndCompStream(jabber); goto end; } } diff --git a/src/XMPP/Stanza.c b/src/XMPP/Stanza.c index 793890e..878bc44 100644 --- a/src/XMPP/Stanza.c +++ b/src/XMPP/Stanza.c @@ -54,3 +54,37 @@ XMPPSendPresence(XMPPComponent *comp, char *fr, char *to) XMLFreeElement(presence); Free(from); } +void +XMPPKillThread(XMPPComponent *jabber) +{ + XMLElement *message, *body, *data; + char *from; + + if (!jabber) + { + return; + } + + from = StrConcat(2, "jabber_die@", jabber->host); + message = XMLCreateTag("message"); + XMLAddAttr(message, "from", from); + XMLAddAttr(message, "to", from); + XMLAddAttr(message, "type", "kill_parsee"); + body = XMLCreateTag("body"); + XMLAddChild(message, body); + + XMLEncode(jabber->stream, message); + StreamFlush(jabber->stream); + XMLFreeElement(message); + Free(from); +} +bool +XMPPIsKiller(XMLElement *stanza) +{ + if (!stanza) + { + return false; + } + return StrEquals( HashMapGet(stanza->attrs, "from"), + HashMapGet(stanza->attrs, "to")); +} diff --git a/src/XMPPThread.c b/src/XMPPThread.c index f381574..7e2a876 100644 --- a/src/XMPPThread.c +++ b/src/XMPPThread.c @@ -35,8 +35,7 @@ ParseeXMPPThread(void *argp) if (StrEquals(stanza->name, "message")) { size_t i; - if (StrEquals(HashMapGet(stanza->attrs, "from"), - HashMapGet(stanza->attrs, "to"))) + if (XMPPIsKiller(stanza)) { /* There's not a lot of scenarios where we loopback */ Log(LOG_INFO, "Dropping thread..."); diff --git a/src/include/XMPP.h b/src/include/XMPP.h index 5f27091..7272200 100644 --- a/src/include/XMPP.h +++ b/src/include/XMPP.h @@ -3,6 +3,8 @@ #include +#include + typedef struct XMPPComponent { char *host; Stream *stream; @@ -25,4 +27,11 @@ extern void XMPPSendPlain(XMPPComponent *c, char *f, char *t, char *m, char *typ /* Closes a raw component stream. */ extern void XMPPEndCompStream(XMPPComponent *stream); + +/* Sends a loopback stanza (a "killstanza"), used to kill an XMPP listener + * thread. */ +extern void XMPPKillThread(XMPPComponent *jabber); + +/* Checks if a stanza is a "killstanza". */ +extern bool XMPPIsKiller(XMLElement *); #endif