From 577f78a317bbbc8af4a6a9c99c9566c7e4ea3098 Mon Sep 17 00:00:00 2001 From: Brian Demsky Date: Thu, 21 Jul 2016 20:06:33 -0700 Subject: [PATCH] more code --- src/server/Makefile | 3 ++ src/server/iotcloud.cpp | 4 +- src/server/iotcloud.fcgi | Bin 48712 -> 50912 bytes src/server/iotquery.cpp | 78 ++++++++++++++++++++++++++++++++------- src/server/iotquery.h | 13 ++++++- 5 files changed, 82 insertions(+), 16 deletions(-) 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 757b3b7068990a78a64c4f31665d45d60cec7b04..c9614c364a0b912a75a5546de56b6302844b67a8 100755 GIT binary patch literal 50912 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:(gV$ql#=kx>h#XH(!7}rvS;Y^zxU?EKOGG|PtV1v=Fj(+@v_1M}e zEyEBlhYmT0_b^Xla46PcZ0yqQg)t4Cqo=JGGruj=&Fa#UL<^vm*y8;$XVW*>-wy*s ze@&lIz?{EyDu(98Y7&;V1WOugWUXK`1vzasHkD#@MR%5SHGf?bIX+bPkYf~C5P4u_xrjwHuq>FFp8Q2szx}DAlTwCX*L-B;1B|mJDeZd7ZHcr_=qpP>S4f^Oo zONxPx{Sn=VvkP0E;~Evn;iWB(?V&^UVTKkka~3YW(XJ0aX!MGanOczsFxUoR<=kPQ zZPDPa5rPAOv#6u)X`xtXjoE0Wr7k1H#MmPy#{ORH#pMWxuGQ9A${yARV;4cW3@T(W z->~D<60|=wFc2N=;L^yhO75Nw4A6tnD|YmQ-S~@Q?Irpgvrt%PiAQ14>}`GV2zpdc zd{MN!C&m#y8b?<%)KrRMRX5Q~QG=_xvFlga7U#%`QKhc~OU+n!VQ2qPJC--&E=>dx z#uzMjn;<95L75X~HT-6;Sh=+um>%1>NQD7leC|m0I>az+|Jw$8+QnB$UEfxJUZT)MjH5o>o_O^}QO9Llld#t6$}EknF?bxWi2t7sNT)h0;H2onbxORjZJOw#bOaw zjc01;NUpsAVP{gI_QjJ)3~}9k(0iA`T~svIfr(b`q=XU+X_I3PCzTMTJF%YjO#OE8 zDVt$$OthiP=@EtNs_w!5p@AN`QAH7Q0&>REad@k)+}OeW3&-Pf{u(lh!Baw`v=pnp zcA*0{rmHO$=;a7hsJe`^utY^K?~g^X6Hybk)SgnN(yy>xotNn#Xb z+@Zx$9>x~CGv05n$2ftpNOX8T?igKS9fdIxyD&T+a95?Y%xy_1Qqab+d*C(()fXF5 zu{Y>y>*?jLMXh|t7i!dKb0KHAE!gcDQr^^&sGnnJvzUOu6Ax^;_)yAoW_&K6#Q@W! zmW>;t(ShpzSPXl643CB$@xcKtQeK7@gYaT6))SW-A49e_yBM}p9BM!07$xUQK77Ck z)rPfWZ|@>!V=&e@bdK8JaQ5RU5bx;0(yynhhbD~WEQI5(84r;Qxi_=9(z6q7-KjCQ zK9||Xra?JoG*#Qpp~hfUjolP!XsoIUSKCd&#udRvlu>P$*-aPQHNh1k(i~nEY-|!> zQz%$hC!l4)WexZUY^1TFIau8sZm5^()uF0Jds$Vh%%}>eS{$?&x6}(V$)_cSuG+4v zs;{-1S|Sjo*;s5hTwEV)v?Jjf$)rmF1hXRqstZ0y6#gZefFmsLeV4UIvtboI@eG8i$_ z@r~Q?3cI?ls;S8-1?mZdYf~gx9bO!+mIcWgOU))p>w+tSb>((-Rdom%!mFfI^>rw> znaVXi(~5Ny8$WAJJ`WkWGO6^+MHHG2;PQBDtTj#Rd&>M;cUf zt*ErabrG0y!{Wu|SSTT_StzAxr4$n)wD)dsq*zqdB!#SNK+7zm){vz!SQ~7O2oN9k ztzHWG>s+nB;vBm!vM5~3LJ+W8gPl>S!7B8=x^NRLMJNzS-94QKm-pC6NqI4dqo?-v z+HrPz4wER7k1}is*&JLZ;!Vh zBaPt(SRlTgjB;yQAbqW@R1;JisgtH<5A}4a%Dd%V+_bV@N+48H)eM_o)Y43gMV0GU z1sfYwEvucL+q807T|+~}G1+Cy?S@FOUX_FP#*=eZ6ncPNk6Y4cTbe?R%}!Qyv0&9Q zCt5{mLX8de4J}QW?nTKQP0(#GMhy|rKBR2bkroaif<|>3Cx>0rk`%8gTw7mNCo{p8 z9D}7Tv64!C=s)QFvdoCPM+*DH$_M6GSs`-Nt8UcL*u<{0SRh-44qB^QQtSZ(8bvnZ z1HC;7rvp(fE2`>Rl7mmAsy66!VZ|y^E4!2vEq50bsg=S&KXp_DMgUn){L&zIXo6M^ z#;l?qRE_p6iD;Yym7s`(!x+M#+WKI#T~pgwr8)$R2wg-~R8XcgTw~S6Hf(okuvsd0 zSqp?nA;$p9?(Vd0V>1MFVvB3+Wwpy>|3}FeH#9EQW?LIs52G38Sy z0m@lMh$}NyH?E8{8;SKj*oI)~86V&i3=~#oFUG`YH@3)8t*T~4xQVlCxPGxT^VI68 z=|#4+7#f{Q*;3Uln9J?j#)g&%MixPrHd|>r7?jW&s*YhtP|A5BMf>%Nm7HxTx*9c9 zW7psV@Qp3i%?*t<`+gPI1Jc@>*j1c%p$RuMg)x!B7)3`DC8{yBCT)JioK+V|c4s|5 z=>ba&NKITpMd{#^vdj5*ym6Luhn&Qn>d75}(+#Ub;W`++TEIlY%ElrgOp~JLi(;^@ zXbmUFMwhme8Wd2fA!6d?4qzxwnMFDk(%Kvru$+*VVbaG4BXf&^${99NnmrP(cMY*) zt>IF&%9+v`w$O1S7pHezX`=2ahbyb7H^|YB%DrQdT zO)PjwD0Jg)VBne}RTrz3q*z%vN}|=s@lL2os)xNiWx+wV7@%sL1&h>aRdsbkOMSB* zwiZ=2Hiq?zmg^E%^|*Y61+F1(4w$HB0YpU%_)m*sSnF#cM4I8 z)T+J2uxu|=YbZ3!vLK-c z=;Y#w+7?q>O|Y)H%2B+mfHri&K@UviHij6^TAs;b(x_{|A|ch4Ep}#3*LGGu80++^ zv_-Z)hI&yb48A5T7dd)kC!d|5l$0HdGmtf?h9N@EvTXI_0**tNYemf3U=b!%;Fy4G z&co6U)+c09mDY==#75!MAcNHHk{Zd;idBtHD?%K>1iKpA7gvnZtWtWXV?b*D;f4>& zX{VbjF7lU&T~uALCMcIqsXfBUFIzwigL3ZHbrVX{y9d#v%Ce|0XE7t^(&WCcwo&de zu-9m`F>EDATBVfa;zEjm*&C0E2D^pKSiCH63A$Enda3GOH@cUXYCk0ErZ;IR-A0Yc zm;f-HsU^GE3OR!zS|>)A6PrgY&$*P;q*W`@rjKQdFiNUbI5H?>5}DD4vR80HqDB?9 zGPN7A?T{0L+!Uq{8?k7#Q@At)Cug68=W=qAOWE31myPlWQ+U}E>w>ja)hh)XIfAl* zmx{P*0b#-JPMD&-WQTVzz#Ho8XlJ)TU6 z&8DnX-BP<5qI3@R^=%OgHoegbM^;p#?+vi;;dzLlcJF%Sh7`}gKEY!^xUR$DK3=b? za2^h%{Xf6FI3u{g6Bw1ziz9B$W8%F=VoZF7ar>C~Oy@ht?n1mcRj9v*oQj`ljP)I1 zFOEOy?+>TaZXNyfo3@ssgw$g${i@Uh6T@Kc=c zNT-&YYm^j@MQ<5JCy#~CGY*Z3&o_Q_+F0~co$pnrmOIVR->FW;Pd8qjyUvXgu-7== z80)*rUZcP`I&Um`ymV4B7JjBtqTV)h7veQ$8QaFh;}zI3F0X;tXUDj_240mLZQp8HHy@%P`(PmY#su_0Wq(>l2zmFUm0@X?B8l69s-(8opTJ z52oR31pisaLG_lN>hMOBz>jX<%N3s^X?(5|^rP+MOTdp+ug3)aEJOc_yDs-R#XtRb z2IuW0=_VXQbsT&R00-rPLCkZwwygq4tzY^iLark^0c*`@>SYNs>Mc8kQL(d=G z8mqm2LO$r%`^qIBZ9i`*{tMFhe<1ke80oLj&%*m0WAUFS@HxgV_2PL{Nqf;a^qa@Q ze{vlBZ-CE*{ONjlV;uU4c(H`zM*2@e6bO8ZDn;ZBMW6or3{~UMuhjh0e*NKc^h?Tl zNX@6ZBz}&S{awF0ulxJQ$Kih$@U+A9`ih?^1=C$tK(iL%x0F2TKWy=barmEvcWS7g z^k0EkDDWw)MTB418mryA$H8Ad4*vRa@OJ=D{pcSd(E9m;pwAigiy;Q|O!@UYIsuGp zyv`N&FnS&S+&JYL9fOH@0$%1~>`?6`)o{+h6KC6aOA1GKcrp-PIrA6bP}NvOI1>=-!4ay#wkZUoi9vWaYgS_a zOQ*3qClUzM)`b^Ux3=2l#qbune9)y8qYh>ch+V$QVwV+{70<_ES002-#o0IvfX9y= z@gdPNeDN(FO(k(Z{>GsioP7}jvhGVZ+KtLOs&Sq=PSaS0C++E?raIGCb@oO!rjock zBB)sUN$Kj+U>dzV%ZO8~schgW1oEufTKZL}|G^y{S$V zhC7<=ARcw&)KZ#&czVgV0b(}K`m!#i6{+XWpxj7lsrzI+w1_rO(-H+8TTGj$RHRM7 zjyF?hsd)wOFwgg(c;|o^^^}4b<8c$-nP}@wWoFw@lInXn+t{%oHCdEZ8%>B4azcgT z$g3jKeaC%t$t_dqSclf2jzqt1ch!|#-G)7x^;p`JI9Ij_&R&H(#%MNq$SPG7FvnBL z)H;CKf6HtBU?+~x1tTbCzAP1-qHTRZqU=&Tm|Bc&x5x1YfE-vD;w6QS^&4!Su}T)6 zI;x11El%6%cS79ia-T~BKHaiLweYCJUwS}yJfmXx!D)}AOdPoEs5l6Pr{+Xknf~ab#z1ra1=(oVvyDf(CjM zMzQE##Q=-Dam>FM!!+((M1ZJYm_>1Py;?S`?*tPa1NV*&JGxmYRvh1y%;btf^3d?5 z9mt4++wi_L^7SWJATT_BSB#!x6yun4AJ!|t@pvinwc)TY@G{yH>+08VTYLK;4m7D0 z95{+<7+Tbz$}ZPx|C2kPb8!o-mVM51<^>9o{=|>8?(0-Uuq1Ty>*vwUDu1Dy7%;X& zDOV|C?)>_>bwcGoEroh?{u-peckEcdmR~>LzFi^eRDLXH#iiH7Dr(dN!0#bA@{f1| zh~ev&D*rYmFqZ#9PdYz-WINyk& z*E(^>k7}t<*HecZfd98EzkdEcpz`lh`6xd{(ef*_!RL^yqUL8z3dkfrFvYb_+>_<& z{JQ?vBAxjcDY|tk|2maFr0P%k`K&cP|Bb*=CzOwue(rxieq@gqei$v~QqAGuh5@P=pb&M8A(uEu^b zJ%3?9Bo!8lz<}o@u|qWelO|HZWY+Hdls(`2p-+?f@v8}$oBsA6Sij(=s}TuG(vROd-A z|BpzZsp$OL4|7Q6Pp40hzl*%opU$uSHLrfi{6~>j_f3F~UuQ(+&sF-<{X>_p?dW#o zahI?CKS$@0+h}{$`E|(OcX8);{6r-(e+d&^m(HidthD^vpH#wu9oGUGICq^-Bl!G` zIITbJcUrIVx9S9yp-^X3;WSmg64y!9`70cZ1ax(D$j_B)*iCw;Du10D2{@g0?l}4X zsq#NpmC7JJzw~pY(lGXPT;kqN8vxSt*N#*E!&l1ut=e#8bd>x}Du25ECR{5s963d0 zOv|t3SUXPn@7*gir1RDJG*=5iS`&+;cb=3Ky=fWJqM|-&LyX8+bf3(>Pt8Mf5an2+ Y?N5&jRPR{jk9)77dJz>5&!@I literal 48712 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 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 -- 2.34.1