home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / GETNODE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  7.2 KB  |  249 lines

  1. #line 1 "GETNODE.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6. #include "cmdshell.h"
  7.  
  8. /****************************************************************************/
  9. /* Reads the data for node number 'number' into the structure 'node'        */
  10. /* from NODE.DAB                                                            */
  11. /* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */
  12. /****************************************************************************/
  13. void getnodedat(uint number, node_t *node, char lockit)
  14. {
  15.     char str[256];
  16.     int count=0;
  17.  
  18. if(!(sys_status&SS_NODEDAB))
  19.     return;
  20. if(!number || number>sys_nodes) {
  21.     errormsg(WHERE,ERR_CHK,"node number",number);
  22.     return; }
  23. number--;    /* make zero based */
  24. while(count<LOOP_NODEDAB) {
  25.     if(count>10)
  26.         mswait(55);
  27.     lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET);
  28.     if(lockit
  29.         && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) {
  30.         count++;
  31.         continue; }
  32.     if(read(nodefile,node,sizeof(node_t))==sizeof(node_t))
  33.         break;
  34.     count++; }
  35. if(count>(LOOP_NODEDAB/2) && count!=LOOP_NODEDAB) {
  36.     sprintf(str,"NODE.DAB COLLISION - Count: %d",count);
  37.     logline("!!",str); }
  38. if(count==LOOP_NODEDAB) {
  39.     errormsg(WHERE,ERR_READ,"NODE.DAB",number+1);
  40.     return; }
  41. }
  42.  
  43. /****************************************************************************/
  44. /* Synchronizes all the nodes knowledge of the other nodes' actions, mode,  */
  45. /* status and other flags.                                                  */
  46. /* Assumes that getnodedat(node_num,&thisnode,0) was called right before it */
  47. /* is called.                                                                  */
  48. /****************************************************************************/
  49. void nodesync()
  50. {
  51.     static user_t user;
  52.     static int inside;
  53.     char str[256],today[32];
  54.     int i,j,atr=curatr; /* was lclatr(-1) 01/29/96 */
  55.     node_t node;
  56.  
  57. if(inside) return;
  58. inside=1;
  59.  
  60. if(thisnode.action!=action) {
  61.     getnodedat(node_num,&thisnode,1);
  62.     thisnode.action=action;
  63.     putnodedat(node_num,thisnode); }
  64.  
  65. criterrs=thisnode.errors;
  66.  
  67. if(sys_status&SS_USERON) {
  68.     if(!(sys_status&SS_NEWDAY)) {
  69.         now=time(NULL);
  70.         unixtodstr(logontime,str);
  71.         unixtodstr(now,today);
  72.         if(strcmp(str,today)) { /* New day, clear "today" user vars */
  73.             sys_status|=SS_NEWDAY;    // So we don't keep doing this over&over
  74.             putuserrec(useron.number,U_ETODAY,5,"0");
  75.             putuserrec(useron.number,U_PTODAY,5,"0");
  76.             putuserrec(useron.number,U_TTODAY,5,"0");
  77.             putuserrec(useron.number,U_LTODAY,5,"0");
  78.             putuserrec(useron.number,U_TEXTRA,5,"0");
  79.             putuserrec(useron.number,U_FREECDT,10
  80.                 ,ultoa(level_freecdtperday[useron.level],str,10));
  81.             getuserdat(&useron); } }
  82.     if(thisnode.misc&NODE_UDAT && !(useron.rest&FLAG('G'))) {   /* not guest */
  83.         getuserdat(&useron);
  84.         getnodedat(node_num,&thisnode,1);
  85.         thisnode.misc&=~NODE_UDAT;
  86.         putnodedat(node_num,thisnode); }
  87.     if(thisnode.misc&NODE_MSGW)
  88.         getsmsg(useron.number);     /* getsmsg clears MSGW flag */
  89.     if(thisnode.misc&NODE_NMSG)
  90.         getnmsg(); }                /* getnmsg clears NMSG flag */
  91.  
  92. if(sync_mod[0])
  93.     exec_bin(sync_mod,&main_csi);
  94.  
  95. if(thisnode.misc&NODE_INTR) {
  96.     bputs(text[NodeLocked]);
  97.     logline(nulstr,"Interrupted");
  98.     hangup();
  99.     inside=0;
  100.     return; }
  101.  
  102. if(sys_status&SS_USERON && memcmp(&user,&useron,sizeof(user_t))) {
  103. //      lputc(7);
  104.     getusrdirs();
  105.     getusrsubs();
  106.     user=useron; }
  107.  
  108. if(sys_status&SS_USERON && online && (timeleft/60)<(5-timeleft_warn)
  109.     && !SYSOP) {
  110.     timeleft_warn=5-(timeleft/60);
  111.     attr(LIGHTGRAY);
  112.     bprintf(text[OnlyXminutesLeft]
  113.         ,((ushort)timeleft/60)+1,(timeleft/60) ? "s" : nulstr); }
  114.  
  115. attr(atr);    /* replace original attributes */
  116. inside=0;
  117. }
  118.  
  119. /****************************************************************************/
  120. /* Prints short messages waiting for this node, if any...                   */
  121. /****************************************************************************/
  122. void getnmsg()
  123. {
  124.     char str[256], HUGE16 *buf;
  125.     int file;
  126.     long length;
  127.  
  128. getnodedat(node_num,&thisnode,1);
  129. thisnode.misc&=~NODE_NMSG;          /* clear the NMSG flag */
  130. putnodedat(node_num,thisnode);
  131.  
  132. #if 0
  133. /* Only for v1b rev 2-5 and XSDK v2.1x compatibility */
  134. sprintf(str,"%sMSGS\\N%3.3u.IXB",data_dir,node_num);
  135. if((ixb=nopen(str,O_RDONLY))!=-1) {
  136.     read(ixb,&offset,4);
  137.     chsize(ixb,0L);
  138.     close(ixb);
  139.     remove(str); }
  140. #endif
  141.  
  142. sprintf(str,"%sMSGS\\N%3.3u.MSG",data_dir,node_num);
  143. if(flength(str)<1L)
  144.     return;
  145. if((file=nopen(str,O_RDWR))==-1) {
  146.     /**
  147.         errormsg(WHERE,ERR_OPEN,str,O_RDWR);
  148.     **/
  149.     return; }
  150. length=filelength(file);
  151. if(!length) {
  152.     close(file);
  153.     return; }
  154. if((buf=LMALLOC(length+1))==NULL) {
  155.     close(file);
  156.     errormsg(WHERE,ERR_ALLOC,str,length+1);
  157.     return; }
  158. if(lread(file,buf,length)!=length) {
  159.     close(file);
  160.     FREE(buf);
  161.     errormsg(WHERE,ERR_READ,str,length);
  162.     return; }
  163. chsize(file,0L);
  164. close(file);
  165. buf[length]=0;
  166.  
  167. if(thisnode.action==NODE_MAIN || thisnode.action==NODE_XFER
  168.     || sys_status&SS_IN_CTRLP) {
  169.     CRLF; }
  170. putmsg(buf,P_NOATCODES);
  171. LFREE(buf);
  172. }
  173.  
  174. /****************************************************************************/
  175. /* 'ext' must be at least 128 bytes!                                        */
  176. /****************************************************************************/
  177. void getnodeext(uint number, char *ext)
  178. {
  179.     char str[256];
  180.     int count=0;
  181.  
  182. if(!(sys_status&SS_NODEDAB))
  183.     return;
  184. if(!number || number>sys_nodes) {
  185.     errormsg(WHERE,ERR_CHK,"node number",number);
  186.     return; }
  187. number--;   /* make zero based */
  188. while(count<LOOP_NODEDAB) {
  189.     if(count>10)
  190.         mswait(55);
  191.     if(lock(node_ext,(long)number*128L,128)==-1) {
  192.         count++;
  193.         continue; }
  194.     lseek(node_ext,(long)number*128L,SEEK_SET);
  195.     if(read(node_ext,ext,128)==128)
  196.         break;
  197.     count++; }
  198. unlock(node_ext,(long)number*128L,128);
  199. if(count>(LOOP_NODEDAB/2) && count!=LOOP_NODEDAB) {
  200.     sprintf(str,"NODE.EXB COLLISION - Count: %d",count);
  201.     logline("!!",str); }
  202. if(count==LOOP_NODEDAB) {
  203.     errormsg(WHERE,ERR_READ,"NODE.EXB",number+1);
  204.     return; }
  205. }
  206.  
  207.  
  208. /****************************************************************************/
  209. /* Prints short messages waiting for 'usernumber', if any...                */
  210. /* then deletes them.                                                       */
  211. /****************************************************************************/
  212. void getsmsg(int usernumber)
  213. {
  214.     char str[256], HUGE16 *buf;
  215.     int file;
  216.     long length;
  217.  
  218. sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,usernumber);
  219. if(flength(str)<1L)
  220.     return;
  221. if((file=nopen(str,O_RDWR))==-1) {
  222.     errormsg(WHERE,ERR_OPEN,str,O_RDWR);
  223.     return; }
  224. length=filelength(file);
  225. if((buf=LMALLOC(length+1))==NULL) {
  226.     close(file);
  227.     errormsg(WHERE,ERR_ALLOC,str,length+1);
  228.     return; }
  229. if(lread(file,buf,length)!=length) {
  230.     close(file);
  231.     FREE(buf);
  232.     errormsg(WHERE,ERR_READ,str,length);
  233.     return; }
  234. chsize(file,0L);
  235. close(file);
  236. buf[length]=0;
  237. getnodedat(node_num,&thisnode,0);
  238. if(thisnode.action==NODE_MAIN || thisnode.action==NODE_XFER
  239.     || sys_status&SS_IN_CTRLP) {
  240.     CRLF; }
  241. if(thisnode.misc&NODE_MSGW) {
  242.     getnodedat(node_num,&thisnode,1);
  243.     thisnode.misc&=~NODE_MSGW;
  244.     putnodedat(node_num,thisnode); }
  245. putmsg(buf,P_NOATCODES);
  246. LFREE(buf);
  247. }
  248.  
  249.