From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/CMD/RESTORE/RTDO.C | 376 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 376 insertions(+) create mode 100644 v4.0/src/CMD/RESTORE/RTDO.C (limited to 'v4.0/src/CMD/RESTORE/RTDO.C') diff --git a/v4.0/src/CMD/RESTORE/RTDO.C b/v4.0/src/CMD/RESTORE/RTDO.C new file mode 100644 index 0000000..bd736b5 --- /dev/null +++ b/v4.0/src/CMD/RESTORE/RTDO.C @@ -0,0 +1,376 @@ + +/*------------------------------------ +/* SOURCE FILE NAME: RTDO.C +/*------------------------------------ +/*  0 */ + +#include "rt.h" +#include "rt1.h" +#include "rt2.h" +#include "restpars.h" /*;AN000;4*/ +#include "direct.h" +#include "stdio.h" +#include "string.h" +#include "dos.h" /*;AN000;2*/ +#include "comsub.h" /* common subroutine def'n */ +#include "doscalls.h" +#include "error.h" + +BYTE *buf_pointer; +unsigned control_file_pointer; +unsigned src_file_handle; +struct FileFindBuf filefindbuf; +struct FileFindBuf dfilefindbuf; +BYTE far *control_buf_pointer; +unsigned int control_bufsize; /* !wrw */ + +extern unsigned char srcddir[MAXPATH+3]; +extern unsigned char rtswitch; +extern unsigned char control_flag; +extern unsigned char control_flag2; +extern unsigned control_file_handle; /* !wrw */ +extern struct subst_list sublist; /*;AN000;6 Message substitution list */ + +/***************** START OF SPECIFICATION ******************************** +/* +/* SUBROUTINE NAME : Dorestore +/* +/* DESCRIPTIVE NAME : Searching all disks and restore the matching files. +/* +/* FUNCTION: This routine does the following: +/* 1. Initialize the buffer +/* 2. Change directory to the one which will hold the first +/* files to be restored. +/* 3. If the source drive is removable +/* Ouput the message to the screen for user to insert a +/* diskette and hit a key when ready. +/* 4. If the target drive is removable +/* Ouput the message to the screen for user to insert a +/* diskette and hit a key when ready. +/* 5. Check whether the diskette contains old or new data +/* format. +/* 6. ouput "file were backup xx-xx-xx" +/* +/* For each diskette, do the following: +/* 5. Call check_bkdisk_old or check_bkdisk_new to check whethe +/* it is a backup diskette and whether it is in correct +/* sequence number. +/* 6. Call search_src_disk_old or search_src_disk_new to search +/* the entire diskette to find matching files and +/* restore them. +/* +/* +/********************** END OF SPECIFICATIONS *******************************/ +void dorestore(srcd,destd,inpath,infname,infext,infspec,dt) /* wrw! */ +BYTE srcd; +BYTE destd; +BYTE *inpath; +BYTE *infname; +BYTE *infext; +BYTE *infspec; +struct timedate *dt; +{ + BYTE string[MAXPATH+2]; + struct disk_header_old dheadold; + struct disk_header_new dheadnew; + struct file_header_new fheadnew; + struct disk_info dinfo; + struct file_info finfo; + unsigned int control_bufsize; + unsigned dirlen = MAXPATH; + WORD dyear; + WORD dmonth; + WORD dday; + + BYTE c; + BYTE done; /*;AN000;p????*/ + BYTE path_to_be_chdir[MAXPATH]; + WORD srcd_num; + BYTE temp_srcddir[MAXPATH]; + unsigned int dnumwant = 1; + DWORD bufsize; + BYTE temp_array1[4]; /*temparary array to build parameters for substitution list */ + BYTE temp_array2[4]; + + /*declaration for dosfindfirst */ + unsigned dirhandle = 1; + unsigned attribute = NOTV; + unsigned search_cnt = 1; /* # of entries to find */ + unsigned buf_len = sizeof(struct FileFindBuf); + BYTE search_string[MAXPATHF+2]; + WORD retcode; + /*end decleration for ffirst and fnext*/ + + union REGS qregs; /*;AN000;8*/ + DWORD date; /*;AN000;6*/ + + /****************************************************************/ + /* change dest drive directory to the one which will hold the */ + /* first file to be restored */ + /****************************************************************/ + string[0] = destd; + string[1] = ':'; + string[2] = NULLC; + strcat(string,inpath); + /*if chdir sucessful, save the directory in finfo->curdir*/ + /*if fail, the path is not exist, and needs to be rebuild*/ + if(chdir(string)==0) + strcpy(finfo.curdir,inpath); + + /*****************************************************************/ + /*if the source disk is hard disk get the current dir of the srcd*/ + /* chdir the source disk to be in \backup directory */ + /*****************************************************************/ + /**************************************/ + /* if the source disk is a hard disk */ + /**************************************/ + /* save current directory of source disk to be reset back later */ + /* convert character srcd into integer form */ + /**************************************/ + + srcd_num = (WORD)(srcd - 'A' +1); + + /**************************************/ + /* get current directory of srcd (DosQCurDir) */ + /**************************************/ + if ((retcode = DOSQCURDIR(srcd_num,(char far *) srcddir,(unsigned far *)&dirlen)) != 0) + { + display_it(INVALID_DRIVE,STND_ERR_DEV,0,NO_RESPTYPE,(BYTE)UTIL_MSG);/*;AN000;6*/ + usererror(INVALIDDRIVE); + } + + temp_srcddir[0] = srcd; + temp_srcddir[1] = ':'; + temp_srcddir[2] = NULLC; + if (strlen(srcddir) != 1) + strcat(temp_srcddir,"\\"); + strcat(temp_srcddir,srcddir); + strcpy(srcddir,temp_srcddir); + + path_to_be_chdir[0] = srcd; + path_to_be_chdir[1] = ':'; + path_to_be_chdir[2] = NULLC; + if (set_reset_test_flag(&control_flag2,SRC_HDISK,TEST) == TRUE) + strcat(path_to_be_chdir,"\\BACKUP"); + else + strcat(path_to_be_chdir,"\\"); + + if(chdir(path_to_be_chdir)!=0) + { display_it(SOURCE_NO_BACKUP_FILE,STND_ERR_DEV,0,NO_RESPTYPE,(BYTE)UTIL_MSG); /*;AN000;6*/ + usererror(NOBACKUPFILE); + } + + /*****************************************************************/ + /* Identify whether the inserted diskette is a old format backup */ + /* diskette or a new format backup diskette */ + /* BACKUP.@@@ or BACKUP.xxx with xxx numeric characters has */ + /* to be on the diskette */ + /*****************************************************************/ + search_string[0] = srcd; + search_string[1] = ':'; + search_string[2] = NULLC; + strcat(search_string, "BACKUP*.???"); + + /***********************/ + /* Find the first file */ + /***********************/ + done = FFALSE; /*;AN000;p????*/ + + retcode = /*;AN000;p????*/ + DOSFINDFIRST /*;AN000;p????*/ + ( /*;AN000;p????*/ + (char far *)search_string, /*;AN000;p????*/ + (unsigned far *)&dirhandle, /*;AN000;p????*/ + attribute, /*;AN000;p????*/ + (struct FileFindBuf far *)&filefindbuf, /*;AN000;p????*/ + buf_len, /*;AN000;p????*/ + (unsigned far *)&search_cnt, /*;AN000;p????*/ + (DWORD) 0 /*;AN000;p????*/ + ); /*;AN000;p????*/ + + if (retcode != NOERROR) /*;AN000;p????*/ + { display_it(SOURCE_NO_BACKUP_FILE,STND_ERR_DEV,0,NO_RESPTYPE,(BYTE)UTIL_MSG); /*;AN000;p????*/ + usererror(NOBACKUPFILE); /*;AN000;p????*/ + } /*;AN000;p????*/ + + /*****************************/ + /* Skip over subdirectories */ + while((retcode = filefindbuf.attributes & SUBDIR) == SUBDIR) /*;AN000;p????*/ + { /*;AN000;p????*/ + search_cnt = 1; /*;AN000;p????*/ + + retcode = /*;AN000;p????*/ + DOSFINDNEXT /*;AN000;p????*/ + ( dirhandle, /*;AN000;p????*/ + (struct FileFindBuf far *)&filefindbuf, /*;AN000;p????*/ + buf_len, /*;AN000;p????*/ + (unsigned far *)&search_cnt /*;AN000;p????*/ + ); /*;AN000;p????*/ + + if (retcode != NOERROR) /*;AN000;p????*/ + { display_it(SOURCE_NO_BACKUP_FILE,STND_ERR_DEV,0,NO_RESPTYPE,(BYTE)UTIL_MSG); /*;AN000;p????*/ + usererror(NOBACKUPFILE); /*;AN000;p????*/ + } /*;AN000;p????*/ + } /*;AN000;p????*/ + + /****************************************/ + /* Loop through looking at file names */ + /****************************************/ + do /*;AN000;p????*/ + { /* Is it old BACKUP ??? */ /*;AN000;p????*/ + if (strcmp(filefindbuf.file_name,BACKUPID)==0) /*;AN000;p????*/ + { /*;AN000;p????*/ + set_reset_test_flag(&control_flag,OLDNEW,SET); /*;AN000;p????*/ + done = TTRUE; /*;AN000;p????*/ + } /*;AN000;p????*/ + else /*;AN000;p????*/ + { /* Is it new BACKUP ??? */ /*;AN000;p????*/ + if ((filefindbuf.file_name[6] == '.') && /*;AN000;p????*/ + (filefindbuf.file_name[7] >= '0') && /*;AN000;p????*/ + (filefindbuf.file_name[7] <= '9') && /*;AN000;p????*/ + (filefindbuf.file_name[8] >= '0') && /*;AN000;p????*/ + (filefindbuf.file_name[8] <= '9') && /*;AN000;p????*/ + (filefindbuf.file_name[9] >= '0') && /*;AN000;p????*/ + (filefindbuf.file_name[9] <= '9') && /*;AN000;p????*/ + (filefindbuf.file_name[10] == NULLC) ) /*;AN000;p????*/ + { /*;AN000;p????*/ + set_reset_test_flag(&control_flag,OLDNEW,RESET); /*;AN000;p????*/ + init_control_buf((unsigned long)0,&control_bufsize);/*;AN000;p????*/ + done = TTRUE; /*;AN000;p????*/ + } /*;AN000;p????*/ + } + + if (!done) + do + { /*;AN000;p????*/ + search_cnt = 1; /*;AN000;p????*/ + retcode = /*;AN000;p????*/ + DOSFINDNEXT /*;AN000;p????*/ + ( dirhandle, /*;AN000;p????*/ + (struct FileFindBuf far *)&filefindbuf, /*;AN000;p????*/ + buf_len, /*;AN000;p????*/ + (unsigned far *)&search_cnt /*;AN000;p????*/ + ); /*;AN000;p????*/ + + if (retcode != NOERROR) /*;AN000;p????*/ + { display_it(SOURCE_NO_BACKUP_FILE,STND_ERR_DEV,0,NO_RESPTYPE,(BYTE)UTIL_MSG); /*;AN000;p????*/ + usererror(NOBACKUPFILE); /*;AN000;p????*/ + } /*;AN000;p????*/ + + } /* end while */ /*;AN000;p????*/ + while(filefindbuf.attributes & SUBDIR == SUBDIR); + + } /* end DO loop */ /*;AN000;p????*/ + while (!done); /*;AN000;p????*/ + + + retcode = DOSFINDCLOSE(dirhandle); + + /***************************************/ + /* Display the date of the backup disk */ + /***************************************/ + dyear = (filefindbuf.write_date >> YRSHIFT & YRMASK) + LOYR; + dmonth = filefindbuf.write_date >> MOSHIFT & MOMASK; + dday = filefindbuf.write_date & DYMASK; + date = dyear + (dday*16777216) + (dmonth*65536); /*;AN000;6*/ + + sublist.value1 = (char far *)date; /*;AN000;6*/ + sublist.flags1 = LEFT_ALIGN + DATE_MDY_4; /*;AN000;6*/ + sublist.max_width1 = (BYTE)10; /*;AN000;6*/ + sublist.min_width1 = sublist.max_width1; /*;AN000;6*/ + display_it(FILES_WERE_BACKUP_ON,STND_OUT_DEV,1,NO_RESPTYPE,(BYTE)UTIL_MSG);/*;AN000;6*/ + + /*****************************************************************/ + /*start a loop to check and restore each diskette */ + /*****************************************************************/ + initbuf(&bufsize); /* !wrw */ + + for (;;) + { + + /*****************************************************************/ + /* check whether the inserted diskette is a backup diskette */ + /*****************************************************************/ + /*if old, check_bkdisk_old else check_bkdisk_new*/ + + if (set_reset_test_flag(&control_flag,OLDNEW,TEST) == TRUE) + check_bkdisk_old(&dheadold, &dinfo, srcd, &dnumwant); + else + check_bkdisk_new((struct disk_header_new far *)&dheadnew, &dinfo, srcd, &dnumwant,&control_bufsize); + + /*****************************************************************/ + /* At this point a real backup diskette which is in correct sequence number */ + /* has been found. In the case of new format, the file CONTROL.xxx is open.*/ + /*****************************************************************/ + /* restored the diskette */ + /*****************************************************************/ + + /*if old*/ + if (set_reset_test_flag(&control_flag,OLDNEW,TEST) == TRUE) + search_src_disk_old(&dinfo,&finfo,&dheadold,(struct disk_header_new far *)&dheadnew, + (struct file_header_new far *)&fheadnew,srcd,destd,bufsize,&dnumwant, + inpath,infname,infext,infspec,dt); + else + search_src_disk_new(&dinfo,&finfo,&dheadold,(struct disk_header_new far *)&dheadnew, + (struct file_header_new far *)&fheadnew,srcd,destd,&dnumwant,bufsize, + inpath,infname,infspec,&control_bufsize,dt); + + printf("\n"); + set_reset_test_flag(&control_flag2,OUTOF_SEQ,RESET); + /************************************************************************/ + /*if ( bk disk is not the last one && (the file spec is WILDCARD or file*/ + /*not found yet or SUB flag in rtswitches is on)), then prompt for user */ + /*to insert another diskette and loop again. */ + /************************************************************************/ + if ((dinfo.dflag!=0xff) && + ((set_reset_test_flag(&control_flag,WILDCARD,TEST) == TRUE) || + (set_reset_test_flag(&control_flag,FOUND,TEST) == FALSE) || + (set_reset_test_flag(&rtswitch,SUB,TEST) == TRUE))) + { + /**********************************************************/ + /* output message for user to insert another diskette and */ + /* "strike any key when ready" */ + /* with response type 4 (wait for a key to be hit) */ + /**********************************************************/ + + if (control_file_handle != 0xffff) /* !wrw */ + { /* !wrw */ + DOSCLOSE(control_file_handle); /* !wrw */ + control_file_handle = 0xffff; /* !wrw */ + } /* !wrw */ + + temp_array1[0] = (char)((dnumwant / 10) + '0'); + temp_array1[1] = (char)((dnumwant % 10) + '0'); + temp_array1[2] = NULLC; + temp_array2[0] = srcd; + temp_array2[1] = NULLC; + + sublist.value1 = (char far *)temp_array1; /*;AN000;6 */ + sublist.flags1 = LEFT_ALIGN + CHAR_FIELD_ASCIIZ; /*;AN000;6 */ + sublist.max_width1 = (BYTE)strlen(temp_array1); /*;AN000;6 */ + sublist.min_width1 = sublist.max_width1; /*;AN000;6 */ + + sublist.value2 = (char far *)temp_array2; /*;AN000;6 */ + sublist.flags2 = LEFT_ALIGN + CHAR_FIELD_ASCIIZ; /*;AN000;6 */ + sublist.max_width2 = (BYTE)strlen(temp_array2); /*;AN000;6 */ + sublist.min_width2 = sublist.max_width2; /*;AN000;6 */ + + display_it(INSERT_SOURCE_DISK,STND_ERR_DEV,2,NO_RESPTYPE,(BYTE)UTIL_MSG); /*;AN000;6*/ + display_it(PRESS_ANY_KEY,STND_ERR_DEV,0,ANY_KEY_RESPTYPE,(BYTE)UTIL_MSG); /*;AN000;6*/ + + /* If single drive system, eliminates double prompting */ + /* for user to "Insert diskette for drive %1" */ + qregs.x.ax = SETLOGICALDRIVE; /*;AN000;8*/ + qregs.h.bl = srcddir[0] - 'A' + 1; /*;AN000;8*/ + intdos(&qregs,&qregs); /*;AN000;8*/ + + continue; + } + else + break; + + } /*end of for loop*/ + + + return; +} /*;AN000;*/ -- cgit v1.2.3