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

  1. #include "includes.h"
  2.  
  3.  
  4.  
  5. struct easizebuf
  6. {
  7.   USHORT cbMaxEASize;
  8.   ULONG  cbMaxEAListSize;
  9. };
  10.  
  11.  
  12.  
  13.  
  14. /* static */
  15. int dump_lists (PVOLUME pVolume)
  16. {
  17.   POPENFILE pCurOpenfile;
  18.   PCURDIR   pCurCurdir;
  19.   PSEARCH   pCurSearch;
  20. #ifdef DEBUG
  21.   char      old_debugging;
  22.  
  23.   old_debugging = debugging;
  24.   debugging = TRUE;
  25. #endif
  26.  
  27.   pCurOpenfile = pVolume->pFirstOpenfile;
  28.   if (pCurOpenfile != 0)
  29.   {
  30.     DEBUG_PRINTF0 ("\r\n  Open files:\r\n");
  31.     while (pCurOpenfile != 0)
  32.     {
  33.       DEBUG_PRINTF4 ("    0x%08lX  %c%c  %s\r\n",
  34.              pCurOpenfile->flatEntry,
  35.              pCurOpenfile->fShare & ACCESS_READ  ? 'R' : '-',
  36.              pCurOpenfile->fShare & ACCESS_WRITE ? 'W' : ' ',
  37.              (char *) pCurOpenfile->szName);
  38.       pCurOpenfile = pCurOpenfile->pNextOpenfile;
  39.     }
  40.   }
  41.   else
  42.   {
  43.     DEBUG_PRINTF0 ("\r\n  No open files\r\n");
  44.   }
  45.  
  46.   pCurCurdir = pVolume->pFirstCurdir;
  47.   if (pCurCurdir != 0)
  48.   {
  49.     DEBUG_PRINTF0 ("  Current directories:\r\n");
  50.     while (pCurCurdir != 0)
  51.     {
  52.       DEBUG_PRINTF2 ("    0x%08lX  %s\r\n",
  53.              pCurCurdir->flatBlkDir,
  54.              (char *) pCurCurdir->szDir);
  55.       pCurCurdir = pCurCurdir->pNextCurdir;
  56.     }
  57.   }
  58.   else
  59.   {
  60.     DEBUG_PRINTF0 ("  No current directories\r\n");
  61.   }
  62.  
  63.   pCurSearch = pVolume->pFirstSearch;
  64.   if (pCurSearch != 0)
  65.   {
  66.     DEBUG_PRINTF0 ("  Open searches:\r\n");
  67.     while (pCurSearch != 0)
  68.     {
  69.       DEBUG_PRINTF3 ("    0x%08lX  0x%08lX  %s\r\n",
  70.              pCurSearch->flatBlkDir,
  71.              pCurSearch->flatEntry,
  72.              (char *) pCurSearch->szPattern);
  73.       pCurSearch = pCurSearch->pNextSearch;
  74.     }
  75.   }
  76.   else
  77.   {
  78.     DEBUG_PRINTF0 ("  No open searches\r\n");
  79.   }
  80.  
  81. #ifdef DEBUG
  82.   debugging = old_debugging;
  83. #endif
  84.  
  85.   return NO_ERROR;
  86. }
  87.  
  88.  
  89.  
  90.  
  91. /* static */
  92. int dump_entry (PVOLUME pVolume, struct CD *pCD)
  93. {
  94.   int      rc;
  95.   PSZ      pName;
  96.   DIRENTRY Entry;
  97.   FLAT     flatEntry;
  98.   FLAT     flatBlkDir;
  99. #ifdef DEBUG
  100.   char     old_debugging;
  101.  
  102.   old_debugging = debugging;
  103.   debugging = TRUE;
  104. #endif
  105.  
  106.   pName = pCD->pPath;
  107.   flatBlkDir = pVolume->flatBlkRootDir;
  108.   pName += 3;
  109.   if (pCD->iCurDirEnd != 0xFFFF)
  110.   {
  111.     flatBlkDir = pCD->pcdfsd->pCurdir->flatBlkDir;
  112.     pName += pCD->iCurDirEnd - 3;
  113.   }
  114.  
  115.   switch (UtilLocate (&flatBlkDir, &flatEntry, &Entry, pName))
  116.   {
  117.     case LOC_NOPATH:
  118.        rc = ERROR_PATH_NOT_FOUND;
  119.        break;
  120.  
  121.     case LOC_NOENTRY:
  122.        rc = ERROR_FILE_NOT_FOUND;
  123.        break;
  124.  
  125.     case LOC_DIRENTRY:
  126.     case LOC_FILEENTRY:
  127.        DEBUG_PRINTF1 ("\r\nflatBlkDir = 0x%08lX\r\n", flatBlkDir);
  128.        DEBUG_PRINTF1 ("flatEntry  = 0x%08lX\r\n", flatEntry);
  129.        DEBUG_PRINTF1 ("  name = '%s'\r\n", (char *) Entry.achName);
  130.        DEBUG_PRINTF1 ("  dosattr = 0x%04X\r\n", Entry.fDOSattr);
  131.        DEBUG_PRINTF3 ("  fblkFile flatAddr = 0x%08lX  cbSize = %lu  clusters=%lu\r\n",
  132.               Entry.fblkFile.clusters.flatAddr, Entry.fblkFile.fSize, Entry.fblkFile.clusters.cbSize>>2);
  133.        DEBUG_PRINTF2 ("  blkEA    flatAddr = 0x%08lX  cbSize = %lu\r\n",
  134.               Entry.blkEA.flatAddr, Entry.blkEA.cbSize);
  135.        rc = NO_ERROR;
  136.        break;
  137.   }
  138.  
  139. #ifdef DEBUG
  140.   debugging = old_debugging;
  141. #endif
  142.   return rc;
  143. }
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150. APIRET EXPENTRY FS_FSCTL (
  151.     union argdat *pArgDat,
  152.     USHORT    iArgType,
  153.     USHORT    func,
  154.     PCHAR    pParm,
  155.     USHORT    lenParm,
  156.     PUSHORT    plenParmIO,
  157.     PCHAR    pData,
  158.     USHORT    lenData,
  159.     PUSHORT    plenDataIO )
  160. {
  161.   int     rc;
  162.   PVOLUME pVolume;
  163.   struct vpfsi *pvpfsi;
  164.   struct vpfsd *pvpfsd;
  165.   struct easizebuf *pEASizeBuf;
  166.  
  167.   UtilEnterRamfs();
  168.   DEBUG_PRINTF2 ("FS_FSCTL  iArgType=%d func=0x%04X", iArgType, func);
  169.  
  170.   switch (iArgType)
  171.   {
  172.     case FSCTL_HANDLE:
  173.        rc = ERROR_NOT_SUPPORTED;
  174.        break;
  175.  
  176.  
  177.     case FSCTL_PATHNAME:
  178.        FSH_GETVOLPARM (pArgDat->cd.pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
  179.        pVolume = pvpfsd->pVolume;
  180.  
  181.        switch (func)
  182.        {
  183.          case 0x0002: /* return max supported EA and EA list sizes */
  184.               if (lenData < sizeof(struct easizebuf))
  185.               {
  186.                 rc = ERROR_BUFFER_OVERFLOW;
  187.                 break;
  188.               }
  189.               pEASizeBuf = (struct easizebuf *) pData;
  190.               pEASizeBuf->cbMaxEASize     = 65531L;
  191.               pEASizeBuf->cbMaxEAListSize = 65535L;
  192.               *plenDataIO = sizeof(struct easizebuf);
  193.               rc = NO_ERROR;
  194.               break;
  195.  
  196.  
  197.          case 0x8100: /* dump internal lists */
  198.               rc = dump_lists (pVolume);
  199.               break;
  200.  
  201.  
  202.          case 0x8101: /* dump Entry */
  203.               rc = dump_entry (pVolume, &pArgDat->cd);
  204.               break;
  205.  
  206.  
  207.          default:     /* */
  208.               rc = ERROR_NOT_SUPPORTED;
  209.               break;
  210.        }
  211.        break;
  212.  
  213.  
  214.     case FSCTL_FSDNAME:
  215.        rc = ERROR_NOT_SUPPORTED;
  216.        break;
  217.   }
  218.  
  219.   DEBUG_PRINTF1 (" => %d\r\n", rc);
  220.   UtilExitRamfs();
  221.   return rc;
  222. }
  223.