home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / WWIV412S.ZIP / BBSUTL1.C < prev    next >
C/C++ Source or Header  |  1990-08-05  |  9KB  |  376 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.               Copyright (C) 1988 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 <sys\stat.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <time.h>
  21. #include <stdlib.h>
  22. #include <io.h>
  23. #include <fcntl.h>
  24. #include <alloc.h>
  25. #include "vardec.h"
  26. #include "fcns.h"
  27.  
  28.  
  29. extern int hangup;
  30. extern char dc[81],dcd[81],odc[81];
  31. extern char charbuffer[161];
  32. extern userrec thisuser;
  33. extern int charbufferpointer,chatting;
  34. extern int usernum,useron;
  35. extern configrec syscfg;
  36. extern int echo,smwcheck,okskey;
  37. extern unsigned char realsl;
  38. extern double timeon;
  39. extern char curspeed[80];
  40. extern unsigned int modem_speed,com_speed;
  41. extern int cursub,curdir,curdloads,helpl;
  42. extern usersubrec usub[32],udir[32];
  43. extern statusrec status;
  44. extern int incom,msgreadlogon,numchain;
  45. extern int fsenttoday,userfile,chatcall;
  46. extern char chatreason[81],irt[81];
  47. extern subboardrec subboards[32];
  48. extern smalrec *smallist;
  49. extern chainfilerec *chains;
  50.  
  51.  
  52. int ok_local()
  53. {
  54.   if (syscfg.sysconfig& sysconfig_no_local)
  55.     return(0);
  56.   else
  57.     return(1);
  58. }
  59.  
  60.  
  61. int finduser1(char *sx)
  62. {
  63.   int i,i1,i2;
  64.   char s[81],s1[81],ch;
  65.   userrec u;
  66.  
  67.   if (sx[0]==0)
  68.     return(0);
  69.   i=finduser(sx);
  70.   if (i>0)
  71.     return(i);
  72.   strcpy(s,sx);
  73.   for (i=0; s[i]!=0; i++)
  74.     s[i]=upcase(s[i]);
  75.   i2=0;
  76.   for (i=0; (i<status.users) && (i2==0); i++) {
  77.     if (strstr(smallist[i].name,s)!=NULL) {
  78.       i1=smallist[i].number;
  79.       read_user(i1,&u);
  80.       sprintf(s1,"Do you mean %s (Y/N/Q) ? ",nam(&u,i1));
  81.       prt(5,s1);
  82.       ch=onek("QYN");
  83.       if (ch=='Y')
  84.     i2=i1;
  85.       if (ch=='Q')
  86.     i=status.users;
  87.     }
  88.   }
  89.   return(i2);
  90. }
  91.  
  92.  
  93. void sl1(int cmd,char *s)
  94. {
  95.   static int midline=0,slf=-1;
  96.   static char f[81];
  97.   char l[180],ch1;
  98.   int i;
  99.  
  100.   switch(cmd) {
  101.     case 0: /* Write line to sysop's log */
  102.       if (slf<=0) {
  103.         slf=open(f,O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
  104.         if (filelength(slf)) {
  105.           lseek(slf,-1L,SEEK_END);
  106.           read(slf,((void *)&ch1),1);
  107.           if (ch1==26)
  108.             lseek(slf,-1L,SEEK_END);
  109.         }
  110.       }
  111.       if (midline) {
  112.         strcpy(l, "\r\n");
  113.         strcat(l, s);
  114.         midline = 0;
  115.       } else
  116.         strcpy(l,s);
  117.       if (syscfg.sysconfig & sysconfig_printer)
  118.         fprintf(stdprn,"%s\r\n",s);
  119.       i=strlen(l);
  120.       l[i++]='\r';
  121.       l[i++]='\n';
  122.       l[i]=0;
  123.       write(slf,(void *)l,i);
  124.       break;
  125.     case 1: /* Close sysop's log */
  126.       if (slf>0) {
  127.         close(slf);
  128.         slf=-1;
  129.       }
  130.       break;
  131.     case 2: /* Set filename */
  132.       if (slf>0) {
  133.         close(slf);
  134.         slf=-1;
  135.       }
  136.       strcpy(f,syscfg.gfilesdir);
  137.       i=strlen(f);
  138.       f[i++]=s[6];
  139.       f[i++]=s[7];
  140.       f[i++]=s[0];
  141.       f[i++]=s[1];
  142.       f[i++]=s[3];
  143.       f[i++]=s[4];
  144.       f[i]=0;
  145.       strcat(f,".LOG");
  146.       break;
  147.     case 3: /* Close sysop's log  + return filename */
  148.       if (slf>0) {
  149.         close(slf);
  150.         slf=-1;
  151.       }
  152.       strcpy(s,&f[strlen(syscfg.gfilesdir)]);
  153.       break;
  154.     case 4:
  155.       if (slf <= 0) {
  156.       slf = open(f, O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
  157.       if (filelength(slf)) {
  158.         lseek(slf, -1L, SEEK_END);
  159.         read(slf, ((void *)&ch1), 1);
  160.         if (ch1 == 26)
  161.           lseek(slf, -1L, SEEK_END);
  162.         }
  163.       }
  164.      if (!midline || ((midline + 2 + strlen(s)) > 78)) {
  165.        strcpy(l, midline ? "\r\n   " : "   ");
  166.        strcat(l, s);
  167.        midline = 3 + strlen(s);
  168.        }
  169.      else {
  170.        strcpy(l, ", ");
  171.        strcat(l, s);
  172.        midline += (2 + strlen(s));
  173.        }
  174.      if (syscfg.sysconfig & sysconfig_printer)
  175.        fprintf(stdprn, "%s", l);
  176.      i = strlen(l);
  177.      write(slf, (void *)l, i);
  178.      break;
  179.   }
  180. }
  181.  
  182. void sysopchar(char *s)
  183. {
  184.   if ((incom || (thisuser.sl != 255)) && (s[0]))
  185.     sl1(4, s);
  186. }
  187.  
  188. void sysoplog(char *s)
  189. {
  190.   char s1[180];
  191.  
  192.   if ((incom) || (thisuser.sl!=255)) {
  193.     strcpy(s1,"   ");
  194.     strcat(s1,s);
  195.     sl1(0,s1);
  196.   }
  197. }
  198.  
  199.  
  200. void ssm(int un, int sy, char *s)
  201. {
  202.   int  f,i,i1;
  203.   userrec u;
  204.   char s1[81];
  205.   shortmsgrec sm;
  206.  
  207.   if (sy!=0)
  208.     return;
  209.   strcpy(s1,syscfg.datadir);
  210.   sprintf(s1,"%sSMW.DAT",syscfg.datadir);
  211.   f=open(s1,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  212.   i=(int) (filelength(f) / sizeof(shortmsgrec));
  213.   i1=i-1;
  214.   if (i1>=0) {
  215.     lseek(f,((long) (i1)) * sizeof(shortmsgrec), SEEK_SET);
  216.     read(f,(void *)&sm,sizeof(shortmsgrec));
  217.     while ((sm.tosys==0) && (sm.touser==0) && (i1>0)) {
  218.       --i1;
  219.       lseek(f,((long) (i1)) * sizeof(shortmsgrec), SEEK_SET);
  220.       read(f,(void *)&sm,sizeof(shortmsgrec));
  221.     }
  222.     if ((sm.tosys) || (sm.touser))
  223.       ++i1;
  224.   } else
  225.     i1=0;
  226.   sm.tosys=sy;
  227.   sm.touser=un;
  228.   strcpy(sm.message,s);
  229.   lseek(f,((long) (i1)) * sizeof(shortmsgrec), SEEK_SET);
  230.   write(f,(void *)&sm,sizeof(shortmsgrec));
  231.   close(f);
  232.   if (sy==0) {
  233.     read_user(un,&u);
  234.     u.sysstatus |= sysstatus_smw;
  235.     if ((u.inact & inact_deleted)==0)
  236.       write_user(un,&u);
  237.     close_user();
  238.   }
  239. }
  240.  
  241. void rsm(int un, userrec *u)
  242. {
  243.   shortmsgrec sm;
  244.   int i,i1,f,any;
  245.   char s1[81];
  246.  
  247.   any=0;
  248.   if ((u->sysstatus) & sysstatus_smw) {
  249.     strcpy(s1,syscfg.datadir);
  250.     sprintf(s1,"%sSMW.DAT",syscfg.datadir);
  251.     f=open(s1,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  252.     i=(int) (filelength(f) / sizeof(shortmsgrec));
  253.     for (i1=0; i1<i; i1++) {
  254.       lseek(f,((long) (i1)) * sizeof(shortmsgrec),SEEK_SET);
  255.       read(f,(void *)&sm,sizeof(shortmsgrec));
  256.       if ((sm.touser==un) && (sm.tosys==0)) {
  257.         pl(sm.message);
  258.         sm.touser=0;
  259.         sm.tosys=0;
  260.         sm.message[0]=0;
  261.         lseek(f,((long) (i1)) * sizeof(shortmsgrec),SEEK_SET);
  262.         write(f,(void *)&sm,sizeof(shortmsgrec));
  263.     any=1;
  264.       }
  265.     }
  266.     close(f);
  267.     u->sysstatus ^= sysstatus_smw;
  268.     smwcheck=1;
  269.   }
  270.   if (any)
  271.     nl();
  272. }
  273.  
  274.  
  275. void show_chains(int *mapp, int *map)
  276. {
  277.   int abort,i,i1;
  278.   char s[81];
  279.  
  280.   abort=0;
  281.   nl();
  282.   for (i=0; (i<*mapp) && (!abort) && (!hangup); i++) {
  283.     itoa(i+1,s,10);
  284.     strcat(s,". ");
  285.     strcat(s,(chains[map[i]].description));
  286.     pla(s,&abort);
  287.   }
  288.   nl();
  289. }
  290.  
  291.  
  292. void run_chain(int cn)
  293. {
  294.   char s[255],s1[81],s2[81];
  295.   int oc;
  296.  
  297.   strcpy(s1,chains[cn].filename);
  298.   strcpy(s2,create_chain_file("CHAIN.TXT"));
  299.   stuff_in(s,s1,s2,"","","","");
  300.   sprintf(s2,"!Ran '%s'",chains[cn].description);
  301.   sysoplog(s2);
  302.   oc=chatcall;
  303.   chatcall=0;
  304.   if (chains[cn].ansir & ansir_no_DOS) {
  305.     set_protect(0);
  306.     if (chains[cn].ansir & ansir_shrink)
  307.       shrink_out(s,1,0,1,1);
  308.     else
  309.       run_external(s);
  310.     topscreen();
  311.   } else
  312.     if (chains[cn].ansir & ansir_shrink)
  313.       shrink_out(s,1,1,1,1);
  314.     else
  315.       full_external(s,0,1);
  316.   chatcall=oc;
  317. }
  318.  
  319.  
  320.  
  321. void do_chains()
  322. {
  323.   int map[50],mapp,i,i1,ok,done;
  324.   char s[81],s1[81],*ss;
  325.   chainfilerec c;
  326.  
  327.   mapp=0;
  328.   for (i=0; i<10; i++)
  329.     odc[i]=0;
  330.   for (i=0; i<numchain; i++) {
  331.     ok=1;
  332.     c=chains[i];
  333.     if ((c.ansir & ansir_ansi) && (!okansi()))
  334.       ok=0;
  335.     if ((c.ansir & ansir_no_300) && (modem_speed==300))
  336.       ok=0;
  337.     if (c.sl>thisuser.sl)
  338.       ok=0;
  339.     if (c.ar)
  340.       if ((c.ar & thisuser.ar)==0)
  341.         ok=0;
  342.     if (ok) {
  343.       map[mapp++]=i;
  344.       if ((mapp % 10) ==0)
  345.         odc[mapp/10 -1]='0'+(mapp/10);
  346.     }
  347.   }
  348.   if (mapp==0) {
  349.     nl();
  350.     nl();
  351.     pl("Sorry, no external programs available.");
  352.     nl();
  353.     return;
  354.   }
  355.   if (mapp==1) {
  356.     run_chain(map[0]);
  357.     return;
  358.   }
  359.   show_chains(&mapp,map);
  360.   done=0;
  361.   do {
  362.     prt(2,"Which (Q=Quit, ?=List) : ");
  363.     ss=mmkey(2);
  364.     i=atoi(ss);
  365.     if ((i>0) && (i<=mapp)) {
  366.       done=1;
  367.       run_chain(map[i-1]);
  368.     } else
  369.       if (strcmp(ss,"Q")==0)
  370.         done=1;
  371.       else
  372.         if (strcmp(ss,"?")==0)
  373.           show_chains(&mapp,map);
  374.   } while ((!hangup) && (!done));
  375. }
  376.