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

  1. #include "includes.h"
  2.  
  3.  
  4.  
  5. APIRET EXPENTRY FS_ATTACH (
  6.     USHORT    flag,
  7.     PSZ        pDev,
  8.     struct vpfsd *pvpfsd,
  9.     struct cdfsd *pcdfsd,    /* not used */
  10.     PCHAR    pParm,
  11.     PUSHORT    pLen )
  12. {
  13.   int rc;
  14.   BLOCK   blkRootDir;
  15.   PVOLUME pVolume;
  16.  
  17.   UtilEnterRamfs();
  18.   DEBUG_PRINTF2 ("FS_ATTACH  pDev='%s' flag=%d", pDev, flag);
  19.  
  20.   switch (flag)
  21.   {
  22.     case 0: /* Attach */
  23.         if (pDev[1] != ':')
  24.         {
  25.           /* only drives, please */
  26.           rc = ERROR_NOT_SUPPORTED;
  27.           break;
  28.         }
  29.  
  30.         rc = NearAlloc ((PNEARBLOCK *) &pVolume, sizeof(VOLUME));
  31.         if (rc)
  32.           break;
  33.  
  34.         rc = BlockMakeEmptyDir (&blkRootDir);
  35.         if (rc)
  36.         {
  37.           NearFree (pVolume);
  38.           break;
  39.         }
  40.  
  41.         pvpfsd->pVolume = pVolume;
  42.         pVolume->blkRootDir.flatAddr = blkRootDir.flatAddr;
  43.         pVolume->blkRootDir.cbSize   = blkRootDir.cbSize;
  44.         pVolume->flatBlkRootDir = VMVirtToFlat (&pVolume->blkRootDir);
  45.         pVolume->pFirstOpenfile = 0;
  46.         pVolume->pFirstCurdir = 0;
  47.         pVolume->pFirstSearch = 0;
  48.         memset (pVolume->szLabel, 0, sizeof(pVolume->szLabel));
  49.         if (FP_SEG(pParm) > 3)
  50.           strncpy (pVolume->szLabel, pParm, 11);    /* volume label */
  51.  
  52.         rc = NO_ERROR;
  53.         break;
  54.  
  55.  
  56.     case 1: /* Detach */
  57.         rc = ERROR_NOT_SUPPORTED;
  58.         break;
  59.  
  60.  
  61.     case 2: /* Query */
  62.         if (*pLen >= 8)
  63.         {
  64.           /* set cbFSAData to 0 => we return 0 bytes in rgFSAData area */
  65.           *((USHORT *) pParm) = 6;
  66.           pParm[2] = 'H';
  67.           pParm[3] = 'e';
  68.           pParm[4] = 'l';
  69.           pParm[5] = 'l';
  70.           pParm[6] = 'o';
  71.           pParm[7] = '\0';
  72.           rc = NO_ERROR;
  73.         }
  74.         else
  75.         {
  76.           /* not enough room to tell that we wanted to return 0 bytes */
  77.           rc = ERROR_BUFFER_OVERFLOW;
  78.         }
  79.         *pLen = 8;
  80.         break;
  81.   }
  82.  
  83.   DEBUG_PRINTF1 (" => %d\r\n", rc);
  84.   UtilExitRamfs();
  85.   return rc;
  86. }
  87.