more code
authorBrian Demsky <bdemsky@plrg.eecs.uci.edu>
Fri, 22 Jul 2016 03:06:33 +0000 (20:06 -0700)
committerBrian Demsky <bdemsky@plrg.eecs.uci.edu>
Fri, 22 Jul 2016 03:06:33 +0000 (20:06 -0700)
src/server/Makefile
src/server/iotcloud.cpp
src/server/iotcloud.fcgi
src/server/iotquery.cpp
src/server/iotquery.h

index 0818b4363622e8b8b69a3ba80f9dbba29ff8ab48..8eee1fa9d5cfbc4d65540cffa14a667a5b804518 100644 (file)
@@ -10,3 +10,6 @@ iotcloud.o: iotcloud.cpp iotquery.h
 
 iotquery.o: iotquery.cpp iotquery.h
        g++ $(CPPFLAGS) -c -o iotquery.o iotquery.cpp
+
+clean:
+       rm *.o iotcloud.fcgi
index dac7ee8d5aeb064021a7b1717d90d45739fa0c18..2f82674b0071e66508123181bf77beea11aa6bf9 100644 (file)
@@ -23,7 +23,9 @@ int main(void) {
       cin.rdbuf(&cin_fcgi_streambuf);
       cout.rdbuf(&cout_fcgi_streambuf);
       cerr.rdbuf(&cerr_fcgi_streambuf);
-
+      IoTQuery * iotquery=new IoTQuery(&request);
+      iotquery->processQuery();
+      delete iotquery;
     } 
 
     // restore stdio streambufs
index 757b3b7068990a78a64c4f31665d45d60cec7b04..c9614c364a0b912a75a5546de56b6302844b67a8 100755 (executable)
Binary files a/src/server/iotcloud.fcgi and b/src/server/iotcloud.fcgi differ
index 89b98a90f076846f72e3bb51a24e62046880cd36..af5a9765ccc816a0c6da53ed725fb8a81a35497a 100644 (file)
@@ -25,15 +25,16 @@ IoTQuery::IoTQuery(FCGX_Request *request) :
   iotcloudroot(NULL),
   dir(NULL),
   length(0),
+  firstentry(0),
+  lastentry(0),
+  numqueueentries(DEFAULT_SIZE),
   fd(-1)
 {
 }
 
-
 IoTQuery::~IoTQuery() {
-  if (fd >= 0) {
+  if (fd >= 0)
     close(fd);
-  }
   if (directory)
     delete directory;
   if (data)
@@ -41,7 +42,15 @@ IoTQuery::~IoTQuery() {
   if (dir != NULL)
     closedir(dir);
 }
-  
+
+int IoTQuery::checkDirectory() {
+  struct stat s;
+  int err=stat(directory, &s);
+  if (-1 == err)
+    return 0;
+  return S_ISDIR(s.st_mode);
+}
+
 void IoTQuery::processQuery() {
   parseQuery();
   getDirectory();
@@ -51,14 +60,14 @@ void IoTQuery::processQuery() {
     return;
   
   if (directory == NULL ||
-      (dir = opendir(directory)) == NULL)
+      checkDirectory())
     return;
   
-  if (openMaxFile() < 0)
+  if (openStatusFile() < 0)
     return;
 
   flock(fd, LOCK_EX);
-      
+  
   cout << "Content-type: text/html\r\n"
        << "\r\n"
        << "<html>\n"
@@ -94,7 +103,6 @@ void IoTQuery::readData() {
   } while (!cin.eof());
 }
 
-
 void IoTQuery::parseQuery() {
   uri = FCGX_GetParam(uri_str, request->envp);
   query = FCGX_GetParam(query_str, request->envp);
@@ -122,16 +130,60 @@ void IoTQuery::getDirectory() {
   directory[directory_len]=0;
 }
 
-int IoTQuery::openMaxFile() {
-  char maxfile[]="queuesize";
+int doread(int fd, void *ptr, size_t count, off_t offset) {
+  do {
+    size_t bytesread=pread(fd, ptr, count, offset);
+    if (bytesread==count) {
+      return 1;
+    } else if (bytesread==0) {
+      return 0;
+    }
+  } while(1);  
+}
+
+void IoTQuery::updateStatusFile() {
+  pwrite(fd, &numqueueentries, sizeof(numqueueentries), OFFSET_MAX);
+  pwrite(fd, &firstentry, sizeof(firstentry), OFFSET_FIRST);
+  pwrite(fd, &lastentry, sizeof(lastentry), OFFSET_LAST);
+}
+
+int IoTQuery::openStatusFile() {
+  char statusfile[]="queuestatus";
   int len=strlen(directory);
 
-  char * filename=new char[len+sizeof(maxfile)+2];
+  char * filename=new char[len+sizeof(statusfile)+2];
   memcpy(filename, directory, len);
   filename[len]='/';
-  memcpy(filename+len+1, maxfile, sizeof(maxfile));
-  filename[len+sizeof(maxfile)+1]=0;
+  memcpy(filename+len+1, statusfile, sizeof(statusfile));
+  filename[len+sizeof(statusfile)+1]=0;
   fd=open(filename, O_CREAT| O_RDWR, S_IRUSR| S_IWUSR);
   delete filename;
+
+  if (fd < 0)
+    return fd;
+  
+  int size;
+  int needwrite=0;
+  if (doread(fd, &size, sizeof(size), OFFSET_MAX))
+    numqueueentries=size;
+  else
+    needwrite=1;
+
+  long entry;
+  if (doread(fd, &entry, sizeof(entry), OFFSET_FIRST))
+    firstentry=entry;
+  else
+    needwrite=1;
+
+  if (doread(fd, &entry, sizeof(entry), OFFSET_LAST))
+    lastentry=entry;
+  else
+    needwrite=1;
+      
+  if (needwrite)
+    updateStatusFile();
+  
   return fd;
 }
+
+                                                  
index ccadd390b8b68415e329175cb90c7c2f582e0670..bfc185e9822ce837ae5e08c160e1bee5f5195b65 100644 (file)
@@ -5,6 +5,11 @@
 #include "fcgi_stdio.h"
 #include <dirent.h>
 
+#define DEFAULT_SIZE 128
+#define OFFSET_MAX 0
+#define OFFSET_FIRST 4
+#define OFFSET_LAST 12
+
 class IoTQuery {
  public:
   IoTQuery(FCGX_Request * request);
@@ -16,8 +21,9 @@ class IoTQuery {
   void getDirectory();
   void readData();
   int checkDirectory();
-  int openMaxFile();
-
+  int openStatusFile();
+  void updateStatusFile();
+  
   FCGX_Request * request;
   char *data;
   char *directory;
@@ -27,6 +33,9 @@ class IoTQuery {
   const char * iotcloudroot;
   DIR *dir;
   long length;
+  long firstentry;
+  long lastentry;
+  int numqueueentries;
   int fd;
 };
 #endif