home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 August (Alt) / CHIP 2005-08.1.iso / program / guvenlik / syslinux-3.07.exe / com32 / lib / sys / fileread.c < prev    next >
Encoding:
C/C++ Source or Header  |  2004-11-23  |  2.6 KB  |  87 lines

  1. #ident "$Id: fileread.c,v 1.2 2004/11/23 23:43:02 hpa Exp $"
  2. /* ----------------------------------------------------------------------- *
  3.  *   
  4.  *   Copyright 2004 H. Peter Anvin - All Rights Reserved
  5.  *
  6.  *   Permission is hereby granted, free of charge, to any person
  7.  *   obtaining a copy of this software and associated documentation
  8.  *   files (the "Software"), to deal in the Software without
  9.  *   restriction, including without limitation the rights to use,
  10.  *   copy, modify, merge, publish, distribute, sublicense, and/or
  11.  *   sell copies of the Software, and to permit persons to whom
  12.  *   the Software is furnished to do so, subject to the following
  13.  *   conditions:
  14.  *   
  15.  *   The above copyright notice and this permission notice shall
  16.  *   be included in all copies or substantial portions of the Software.
  17.  *   
  18.  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  19.  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  20.  *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  21.  *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  22.  *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  23.  *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  24.  *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  25.  *   OTHER DEALINGS IN THE SOFTWARE.
  26.  *
  27.  * ----------------------------------------------------------------------- */
  28.  
  29. /*
  30.  * read.c
  31.  *
  32.  * Reading from a file
  33.  */
  34.  
  35. #include <errno.h>
  36. #include <string.h>
  37. #include <com32.h>
  38. #include <minmax.h>
  39. #include "file.h"
  40.  
  41. ssize_t __file_read(struct file_info *fp, void *buf, size_t count)
  42. {
  43.   com32sys_t ireg, oreg;
  44.   char *bufp = buf;
  45.   size_t n = 0;
  46.   size_t ncopy;
  47.  
  48.   memset(&ireg, 0, sizeof ireg);
  49.   ireg.eax.w[0] = 0x0007;    /* Read file */
  50.   ireg.esi.w[0] = OFFS(__com32.cs_bounce);
  51.   ireg.es = SEG(__com32.cs_bounce);
  52.  
  53.   while ( count ) {
  54.     if ( fp->i.nbytes == 0 ) {
  55.       if ( fp->i.offset >= fp->i.length || !fp->i.filedes )
  56.     return n;        /* As good as it gets... */
  57.  
  58.       ireg.esi.w[0] = fp->i.filedes;
  59.       ireg.ecx.w[0] = MAXBLOCK >> fp->i.blocklg2;
  60.       
  61.       __intcall(0x22, &ireg, &oreg);
  62.  
  63.       if ( oreg.eflags.l & EFLAGS_CF ) {
  64.     errno = EIO;
  65.     return -1;
  66.       }
  67.  
  68.       fp->i.filedes = ireg.esi.w[0];
  69.       fp->i.nbytes = min(fp->i.length-fp->i.offset, (unsigned)MAXBLOCK);
  70.       fp->i.datap = fp->i.buf;
  71.       memcpy(fp->i.buf, __com32.cs_bounce, fp->i.nbytes);
  72.     }
  73.  
  74.     ncopy = min(count, fp->i.nbytes);
  75.     memcpy(bufp, fp->i.datap, ncopy);
  76.  
  77.     n += ncopy;
  78.     bufp += ncopy;
  79.     count -= ncopy;
  80.     fp->i.datap += ncopy;
  81.     fp->i.offset += ncopy;
  82.     fp->i.nbytes -= ncopy;
  83.   }
  84.  
  85.   return n;
  86. }
  87.