Add semi working control code
[matches/MCTX3420.git] / server / fastcgi.c
index b4b3587..6b2957e 100644 (file)
@@ -191,9 +191,9 @@ char *FCGI_KeyPair(char *in, const char **key, const char **value)
 }
 
 /**
- * Aids in parsing request parameters. Expected keys along with their type
- * and whether or not they're required are provided. This function will then
- * parse the parameter string to find these keys.
+ * Aids in parsing request parameters. 
+ * Input: The expected keys along with their type and whether or not
+ * they're required.
  * @param context The context to work in
  * @param params The parameter string to be parsed
  * @param values An array of FCGIValue's that specify expected keys
@@ -237,7 +237,7 @@ bool FCGI_ParseRequest(FCGIContext *context, char *params, FCGIValue values[], s
                                                }
 
                                                if (FCGI_TYPE(val->flags) == FCGI_INT_T)
-                                                       *((int*) val->value) = parsed;
+                                                       *((int*) val->value) = (int) parsed;
                                                else
                                                        *((long*) val->value) = parsed;
                                        }       break;
@@ -439,6 +439,7 @@ void * FCGI_RequestLoop (void *data)
                Log(LOGDEBUG, "Got request #%d", context.response_number);
                ModuleHandler module_handler = NULL;
                char module[BUFSIZ], params[BUFSIZ];
+               bool lock_required = false;
                
                //strncpy doesn't zero-truncate properly
                snprintf(module, BUFSIZ, "%s", getenv("DOCUMENT_URI_LOCAL"));
@@ -462,13 +463,21 @@ void * FCGI_RequestLoop (void *data)
                        module_handler = Control_Handler;
                } else if (!strcmp("sensors", module)) {
                        module_handler = Sensor_Handler;
+                       lock_required = true;
                } else if (!strcmp("actuators", module)) {
                        module_handler = Actuator_Handler;
+                       lock_required = true;
                }
 
                context.current_module = module;
                if (module_handler) {
-                       module_handler(&context, params);
+                       if (lock_required && !Control_Lock()) {
+                               FCGI_RejectJSONEx(&context, STATUS_NOTRUNNING, "Experiment is not running.");
+                       } else {
+                               module_handler(&context, params);
+                               if (lock_required)
+                                       Control_Unlock();
+                       }
                } else {
                        FCGI_RejectJSON(&context, "Unhandled module");
                }

UCC git Repository :: git.ucc.asn.au