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/RESTORE.C | 240 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 v4.0/src/CMD/RESTORE/RESTORE.C (limited to 'v4.0/src/CMD/RESTORE/RESTORE.C') diff --git a/v4.0/src/CMD/RESTORE/RESTORE.C b/v4.0/src/CMD/RESTORE/RESTORE.C new file mode 100644 index 0000000..e60288f --- /dev/null +++ b/v4.0/src/CMD/RESTORE/RESTORE.C @@ -0,0 +1,240 @@ + +/*  0 */ + +/**************************************************************************/ +/* +/* MODULE NAME : RESTORE utility +/* +/* SOURCE FILE NAME: RESTORE.C +/* +/* DESCRIPTIVE NAME : Restore one or more backed-up files from a +/* disk to another disk +/* +/* FUNCTION: Restore files saved by BACKUP utility to their +/* destination disk. This utility will be able to identify +/* which of the two backup formats was used and to do the +/* restore accordingly. +/* +/* NOTES: This RESTORE utility recognize two data formats: +/* 1. The data format used by BACKUP utility of 3.2 and before. +/* 2. The data format used by BACKUP utility of 3.3 and above, +/* and also used by CP/DOS 1.0 and above. +/* +/* DEPENDENCY: +/* This utility has a dependency on the BACKUP utility to +/* perform file backup correctly using the data structure +/* agreed on. +/* +/* RESTRICTION: +/* This utility is able to restore the files which are previously +/* backup by the BACKUP utility only. +/* +/* ENTRY POINT: Main +/* +/* INPUT: (PARAMETERS) +/* +/* COMMAND SYNTAX: +/* [d:][path]Restore d: [d:][path][filename][.ext] +/* [/S] [/P] [/B:date] [/A:date] [/E:time][/L:time][/M] [/N] +/* +/* Parameters: +/* The first parameter you specify is the drive designator of +/* the disk containing the backed up files. The second +/* parameter is the a filespec indicating which files you want +/* to restore. +/* Switches: +/* /S - Restore subdirectories too. +/* /P - If any hidden or read-only files match the filespec, +/* prompt the user for permission to restore them. +/* /B - Only restore those files which were last Revised on or +/* before the given date. +/* /A - Only restore those files which were last Revised on or +/* after the given date. +/* /E - Only restore those files which were last Revised at or +/* earlier then the given time. +/* /L - Only restore those files which were last Revised at or +/* later then the given time. +/* /M - Only restore those files which have been Revised since +/* the last backup. +/* /N - Only restore those files which no longer exist on the +/* destination disk. +/* +/* EXIT-ERROR: +/* The restore program sets the ERRORLEVEL in the following manner: +/* +/* 0 Normal completion +/* 1 No files were found to backup +/* 2 Some files not restored due to sharing conflict +/* 3 Terminated by user +/* 4 Terminated due to error +/* +/* +/* SOURCE HISTORY: +/* +/* Modification History: +/* +/* Code added in DOS 3.3 to allow control file > 64k commented as: +/* /* !wrw */ +/* +/* ;AN000; Code added in DOS 4.0 +/* ;AN000;2 Support for APPEND /X deactivation +/* ;AN000;3 Support for Extended Attributes +/* ;AN000;4 Support for PARSE service routines +/* ;AN000;5 Support for code page file tags +/* ;AN000;6 Support for MESSAGE retriever +/* ;AN000;8 Eliminate double prompting on single drive systems +/* ;AN000;9 Fix for termination on "Unable to MKDIR" +/* ;AN000;10 Fix for p1620 +/* ;AN001; Add CR, LF to end of command line +/* ;AN002; Make parser errors display the offending parameter +/* ;AN003; Only disallow restore of system files in ROOT !! +/* ;AN004; Fix parser +/* ;AN005; Replace COM_STRRCHR dbcs routine, fixes p5029 +/***************** END OF SPECIFICATION *********************************/ + +#include "rt.h" +#include "rt1.h" +#include "rt2.h" +#include "restpars.h" /*;AN000;4*/ +#include "dos.h" /*;AN000;2*/ +#include "comsub.h" /* common subroutine def'n */ +#include "doscalls.h" +#include "error.h" + + +BYTE destddir[MAXPATH+3] = {'\0'}; +BYTE srcddir[MAXPATH+3] = {'\0'}; +BYTE rtswitch=0; +BYTE control_flag=0; +BYTE control_flag2=0; +BYTE *buf_pointer; + +/*=============================*/ +BYTE srcd; /*;AN000;4*/ +BYTE destd; /*;AN000;4*/ +BYTE inpath [MAXPATH]; /*;AN000;*/ +BYTE infname [MAXFNAME]; /*;AN000;*/ +BYTE infext [MAXFEXT]; /*;AN000;*/ +BYTE infspec [MAXFSPEC]; /*;AN000;*/ +/*=============================*/ +/*---------------------------------------*/ +/*- */ +/*- Data structures for the PARSER */ +/*- */ +/*---------------------------------------*/ + +struct subst_list sublist; /*;AN000;6 Message substitution list */ +char response_buff[5]; /*;AN000;6 User response buffer *//*;AN000;6*/ + +BYTE append_indicator = 0xff; /*;AN000;2 Indicates the support for APPEND /X is active */ +WORD original_append_func; /*;AN000;2 APPEND functions on program entry*/ +struct timedate td; + +/***************** START OF SPECIFICATION *********************************/ +/* +/* SUBROUTINE NAME : Main +/* +/* DESCRIPTIVE NAME : Main routine for RESTORE utility +/* +/* FUNCTION: Main routine does the following: +/* 1. Verifies the DOS version +/* 2. Validate the input command line +/* 3. Calls dorestore to do the file restore. +/* +/* NOTES: +/* +/* ENTRY POINT: Main +/* Linkage: main((argc,argv) +/* +/* INPUT: (PARAMETERS) +/* argc - number of arguments +/* argv - array of pointers to arguments +/* +/* EFFECTS: rtswitch is changed to reflect the switches passed. +/* +/********************** END OF SPECIFICATIONS *******************************/ +void main(argc,argv) /* wrw! */ + int argc; + char *argv[]; +{ + WORD retcode; + union REGS inregs,outregs; /*AN000*/ + WORD i; /*loop counter */ + WORD j; /*arrary subcript */ + BYTE *c; + DWORD drive_map; + DWORD prev_address; + WORD prev_action; + +/**********************************/ +/** PRELOAD MESSAGES **/ +/**********************************/ + sysloadmsg(&inregs,&outregs); /*;AN000;6 Preload messages */ + if (outregs.x.cflag & CARRY) /*;AN000;6 If there was an error */ + { /*;AN000;6*/ + sysdispmsg(&outregs,&outregs); /*;AN000;6 Display the error message */ + exit_routine(UNEXPECTED); /*;AN000;6 and terminate */ + } /*;AN000;6*/ + + +/*********************************************/ +/* Parse the drive and file name entered */ +/*********************************************/ + parse_command_line /*;AN000;4*/ + ( /*;AN000;4*/ + argc, /*;AN000;4*/ + argv /*;AN000;4*/ + ); /*;AN000;4*/ + +/*********************************************/ +/* Make sure APPEND /X is not active */ +/*********************************************/ + check_appendX(); /*;AN000;2 */ + + +/*********************************************/ +/* Take control of Control Break Interrupt */ +/*********************************************/ + retcode = DOSSETSIGHANDLER + ( + (void far *)signal_handler_routine, /* Signal handler address */ + (DWORD far *)&prev_address, /* Address of previous handler */ + (unsigned far *)&prev_action, /* Address of previous action */ + (unsigned)INSTALL_SIGNAL, /* Indicate request type */ + (unsigned)CTRL_C /* Signal number */ + ); + + retcode = DOSSETSIGHANDLER + ( + (void far *)signal_handler_routine, /* Signal handler address */ + (DWORD far *)&prev_address, /* Address of previous handler */ + (unsigned far *)&prev_action, /* Address of previous action */ + (unsigned)INSTALL_SIGNAL, /* Indicate request type */ + (unsigned)CTRL_BREAK /* Signal number */ + ); + +/*********************************/ +/* Take control of Hard Errors */ +/*********************************/ + set_int24_vector(); /*;AN000; Set Critical error vector (int 24h) */ + + + /************************************************************/ + /* call dorestore (RTDO.C) to actually do the restoring */ + /************************************************************/ + dorestore(srcd,destd,inpath,infname,infext,infspec,&td); + + /************************************************************/ + /* output a msg in the following situations: */ + /* if flag indicates no file found */ + /************************************************************/ + if (set_reset_test_flag(&control_flag,FOUND,TEST)==FALSE) + { + /*warning! No files were found to restore*/ + display_it(NO_FILE_TO_RESTORE,STND_ERR_DEV,0,NO_RESPTYPE,(BYTE)UTIL_MSG); /*;AN000;6*/ + exit_routine(NOFILES); + } + + exit_routine(NORMAL); + +} /* end of main*/ -- cgit v1.2.3