Beispiel #1
0
/* Return a pointer to the specified volume's FSD-dependent volume
   data. */
static struct vpfsd far * queryVPFSD(unsigned short hVPB)
{
   struct vpfsi far * pvpfsi;
   struct vpfsd far * pvpfsd;
   FSH_GETVOLPARM(hVPB, &pvpfsi, &pvpfsd);
   if (!pvpfsd) PANIC("Invalid VPB handle!");
   return pvpfsd;
}
Beispiel #2
0
int far pascal _loadds FS_IOCTL(
                           struct sffsi   far *psffsi,
                           struct sffsd   far *psffsd,
                           unsigned short     cat,
                           unsigned short     func,
                           char           far *pParm,
                           unsigned short     lenParm,
                           unsigned       far *pParmLenInOut,
                           char           far *pData,
                           unsigned short     lenData,
                           unsigned       far *pDataLenInOut
                          )
{
  int           rc;
  struct vpfsi *pvpfsi;
  struct vpfsd *pvpfsd;

  kprintf("**** FS_IOCTL: cat = 0x%x, func = 0x%x\n", cat, func);

  FSH_GETVOLPARM(psffsi->sfi_hVPB, &pvpfsi, &pvpfsd);
  if ((rc = FSH_DEVIOCTL(
                         0,
                         pvpfsi->vpi_hDEV,
                         psffsi->sfi_selfsfn,
                         cat,
                         func,
                         pParm,
                         lenParm,
                         pData,
                         lenData
                        )) == NO_ERROR) {
  // nothing
  } else {
      kprintf("FS_IOCTL: FSH_DEVIOCTL returned %u\n", rc);
  }

  if (pDataLenInOut) {
    *pDataLenInOut = lenData;
  }
  if (pParmLenInOut) {
    *pParmLenInOut = lenParm;
  }

  return rc;
}
Beispiel #3
0
APIRET EXPENTRY FS_CHDIR (
    USHORT	flag,
    struct cdfsi *pcdfsi,
    struct cdfsd *pcdfsd,
    PSZ		pDir,
    USHORT	iCurDirEnd )
{
  int      rc;
  PVOLUME  pVolume;
  PCURDIR  pCurdir;
  PCURDIR  pPrevCurdir;
  PCURDIR  pCurCurdir;
  DIRENTRY Entry;
  FLAT     flatEntry;
  FLAT     flatBlkDir;
  struct vpfsi *pvpfsi;
  struct vpfsd *pvpfsd;
  PSZ      pFullDir;

  UtilEnterRamfs();
  DEBUG_PRINTF2 ("FS_CHDIR  flag=%d  pDir='%s'", flag, pDir);

  switch (flag)
  {
    case 0: /* allocate new working directory */
	    FSH_GETVOLPARM (pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
	    pVolume = pvpfsd->pVolume;
	    flatBlkDir = pVolume->flatBlkRootDir;
	    pFullDir = pDir;
	    pDir += 3;
	    if (iCurDirEnd != 0xFFFF)
	    {
	      flatBlkDir = pcdfsd->pCurdir->flatBlkDir;
	      pDir += iCurDirEnd-3;
	    }

	    switch (UtilLocate (&flatBlkDir, &flatEntry, &Entry, pDir))
	    {
	      case LOC_NOPATH:
		     rc = ERROR_PATH_NOT_FOUND;
		     break;

	      case LOC_FILEENTRY:
		     rc = ERROR_ACCESS_DENIED;
		     break;

	      case LOC_NOENTRY:
		     rc = ERROR_PATH_NOT_FOUND;
		     break;

	      case LOC_DIRENTRY:
		     rc = NearAlloc ((PNEARBLOCK *) &pCurdir, sizeof(CURDIR) + strlen(pFullDir));
		     if (rc)
		       break;
		     pcdfsd->pCurdir = pCurdir;
		     pCurdir->pNextCurdir = pVolume->pFirstCurdir;
		     pVolume->pFirstCurdir = pCurdir;
		     pCurdir->pVolume = pVolume;
		     pCurdir->flatBlkDir = flatEntry + FIELDOFFSET(DIRENTRY,fblkFile.clusters);
		     strcpy (pCurdir->szDir, pFullDir);
		     rc = NO_ERROR;
		     break;
	    }
	    break;


    case 1: /* verify working directory - only for removable media? */
	    rc = ERROR_NOT_SUPPORTED;
	    break;


    case 2: /* deallocate working directory */
	    if (pcdfsi != NULL)
	      FSH_GETVOLPARM (pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
	    else
	      pvpfsd = NULL;
	    pCurdir = pcdfsd->pCurdir;
	    pVolume = pCurdir->pVolume;
	    pPrevCurdir = 0;
	    pCurCurdir = pVolume->pFirstCurdir;

	    if (pCurCurdir == 0)
            {
               /* All directories already freed, nothing to do */
               rc = NO_ERROR;
	       break;
	    }

	    while (pCurCurdir != pCurdir)
	    {
#ifdef DEBUG
	      if (pCurCurdir == 0)
	      {
		debugging = TRUE;
		DEBUG_PRINTF0 ("\r\n!!! CURDIR not found\r\n");
		INT3;
	      }
#endif
	      pPrevCurdir = pCurCurdir;
	      pCurCurdir = pCurCurdir->pNextCurdir;
	    }

	    if (pPrevCurdir != 0)
	      pPrevCurdir->pNextCurdir = pCurCurdir->pNextCurdir;
	    else
	      pVolume->pFirstCurdir = pCurCurdir->pNextCurdir;
	    NearFree (pCurCurdir);
	    if (pvpfsd != NULL)
	      pvpfsd->pVolume = scavenge_volume (pVolume);
	    rc = NO_ERROR;
	    break;
  }

  DEBUG_PRINTF1 (" => %d\r\n", rc);
  UtilExitRamfs();
  return rc;
}