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

  1. #include "includes.h"
  2.  
  3.  
  4.  
  5.  
  6.  
  7. APIRET EXPENTRY FS_FILEATTRIBUTE (
  8.     USHORT    flag,
  9.     struct cdfsi *pcdfsi,
  10.     struct cdfsd *pcdfsd,
  11.     PSZ        pName,
  12.     USHORT    iCurDirEnd,
  13.     PUSHORT    pAttr )
  14. {
  15.   int      rc;
  16.   PVOLUME  pVolume;
  17.   DIRENTRY Entry;
  18.   FLAT     flatEntry;
  19.   FLAT     flatBlkDir;
  20.   struct vpfsi *pvpfsi;
  21.   struct vpfsd *pvpfsd;
  22.  
  23.   UtilEnterRamfs();
  24.   DEBUG_PRINTF3 ("FS_FILEATTRIBUTE  flag=%d, *pAttr=0x%02X, pName='%s'",
  25.          flag, *pAttr, pName);
  26.  
  27.   FSH_GETVOLPARM (pcdfsi->cdi_hVPB, &pvpfsi, &pvpfsd);
  28.   pVolume = pvpfsd->pVolume;
  29.   flatBlkDir = pVolume->flatBlkRootDir;
  30.   pName += 3;
  31.  
  32.   if (pName[0] == '\0'  &&  flag == 0)
  33.   {
  34.     /* get attribute of root */
  35.     *pAttr = DOSATTR_DIRECTORY;
  36.     rc = NO_ERROR;
  37.     goto end;
  38.   }
  39.  
  40.   if (iCurDirEnd != 0xFFFF)
  41.   {
  42.     flatBlkDir = pcdfsd->pCurdir->flatBlkDir;
  43.     pName += iCurDirEnd-3;
  44.   }
  45.  
  46.   switch (UtilLocate (&flatBlkDir, &flatEntry, &Entry, pName))
  47.   {
  48.     case LOC_NOPATH:
  49.        rc = ERROR_PATH_NOT_FOUND;
  50.        break;
  51.  
  52.     case LOC_NOENTRY:
  53.        rc = ERROR_FILE_NOT_FOUND;
  54.        break;
  55.  
  56.     case LOC_FILEENTRY:
  57.     case LOC_DIRENTRY:
  58.        if (flag == 0)
  59.        {
  60.          /* get attribute */
  61.          /* @@@ should we clear DOSATTR_NON83 flag? */
  62.          *pAttr = Entry.fDOSattr;
  63.        }
  64.        else
  65.        {
  66.          /* set attribute */
  67.          Entry.fDOSattr = (Entry.fDOSattr & (DOSATTR_DIRECTORY | DOSATTR_NON83 | DOSATTR_NEEDEA))
  68.                 | (*pAttr & ~(DOSATTR_DIRECTORY | DOSATTR_NON83 | DOSATTR_NEEDEA));
  69.          VMWrite (flatEntry + FIELDOFFSET(DIRENTRY,fDOSattr),
  70.               &Entry.fDOSattr, sizeof(Entry.fDOSattr));
  71.        }
  72.        rc = NO_ERROR;
  73.        break;
  74.   }
  75.  
  76. end:
  77.  
  78.   DEBUG_PRINTF1 (" => %d\r\n", rc);
  79.   UtilExitRamfs();
  80.   return rc;
  81. }
  82.