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/RTOLD.C | 266 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 v4.0/src/CMD/RESTORE/RTOLD.C (limited to 'v4.0/src/CMD/RESTORE/RTOLD.C') diff --git a/v4.0/src/CMD/RESTORE/RTOLD.C b/v4.0/src/CMD/RESTORE/RTOLD.C new file mode 100644 index 0000000..a345d76 --- /dev/null +++ b/v4.0/src/CMD/RESTORE/RTOLD.C @@ -0,0 +1,266 @@ + +/*---------------------------- +/* SOURCE FILE NAME: RTOLD.C +/*---------------------------- +/*  0 */ + +#include "rt.h" +#include "rt1.h" +#include "rt2.h" +#include "restpars.h" /*;AN000;4*/ +#include "string.h" +#include "dos.h" /*;AN000;2*/ +#include "comsub.h" /* common subroutine def'n */ +#include "doscalls.h" +#include "error.h" + +extern BYTE rtswitch; +extern BYTE control_flag; +extern BYTE control_flag2; +extern BYTE far *buf_pointer; +extern unsigned src_file_handle; +extern struct FileFindBuf filefindbuf; +extern struct subst_list sublist; /*;AN000;6 Message substitution list */ + +/***************** START OF SPECIFICATION *********************************/ +/* */ +/* SUBROUTINE NAME : search_src_disk_old */ +/* */ +/* DESCRIPTIVE NAME : For old format only, search the entire disk for */ +/* matching files. */ +/* */ +/* FUNCTION: Using find first and find next to find all the files */ +/* which match the filename specified in the input */ +/* cammand line. */ +/* */ +/* Whenever there is a file found, subroutine filespecmatch */ +/* is called to match the file path, and file extension. */ +/* If file path and file extension match the specification, */ +/* subroutine switchmatch is called to match the file */ +/* attributes, file modes, time, and date, then file sequence */ +/* number is checked. */ +/* */ +/* If the file matches all the specification, subroutine */ +/* restore_a_file is called to actually restore the file. */ +/* */ +/* */ +/********************** END OF SPECIFICATIONS *******************************/ +void search_src_disk_old(dinfo,finfo,dheadold,dheadnew,fheadnew, /* wrw! */ + srcd,destd,buf_size,dnumwant, + inpath,infname,infext,infspec,td) + + struct disk_info *dinfo; + struct file_info *finfo; + struct disk_header_old *dheadold; + struct file_header_new far *fheadnew; + struct disk_header_new far *dheadnew; + BYTE srcd; + BYTE destd; + unsigned long buf_size; + unsigned int *dnumwant; + unsigned char *inpath; + unsigned char *infname; + unsigned char *infext; + unsigned char *infspec; + struct timedate *td; + +{ + BYTE outstring[MAXPATH+MAXFSPEC]; + WORD file_seq_num=1; + WORD first_file_on_diskette = TRUE; + WORD first_time_in_loop = TRUE; + WORD return_code; + DWORD partsize; + unsigned int control_bufsize; + BYTE temp_fname[MAXFNAME]; + BYTE temp_path[MAXPATH]; + WORD temp_dirhandle; + + + /*declaration for dosfindfirst */ + unsigned dirhandle = 0xffff; /* directory handle */ + 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*/ + int x; /*;AN000;8*/ + +/*************************************************************************/ +/* FIND THE FIRST FILE ON SOURCE */ +/*************************************************************************/ + search_string[0] = srcd; + search_string[1] = ':'; + search_string[2] = NULLC; + strcat(search_string, infname); + strcat(search_string, ".*"); + +retcode = /* Find the 1st filename that */ + DOSFINDFIRST( /* matches specified file spec*/ + ( char far * ) search_string, /* File path name */ + ( unsigned far * ) &dirhandle, /* Directory search handle */ + (unsigned) NOTV, /* Search attribute */ + (struct FileFindBuf far *) &filefindbuf, + buf_len, /* Result buffer length */ + ( unsigned far * ) &search_cnt, /* Number of entries to find */ + ( DWORD) 0 + ); + + +/*************************************************************************/ +/* IF CANNOT FIND ANY FILES ON SOURCE, RETURN */ +/*************************************************************************/ + if (retcode != 0) + return; + + + + +/*************************************************************************/ +/* start DO loop to find next until no more file found */ +/*************************************************************************/ +do +{ + /*if the directory found is a subdirectory, find next one*/ + if((retcode = filefindbuf.attributes & 0x0010) != 0x0010) + { + /* SKIP BACKUPID */ + if (strcmp(filefindbuf.file_name,BACKUPID) != 0) + { + if (first_time_in_loop == FALSE) + DOSCLOSE(src_file_handle); + else + first_time_in_loop = FALSE; + + /*************************************************************************/ + /*check_flheader_old: open and read file header, */ + /*************************************************************************/ + strcpy(temp_fname,filefindbuf.file_name); + retcode = check_flheader_old( finfo, temp_fname, + filefindbuf.write_date, filefindbuf.write_time, + filefindbuf.attributes, filefindbuf.file_size, + file_seq_num, srcd, destd, infspec, inpath, dnumwant); + + if (retcode == 0) { + + /*************************/ + /* SKIP SYSTEM FILES */ + if ((set_reset_test_flag(&control_flag2,CPPC,TEST) == FALSE) && + (strcmp(finfo->fname,"IBMBIO.COM")==0 || + strcmp(finfo->fname,"IBMDOS.COM")==0 || + strcmp(finfo->fname,"COMMAND.COM")==0 )) + {} + else { + + /*************************************************************************/ + /*if there is any switches set in the input line */ + /*switchmatch (this subroutine search the hard disk for the dest */ + /*************************************************************************/ + if ((set_reset_test_flag(&control_flag,SWITCHES,TEST) == FALSE) || + (set_reset_test_flag(&control_flag,SWITCHES,TEST) == TRUE && + ((retcode = switchmatch(finfo, srcd, destd, td)) == TRUE) )) { + + /*************************************************************************/ + /*if dnum in fheadold.disknum is not 1 and is not in sequence, error */ + /*************************************************************************/ + if (set_reset_test_flag(&control_flag2,OUTOF_SEQ,TEST) == TRUE && + first_file_on_diskette == TRUE && finfo->dnum != 1) + {} + else + { + if (finfo->dnum != 1 || finfo->dnum != file_seq_num) + { + display_it(FILE_SEQUENCE_ERROR,STND_ERR_DEV,0,NO_RESPTYPE,(BYTE)UTIL_MSG); /*;AN000;6*/ + unexperror(FILESEQERROR); + } + /*endif*/ + /*************************************************************************/ + /* output msg to indicate which file is to be restored */ + /*************************************************************************/ + /*outstring = inpath\infspec*/ + strcpy(outstring,finfo->path); + if (strlen(finfo->path) != 1 ) + strcat(outstring,"\\"); + + strcat(outstring,finfo->fname); + x = strlen(outstring); + outstring[x] = CR; /*;AN000;6*/ + outstring[x+1] = LF; /*;AN000;6*/ + outstring[x+2] = NUL; /*;AN000;6*/ + qregs.x.ax = 0x4000; /*;AN000;6*/ + qregs.x.bx = 0x0001; /*;AN000;6*/ + qregs.x.cx = (WORD)strlen(outstring); /*;AN000;6*/ + qregs.x.dx = (unsigned int)&outstring[0]; /*;AN000;6*/ + intdos(&qregs,&qregs); /*;AN000;6*/ + + + /*************************************************************************/ + /* call restore_a_file to restore the file */ + /*************************************************************************/ + restore_a_file(finfo,dinfo,buf_size,&control_bufsize, + fheadnew,dheadold,dheadnew, + srcd,destd,inpath,infname,infspec,dnumwant,&dirhandle); + + first_file_on_diskette = FALSE; + + /*************************************************************************/ + /* if the file just restored is a split file, and last file, exit loop */ + /*************************************************************************/ + if (set_reset_test_flag(&control_flag,SPLITFILE,TEST)==TRUE) + { + set_reset_test_flag(&control_flag,SPLITFILE,RESET); + + if (dirhandle == 0xffff) + break; + else + { + retcode = 0; + continue; + } + } /*end of if file splitted*/ + + + } /*end of if disk and file out of sequence*/ + } /*end of switch match fail*/ + } /*end of PC/DOS and it is system files*/ + } /*end of if check file header is ok */ + } /*end of if file name is not BACKUPID*/ + } /*end of if the directory found is a subdirectory*/ + + search_cnt = 1; + + retcode = + DOSFINDNEXT + (dirhandle, + (struct FileFindBuf far *)&filefindbuf, + buf_len, + (unsigned far *)&search_cnt + ); + +} +while(retcode == 0); /* END MAIN DO LOOP */ + +DOSCLOSE(src_file_handle); +/*************************************************************************/ +/* if error during findnext, error exit */ +/*************************************************************************/ + if (retcode != ERROR_NO_MORE_FILES && retcode != 0) + { + com_msg(retcode); + unexperror(retcode); + } + + + if (dirhandle != 0xffff) + { + if ((retcode = DOSFINDCLOSE(dirhandle)) != 0) + { + com_msg(retcode); + unexperror(retcode); + } + } + + +return; +} /*end of subroutine*/ -- cgit v1.2.3