info: re-introduce composite commands
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 9 Mar 2016 10:19:18 +0000 (11:19 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 9 Mar 2016 12:01:13 +0000 (13:01 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/info/info_types.h
lib/info/olsrd_info.c
lib/jsoninfo/src/olsrd_plugin.c
lib/txtinfo/src/olsrd_plugin.c

index 682d407..c8f339c 100644 (file)
@@ -82,6 +82,7 @@ typedef void (*printer_error)(struct autobuf *abuf, unsigned int status, const c
 typedef void (*printer_generic)(struct autobuf *abuf);
 
 typedef struct {
+    bool supportsCompositeCommands;
     init_plugin init;
     command_matcher is_command;
     mime_type determine_mime_type;
index 9e0a26d..4ecb81e 100644 (file)
@@ -110,7 +110,7 @@ static char * skipMultipleSlashes(char * requ) {
   return r;
 }
 
-static unsigned int determine_action(char *requ) {
+static unsigned int determine_single_action(char *requ) {
   static unsigned int SIW_ENTRIES[] = {
   //
       SIW_OLSRD_CONF,//
@@ -155,6 +155,70 @@ static unsigned int determine_action(char *requ) {
   return 0;
 }
 
+static unsigned int determine_action(char *requ) {
+  if (!functions->is_command) {
+    return 0;
+  }
+
+  if (!requ || (requ[0] == '\0')) {
+    /* no more text */
+    return 0;
+  }
+
+  /* requ is guaranteed to be at least 1 character long */
+
+  if (!functions->supportsCompositeCommands) {
+    /* no support for composite commands */
+    return determine_single_action(requ);
+  }
+
+  /* composite commands */
+
+  {
+    unsigned int action = 0;
+
+    char * requestSegment = requ;
+    while (requestSegment) {
+      requestSegment = skipMultipleSlashes(requestSegment);
+      if (requestSegment[0] == '\0') {
+        /* there is no more text */
+        requestSegment = NULL;
+        continue;
+      }
+
+      /* there is more text */
+
+      {
+        unsigned int r = 0;
+        char * requestSegmentTail = strchr(&requestSegment[1], '/');
+
+        if (!requestSegmentTail) {
+          /* there isn't another slash, process everything that is left */
+          r = determine_single_action(requestSegment);
+        } else {
+          /* there is another slash, process everything before the slash */
+          char savedCharacter = *requestSegmentTail;
+          *requestSegmentTail = '\0';
+          r = determine_single_action(requestSegment);
+          *requestSegmentTail = savedCharacter;
+        }
+
+        if (!r) {
+          /* not found */
+          return 0;
+        }
+
+        action |= r;
+
+        /* process everything that is left in the next iteration */
+        requestSegment = requestSegmentTail;
+      }
+    }
+
+    return action;
+  }
+}
+
 static void write_data(void *fullyWritten) {
   fd_set set;
   int result, i, max;
index b64541f..3949b18 100644 (file)
@@ -55,6 +55,7 @@
 
 static info_plugin_functions_t functions = { //
     //
+        .supportsCompositeCommands = true, //
         .init = plugin_init, //
         .is_command = isCommand, //
         .determine_mime_type = determine_mime_type, //
index e8c7767..87424d0 100644 (file)
@@ -55,6 +55,7 @@
 
 static info_plugin_functions_t functions = { //
     //
+        .supportsCompositeCommands = true, //
         .init = NULL, //
         .is_command = isCommand, //
         .determine_mime_type = NULL, //