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

  1. #include "includes.h"
  2.  
  3.  
  4.  
  5. APIRET EXPENTRY FS_CHDIR (
  6.     USHORT    flag,
  7.     struct cdfsi *pcdfsi,
  8.     struct cdfsd *pcdfsd,
  9.     PSZ        pDir,
  10.     USHORT    iCurDirEnd )
  11. {
  12.   int      rc;
  13.   PVOLUME  pVolume;
  14.   PCURDIR  pCurdir;
  15.   PCURDIR  pPrevCurdir;
  16.   PCURDIR  pCurCurdir;
  17.   DIRENTRY Entry;
  18.   FLAT     flatEntry;
  19.   FLAT     flatBlkDir;
  20.   struct vpfsi *pvpfsi;
  21.   struct vpfsd *pvpfsd;
  22.   PSZ      pFullDir;
  23.  
  24.   UtilEnterRamfs();
  25.   DEBUG_PRINTF2 ("FS_CHDIR  flag=%d  pDir='%s'", flag, pDir);
  26.  
  27.   switch (flag)
  28.   {
  29.     case 0: /* allocate new working directory */
  30.         FSH_GETVOLPARM (pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
  31.         pVolume = pvpfsd->pVolume;
  32.         flatBlkDir = pVolume->flatBlkRootDir;
  33.         pFullDir = pDir;
  34.         pDir += 3;
  35.         if (iCurDirEnd != 0xFFFF)
  36.         {
  37.           flatBlkDir = pcdfsd->pCurdir->flatBlkDir;
  38.           pDir += iCurDirEnd-3;
  39.         }
  40.  
  41.         switch (UtilLocate (&flatBlkDir, &flatEntry, &Entry, pDir))
  42.         {
  43.           case LOC_NOPATH:
  44.              rc = ERROR_PATH_NOT_FOUND;
  45.              break;
  46.  
  47.           case LOC_FILEENTRY:
  48.              rc = ERROR_ACCESS_DENIED;
  49.              break;
  50.  
  51.           case LOC_NOENTRY:
  52.              rc = ERROR_PATH_NOT_FOUND;
  53.              break;
  54.  
  55.           case LOC_DIRENTRY:
  56.              rc = NearAlloc ((PNEARBLOCK *) &pCurdir, sizeof(CURDIR) + strlen(pFullDir));
  57.              if (rc)
  58.                break;
  59.              pcdfsd->pCurdir = pCurdir;
  60.              pCurdir->pNextCurdir = pVolume->pFirstCurdir;
  61.              pVolume->pFirstCurdir = pCurdir;
  62.              pCurdir->pVolume = pVolume;
  63.              pCurdir->flatBlkDir = flatEntry + FIELDOFFSET(DIRENTRY,fblkFile.clusters);
  64.              strcpy (pCurdir->szDir, pFullDir);
  65.              rc = NO_ERROR;
  66.              break;
  67.         }
  68.         break;
  69.  
  70.  
  71.     case 1: /* verify working directory - only for removable media? */
  72.         rc = ERROR_NOT_SUPPORTED;
  73.         break;
  74.  
  75.  
  76.     case 2: /* deallocate working directory */
  77.         pCurdir = pcdfsd->pCurdir;
  78.         pVolume = pCurdir->pVolume;
  79.         pPrevCurdir = 0;
  80.         pCurCurdir = pVolume->pFirstCurdir;
  81.         while (pCurCurdir != pCurdir)
  82.         {
  83. #ifdef DEBUG
  84.           if (pCurCurdir == 0)
  85.           {
  86.         debugging = TRUE;
  87.         DEBUG_PRINTF0 ("\r\n!!! CURDIR not found\r\n");
  88.         INT3;
  89.           }
  90. #endif
  91.           pPrevCurdir = pCurCurdir;
  92.           pCurCurdir = pCurCurdir->pNextCurdir;
  93.         }
  94.  
  95.         if (pPrevCurdir != 0)
  96.           pPrevCurdir->pNextCurdir = pCurCurdir->pNextCurdir;
  97.         else
  98.           pVolume->pFirstCurdir = pCurCurdir->pNextCurdir;
  99.         NearFree (pCurdir);
  100.         rc = NO_ERROR;
  101.         break;
  102.   }
  103.  
  104.   DEBUG_PRINTF1 (" => %d\r\n", rc);
  105.   UtilExitRamfs();
  106.   return rc;
  107. }
  108.