home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / CMDS / mtools_3.6.src.lzh / MTOOLS_3.6 / force_io.c < prev    next >
Text File  |  1997-11-12  |  845b  |  49 lines

  1. /*
  2.  * Force I/O to be done to complete transfer length
  3.  *
  4.  * written by:
  5.  *
  6.  * Alain L. Knaff            
  7.  * Alain.Knaff@poboxes.com
  8.  *
  9.  */
  10.  
  11. #include "sysincludes.h"
  12. #include "msdos.h"
  13. #include "stream.h"
  14.  
  15. static int force_io(Stream_t *Stream,
  16.             char *buf, off_t start, size_t len,
  17.             int (*io)(Stream_t *, char *, off_t, size_t))
  18. {
  19.     int ret;
  20.     int done=0;
  21.     
  22.     while(len){
  23.         ret = io(Stream, buf, start, len);
  24.         if ( ret <= 0 ){
  25.             if (done)
  26.                 return done;
  27.             else
  28.                 return ret;
  29.         }
  30.         start += ret;
  31.         done += ret;
  32.         len -= ret;
  33.         buf += ret;
  34.     }
  35.     return done;
  36. }
  37.  
  38. int force_write(Stream_t *Stream, char *buf, off_t start, size_t len)
  39. {
  40.     return force_io(Stream, buf, start, len,
  41.             Stream->Class->write);
  42. }
  43.  
  44. int force_read(Stream_t *Stream, char *buf, off_t start, size_t len)
  45. {
  46.     return force_io(Stream, buf, start, len,
  47.             Stream->Class->read);
  48. }
  49.