home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / WWIV2.ZIP / SHRINK.C < prev    next >
C/C++ Source or Header  |  1992-12-30  |  6KB  |  312 lines

  1. /*****************************************************************************
  2.  
  3.                                 WWIV Version 4
  4.                     Copyright (C) 1988-1993 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. #include <process.h>
  22. #include <dir.h>
  23.  
  24.  
  25. #define READ(x) read(f,&(x),sizeof(x))
  26.  
  27. #define WRITE(x) write(f,&(x),sizeof(x))
  28.  
  29.  
  30. /****************************************************************************/
  31.  
  32. int restore_data(char *s)
  33. {
  34.   int f,stat;
  35.  
  36.   f=open(s,O_RDONLY | O_BINARY);
  37.   if (f<0)
  38.     return(-1);
  39.  
  40.   READ(stat);
  41.   READ(oklevel);
  42.   READ(noklevel);
  43.   READ(ooneuser);
  44.   READ(no_hangup);
  45.   READ(ok_modem_stuff);
  46.   READ(topdata);
  47.   READ(last_time_c);
  48.   READ(sysop_alert);
  49.   READ(do_event);
  50.  
  51.   if (stat) {
  52.     READ(andwith);
  53.     READ(usernum);
  54.     READ(chatcall);
  55.     READ(chatreason);
  56.     READ(timeon);
  57.     READ(extratimecall);
  58.     READ(curspeed);
  59.     READ(modem_speed);
  60.     READ(com_speed);
  61.     READ(modem_flag);
  62.     READ(cursub);
  63.     READ(curdir);
  64.     READ(curdloads);
  65.     READ(msgreadlogon);
  66.     READ(nscandate);
  67.     READ(mailcheck);
  68.     READ(smwcheck);
  69.     READ(use_workspace);
  70.     READ(using_modem);
  71.     READ(last_time);
  72.     READ(fsenttoday);
  73.     READ(global_xx);
  74.     READ(xtime);
  75.     READ(xdate);
  76.     READ(incom);
  77.     READ(outcom);
  78.     READ(global_handle);
  79.     READ(actsl);
  80.     READ(numbatch);
  81.     READ(numbatchdl);
  82.  
  83.     read(f,batch, numbatch*sizeof(batchrec));
  84.     READ(batchtime);
  85.  
  86.     if (global_handle) {
  87.       global_handle=0;
  88.       set_global_handle(1);
  89.     }
  90.  
  91.     read_user(usernum,&thisuser);
  92.     read_qscn(usernum,qsc,0);
  93.     useron=1;
  94.     changedsl();
  95.     topscreen();
  96.     set_baud(com_speed);
  97.     if (modem_flag & flag_fc)
  98.       flow_control = 1;
  99.   }
  100.  
  101.   close(f);
  102.   unlink(s);
  103.   unlink("stat.wwv");
  104.   return(stat);
  105. }
  106.  
  107. /****************************************************************************/
  108.  
  109. void save_state(char *s, int state,int ctc)
  110. {
  111.   int f;
  112.  
  113.   save_status();
  114.  
  115.   f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  116.   if (f<0)
  117.     return;
  118.  
  119.   WRITE(state);
  120.   WRITE(oklevel);
  121.   WRITE(noklevel);
  122.   WRITE(ooneuser);
  123.   WRITE(no_hangup);
  124.   WRITE(ok_modem_stuff);
  125.   WRITE(topdata);
  126.   WRITE(last_time_c);
  127.   WRITE(sysop_alert);
  128.   WRITE(do_event);
  129.  
  130.   WRITE(andwith);
  131.   WRITE(usernum);
  132.   WRITE(chatcall);
  133.   WRITE(chatreason);
  134.   WRITE(timeon);
  135.   WRITE(extratimecall);
  136.   WRITE(curspeed);
  137.   WRITE(modem_speed);
  138.   WRITE(com_speed);
  139.   WRITE(modem_flag);
  140.   WRITE(cursub);
  141.   WRITE(curdir);
  142.   WRITE(curdloads);
  143.   WRITE(msgreadlogon);
  144.   WRITE(nscandate);
  145.   WRITE(mailcheck);
  146.   WRITE(smwcheck);
  147.   WRITE(use_workspace);
  148.   WRITE(using_modem);
  149.   WRITE(last_time);
  150.   WRITE(fsenttoday);
  151.   WRITE(global_xx);
  152.   WRITE(xtime);
  153.   WRITE(xdate);
  154.   WRITE(incom);
  155.   WRITE(outcom);
  156.   WRITE(global_handle);
  157.   WRITE(actsl);
  158.   WRITE(numbatch);
  159.   WRITE(numbatchdl);
  160.  
  161.   write(f,batch, numbatch*sizeof(batchrec));
  162.   WRITE(batchtime);
  163.  
  164.  
  165.   set_global_handle(0);
  166.  
  167.   close(f);
  168.  
  169.   f=open("stat.wwv",O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  170.   if (f<0)
  171.     return;
  172.  
  173.   WRITE(incom);
  174.   WRITE(outcom);
  175.   WRITE(thisuser);
  176.   WRITE(flow_control);
  177.   WRITE(async_irq);
  178.   WRITE(com_speed);
  179.   WRITE(base);
  180.   WRITE(andwith);
  181.   WRITE(ctc);
  182.   WRITE(defscreenbottom);
  183.   WRITE(ok_modem_stuff);
  184.   WRITE(save_dos);
  185.  
  186.   close(f);
  187.  
  188.  
  189. }
  190.  
  191. /****************************************************************************/
  192.  
  193. char *findit(char *cmd,char *ext)
  194. {
  195.   char *ss;
  196.   static char s[81];
  197.  
  198.   if (ext)
  199.     sprintf(s,"%s.%s",cmd,ext);
  200.   else
  201.     strcpy(s,cmd);
  202.  
  203.   if (exist(s))
  204.     return(s);
  205.  
  206.   if (strchr(s,'/') || strchr(s,'\\'))
  207.     ss=NULL;
  208.   else
  209.     ss=searchpath(s);
  210.  
  211.   return(ss);
  212. }
  213.  
  214. /****************************************************************************/
  215.  
  216. void do_it_1(char *cl)
  217. {
  218.   int i,i1,l,sp;
  219.   char *ss,*ss1,*ss2;
  220.   char t[81];
  221.  
  222.   sl1(1,"");
  223.   if (ok_modem_stuff)
  224.     closeport();
  225.   close_user();
  226.   close_strfiles();
  227.  
  228.   ss=cl;
  229.   while ((*ss) && (*ss!=' '))
  230.     ++ss;
  231.   if (*ss==' ') {
  232.     *ss=0;
  233.     ss++;
  234.   }
  235.   ss1=point_shrink;
  236.   *ss1=1;
  237.   ss1++;
  238.   ss2=findit(cl,NULL);
  239.   if (!ss2) {
  240.     ss2=findit(cl,"COM");
  241.     if (!ss2) {
  242.       ss2=findit(cl,"EXE");
  243.       if (!ss2)
  244.         return;
  245.     }
  246.   }
  247.   strcpy(ss1,ss2);
  248.   ss1=MK_FP(FP_SEG(ss1),0x0080);
  249.   strcpy(t," ");
  250.   strcat(t,ss);
  251.   strcat(t,"\r");
  252.   *ss1=strlen(t)-1;
  253.   ++ss1;
  254.   strcpy(ss1,t);
  255.   setvect(save_dos,NULL);
  256.   exit(0);
  257. }
  258.  
  259. /****************************************************************************/
  260.  
  261. void shrink_out(char *command, int state, int intercept,int ctc,int ccc)
  262. {
  263.   char s[81],t[81],s1[10];
  264.   int ok_shrink;
  265.  
  266.   ok_shrink=1;
  267.   if (!point_shrink) {
  268.     ok_shrink=0;
  269.     nl();
  270.     pl(get_string(884));
  271.     nl();
  272.   }
  273.   if (!searchpath("RETURN.EXE")) {
  274.     ok_shrink=0;
  275.     nl();
  276.     pl(get_string(885));
  277.     nl();
  278.   }
  279.  
  280.   strcpy(s,command);
  281.   strtok(s," \t");
  282.   if ((!findit(s,NULL)) && (!findit(s,"COM")) && (!findit(s,"EXE"))) {
  283.     if (findit(s,"BAT"))
  284.       ccc=1;
  285.     else
  286.       return;
  287.   }
  288.  
  289.   if (ok_shrink) {
  290.     if (state>0) {
  291.       write_user(usernum,&thisuser);
  292.       write_qscn(usernum,qsc,0);
  293.       if (state>1)
  294.         thisuser.sysstatus &= ~sysstatus_pause_on_page;
  295.     }
  296.     save_state("restore.wwv",state,ctc);
  297.     set_protect(0);
  298.     if (intercept)
  299.       sprintf(s,"RETURN.EXE %d %d %s",intercept,ccc,command);
  300.     else
  301.       sprintf(s,"%s /C %s",getenv("COMSPEC"), command);
  302.     do_it_1(s);
  303.     unlink("restore.wwv");
  304.     unlink("stat.wwv");
  305.   } else {
  306.     if (intercept)
  307.       full_external(command,ctc,ccc);
  308.     else
  309.       do_remote(command,ccc);
  310.   }
  311. }
  312.