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)
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;
}
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]);
}
//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);
}
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;
}
flock(fd, LOCK_EX);
decodeQuery();
-
+
if (reqGetSlot)
getSlot();
else if (reqPutSlot)
cerr << strerror(errno) << " error opening statusfile" << endl;
return false;
}
-
+
int size;
int needwrite=0;
if (doread(fd, &size, sizeof(size), OFFSET_MAX))