home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / UTILITY / ES102.ARJ / BE.C next >
Text File  |  1990-07-16  |  15KB  |  606 lines

  1. /* note this is capable but NOT modded for 64 base mod */
  2. /* this is an exact copy of boardedit() in SYSOPF.C so */
  3. /* converting it to 64 base shouldn't be hard at all   */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <io.h>
  8. #include <fcntl.h>
  9. #include <dos.h>
  10. #include <stdlib.h>
  11. #include <sys\stat.h>
  12. #include "vardec.h"
  13. #define DO_PW_CHECK
  14. /* delete or comment out above line if sysop password check is not desired */
  15.  
  16. int    usernum,             /* user number for the user */
  17.        age,                 /* age of the user */
  18.        screenchars,         /* chars/line user has specified */
  19.        screenlines,         /* lines/screen user has specified */
  20.        sl,                  /* sec lev for user (0-255) */
  21.        so,                  /* non-zero if user is sysop (sl=255) */
  22.        cs,                  /* non-zero if user is co-sysop */
  23.        okansi,              /* non-zero if user can support ANSI */
  24.        incom,               /* non-zero if user is calling remotely */
  25.        comport;             /* com port user is on */
  26. char   name[81],            /* name/alias of user */
  27.        realname[81],        /* real name of user */
  28.        callsign[10],        /* amateur radio callsign of user */
  29.        sex,                 /* sex of user, M or F */
  30.        laston[81],          /* date user was last on */
  31.        gfiles[81],          /* directory for text files, ends in \ */
  32.        data[81],            /* directory for non-text files, ends in \ */
  33.        sysoplog[81],        /* full path & filename for sysop log */
  34.        curspeed[81];        /* speed user is on at, "KB" if local */
  35. double gold,                /* gold user has */
  36.        timeallowed,         /* number of seconds before user logged off */
  37.        version;             /* version of WWIV running under */
  38. configrec syscfg;
  39. int num_subs, userfile;
  40. subboardrec subboards[64];
  41.  
  42. void far interrupt (*inli)(char *, char *, int, int);
  43. void far interrupt (*checka)(int *, int *);
  44. void far interrupt (*pla)(char *, int *);
  45. void far interrupt (*outchr)(char);
  46. void far interrupt (*outstr)(char *);
  47. void far interrupt (*nl)();
  48. void far interrupt (*pl)(char *);
  49. int  far interrupt (*empty)();
  50. char far interrupt (*inkey)();
  51. unsigned char far interrupt (*getkey)();
  52. void far interrupt (*input)(char *, int);
  53. void far interrupt (*inputl)(char *, int);
  54. int  far interrupt (*yn)();
  55. int  far interrupt (*ny)();
  56. void far interrupt (*ansic)(int);
  57. char far interrupt (*onek)(char *);
  58. void far interrupt (*prt)(int, char *);
  59. void far interrupt (*mpl)(int);
  60. void far **funcs;
  61.  
  62. int read_in_data(char *fn)
  63. {
  64.   char buf[1024];
  65.   char *ptr[30],*ss,s[81];
  66.   int i,f,len,i1;
  67.   float fl;
  68.  
  69.   f=open(fn,O_RDONLY | O_BINARY);
  70.   if (f<0) {
  71.     return(-1);
  72.   }
  73.   i1=1;
  74.   ptr[0]=buf;
  75.   len=read(f,(void *)buf,1024);
  76.   close(f);
  77.   for (i=0; i<len; i++)
  78.     if (buf[i]==13) {
  79.       buf[i]=0;
  80.       ptr[i1++]=&buf[i+2];
  81.     }
  82.   while (*ptr[6]==32)
  83.     ++(ptr[6]);
  84.   while (*ptr[15]==32)
  85.     ++(ptr[15]);
  86.   usernum=atoi(ptr[0]);
  87.   strcpy(name,ptr[1]);
  88.   strcpy(realname,ptr[2]);
  89.   strcpy(callsign,ptr[3]);
  90.   age=atoi(ptr[4]);
  91.   sex=*ptr[5];
  92.   sscanf(ptr[6],"%f",&fl);
  93.   gold=(double)fl;
  94.   strcpy(laston,ptr[7]);
  95.   screenchars=atoi(ptr[8]);
  96.   screenlines=atoi(ptr[9]);
  97.   sl=atoi(ptr[10]);
  98.   so=atoi(ptr[11]);
  99.   cs=atoi(ptr[12]);
  100.   okansi=atoi(ptr[13]);
  101.   incom=atoi(ptr[14]);
  102.   sscanf(ptr[15],"%f",&fl);
  103.   timeallowed=(double)fl;
  104.   strcpy(gfiles,ptr[16]);
  105.   strcpy(data,ptr[17]);
  106.   strcpy(sysoplog,gfiles);
  107.   strcat(sysoplog,ptr[18]);
  108.   strcpy(curspeed,ptr[19]);
  109.   comport=atoi(ptr[20]);
  110.   version=-1.0;
  111.   ss=getenv("BBS");
  112.   if (strncmp(ss,"WWIV",4)) {
  113.     printf("\nThis program MUST be run under WWIV v4.07 or later.\n");
  114.     exit(0);
  115.   }
  116.   strcpy(s,&(ss[6]));
  117.   i=(s[0]-'0')*100+(s[2]-'0')*10+(s[3]-'0');
  118.   version=((double)i)/100.0;
  119.   if (i<407) {
  120.     printf("\nThis program requires WWIV v4.07 or later.\n");
  121.     exit(0);
  122.   }
  123.   funcs=(void far *)getvect(0x6a);
  124.   inli=funcs[0];
  125.   checka=funcs[1];
  126.   pla=funcs[2];
  127.   outchr=funcs[3];
  128.   outstr=funcs[4];
  129.   nl=funcs[5];
  130.   pl=funcs[8];
  131.   empty=funcs[9];
  132.   inkey=funcs[10];
  133.   getkey=funcs[11];
  134.   input=funcs[12];
  135.   inputl=funcs[13];
  136.   yn=funcs[14];
  137.   ny=funcs[15];
  138.   ansic=funcs[16];
  139.   onek=funcs[17];
  140.   prt=funcs[18];
  141.   mpl=funcs[19];
  142.   return(0);
  143. }
  144.  
  145. int checkpw()
  146. {
  147. #ifdef DO_PW_CHECK
  148.   char s[81];
  149.  
  150.   nl();
  151.   prt(2,"SY: ");
  152.   input(s,20);
  153.   if (strcmp(s,(syscfg.systempw))==0)
  154. #endif
  155.     return(1);
  156. #ifdef DO_PW_CHECK
  157.   else
  158.     return(0);
  159. #endif
  160. }
  161.  
  162. void close_user()
  163. {
  164.   if (userfile!=-1) {
  165.     close(userfile);
  166.     userfile=-1;
  167.   }
  168. }
  169.  
  170. void read_user(unsigned int un, userrec *u)
  171. {
  172.   long pos;
  173.   char s[80];
  174.   int i;
  175.  
  176.   if (userfile==-1) {
  177.     sprintf(s, "%sUSER.LST", syscfg.datadir);
  178.     userfile=open(s,O_RDWR | O_BINARY);
  179.     if (userfile<0) {
  180.       u->inact=inact_deleted;
  181.       return;
  182.     }
  183.   }
  184.   pos=((long) sizeof(userrec)) * ((long) un);
  185.   if (filelength(userfile)<=pos) {
  186.     u->inact=inact_deleted;
  187.     return;
  188.   }
  189.   lseek(userfile,pos,SEEK_SET);
  190.   i=read(userfile, (void *)u, sizeof(userrec));
  191.   if (i==-1) {
  192.     sprintf(s, "%sUSER.LST", syscfg.datadir);
  193.     userfile=open(s,O_RDWR | O_BINARY);
  194.     if (userfile<0) {
  195.       u->inact=inact_deleted;
  196.       return;
  197.     }
  198.     pos=((long) sizeof(userrec)) * ((long) un);
  199.     if (filelength(userfile)<=pos) {
  200.       u->inact=inact_deleted;
  201.       return;
  202.     }
  203.     lseek(userfile,pos,SEEK_SET);
  204.     i=read(userfile, (void *)u, sizeof(userrec));
  205.     if (i==-1) {
  206.       pl("COULDN'T READ USER.");
  207.     }
  208.     close_user();
  209.   }
  210. }
  211.  
  212. void write_user(unsigned int un, userrec *u)
  213. {
  214.   long pos;
  215.   char s[80];
  216.   unsigned char oldsl;
  217.   int i;
  218.  
  219.   if (userfile==-1) {
  220.     sprintf(s, "%sUSER.LST", syscfg.datadir);
  221.     userfile=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  222.   }
  223.   pos=((long) sizeof(userrec)) * ((long) un);
  224.   lseek(userfile,pos,SEEK_SET);
  225.   i=write(userfile, (void *)u, sizeof(userrec));
  226.   if (i==-1) {
  227.     sprintf(s, "%sUSER.LST", syscfg.datadir);
  228.     userfile=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  229.     pos=((long) sizeof(userrec)) * ((long) un);
  230.     lseek(userfile,pos,SEEK_SET);
  231.     i=write(userfile, (void *)u, sizeof(userrec));
  232.     if (i==-1) {
  233.       pl("COULDN'T WRITE USER.");
  234.     }
  235.     close_user();
  236.   }
  237. }
  238.  
  239. void boarddata(int n, char *s)
  240. {
  241.   char x,y,k,i;
  242.   subboardrec r;
  243.  
  244.   r=subboards[n];
  245.   if (r.ar==0)
  246.     x=32;
  247.   else {
  248.     for (i=0; i<16; i++)
  249.       if ((1 << i) & r.ar)
  250.         x='A'+i;
  251.   }
  252.   switch(r.anony) {
  253.     case 0: y='N'; break;
  254.     case anony_enable_anony: y='Y'; break;
  255.     case anony_enable_dear_abby: y='D'; break;
  256.     case anony_force_anony: y='F'; break;
  257.     case anony_real_name: y='R'; break;
  258.   }
  259.   if (r.key==0)
  260.     k=32;
  261.   else
  262.     k=r.key;
  263.   sprintf(s,"%2d %1c %1c  %-40s  %-8s %-3d %-3d %-3d %-3d %1c",
  264.             n,k,x,r.name,r.filename,r.readsl,r.postsl,r.age,r.maxmsgs,y);
  265. }
  266.  
  267. void showsubs()
  268. {
  269.   int abort,i;
  270.   char s[180];
  271.  
  272.   outchr(12);
  273.   abort=0;
  274.   pla("NN K AR Name                                      FN       RSL PSL AGE MSG ANON",
  275.       &abort);
  276.   pla("== - == ----------------------------------------  ======== --- === --- === ----",
  277.       &abort);
  278.   for (i=0; (i<num_subs) && (!abort); i++) {
  279.     boarddata(i,s);
  280.     pla(s,&abort);
  281.   }
  282. }
  283.  
  284. void modify_sub(int n)
  285. {
  286.   subboardrec r;
  287.   char s[81],s1[81],s2[81],ch,ch2;
  288.   int i,i1,done;
  289.  
  290.   r=subboards[n];
  291.   done=0;
  292.   do {
  293.     outchr(12);
  294.     sprintf(s2, "A. Name       : %s", r.name); pl(s2);
  295.     sprintf(s2, "B. Filename   : %s", r.filename); pl(s2);
  296.     if (r.key==0)
  297.       strcpy(s,"None");
  298.     else {
  299.       s[0]=r.key;
  300.       s[1]=0;
  301.     }
  302.     sprintf(s2, "C. Key        : %s", s); pl(s2);
  303.     itoa(r.readsl,s,10);
  304.     sprintf(s2, "D. Read SL    : %s", s); pl(s2);
  305.     itoa(r.postsl,s,10);
  306.     sprintf(s2, "E. Post SL    : %s", s); pl(s2);
  307.     switch(r.anony) {
  308.       case 0: strcpy(s,"No."); break;
  309.       case anony_enable_anony: strcpy(s,"Yes."); break;
  310.       case anony_enable_dear_abby: strcpy(s,"Dear Abby."); break;
  311.       case anony_force_anony: strcpy(s,"Forced."); break;
  312.       case anony_real_name: strcpy(s,"Real Name"); break;
  313.     }
  314.     sprintf(s2, "F. Anony      : %s",s); pl(s2);
  315.     itoa(r.age,s,10);
  316.     sprintf(s2, "G. Min. Age   : %s",s); pl(s2);
  317.     itoa(r.maxmsgs,s,10);
  318.     sprintf(s2, "H. Max Msgs   : %s",s); pl(s2);
  319.     strcpy(s,"None.");
  320.     if (r.ar!=0) {
  321.       for (i=0; i<16; i++)
  322.         if ((1 << i) & r.ar)
  323.           s[0]='A'+i;
  324.       s[1]=0;
  325.     }
  326.     sprintf(s2, "I. AR         : %s",s); pl(s2);
  327.     ltoa((unsigned long) r.type,s,10);
  328.     sprintf(s2, "J. Sub Type   : %s",s); pl(s2);
  329.     itoa(r.storage_type,s,10);
  330.     sprintf(s2, "K. Storage typ: %s",s); pl(s2);
  331.     nl();
  332.     prt(2,"Which (A-K,Q) ? ");
  333.     ch=onek("QABCDEFGHIJK");
  334.     switch(ch) {
  335.       case 'Q':done=1; break;
  336.       case 'A':
  337.         nl();
  338.         prt(2,"New Name? ");
  339.         inputl(s,40);
  340.         if (s[0])
  341.           strcpy(r.name,s);
  342.         break;
  343.       case 'B':
  344.         nl();
  345.         prt(2,"New Filename? ");
  346.         input(s,8);
  347.         if ((s[0]!=0) && (strchr(s,'.')==0))
  348.           strcpy(r.filename,s);
  349.         break;
  350.       case 'C':
  351.         nl();
  352.         prt(2,"New Key (spc=none) ? ");
  353.         ch2=onek("@#$%^&()-_=+\\|][{};:'\",<>`~ ");
  354.         if (ch2==32)
  355.           r.key=0;
  356.         else
  357.           r.key=ch2;
  358.         break;
  359.       case 'D':
  360.         nl();
  361.         prt(2,"New Read SL? ");
  362.         input(s,3);
  363.         i=atoi(s);
  364.         if ((i>=0) && (i<256) && (s[0]))
  365.           r.readsl=i;
  366.         break;
  367.       case 'E':
  368.         nl();
  369.         prt(2,"New Post SL? ");
  370.         input(s,3);
  371.         i=atoi(s);
  372.         if ((i>=0) && (i<256) && (s[0]))
  373.           r.postsl=i;
  374.         break;
  375.       case 'F':
  376.         nl();
  377.         prt(2,"New Anony (Y,N,D,F,R) ? ");
  378.         ch2=onek("NYDFR");
  379.         switch(ch2) {
  380.           case 'N': r.anony=0; break;
  381.           case 'Y': r.anony=anony_enable_anony; break;
  382.           case 'D': r.anony=anony_enable_dear_abby; break;
  383.           case 'F': r.anony=anony_force_anony; break;
  384.           case 'R': r.anony=anony_real_name; break;
  385.         }
  386.         break;
  387.       case 'G':
  388.         nl();
  389.         prt(2,"New Min Age? ");
  390.         input(s,3);
  391.         i=atoi(s);
  392.         if ((i>=0) && (i<128) && (s[0]))
  393.           r.age=i;
  394.         break;
  395.       case 'H':
  396.         nl();
  397.         prt(2,"New Max Msgs? ");
  398.         input(s,3);
  399.         i=atoi(s);
  400.         if ((i>0) && (i<255) && (s[0]))
  401.           r.maxmsgs=i;
  402.         break;
  403.       case 'I':
  404.         nl();
  405.         prt(2,"New AR (<SPC>=None) ? ");
  406.         ch2=onek("ABCDEFGHIJKLMNOP ");
  407.         if (ch2==32)
  408.           r.ar=0;
  409.         else
  410.           r.ar=1 << (ch2-'A');
  411.         break;
  412.       case 'J':
  413.         nl();
  414.         prt(2,"New Sub Type? ");
  415.         input(s,5);
  416.         i=atoi(s);
  417.         if (s[0])
  418.           r.type=i;
  419.         break;
  420.       case 'K':
  421.         nl();
  422.         prt(2,"New Storage Type (0,1,2) ? ");
  423.         input(s,4);
  424.         i=atoi(s);
  425.         if ((s[0]) && (i>=0) && (i<=2))
  426.           r.storage_type=i;
  427.         break;
  428.     }
  429.   } while (!done);
  430.   subboards[n]=r;
  431. }
  432.  
  433. void insert_sub(int n)
  434. {
  435.   subboardrec r;
  436.   int i,i1,nu;
  437.   userrec u;
  438.   long l1,l2,l3;
  439.  
  440.   for (i=num_subs-1; i>=n; i--)
  441.     subboards[i+1]=subboards[i];
  442.   strcpy(r.name,"** NEW SUB **");
  443.   strcpy(r.filename,"NONAME");
  444.   r.key=0;
  445.   r.readsl=60;
  446.   r.postsl=60;
  447.   r.anony=0;
  448.   r.age=0;
  449.   r.maxmsgs=100;
  450.   r.ar=0;
  451.   r.type=0;
  452.   r.storage_type=2;
  453.   subboards[n]=r;
  454.   ++num_subs;
  455.   read_user(1,&u);
  456.   nu=(int) (filelength(userfile) / sizeof(userrec));
  457.   l1=0xffffffff >>(32-n);
  458.   l2=0xffffffff <<(n+1);
  459.   l3=1L << n;
  460.   for (i=1; i<nu; i++) {
  461.     read_user(i,&u);
  462.     if (u.sysopsub!=255)
  463.       if (u.sysopsub>=n)
  464.         ++u.sysopsub;
  465.     for (i1=num_subs-1; i1>n; i1--)
  466.       u.qscnptr[i1]=u.qscnptr[i1-1];
  467.     u.qscnptr[n]=0L;
  468.     u.qscn=(u.qscn & l1) | ((u.qscn << 1) & l2) | l3;
  469.     write_user(i,&u);
  470.   }
  471.   modify_sub(n);
  472. }
  473.  
  474. void delete_sub(int n)
  475. {
  476.   char s[81];
  477.   int i,i1,nu;
  478.   userrec u;
  479.   long l1,l2;
  480.  
  481.   prt(5, "Delete data files? ");
  482.   if (yn()) {
  483.     sprintf(s, "%s%s.SUB", syscfg.datadir, subboards[n].filename);
  484.     unlink(s);
  485.     sprintf(s, "%s%s.DAT", syscfg.msgsdir, subboards[n].filename);
  486.     unlink(s);
  487.   }
  488.   for (i=n; i<num_subs; i++)
  489.     subboards[i]=subboards[i+1];
  490.   --num_subs;
  491.   read_user(1,&u);
  492.   nu=(int) (filelength(userfile) / sizeof(userrec));
  493.   l1=0xffffffff >>(32-n);
  494.   l2=0xffffffff <<(n);
  495.   for (i=1; i<nu; i++) {
  496.     read_user(i,&u);
  497.     if (u.sysopsub==n)
  498.       u.sysopsub=255;
  499.     else
  500.       if ((u.sysopsub>n) && (u.sysopsub!=255))
  501.         --u.sysopsub;
  502.     for (i1=n; i1<num_subs; i1++)
  503.       u.qscnptr[i1]=u.qscnptr[i1+1];
  504.     u.qscnptr[31]=0L;
  505.     u.qscn=(u.qscn & l1) | ((u.qscn >> 1) & l2);
  506.     write_user(i,&u);
  507.   }
  508. }
  509.  
  510. void boardedit()
  511. {
  512.   int i,i1,i2,done,f;
  513.   char s[81],s1[81],s2[81],ch;
  514.  
  515.   if (!checkpw())
  516.     return;
  517.   showsubs();
  518.   done=0;
  519.   do {
  520.     nl();
  521.     prt(2,"Subs: D:elete, I:nsert, M:odify, Q:uit, ? : ");
  522.     ch=onek("QDIM?");
  523.     switch(ch) {
  524.       case '?':
  525.         showsubs();
  526.         break;
  527.       case 'Q':
  528.         done=1;
  529.         break;
  530.       case 'M':
  531.         nl();
  532.         prt(2,"Sub number? ");
  533.         input(s,2);
  534.         i=atoi(s);
  535.         if ((s[0]!=0) && (i>=0) && (i<num_subs))
  536.           modify_sub(i);
  537.         break;
  538.       case 'I':
  539.         if (num_subs<32) {
  540.           nl();
  541.           prt(2,"Insert before which sub? ");
  542.           input(s,2);
  543.           i=atoi(s);
  544.           if ((s[0]!=0) && (i>=0) && (i<=num_subs))
  545.             insert_sub(i);
  546.         }
  547.         break;
  548.       case 'D':
  549.         nl();
  550.         prt(2,"Delete which sub? ");
  551.         input(s,2);
  552.         i=atoi(s);
  553.         if ((s[0]!=0) && (i>=0) && (i<num_subs)) {
  554.           nl();
  555.           sprintf(s1,"Delete %s? ",subboards[i].name);
  556.           prt(5,s1);
  557.           if (yn())
  558.             delete_sub(i);
  559.         }
  560.         break;
  561.     }
  562.   } while (!done);
  563.   sprintf(s, "%sSUBS.DAT", syscfg.datadir);
  564.   f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  565.   write(f,(void *)&subboards[0], num_subs * sizeof(subboardrec));
  566.   close(f);
  567. }
  568.  
  569. void main(int argc, char *argv[])
  570. {
  571.   char s[81];
  572.   int i;
  573.  
  574.   userfile = -1;
  575.  
  576.   if (argc<2)
  577.     strcpy(s,"chain.txt");
  578.   else
  579.     strcpy(s,argv[1]);
  580.   if (read_in_data(s)==-1) {
  581.     printf("\nData file not found: %s\n\n", s);
  582.     abort();
  583.   }
  584.  
  585.   strcpy(s,"CONFIG.DAT");
  586.   i=open(s,O_RDWR | O_BINARY);
  587.   if (i<0) {
  588.     printf("%s NOT FOUND.\n",s);
  589.     exit(1);
  590.   }
  591.   read(i,(void *) (&syscfg), sizeof(configrec));
  592.   close(i);
  593.  
  594.   sprintf(s, "%sSUBS.DAT", syscfg.datadir);
  595.   i=open(s,O_RDWR | O_BINARY);
  596.   if (i<0) {
  597.     printf("%s NOT FOUND.\n",s);
  598.     exit(1);
  599.   }
  600.   num_subs=(read(i,(void *) (&subboards), (32*sizeof(subboardrec))))/
  601.            sizeof(subboardrec);
  602.   close(i);
  603.  
  604.   boardedit();
  605. }
  606.