[MOD] Make functions for creating a "killer stanza"

Cleaning up the mop...
This commit is contained in:
LDA 2024-06-19 14:41:04 +02:00
commit e089cea02a
4 changed files with 46 additions and 16 deletions

View file

@ -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;
}
}

View file

@ -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"));
}

View file

@ -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...");

View file

@ -3,6 +3,8 @@
#include <Cytoplasm/Stream.h>
#include <XML.h>
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