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

  1. #include "includes.h"
  2.  
  3.  
  4.  
  5.  
  6.  
  7. APIRET EXPENTRY FS_WRITE (
  8.     struct sffsi *psffsi,
  9.     struct sffsd *psffsd,
  10.     PCHAR    pData,
  11.     PUSHORT    pLen,
  12.     USHORT    IOflag )    /* not used */
  13. {
  14.   int       rc;
  15.   POPENFILE pOpenfile;
  16.   ULONG     cbNewPos;
  17.   FBLOCK    fblkFile;
  18.  
  19.   UtilEnterRamfs();
  20.   DEBUG_PRINTF2 ("FS_WRITE  sfn=%d *pLen=%u", psffsi->sfi_selfsfn, *pLen);
  21.  
  22.   pOpenfile = psffsd->pOpenfile;
  23.   VMRead (&fblkFile, pOpenfile->flatEntry + FIELDOFFSET(DIRENTRY,fblkFile), sizeof(FBLOCK));
  24.  
  25. #ifdef DEBUG
  26.   if (fblkFile.fSize != psffsi->sfi_size)
  27.   {
  28.     debugging = TRUE;
  29.     DEBUG_PRINTF2 ("\r\n!!! fblkFile.fSize = %lu, sfi_size = %lu\r\n",
  30.            fblkFile.fSize, psffsi->sfi_size);
  31.     INT3;
  32.   }
  33. #endif
  34.  
  35.   cbNewPos = psffsi->sfi_position + *pLen;
  36.   if (cbNewPos > psffsi->sfi_size)
  37.   {
  38.     rc = chsize_helper (&fblkFile, cbNewPos);
  39.     if (rc)
  40.       goto end;
  41.     VMWrite (pOpenfile->flatEntry + FIELDOFFSET(DIRENTRY,fblkFile), &fblkFile, sizeof(FBLOCK));
  42.     psffsi->sfi_size = cbNewPos;
  43.   }
  44.   write_fblocks(pData, &fblkFile, psffsi->sfi_position, *pLen);
  45.   psffsi->sfi_position = cbNewPos;
  46.   psffsi->sfi_tstamp |= (ST_SWRITE | ST_PWRITE);
  47.  
  48.   rc = NO_ERROR;
  49.  
  50. end:
  51.  
  52.   DEBUG_PRINTF1 (" => %d\r\n", rc);
  53.   UtilExitRamfs();
  54.   return rc;
  55. }
  56.