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 / open.c < prev    next >
Encoding:
C/C++ Source or Header  |  2004-11-23  |  2.6 KB  |  91 lines

  1. #ident "$Id: open.c,v 1.4 2004/11/23 23:43:02 hpa Exp $"
  2. /* ----------------------------------------------------------------------- *
  3.  *   
  4.  *   Copyright 2003-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. #include <errno.h>
  30. #include <com32.h>
  31. #include <string.h>
  32. #include <unistd.h>
  33. #include <fcntl.h>
  34. #include "file.h"
  35.  
  36. /*
  37.  * open.c
  38.  *
  39.  * Open an ordinary file
  40.  */
  41.  
  42. extern ssize_t __file_read(struct file_info *, void *, size_t);
  43. extern int __file_close(struct file_info *);
  44.  
  45. static const struct input_dev file_dev = {
  46.   .dev_magic = __DEV_MAGIC,
  47.   .flags     = __DEV_FILE | __DEV_INPUT,
  48.   .fileflags = O_RDONLY,
  49.   .read      = __file_read,
  50.   .close     = __file_close,
  51. };
  52.  
  53. int open(const char *pathname, int flags, ...)
  54. {
  55.   com32sys_t regs;
  56.   int fd;
  57.   struct file_info *fp;
  58.  
  59.   fd = opendev(&file_dev, NULL, flags);
  60.  
  61.   if ( fd < 0 )
  62.     return -1;
  63.   
  64.   fp = &__file_info[fd];
  65.  
  66.   strlcpy(__com32.cs_bounce, pathname, __com32.cs_bounce_size);
  67.  
  68.   regs.eax.w[0] = 0x0006;
  69.   regs.esi.w[0] = OFFS(__com32.cs_bounce);
  70.   regs.es = SEG(__com32.cs_bounce);
  71.  
  72.   __com32.cs_intcall(0x22, ®s, ®s);
  73.   
  74.   if ( (regs.eflags.l & EFLAGS_CF) || regs.esi.w[0] == 0 ) {
  75.     errno = ENOENT;
  76.     return -1;
  77.   }
  78.  
  79.   {
  80.     uint16_t blklg2;
  81.     asm("bsrw %1,%0" : "=r" (blklg2) : "rm" (regs.ecx.w[0]));
  82.     fp->i.blocklg2 = blklg2;
  83.   }
  84.   fp->i.length    = regs.eax.l;
  85.   fp->i.filedes   = regs.esi.w[0];
  86.   fp->i.offset    = 0;
  87.   fp->i.nbytes    = 0;
  88.  
  89.   return fd;
  90.