home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 225_01 / restore.c < prev    next >
Text File  |  1987-06-10  |  11KB  |  310 lines

  1. /*-----------------------------------------------------------------*/
  2. /*
  3.          Programme:     RESTORE.C
  4.          ---------
  5.          Purpose:       Will restore a file which has been erased
  6.          -------        if that file can be found it the second
  7.                         directory (on last track) and the allocation
  8.                         blocks it controls are not already in use by
  9.                         another file.
  10.  
  11.          Compiler:      BDS C V 1.50
  12.          --------
  13.          Written:       10/11/86
  14.          -------
  15.          Amended:       xx/xx/86
  16.          -------
  17.          Version:       1.0
  18.          -------
  19.  
  20.          Copyright 1986 - Cogar Computer Services Pty. Ltd.        */
  21. /*-----------------------------------------------------------------*/
  22. #include <bdscio.h>
  23. #include <pec.h>
  24. /*-----------------------------------------------------------------*/
  25. #define    VERSION "1.0\0"
  26. #define NAME    "RESTORE\0"
  27. /*-----------------------------------------------------------------*/
  28.  
  29. main(argc, argv)    /* For Command Line processing             */
  30. int argc;
  31. char *argv[];
  32. {
  33. /*-----------------------------------------------------------------*/
  34. /*  Space reserved for variables used in programme                 */
  35. /*-----------------------------------------------------------------*/
  36.     int i, j, k, l, FD, BIT_NO, EXTENT, BLOCKS;
  37.     unsigned BLOCK_NO, PHYS_SEC, BYTE_NO;
  38.     unsigned FILE_LEN;    /* Length of DIRECT.ORY            */
  39.     char *ALV;        /* Pointer to ALV table            */
  40.     char c;
  41.     int CPM;    /* To check the CP/M Version number        */
  42.     char DRIVE;    /* The active drive                        */
  43.     char OLD_DRIVE;    /* The drive at start of programme         */
  44.     char OLD_USER;    /* The User No. at start of programme      */
  45.     char USER;    /* The User No. for this programme         */
  46.     char MY_FILE[13], *PTR;    /* The file name to be restored    */
  47.     char filename[12];    /* The parsed file name            */
  48.     char **skew_table;
  49.     char *BIG_BUF;
  50.     struct dpb *THIS;    /* Pointer to DPB                  */
  51.     char DMA_BUF[128];    /* Transfer buffer                 */
  52.     char MY_FCB[32];    /* The file control block          */
  53.     char FLAG;    /* The allocation block flag               */
  54.     char CHECK;    /* The allocation block flag               */
  55.     char MATCH;
  56. /*-----------------------------------------------------------------*/
  57.     pec_clear();    /* Universal routine                       */
  58.     printf("%s - Version %s\n",NAME, VERSION);
  59.     printf("Copyright 1986 - Cogar Computer Services Pty.Ltd.\n\n");
  60. /*-----------------------------------------------------------------*/
  61. /*  First check the CP/M Version in use.   If it is less than
  62.     Version 2.0 then inform the user and terminate programme.      */
  63. /*-----------------------------------------------------------------*/
  64.  
  65.     CPM = get_cpm();    /* Obtain the CP/M version and No. */
  66.  
  67.     i = (CPM & 0xff) - 0x20; /* Mask off the MP/M bit          */
  68.  
  69.     if(i < 0)        /* Must be less than V 2.0         */
  70.     {
  71.     printf("This programme requires at least V 2.x of CP/M.\n");
  72.         printf("Sorry but it won't run for you.\n");
  73.         exit();
  74.     }
  75. /*-----------------------------------------------------------------*/
  76. /*  The CP/M Version is OK, so save the starting User No. and the
  77.     starting Drive No. in case either is changed later.            */
  78. /*-----------------------------------------------------------------*/
  79.     OLD_USER = user_id(0xff);
  80.     OLD_DRIVE = get_default() + 0x41;
  81.  
  82. /*-----------------------------------------------------------------*/
  83.     printf("This programme can be used to restore a file which\n");
  84.     printf("was previously erased so long as CP/M hasn't already\n");
  85.     printf("re-allocated the disk space to another file.   If this\n");
  86.     printf("has happened then you can't recover the data from the\n");
  87.     printf("erased file.\n\n");
  88.     if(argc != 2)
  89.     {
  90.     printf("Enter the name of the file you wish to restore as -\n\n\t");
  91.     printf("[d:]filename\n\n");
  92.     printf("where 'd' is the optional drive code.   If you don't\n");
  93.     printf("specify the drive then the default drive will be used.\n");
  94.     PTR = gets(MY_FILE);
  95.     }
  96.     else PTR = argv[1];
  97.     up_str(PTR);
  98.     line();
  99.  
  100. /*-----------------------------------------------------------------*/
  101. /*  Now check  to see if a Drive Code was entered.
  102.     Other checks can also be used, as required but then it will be
  103.     necessary to change this coding.                               */
  104. /*-----------------------------------------------------------------*/
  105.     if(PTR[1] == ':')
  106.         DRIVE = PTR[0];
  107.     else DRIVE = OLD_DRIVE;
  108. /*-----------------------------------------------------------------*/
  109. /*  Check that the selected drive is available/on-line.   If not
  110.     then terminate the programme.   You may need to add a message
  111.     about what is going on if your version of CP/M doesn't do
  112.     this automatically, as mine does.                              */
  113. /*-----------------------------------------------------------------*/
  114.     if(!(skew_table = seldsk(DRIVE)))
  115.         exit();
  116.     if(select_dsk(DRIVE) != 0)
  117.         exit();
  118.  
  119. /*-----------------------------------------------------------------*/
  120. /*  Next put the file name in the form which it will appear in
  121.     the directory.                                                 */
  122. /*-----------------------------------------------------------------*/
  123.     setmem(&filename[0], 11, 0x20);
  124.     if(PTR[1] != ':')    /* No drive code given             */
  125.         j = 0;
  126.     else j = 2;        /* Drive code given                */
  127.  
  128.     for(i = 0; i < 11; i++)
  129.     {
  130.         if(PTR[j] != '.' && i < 8)
  131.         {
  132.             filename[i] = PTR[j];
  133.             j++;
  134.         }
  135.         else if(PTR[j] == '.' && i < 8)
  136.             filename[i] = SPACE;
  137.         else if(i > 7)
  138.         {
  139.             j++;
  140.         if(isalnum(PTR[j]))
  141.             filename[i] = PTR[j];
  142.         else filename[i] = 0x20;
  143.         }
  144.     }
  145.     filename[i] = '\0';
  146.     printf("The parsed file name is ==> %s\n\n", filename);
  147.  
  148. /*-----------------------------------------------------------------*/
  149. /*  First check to see whether the file exists on the disk in
  150.     any user area.   If so, no need to restore it.                 */
  151. /*-----------------------------------------------------------------*/
  152.     THIS = dpb_adr();    /* Get dpb address for later       */
  153.     BLOCKS = THIS->DSM + 1;    /* Total blocks in table           */
  154.  
  155.     if((FLAG = THIS->DSM >> 8) == 0)
  156.         FLAG = FALSE;   /* 8-bit addresses                 */
  157.     else FLAG = TRUE;       /* 16-bit addresses                */
  158.     if(THIS->AL0 < 240)
  159.         c = 2;
  160.     else c = 4;
  161.     ALV = get_alv();    /* Pointer to ALV table            */
  162.  
  163.     printf("Checking all User Areas for file - %s\n\n", PTR);
  164.     for(i = 0; i < 16; i++)
  165.     {
  166.         user_id(i);    /* Go to User Area                 */
  167.         if((FD = open(PTR, 0)) != -1)
  168.         {
  169.     printf("The file  %s can be found in User Area - %d\n", PTR, i);
  170.     printf("so you can get it with USER2.\n");
  171.         close(FD);
  172.         user_id(OLD_USER);
  173.         exit();
  174.         }
  175.     }
  176.     printf("It wasn't found so now check file  DIRECT.ORY\n\n");
  177.     user_id(15);
  178.  
  179.     if((FD = open("DIRECT.ORY", 0)) == -1)
  180.     {
  181.         printf("The second directory doesn't exist so we can't\n");
  182.         printf("go any further....sorry.\n");
  183.         user_id(OLD_USER);
  184.         exit();
  185.     }
  186.     printf("OK...we have the second directory.   Now check for\n");
  187.     printf("the file  %s\n\n", PTR);
  188.  
  189.     FILE_LEN = cfsize(FD);
  190.     BIG_BUF = alloc(FILE_LEN*128);
  191.     read(FD, BIG_BUF, FILE_LEN*128);    /* Get information         */
  192.     close(FD);
  193.  
  194.     MATCH = FALSE;
  195.     EXTENT = 0;
  196.  
  197.     for(i = 0; i < FILE_LEN*128; i = i + 32)
  198.     {
  199.     if(compare(&filename[0], &BIG_BUF[i + 1], 11))
  200.     {
  201.         printf("Have matched name.\n");
  202.         MATCH = TRUE;
  203. /*-----------------------------------------------------------------*/
  204. /*  The file name has been found so now check the blocks to see
  205.     whether any other file is using them.                          */
  206. /*-----------------------------------------------------------------*/
  207.         movmem(&BIG_BUF[i], &MY_FCB[0], 32);
  208.         for(j = 0; j < 16; j++)
  209.         {
  210.         if(!FLAG)
  211.             BLOCK_NO = MY_FCB[16 + j] & 0xff;
  212.         else if(FLAG)
  213.         {
  214.             BLOCK_NO = (MY_FCB[17 + j] << 8) & 0xff00;
  215.         BLOCK_NO = BLOCK_NO + (MY_FCB[16 + j] & 0xff);
  216.         j++;
  217.         }
  218. /*-------------------------------------------------------------