
/*  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*/
