more bug fixes
[iotcloud.git] / src / server / iotquery.cpp
index 9ab3f27aab15d6374060ff86a6d659b8320c7ebc..8d708cb1edeb1385c2d81a7ef2e3df3ddc511ce4 100644 (file)
@@ -57,7 +57,7 @@ void IoTQuery::decodeQuery() {
        char * str=new char[len+1];
        memcpy(str, query, len+1);
        char *tok_ptr=str;
-       
+
        /* Parse commands */
        char *command=strsep(&tok_ptr, "&");
        if (strncmp(command, "req=putslot", 11) == 0)
@@ -75,15 +75,19 @@ void IoTQuery::decodeQuery() {
                        requestsequencenumber = strtoll(sequencenumber_str + 1, NULL, 10);
                }
        }
-       
+
+       //don't allow a really old sequence number
+       if (requestsequencenumber < oldestentry)
+               requestsequencenumber = oldestentry;
+
        /* Update size if we get request */
        char * numqueueentries_str = tok_ptr;
        if (numqueueentries_str != NULL &&
                        strncmp(numqueueentries_str, "max=", 4) == 0) {
-               numqueueentries_str = strchr(numqueueentries_str + 1, '=');
+               numqueueentries_str = strchr(numqueueentries_str, '=') + 1;
                numqueueentries = strtoll(numqueueentries_str, NULL, 10);
        }
-               
+
        delete str;
 }
 
@@ -140,35 +144,34 @@ void IoTQuery::getSlot() {
                delete filename;
        }
        const char header[]="getslot";
-       long long size=sizeof(header)-1+sizeof(numrequeststosend)+4*numrequeststosend+numbytes; //header + payload + file count + sizes
+       long long size=sizeof(header)-1+sizeof(numrequeststosend)+4*numrequeststosend+numbytes;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         //header + payload + file count + sizes
        char * response = new char[size];
        long long offset=0;
        memcpy(response, header, sizeof(header)-1);
        offset+=sizeof(header)-1;
        int numreq=htonl(numrequeststosend);
-       cerr << numrequeststosend << " " << numreq << endl;
        memcpy(response + offset, &numreq, sizeof(numreq));
        offset+=sizeof(numrequeststosend);
-       for(int i=0;i<numrequeststosend;i++) {
+       for(int i=0; i<numrequeststosend; i++) {
                int filesize=htonl(filesizes[i]);
                memcpy(response + offset, &filesize, sizeof(filesize));
                offset+=sizeof(int);
        }
-       
+
        //copy file data
-       for(int i=0;i<numrequeststosend;i++) {
+       for(int i=0; i<numrequeststosend; i++) {
                if (fdarray[i]>=0) {
                        doRead(fdarray[i], response+offset, filesizes[i]);
                        offset+=filesizes[i];
                }
        }
-       
+
        //write response out
        sendResponse(response, size);
 
        //cleanup
        delete response;
-       for(int i=0;i<numrequeststosend;i++) {
+       for(int i=0; i<numrequeststosend; i++) {
                if (fdarray[i] >= 0)
                        close(fdarray[i]);
        }
@@ -185,15 +188,15 @@ void IoTQuery::putSlot() {
                //need to drop slot
                removeOldestSlot();
        }
-       
+
        //write slot data out to file
        char *filename = getSlotFileName(requestsequencenumber);
        int slotfd = open(filename, O_CREAT|O_WRONLY, S_IRUSR| S_IWUSR);
        doWrite(slotfd, data, length);
        close(slotfd);
        delete filename;
-       newestentry = requestsequencenumber; // update sequence number
-       updateStatusFile(); // update counts
+       newestentry = requestsequencenumber;                                                                                                                                                                                                                                                                                                                                                                                                                                    // update sequence number
+       updateStatusFile();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             // update counts
        char command[]="putslot";
        sendResponse(command, sizeof(command)-1);
 }
@@ -202,12 +205,12 @@ void IoTQuery::sendResponse(char * bytes, int len) {
        cout << "Accept-Ranges: bytes\r\n"
                         << "Content-Length: " << len << "\r\n"
                         << "\r\n";
-       cout.write(bytes, len); 
+       cout.write(bytes, len);
 }
 
 char * IoTQuery::getSlotFileName(long long slot) {
        int directorylen=strlen(directory);
-       char * filename=new char[25+directorylen];//19 digits for long number + 4 characters for SLOT + 1 character for null termination
+       char * filename=new char[25+directorylen];                                                                                                                                                                                                                                                                                                                                                                                                                                                                              //19 digits for long number + 4 characters for SLOT + 1 character for null termination
        snprintf(filename, 24+directorylen+1, "%s/SLOT%lld", directory, slot);
        return filename;
 }
@@ -245,7 +248,7 @@ void IoTQuery::processQuery() {
        flock(fd, LOCK_EX);
 
        decodeQuery();
-       
+
        if (reqGetSlot)
                getSlot();
        else if (reqPutSlot)
@@ -328,7 +331,7 @@ bool IoTQuery::openStatusFile() {
                cerr << strerror(errno) << " error opening statusfile" << endl;
                return false;
        }
-       
+
        int size;
        int needwrite=0;
        if (doread(fd, &size, sizeof(size), OFFSET_MAX))