io.h
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:4k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)io.h 2.9 98/09/05 Copyright 1986, 1995 J. Schilling */
  2. /*
  3.  * Copyright (c) 1986, 1995 J. Schilling
  4.  */
  5. /*
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2, or (at your option)
  9.  * any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; see the file COPYING.  If not, write to
  18.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20. #include <mconfig.h>
  21. #include <standard.h>
  22. #include <unixstd.h>
  23. #include <fctldefs.h>
  24. #ifdef NO_USG_STDIO
  25. # ifdef HAVE_USG_STDIO
  26. # undef HAVE_USG_STDIO
  27. # endif
  28. #endif
  29. /*
  30.  * speed things up...
  31.  */
  32. #define _openfd(name, omode) (open(name, omode, 0666))
  33. #define DO_MYFLAG /* use local flags */
  34. /*
  35.  * Flags used during fileopen(), ... by _fcons()/ _cvmod()
  36.  */
  37. #define FI_NONE 0x0000 /* no flags defined */
  38. #define FI_READ 0x0001 /* open for reading */
  39. #define FI_WRITE 0x0002 /* open for writing */
  40. #define FI_BINARY 0x0004 /* open in binary mode */
  41. #define FI_CREATE 0x0010 /* create if nessecary */
  42. #define FI_TRUNC 0x0020 /* truncate file on open */
  43. #define FI_APPEND 0x0040 /* append on each write */
  44. #define FI_UNBUF 0x0080 /* dont't buffer io */
  45. #define FI_CLOSE 0x1000 /* close file on error */
  46. /*
  47.  * local flags
  48.  */
  49. #define _IONORAISE 01 /* do no raisecond() on errors */
  50. #define _IOUNBUF 02 /* do unbuffered i/o */
  51. #ifdef DO_MYFLAG
  52. struct _io_flags {
  53. FILE *fl_io; /* file pointer */
  54. struct _io_flags /* pointer to next struct */
  55. *fl_next; /* if more file pointer to same fd */
  56. int fl_flags; /* my flags */
  57. };
  58. typedef struct _io_flags _io_fl;
  59. extern int _io_glflag; /* global default flag */
  60. extern _io_fl *_io_myfl; /* array of structs to hold my flags */
  61. extern int _fl_max; /* max fd currently in _io_myfl */
  62. /*
  63.  * if fileno > max
  64.  * expand
  65.  * else if map[fileno].pointer == 0
  66.  * return 0
  67.  * else if map[fileno].pointer == p
  68.  * return map[fileno].flags
  69.  * else
  70.  * search list
  71.  */
  72. #define flp(p) (&_io_myfl[fileno(p)])
  73. #ifdef MY_FLAG_IS_MACRO
  74. #define my_flag(p) ((int)fileno(p) >= _fl_max ?
  75. _io_get_my_flag(p) :
  76. ((flp(p)->fl_io == 0 || flp(p)->fl_io == p) ?
  77. flp(p)->fl_flags :
  78. _io_get_my_flag(p)))
  79. #else
  80. #define my_flag(p) _io_get_my_flag(p)
  81. #endif
  82. #define set_my_flag(p,v) _io_set_my_flag(p, v)
  83. #define add_my_flag(p,v) _io_add_my_flag(p, v)
  84. extern int _io_get_my_flag __PR((FILE *));
  85. extern void _io_set_my_flag __PR((FILE *, int));
  86. extern void _io_add_my_flag __PR((FILE *, int));
  87. #else /* DO_MYFLAG */
  88. #define my_flag(p) _IONORAISE /* Always noraise */
  89. #define set_my_flag(p,v) /* Ignore */
  90. #define add_my_flag(p,v) /* Ignore */
  91. #endif /* DO_MYFLAG */
  92. #ifdef HAVE_USG_STDIO
  93. /*
  94.  * Define prototypes to verify if our interface is right
  95.  */
  96. extern int _filbuf __PR((FILE *));
  97. extern int _flsbuf __PR((int, FILE *));
  98. #else
  99. /*
  100.  * If we are on a non USG system we cannot down file pointers
  101.  */
  102. #undef DO_DOWN
  103. #endif
  104. #ifndef DO_DOWN
  105. /*
  106.  * No stream checking
  107.  */
  108. #define down(f)
  109. #define down1(f,fl1)
  110. #define down2(f,fl1,fl2)
  111. #else
  112. /*
  113.  * Do stream checking (works only on USG stdio)
  114.  *
  115.  * New version of USG stdio.
  116.  * _iob[] holds only a small amount of pointers.
  117.  * Aditional space is allocated.
  118.  * We may check only if the file pointer is != NULL
  119.  * and if iop->_flag refers to a stream with appropriate modes.
  120.  * If _iob[] gets expanded by malloc() we cannot check upper bound.
  121.  */
  122. #define down(f) ((f) == 0 || (f)->_flag==0 ? 
  123. (raisecond(_badfile, 0L),(FILE *)0) : (f))
  124. #define down1(f,fl1) ((f) == 0 || (f)->_flag==0 ? 
  125. (raisecond(_badfile, 0L),(FILE *)0) : 
  126. (((f)->_flag & fl1) != fl1 ? 
  127. (raisecond(_badop, 0L),FILE *)0) : 
  128. (f)))
  129. #define down2(f,fl1,fl2)((f) == 0 || (f)->_flag==0 ? 
  130. (raisecond(_badfile, 0L),(FILE *)0) : 
  131. (((f)->_flag & fl1) != fl1 && 
  132.  ((f)->_flag & fl2) != fl2 ? 
  133. (raisecond(_badop, 0L),(FILE *)0) : 
  134. (f)))
  135. #endif /* DO_DOWN */
  136. extern char _badfile[];
  137. extern char _badmode[];
  138. extern char _badop[];