home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / WWIVSOR.ZIP / SYSOPF.C < prev    next >
Text File  |  1995-05-12  |  20KB  |  834 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1995 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21.  
  22.  
  23. void isr1(int un, unsigned char *name)
  24. {
  25.   int cp,i;
  26.   smalrec sr;
  27.  
  28.   cp=0;
  29.   while ((cp<status.users) && (strcmp(name,(smallist[cp].name))>0))
  30.     ++cp;
  31.   for (i=status.users; i>cp; i--)
  32.     smallist[i]=smallist[i-1];
  33.   strcpy(sr.name,name);
  34.   sr.number=un;
  35.   smallist[cp]=sr;
  36.   ++status.users;
  37. }
  38.  
  39.  
  40. void reset_files(void)
  41. {
  42.   int i,i1,f;
  43.   userrec u;
  44.   char s[81];
  45.   long pos;
  46.   unsigned short users;
  47.  
  48.   read_status();
  49.   status.users=users=0;
  50.   nl();
  51.   i1=number_userrecs();
  52.   sprintf(s,"%sUSER.LST",syscfg.datadir);
  53.   f=sh_open1(s,O_RDONLY | O_BINARY);
  54.   if (f>=0) {
  55.     for (i=1; i<=i1; i++) {
  56.       pos=((long) syscfg.userreclen) * ((long) i);
  57.       sh_lseek(f,pos,SEEK_SET);
  58.       sh_read(f, (void *)&u, syscfg.userreclen);
  59.       if ((u.inact & inact_deleted)==0) {
  60.         fix_user_rec(&u);
  61.         status.users=users;
  62.         isr1(i,u.name);
  63.         users=status.users;
  64.       }
  65.       if ((i % 10)==0) {
  66.         f=sh_close(f);
  67.         npr("%d\r",i);
  68.         f=sh_open1(s,O_RDONLY | O_BINARY);
  69.       }
  70.     }
  71.     f=sh_close(f);
  72.   }
  73.   outstr("\r\n\r\n");
  74.  
  75.   lock_status();
  76.  
  77.   sprintf(s,"%sNAMES.LST",syscfg.datadir);
  78.   i=sh_open1(s,O_RDWR | O_BINARY | O_TRUNC);
  79.   if (i<0) {
  80.     printf(get_stringx(1,132),s);
  81.     exit(noklevel);
  82.   }
  83.   sh_write(i,(void *) (smallist), (sizeof(smalrec) * status.users));
  84.   i=sh_close(i);
  85.   status.users=users;
  86.   save_status();
  87. }
  88.  
  89. void outstr_x1(char *s)
  90. {
  91.   ansic_x(1);
  92.   outstr(s);
  93.   ansic_x(2);
  94. }
  95.  
  96.  
  97. void prstatus(void)
  98. {
  99.   int i;
  100.   long l;
  101.  
  102.   read_status();
  103.   outchr(12);
  104.   if (syscfg.newuserpw[0]!=0) {
  105.     outstr_x1(get_string(298)); pl(syscfg.newuserpw);
  106.   }
  107.   outstr_x1(get_string(299)); pl(syscfg.closedsystem?get_string(300):get_string(301));
  108.   outstr_x1(get_string(302)); pln(status.users);
  109.   outstr_x1(get_string(303)); npr("%ld\r\n",status.callernum1);
  110.   outstr_x1(get_string(304)); pl(status.date1);
  111.   outstr_x1(get_string(305)); pl(times());
  112.   outstr_x1(get_string(306)); pln(status.activetoday);
  113.   outstr_x1(get_string(307)); pln(status.callstoday);
  114.   outstr_x1(get_string(308)); pln(status.msgposttoday-status.localposts);
  115.   outstr_x1(get_string(960)); pln(status.localposts);
  116.   outstr_x1(get_string(309)); pln(status.emailtoday);
  117.   outstr_x1(get_string(310)); pln(status.fbacktoday);
  118.   outstr_x1(get_string(311)); pln(status.uptoday);
  119.   outstr_x1(get_string(312)); pln(fwaiting);
  120. #ifndef __OS2__
  121.   outstr_x1(get_string(18));  pln(_stklen);
  122. #endif
  123.   outstr_x1(get_string(19));  npr("%dk\r\n", (int) (bbscoreleft()/1024));
  124.   outstr_x1(get_string(20));  npr("%d%%\r\n", cachestat());
  125.   outstr_x1(get_string(938)); npr("%lu\r\n",status.qscanptr);
  126.   i=3;
  127.   l=(long) freek(3);
  128.   while ((l>0) && ((i+'@')<=cdir[0])) {
  129.     ansic_x(1);
  130.     npr("%c",i+'@');
  131.     outstr(get_string(313));
  132.     ansic_x(2);
  133.     npr("%ldk\r\n",l);
  134.     i++;
  135.     if ((i+'@')<=cdir[0])
  136.       l=(long) freek(i);
  137.   }
  138.   ansic_x(1);
  139.   outstr(get_string(314));
  140.   ansic_x(2);
  141.   if (!sysop2())
  142.     outstr(get_string(112));
  143.   pl(get_string(315));
  144.   if (num_instances() < 1)
  145.     return;
  146.   multi_instance();
  147. }
  148.  
  149. void valuser(int un)
  150. {
  151.   userrec u;
  152.   char s[81],s1[81],s2[81],s3[81],ar1[20],dar1[20],ch1;
  153.   int i,i1,ar2,dar2;
  154.  
  155.   read_user(un,&u);
  156.   if ((u.inact & inact_deleted)==0) {
  157.     nl();
  158.     outstr(get_string(1005)); pl(nam(&u,un));
  159.     outstr(get_string(238)); pl(u.realname);
  160.     outstr(get_string(242)); pl(u.phone);
  161.     outstr(get_string(244)); npr("%d %c\r\n", u.age, u.sex);
  162.     outstr(get_string(245)); pl(ctypes[u.comp_type]);
  163.     if (u.note[0]) {
  164.       outstr(get_string(253));
  165.       pl(u.note);
  166.     }
  167.     nl();
  168.     outstr(get_string(255)); pln(u.sl);
  169.     if ((u.sl!=255) && (u.sl<actsl)) {
  170.       outstr(get_string(316));
  171.       input(s,3);
  172.       if (s[0]) {
  173.         i=atoi(s);
  174.         if ((!wfc) && (i>=actsl))
  175.           i=-2;
  176.         if ((i>=0) && (i<255))
  177.           u.sl=i;
  178.     if (i==-1) {
  179.       nl();
  180.       prt(5,get_string(267));
  181.       if (yn()) {
  182.             deluser(un);
  183.         nl();
  184.         pl(get_string(56));
  185.         nl();
  186.       } else {
  187.         nl();
  188.         pl(get_string(317));
  189.       }
  190.       return;
  191.     }
  192.       }
  193.     }
  194.     nl();
  195.     outstr(get_string(318)); pln(u.dsl);
  196.     if ((u.dsl!=255) && (u.dsl<thisuser.dsl)) {
  197.       outstr(get_string(316));
  198.       input(s,3);
  199.       if (s[0]) {
  200.         i=atoi(s);
  201.         if ((!wfc) && (i>=thisuser.dsl))
  202.           i=-1;
  203.         if ((i>=0) && (i<255))
  204.           u.dsl=i;
  205.       }
  206.     }
  207.     strcpy(s3,restrict_string);
  208.     ar2=1;
  209.     dar2=1;
  210.     ar1[0]=13;
  211.     dar1[0]=13;
  212.     for (i=0; i<=15; i++) {
  213.       if (u.ar & (1 << i))
  214.         s[i]='A'+i;
  215.       else
  216.         s[i]=32;
  217.       if (thisuser.ar & (1 << i))
  218.         ar1[ar2++]='A'+i;
  219.       if (u.dar & (1 << i))
  220.         s1[i]='A'+i;
  221.       else
  222.         s1[i]=32;
  223.       if (thisuser.dar & (1 << i))
  224.         dar1[dar2++]='A'+i;
  225.       if (u.restrict & (1 << i))
  226.         s2[i]=s3[i];
  227.       else
  228.         s2[i]=32;
  229.     }
  230.     s[16]=0;
  231.     s1[16]=0;
  232.     s2[16]=0;
  233.     ar1[ar2]=0;
  234.     dar1[dar2]=0;
  235.     nl();
  236.     ch1=0;
  237.     if (ar2>1)
  238.       do {
  239.         outstr(get_string(258)); pl(s);
  240.         prt(2,get_string(319));
  241.         ch1=onek(ar1);
  242.         if (ch1!=13) {
  243.           ch1-='A';
  244.           if (s[ch1]==32)
  245.             s[ch1]=ch1+'A';
  246.           else
  247.             s[ch1]=32;
  248.           u.ar ^= (1 << ch1);
  249.           ch1=0;
  250.         }
  251.       } while ((!hangup) && (ch1!=13));
  252.     nl();
  253.     ch1=0;
  254.     if (dar2>1)
  255.       do {
  256.         outstr(get_string(259)); pl(s1);
  257.         prt(2,get_string(319));
  258.         ch1=onek(dar1);
  259.         if (ch1!=13) {
  260.           ch1-='A';
  261.           if (s1[ch1]==32)
  262.             s1[ch1]=ch1+'A';
  263.           else
  264.             s1[ch1]=32;
  265.           u.dar ^= (1 << ch1);
  266.           ch1=0;
  267.         }
  268.       } while ((!hangup) && (ch1!=13));
  269.     nl();
  270.     ch1=0;
  271.     s[0]=13;
  272.     s[1]='?';
  273.     strcpy(&(s[2]),restrict_string);
  274.     do {
  275.       npr("      %s\r\n",s3);
  276.       outstr(get_string(320)); pl(s2);
  277.       prt(2,get_string(319));
  278.       ch1=onek(s);
  279.       if ((ch1!=13) && (ch1!=32) && (ch1!='?')) {
  280.         i=-1;
  281.         for (i1=0; i1<16; i1++)
  282.           if (ch1==s[i1+2])
  283.             i=i1;
  284.         if (i>-1) {
  285.           u.restrict ^= (1 << i);
  286.           if (s2[i]==32)
  287.             s2[i]=s3[i];
  288.           else
  289.             s2[i]=32;
  290.         }
  291.         ch1=0;
  292.       }
  293.       if (ch1=='?') {
  294.         ch1=0;
  295.         printmenu(10);
  296.       }
  297.     } while ((!hangup) && (ch1==0));
  298.     write_user(un,&u);
  299.     nl();
  300.   } else {
  301.     nl();
  302.     pl(get_string(321));
  303.     nl();
  304.   }
  305. }
  306.  
  307. #define NET_SEARCH_SUBSTR     0x0001
  308. #define NET_SEARCH_AREACODE   0x0002
  309. #define NET_SEARCH_GROUP      0x0004
  310. #define NET_SEARCH_AC         0x0008
  311. #define NET_SEARCH_GC         0x0010
  312. #define NET_SEARCH_NC         0x0020
  313. #define NET_SEARCH_PHSUBSTR   0x0040
  314. #define NET_SEARCH_NOCONNECT  0x0080
  315. #define NET_SEARCH_NEXT       0x0100
  316. #define NET_SEARCH_HOPS       0x0200
  317. #define NET_SEARCH_ALL        0xFFFF
  318.  
  319. void print_net_listing(unsigned int tp)
  320. {
  321.   int done=0, i, i1, gn=0, onxi, odci, abort, matched, f, useregion;
  322.   net_system_list_rec csne;
  323.   unsigned short slist,cmdbit=0;
  324.   unsigned char substr[81], onx[20], acstr[4], phstr[13], *mmk;
  325.   unsigned char cmd, ch, s[161], s1[101], s2[101], s3[101], s4[101], bbstype;
  326.   unsigned long l;
  327.  
  328.   read_status();
  329.  
  330.   helpl=45;
  331.  
  332.   if (!net_num_max)
  333.     return;
  334.  
  335.   write_inst(INST_LOC_NETLIST,0,INST_FLAGS_NONE);
  336.  
  337.   if (tp) {
  338.     l=thisuser.sysstatus;
  339.     if ((l & sysstatus_pause_on_page)==0)
  340.       thisuser.sysstatus ^= sysstatus_pause_on_page;
  341.   }
  342.  
  343.   while (!done && !hangup) {
  344.     outchr(12);
  345.     if (net_num_max>1) {
  346.       odc[0]=0;
  347.       odci=0;
  348.       onx[0]='Q';
  349.       onx[1]=0;
  350.       onxi=1;
  351.       nl();
  352.       for (i=0; i<net_num_max; i++) {
  353.         if (i<9) {
  354.           onx[onxi++]=i+'1';
  355.           onx[onxi]=0;
  356.         } else {
  357.           odci=(i+1)/10;
  358.           odc[odci-1]=odci+'0';
  359.           odc[odci]=0;
  360.         }
  361.         npr("2%d7]1 %s\r\n",i+1,net_networks[i].name);
  362.       }
  363.       pl(get_string(1279));
  364.       nl();
  365.       prt(9,get_string(1280));
  366.       if (net_num_max<9) {
  367.         ch=onek(onx);
  368.         if (ch=='Q')
  369.           done=1;
  370.         else
  371.           i=ch-'1';
  372.       } else {
  373.         mmk=mmkey(2);
  374.         if (*mmk=='Q')
  375.           done=1;
  376.         else
  377.           i=atoi(mmk)-1;
  378.       }
  379.  
  380.       if (done)
  381.         break;
  382.  
  383.       if ((i>=0) && (i<net_num_max)) {
  384.         set_net_num(i);
  385.       } else
  386.         continue;
  387.     }
  388.  
  389.     read_bbs_list_index();
  390.     abort=0; cmdbit=0; slist=0;
  391.     substr[0]=0; acstr[0]=0; phstr[0]=0;
  392.  
  393.     nl();
  394.     pl(get_string(1281));
  395.     pl(get_string(1282));
  396.     pl(get_string(1283));
  397.     pl(get_string(1284));
  398.     pl(get_string(1285));
  399.     pl(get_string(1286));
  400.     pl(get_string(1287));
  401.     pl(get_string(1288));
  402.     pl(get_string(1289));
  403.     pl(get_string(1290));
  404.     nl();
  405.     outstr(get_string(1291));
  406.     cmd=onek("Q123456789");
  407.  
  408.     switch (cmd) {
  409.       case 'Q':
  410.         done=1;
  411.         break;
  412.       case '1':
  413.         cmdbit=NET_SEARCH_ALL;
  414.         break;
  415.       case '2':
  416.         cmdbit=NET_SEARCH_AREACODE;
  417.         nl();
  418.         outstr(get_string(1292));
  419.         input(acstr,3);
  420.         if (strlen(acstr)!=3)
  421.           abort=1;
  422.         if (!abort)
  423.           for (i=0; i<3; i++)
  424.             if ((acstr[i]<'0') || (acstr[i]>'9'))
  425.               abort=1;
  426.         if (abort) {
  427.           pl(get_string(1293));
  428.           pausescr();
  429.           cmdbit=0;
  430.         }
  431.         break;
  432.       case '3':
  433.         cmdbit=NET_SEARCH_GROUP;
  434.         nl();
  435.         outstr(get_string(1294));
  436.         input(s,2);
  437.         if ((s[0]==0) || (atoi(s)<1)) {
  438.           pl(get_string(1295));
  439.           pausescr();
  440.           cmdbit=0;
  441.           break;
  442.         }
  443.         gn=atoi(s);
  444.         break;
  445.       case '4':
  446.         cmdbit=NET_SEARCH_AC;
  447.         break;
  448.       case '5':
  449.         cmdbit=NET_SEARCH_GC;
  450.         break;
  451.       case '6':
  452.         cmdbit=NET_SEARCH_NC;
  453.         break;
  454.       case '7':
  455.         cmdbit=NET_SEARCH_SUBSTR;
  456.         nl();
  457.         outstr(get_string(1296));
  458.         input(substr,40);
  459.         if (substr[0]==0) {
  460.           pl(get_string(1297));
  461.           pausescr();
  462.           cmdbit=0;
  463.         }
  464.         break;
  465.       case '8':
  466.         cmdbit=NET_SEARCH_PHSUBSTR;
  467.         nl();
  468.         outstr(get_string(1298));
  469.         input(phstr,12);
  470.         if (phstr[0]==0) {
  471.           pl(get_string(1299));
  472.           pausescr();
  473.           cmdbit=0;
  474.         }
  475.         break;
  476.       case '9':
  477.         cmdbit=NET_SEARCH_NOCONNECT;
  478.         break;
  479.     }
  480.  
  481.     if (!cmdbit)
  482.       continue;
  483.  
  484.     nl();
  485.     outstr(get_string(1300));
  486.     useregion=yn();
  487.  
  488.     sprintf(s,"%sBBSDATA.NET",net_data);
  489.     f=sh_open1(s,O_RDONLY | O_BINARY);
  490.     if (f < 0) {
  491.       npr("%s%s!",get_string(1301),s);
  492.       nl();
  493.       pausescr();
  494.       continue;
  495.     }
  496.  
  497.     strcpy(s,get_string(1302));
  498.     nln(2);
  499.  
  500.     for (i=0; (i<num_sys_list) && (!abort); i++) {
  501.       matched=0;
  502.       sh_read(f,&csne,sizeof(net_system_list_rec));
  503.       if ((csne.forsys==65535) && (cmdbit!=NET_SEARCH_NOCONNECT))
  504.         continue;
  505.       strcpy(s1,csne.phone);
  506.  
  507.       if (csne.other & other_net_coord)
  508.         bbstype='&';
  509.       else if (csne.other & other_group_coord)
  510.         bbstype='%';
  511.       else if (csne.other & other_coordinator)
  512.         bbstype='^';
  513.       else
  514.         bbstype=' ';
  515.  
  516.       strcpy(s2,csne.name);
  517.       for (i1=0; i1<strlen(s2); i1++)
  518.         s2[i1]=upcase(s2[i1]);
  519.  
  520.       switch (cmdbit) {
  521.         case NET_SEARCH_ALL:
  522.           matched=1;
  523.           break;
  524.         case NET_SEARCH_AREACODE:
  525.           if (strncmp(acstr, csne.phone, 3)==0)
  526.             matched=1;
  527.           break;
  528.         case NET_SEARCH_GROUP:
  529.           if (gn==csne.group)
  530.             matched=1;
  531.           break;
  532.         case NET_SEARCH_AC:
  533.           if (csne.other & other_coordinator)
  534.             matched=1;
  535.           break;
  536.         case NET_SEARCH_GC:
  537.           if (csne.other & other_group_coord)
  538.             matched=1;
  539.           break;
  540.         case NET_SEARCH_NC:
  541.           if (csne.other & other_net_coord)
  542.             matched=1;
  543.           break;
  544.         case NET_SEARCH_SUBSTR:
  545.           if (strstr(s2,substr)!=NULL)
  546.             matched=1;
  547.           else {
  548.             sprintf(s3,"@%u",csne.sysnum);
  549.             if (strstr(s3,substr)!=NULL)
  550.               matched=1;
  551.           }
  552.           break;
  553.         case NET_SEARCH_PHSUBSTR:
  554.           if (strstr(s1,phstr)!=NULL)
  555.             matched=1;
  556.           break;
  557.         case NET_SEARCH_NOCONNECT:
  558.           if (csne.forsys==65535)
  559.             matched=1;
  560.           break;
  561.       }
  562.  
  563.       if (matched) {
  564.         slist++;
  565.         if ((!useregion) && (slist==1)) {
  566.           pla(get_string(1303),&abort);
  567.           pla(get_string(1304),&abort);
  568.         } else {
  569.           if ((useregion) && (strncmp(s,csne.phone,3)!=0)) {
  570.             strcpy(s,csne.phone);
  571.             describe_area_code(atoi(csne.phone),s3);
  572.             sprintf(s4,"\r\n%s%s\r\n",get_string(1305),s3);
  573.             pla(s4,&abort);
  574.             pla(get_string(1303),&abort);
  575.             pla(get_string(1304),&abort);
  576.           }
  577.         }
  578.         if (cmdbit!=NET_SEARCH_NOCONNECT)
  579.           sprintf(s3,"%5u%c %12s  %-40s %3d %5u %2d",
  580.               csne.sysnum,bbstype,csne.phone,csne.name,
  581.               csne.numhops,csne.forsys,csne.group);
  582.         else
  583.           sprintf(s3,"%5u%c %12s  %-40s%s%2d",
  584.               csne.sysnum,bbstype,csne.phone,csne.name,get_string(1307),csne.group);
  585.         pla(s3, &abort);
  586.       }
  587.     }
  588.     f=sh_close(f);
  589.     if ((!abort) && (slist)) {
  590.       nl();
  591.       npr("%s%d\r\n",get_string(1306),slist);
  592.     }
  593.     pausescr();
  594.   }
  595.   if (tp)
  596.     thisuser.sysstatus=l;
  597. }
  598.  
  599.  
  600. void read_new_stuff(void)
  601. {
  602.   int i;
  603.  
  604.   zap_bbs_list();
  605.   for (i=0; i<net_num_max; i++) {
  606.     set_net_num(i);
  607.     zap_call_out_list();
  608.     zap_contacts();
  609.   }
  610.   set_language(0);
  611. }
  612.  
  613.  
  614. void mailr(void)
  615. {
  616.   int i,f,next,tp,nn;
  617.   mailrec m, m1;
  618.   char c;
  619.   userrec u;
  620.  
  621.   f=open_email(0);
  622.   if (f!=-1) {
  623.     i=filelength(f)/sizeof(mailrec)-1;
  624.     c=' ';
  625.     while ((i>=0) && (c!='Q') && (!hangup)) {
  626.       sh_lseek(f,((long) (i)) * ((long) sizeof(mailrec)),SEEK_SET);
  627.       sh_read(f,(void *)&m,sizeof(mailrec));
  628.       if (m.touser!=0) {
  629.         f=sh_close(f);
  630.         do {
  631.           read_user(m.touser,&u);
  632.           outstr(get_string(325));
  633.           pl(nam(&u,m.touser));
  634.           tp=80;
  635.           if (m.status & status_source_verified)
  636.             tp -= 2;
  637.           if (m.status & status_new_net) {
  638.             tp -= 1;
  639.             if (strlen(m.title)<=tp) {
  640.               nn=m.title[tp+1];
  641.             } else
  642.               nn=0;
  643.           } else
  644.             nn=0;
  645.           set_net_num(nn);
  646.           outstr(get_string(326)); pl(m.title);
  647.           setorigin(m.fromsys, m.fromuser);
  648.           read_message1(&(m.msg),m.anony & 0x0f,1,&next,"EMAIL");
  649.           prt(2,get_string(327));
  650.           if (next)
  651.             c=' ';
  652.           else
  653.             c=onek("QRD ");
  654.           if (c=='D') {
  655.             f=open_email(1);
  656.             sh_lseek(f,((long) (i)) * ((long) sizeof(mailrec)),SEEK_SET);
  657.             sh_read(f,(void *)&m1,sizeof(mailrec));
  658.             if (memcmp(&m, &m1, sizeof(mailrec))==0)
  659.               delmail(f,i);
  660.             else
  661.               pl(get_string(1308));
  662.             f=sh_close(f);
  663.             if ((!useron) && (m.touser==1) && (m.tosys==0))
  664.               --thisuser.waiting;
  665.           }
  666.           nln(2);
  667.         } while ((c=='R') && (!hangup));
  668.  
  669.         f=open_email(0);
  670.         if (f<0)
  671.           break;
  672.       }
  673.       i-=1;
  674.     }
  675.     sh_close(f);
  676.   }
  677. }
  678.  
  679.  
  680. void chuser(void)
  681. {
  682.   char s[81];
  683.   int i;
  684.  
  685.   if (!checkpw())
  686.     return;
  687.   if (!so())
  688.     return;
  689.   prt(2,get_string(328));
  690.   input(s,30);
  691.   i=finduser1(s);
  692.   if (i>0) {
  693.     write_user(usernum,&thisuser);
  694.     write_qscn(usernum,qsc,0);
  695.     read_user(i,&thisuser);
  696.     read_qscn(i,qsc,0);
  697.     usernum=i;
  698.     actsl=255;
  699.     sprintf(s,get_stringx(1,17),nam(&thisuser,usernum));
  700.     sysoplog(s);
  701.     changedsl();
  702.     topscreen();
  703.   } else
  704.     pl(get_string(8));
  705. }
  706.  
  707. void zlog(void)
  708. {
  709.   zlogrec z;
  710.   char s[81];
  711.   int abort,f,i,i1;
  712.  
  713.   sprintf(s,"%sZLOG.DAT",syscfg.datadir);
  714.   f=sh_open1(s,O_RDONLY | O_BINARY);
  715.   if (f<0)
  716.     return;
  717.   i=0;
  718.   abort=0;
  719.   sh_read(f,(void *)&z,sizeof(zlogrec));
  720.   pla(get_string(329),&abort);
  721.   pla(get_string(330),&abort);
  722.   while ((i<97) && (!abort) && (!hangup) && (z.date[0]!=0)) {
  723.     if (z.calls)
  724.       i1=z.active/z.calls;
  725.     else
  726.       i1=0;
  727.     sprintf(s,"%s    %4d    %4d     %3d     %3d     %3d    %3d     %3d      %3d",
  728.          z.date,z.calls,z.active,z.posts,z.email,z.fback,z.up,10*z.active/144,i1);
  729.     pla(s,&abort);
  730.     ++i;
  731.     if (i<97) {
  732.       sh_lseek(f,((long) i) * sizeof(zlogrec),SEEK_SET);
  733.       sh_read(f,(void *)&z,sizeof(zlogrec));
  734.     }
  735.   }
  736.   sh_close(f);
  737. }
  738.  
  739.  
  740. void beginday(void)
  741. {
  742.   char s[255];
  743.   zlogrec z,z1;
  744.   int f,i;
  745.  
  746.   double fk;
  747.   int    nus;
  748.  
  749.   if (instance != 1) {
  750.     read_status();
  751.     return;
  752.   }
  753.   lock_status();
  754.  
  755.   if (strcmp(date(), status.date1)==0)  {
  756.     save_status();
  757.     return;
  758.   }
  759.   pl(get_string(331));
  760.  
  761.   strcpy(z.date,status.date1);
  762.   z.active=status.activetoday;
  763.   z.calls=status.callstoday;
  764.   z.posts=status.localposts;
  765.   z.email=status.emailtoday;
  766.   z.fback=status.fbacktoday;
  767.   z.up=status.uptoday;
  768.   status.callstoday=0;
  769.   status.msgposttoday=0;
  770.   status.localposts=0;
  771.   status.emailtoday=0;
  772.   status.fbacktoday=0;
  773.   status.uptoday=0;
  774.   status.activetoday=0;
  775.   status.days++;
  776.   strcpy(status.date3,status.date2);
  777.   strcpy(status.date2,status.date1);
  778.   strcpy(status.date1,date());
  779.   strcpy(status.log2,status.log1);
  780.   slname(status.date2, status.log1);
  781.  
  782.   sprintf(s,"%s%s",syscfg.gfilesdir, status.log2);
  783.   unlink(s);
  784.  
  785.   sprintf(s,"%sUSER.LOG",syscfg.gfilesdir);
  786.   unlink(s);
  787.   sprintf(s,"%sZLOG.DAT",syscfg.datadir);
  788.   f=sh_open1(s,O_RDWR | O_BINARY);
  789.   if (f<0) {
  790.     f=sh_open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  791.     z1.date[0]=0;
  792.     z1.active=0;
  793.     z1.calls=0;
  794.     z1.posts=0;
  795.     z1.email=0;
  796.     z1.fback=0;
  797.     z1.up=0;
  798.     for (i=0; i<97; i++)
  799.       sh_write(f,(void *)&z1,sizeof(zlogrec));
  800.   } else {
  801.     for (i=96; i>=1; i--) {
  802.       sh_lseek(f,(long) ((i-1) * sizeof(zlogrec)),SEEK_SET);
  803.       sh_read(f,(void *)&z1,sizeof(zlogrec));
  804.       sh_lseek(f,(long) (i * sizeof(zlogrec)),SEEK_SET);
  805.       sh_write(f,(void *)&z1,sizeof(zlogrec));
  806.     }
  807.   }
  808.   sh_lseek(f,0L,SEEK_SET);
  809.   sh_write(f,(void *)&z,sizeof(zlogrec));
  810.   sh_close(f);
  811.  
  812.   save_status();
  813.  
  814.   fk=freek1(syscfg.datadir);
  815.   nus=syscfg.maxusers-status.users;
  816.  
  817.   if (fk<512.0) {
  818.     sprintf(s,get_stringx(1,18),(int) fk);
  819.     ssm(1,0,s);
  820.   }
  821.  
  822.   if ((!syscfg.closedsystem) && (nus<15)){
  823.     sprintf(s,get_stringx(1,19),nus);
  824.     ssm(1,0,s);
  825.   }
  826.  
  827.   if (syscfg.beginday_c[0]) {
  828.     stuff_in(s,syscfg.beginday_c,create_chain_file(),"","","","");
  829.     extern_prog(s, sysinfo.spawn_opts[2]);
  830.   }
  831. }
  832.  
  833.  
  834.