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

  1. #include "includes.h"
  2.  
  3.  
  4.  
  5.  
  6.  
  7. APIRET EXPENTRY FS_MKDIR (
  8.     struct cdfsi *pcdfsi,
  9.     struct cdfsd *pcdfsd,
  10.     PSZ        pName,
  11.     USHORT    iCurDirEnd,
  12.     PEAOP    pEABuf,
  13.     USHORT    flags )
  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.   ULONG    datiNow;
  23.  
  24.   UtilEnterRamfs();
  25.   DEBUG_PRINTF2 ("FS_MKDIR  pName='%s' flags=%d", pName, flags);
  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')
  33.   {
  34.     /* tried to create root directory */
  35.     rc = ERROR_ACCESS_DENIED;
  36.     goto end;
  37.   }
  38.  
  39.   if (iCurDirEnd != 0xFFFF)
  40.   {
  41.     flatBlkDir = pcdfsd->pCurdir->flatBlkDir;
  42.     pName += iCurDirEnd-3;
  43.   }
  44.  
  45.   switch (UtilLocate (&flatBlkDir, &flatEntry, &Entry, pName))
  46.   {
  47.     case LOC_NOPATH:
  48.        rc = ERROR_PATH_NOT_FOUND;
  49.        break;
  50.  
  51.  
  52.     case LOC_FILEENTRY:
  53.     case LOC_DIRENTRY:
  54.        rc = ERROR_ACCESS_DENIED;
  55.        break;
  56.  
  57.  
  58.     case LOC_NOENTRY:
  59.        Entry.fDOSattr = flags | DOSATTR_DIRECTORY;
  60.        datiNow = UtilGetDateTime();
  61.        Entry.datiCreate = datiNow;
  62.        Entry.datiAccess = datiNow;
  63.        Entry.datiWrite  = datiNow;
  64.  
  65.        rc = BlockMakeEmptyDir (&Entry.fblkFile.clusters);
  66.        if (rc)  goto backout1;
  67.  
  68.        Entry.blkEA.flatAddr = 0;
  69.        Entry.blkEA.cbSize   = 0;
  70.        rc = EaAddList (&Entry.blkEA, pEABuf);
  71.        if (rc)  goto backout2;
  72.  
  73.        rc = UtilInsertEntry (pVolume, flatBlkDir, &Entry, &flatEntry);
  74.        if (rc)  goto backout3;
  75.  
  76.        break;
  77.  
  78.  
  79.      backout3:
  80.        BlockFree (&Entry.blkEA);
  81.      backout2:
  82.        BlockFree (&Entry.fblkFile.clusters);
  83.      backout1:
  84.        break;
  85.   }
  86.  
  87. end:
  88.  
  89.   DEBUG_PRINTF1 (" => %d\r\n", rc);
  90.   UtilExitRamfs();
  91.   return rc;
  92. }
  93.