From: Brian Demsky Date: Fri, 22 Jul 2016 03:06:33 +0000 (-0700) Subject: more code X-Git-Url: http://plrg.eecs.uci.edu/git/?p=iotcloud.git;a=commitdiff_plain;h=577f78a317bbbc8af4a6a9c99c9566c7e4ea3098 more code --- diff --git a/src/server/Makefile b/src/server/Makefile index 0818b43..8eee1fa 100644 --- a/src/server/Makefile +++ b/src/server/Makefile @@ -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 diff --git a/src/server/iotcloud.cpp b/src/server/iotcloud.cpp index dac7ee8..2f82674 100644 --- a/src/server/iotcloud.cpp +++ b/src/server/iotcloud.cpp @@ -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 diff --git a/src/server/iotcloud.fcgi b/src/server/iotcloud.fcgi index 757b3b7..c9614c3 100755 Binary files a/src/server/iotcloud.fcgi and b/src/server/iotcloud.fcgi differ diff --git a/src/server/iotquery.cpp b/src/server/iotquery.cpp index 89b98a9..af5a976 100644 --- a/src/server/iotquery.cpp +++ b/src/server/iotquery.cpp @@ -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" << "\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; } + + diff --git a/src/server/iotquery.h b/src/server/iotquery.h index ccadd39..bfc185e 100644 --- a/src/server/iotquery.h +++ b/src/server/iotquery.h @@ -5,6 +5,11 @@ #include "fcgi_stdio.h" #include +#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