home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 6 File / 06-File.zip / ramfs102.zip / src / move.c < prev    next >
C/C++ Source or Header  |  2002-09-28  |  3KB  |  138 lines

  1. #include "includes.h"
  2.  
  3.  
  4.  
  5.  
  6.  
  7. APIRET EXPENTRY FS_MOVE (
  8.     struct cdfsi *pcdfsi,
  9.     struct cdfsd *pcdfsd,
  10.     PSZ        pSrc,
  11.     USHORT    iSrcCurDirEnd,
  12.     PSZ        pDst,
  13.     USHORT    iDstCurDirEnd,
  14.     USHORT    flags )
  15. {
  16.   int       rc;
  17.   PSZ        pName;
  18.   PVOLUME   pVolume;
  19.   DIRENTRY  SrcEntry;
  20.   DIRENTRY  DstEntry;
  21.   FLAT      flatEntry;
  22.   FLAT      flatBlkDir;
  23.   struct vpfsi *pvpfsi;
  24.   struct vpfsd *pvpfsd;
  25.  
  26.   UtilEnterRamfs();
  27.   DEBUG_PRINTF3 ("FS_MOVE  pSrc='%s' pDst='%s' flags=%d",
  28.          pSrc, pDst, flags);
  29.  
  30.   FSH_GETVOLPARM (pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
  31.   pVolume = pvpfsd->pVolume;
  32.  
  33.   /* examine source entry */
  34.   flatBlkDir = pVolume->flatBlkRootDir;
  35.   pName = pSrc + 3;
  36.   if (iSrcCurDirEnd != 0xFFFF)
  37.   {
  38.     flatBlkDir = pcdfsd->pCurdir->flatBlkDir;
  39.     pName += iSrcCurDirEnd-3;
  40.   }
  41.  
  42.   switch (UtilLocate (&flatBlkDir, &flatEntry, &SrcEntry, pName))
  43.   {
  44.     case LOC_NOPATH:
  45.        rc = ERROR_PATH_NOT_FOUND;
  46.        goto end;
  47.  
  48.     case LOC_NOENTRY:
  49.        rc = ERROR_FILE_NOT_FOUND;
  50.        goto end;
  51.  
  52.     case LOC_FILEENTRY:
  53.     case LOC_DIRENTRY:
  54.        /* source name seems OK */
  55.        break;
  56.   }
  57.  
  58.   /* preserve original case in source entry */
  59.   VMRead (SrcEntry.achName, flatEntry + FIELDOFFSET(DIRENTRY,achName),
  60.       SrcEntry.cbName);
  61.   /* remove source entry */
  62.   UtilDeleteEntry (pVolume, flatBlkDir, &SrcEntry, flatEntry);
  63.  
  64.   /* examine destination name */
  65.   flatBlkDir = pVolume->flatBlkRootDir;
  66.   pName = pDst + 3;
  67.   if (iDstCurDirEnd != 0xFFFF)
  68.   {
  69.     flatBlkDir = pcdfsd->pCurdir->flatBlkDir;
  70.     pName += iDstCurDirEnd-3;
  71.   }
  72.  
  73.   switch (UtilLocate (&flatBlkDir, &flatEntry, &DstEntry, pName))
  74.   {
  75.     case LOC_NOPATH:
  76.        rc = ERROR_PATH_NOT_FOUND;
  77.        break;
  78.  
  79.     case LOC_FILEENTRY:
  80.     case LOC_DIRENTRY:
  81.        /* destination entry already exists */
  82.        rc = ERROR_ACCESS_DENIED;
  83.        break;
  84.  
  85.     case LOC_NOENTRY:
  86.        /* ok, insert source entry here */
  87.        DstEntry.fDOSattr = (SrcEntry.fDOSattr & ~DOSATTR_NON83) | flags;
  88.        DstEntry.fblkFile         = SrcEntry.fblkFile;
  89.        DstEntry.blkEA.flatAddr   = SrcEntry.blkEA.flatAddr;
  90.        DstEntry.blkEA.cbSize     = SrcEntry.blkEA.cbSize;
  91.        DstEntry.datiCreate       = SrcEntry.datiCreate;
  92.        DstEntry.datiAccess       = SrcEntry.datiAccess;
  93.        DstEntry.datiWrite        = SrcEntry.datiWrite;
  94.        rc = UtilInsertEntry (pVolume, flatBlkDir, &DstEntry, &flatEntry);
  95.        break;
  96.   }
  97.  
  98.   if (rc != NO_ERROR)
  99.   {
  100.     /* error inserting new entry, try to reinsert source entry */
  101.     /* find out where to reinsert SrcEntry */
  102.     flatBlkDir = pVolume->flatBlkRootDir;
  103.     pName = pSrc + 3;
  104.     if (iSrcCurDirEnd != 0xFFFF)
  105.     {
  106.       flatBlkDir = pcdfsd->pCurdir->flatBlkDir;
  107.       pName += iSrcCurDirEnd-3;
  108.     }
  109.     if (UtilLocate (&flatBlkDir, &flatEntry, &DstEntry, pName) != LOC_NOENTRY)
  110.     {
  111.       /* this never happens */
  112. #ifdef DEBUG
  113.       debugging = TRUE;
  114.       DEBUG_PRINTF0 ("\r\n!!! FS_MOVE  reinserting src not LOC_NOENTRY\r\n");
  115. #endif
  116.       INT3;
  117.     }
  118.  
  119.     if (UtilInsertEntry (pVolume, flatBlkDir, &SrcEntry, &flatEntry) != NO_ERROR)
  120.     {
  121.       /* let's hope this never happens */
  122. #ifdef DEBUG
  123.       debugging = TRUE;
  124.       DEBUG_PRINTF2 ("\r\n!!! FS_MOVE  reinserting src error too difficult to handle src='%s' dst='%s'\r\n",
  125.              pSrc, pDst);
  126. #endif
  127.       INT3;
  128.     }
  129.   }
  130.  
  131.  
  132. end:
  133.  
  134.   DEBUG_PRINTF1 (" => %d\r\n", rc);
  135.   UtilExitRamfs();
  136.   return rc;
  137. }
  138.