aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/control/interfaces/xml_interface.c
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2007-11-12 15:06:04 +0000
committerMartin Willi <martin@strongswan.org>2007-11-12 15:06:04 +0000
commit275cec2eac14885ca86d3c3b0346d81960d0a219 (patch)
tree081b14e9816b7e6c5c629b2f4759797a2ae3672d /src/charon/control/interfaces/xml_interface.c
parent1f1ec595e57e0be7be05880e4c3e61bc311bf86a (diff)
downloadstrongswan-275cec2eac14885ca86d3c3b0346d81960d0a219.tar.bz2
strongswan-275cec2eac14885ca86d3c3b0346d81960d0a219.tar.xz
implemented IKE/CHILD_SA termination through XML interface
Diffstat (limited to 'src/charon/control/interfaces/xml_interface.c')
-rw-r--r--src/charon/control/interfaces/xml_interface.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/charon/control/interfaces/xml_interface.c b/src/charon/control/interfaces/xml_interface.c
index 02da1064d..7a44c03fb 100644
--- a/src/charon/control/interfaces/xml_interface.c
+++ b/src/charon/control/interfaces/xml_interface.c
@@ -283,6 +283,49 @@ static void request_query_ikesa(xmlTextReaderPtr reader, xmlTextWriterPtr writer
xmlTextWriterEndElement(writer);
}
+
+/**
+ * process a *terminate control request message
+ */
+static void request_control_terminate(xmlTextReaderPtr reader,
+ xmlTextWriterPtr writer, bool ike)
+{
+ while (xmlTextReaderRead(reader))
+ {
+ if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT)
+ {
+ if (streq(xmlTextReaderConstName(reader), "id"))
+ {
+ if (xmlTextReaderRead(reader) &&
+ xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT)
+ {
+ const char *str;
+ u_int32_t id;
+
+ str = xmlTextReaderConstValue(reader);
+ if (str == NULL || !(id = atoi(str)))
+ {
+ DBG1(DBG_CFG, "error parsing XML id string");
+ break;
+ }
+ DBG1(DBG_CFG, "terminating %s_SA %d", ike ? "IKE" : "CHILD", id);
+ if (ike)
+ {
+ charon->interfaces->terminate_ike(charon->interfaces,
+ id, interface_manager_cb_empty, NULL);
+ }
+ else
+ {
+ charon->interfaces->terminate_child(charon->interfaces,
+ id, interface_manager_cb_empty, NULL);
+ }
+ break;
+ }
+ }
+ }
+ }
+}
+
/**
* process a query request
*/
@@ -306,6 +349,33 @@ static void request_query(xmlTextReaderPtr reader, xmlTextWriterPtr writer)
}
/**
+ * process a control request
+ */
+static void request_control(xmlTextReaderPtr reader, xmlTextWriterPtr writer)
+{
+ /* <control> */
+ xmlTextWriterStartElement(writer, "control");
+ while (xmlTextReaderRead(reader))
+ {
+ if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT)
+ {
+ if (streq(xmlTextReaderConstName(reader), "ikesaterminate"))
+ {
+ request_control_terminate(reader, writer, TRUE);
+ break;
+ }
+ if (streq(xmlTextReaderConstName(reader), "childsaterminate"))
+ {
+ request_control_terminate(reader, writer, FALSE);
+ break;
+ }
+ }
+ }
+ /* </control> */
+ xmlTextWriterEndElement(writer);
+}
+
+/**
* process a request message
*/
static void request(xmlTextReaderPtr reader, char *id, int fd)
@@ -337,6 +407,11 @@ static void request(xmlTextReaderPtr reader, char *id, int fd)
request_query(reader, writer);
break;
}
+ if (streq(xmlTextReaderConstName(reader), "control"))
+ {
+ request_control(reader, writer);
+ break;
+ }
}
}
/* </message> and close document */