Some bugfixes for sensor/data code + add FCGI_INT_T
[matches/MCTX3420.git] / server / fastcgi.c
index 8c6355a..34c337a 100644 (file)
@@ -40,7 +40,7 @@ struct FCGIContext {
 static void IdentifyHandler(FCGIContext *context, char *params) {
        bool ident_sensors = false, ident_actuators = false;
        //const char *key, *value;
-       struct timeval now;
+
        int i;
 
        FCGIValue values[2] = {{"sensors", &ident_sensors, FCGI_BOOL_T},
@@ -62,12 +62,6 @@ static void IdentifyHandler(FCGIContext *context, char *params) {
        FCGI_JSONPair("build_date", __DATE__ " " __TIME__);
        FCGI_JSONLong("api_version", API_VERSION);
 
-       //Time and running statistics
-       gettimeofday(&now, NULL);
-       FCGI_JSONDouble("start_time", TIMEVAL_TO_DOUBLE(g_options.start_time));
-       FCGI_JSONDouble("current_time", TIMEVAL_TO_DOUBLE(now));
-       FCGI_JSONDouble("running_time", TIMEVAL_DIFF(now, g_options.start_time));
-
        //Sensor and actuator information
        if (ident_sensors) {
                FCGI_JSONKey("sensors");
@@ -243,14 +237,19 @@ bool FCGI_ParseRequest(FCGIContext *context, char *params, FCGIValue values[], s
                                        case FCGI_BOOL_T:
                                                *((bool*) val->value) = true;
                                                break;
-                                       case FCGI_LONG_T:
-                                               *((long*) val->value) = strtol(value, &ptr, 10);
+                                       case FCGI_INT_T: case FCGI_LONG_T: {
+                                               long parsed = strtol(value, &ptr, 10);
                                                if (!*value || *ptr) {
                                                        snprintf(buf, BUFSIZ, "Expected int for '%s' but got '%s'", key, value);
                                                        FCGI_RejectJSON(context, FCGI_EscapeJSON(buf));
                                                        return false;
                                                }
-                                               break;
+
+                                               if (FCGI_TYPE(val->flags) == FCGI_INT_T)
+                                                       *((int*) val->value) = parsed;
+                                               else
+                                                       *((long*) val->value) = parsed;
+                                       }       break;
                                        case FCGI_DOUBLE_T:
                                                *((double*) val->value) = strtod(value, &ptr);
                                                if (!*value || *ptr) {
@@ -297,6 +296,12 @@ void FCGI_BeginJSON(FCGIContext *context, StatusCodes status_code)
        printf("{\r\n");
        printf("\t\"module\" : \"%s\"", context->current_module);
        FCGI_JSONLong("status", status_code);
+       //Time and running statistics
+       struct timeval now;
+       gettimeofday(&now, NULL);
+       FCGI_JSONDouble("start_time", TIMEVAL_TO_DOUBLE(g_options.start_time));
+       FCGI_JSONDouble("current_time", TIMEVAL_TO_DOUBLE(now));
+       FCGI_JSONDouble("running_time", TIMEVAL_DIFF(now, g_options.start_time));
 }
 
 /**
@@ -438,19 +443,7 @@ void * FCGI_RequestLoop (void *data)
        FCGIContext context = {0};
        
        Log(LOGDEBUG, "First request...");
-       //TODO: The FCGI_Accept here is blocking. 
-       //              That means that if another thread terminates the program, this thread
-       //               will not terminate until the next request is made.
        while (FCGI_Accept() >= 0) {
-
-               if (Thread_Runstate() != RUNNING)
-               {
-                       //TODO: Yeah... deal with this better :P
-                       Log(LOGERR, "FIXME; FCGI gets request after other threads have finished.");
-                       printf("Content-type: text/plain\r\n\r\n+++OUT OF CHEESE ERROR+++\n");
-                       break;
-               }
-               
                Log(LOGDEBUG, "Got request #%d", context.response_number);
                ModuleHandler module_handler = NULL;
                char module[BUFSIZ], params[BUFSIZ];
@@ -488,7 +481,6 @@ void * FCGI_RequestLoop (void *data)
        }
 
        Log(LOGDEBUG, "Thread exiting.");
-       Thread_QuitProgram(false);
        // NOTE: Don't call pthread_exit, because this runs in the main thread. Just return.
        return NULL;
 }

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