1 /* @(#)schilyio.h 2.32 18/10/10 Copyright 1986, 1995-2018 J. Schilling */ 2 /* 3 * Copyright (c) 1986, 1995-2018 J. Schilling 4 */ 5 /* 6 * The contents of this file are subject to the terms of the 7 * Common Development and Distribution License, Version 1.0 only 8 * (the "License"). You may not use this file except in compliance 9 * with the License. 10 * 11 * See the file CDDL.Schily.txt in this distribution for details. 12 * A copy of the CDDL is also available via the Internet at 13 * http://www.opensource.org/licenses/cddl1.txt 14 * 15 * When distributing Covered Code, include this CDDL HEADER in each 16 * file and include the License file CDDL.Schily.txt from this distribution. 17 */ 18 19 #ifndef _STDIO_SCHILYIO_H 20 #define _STDIO_SCHILYIO_H 21 22 #include <schily/mconfig.h> 23 #include <schily/stdio.h> 24 #include <schily/standard.h> 25 #include <schily/types.h> 26 #include <schily/unistd.h> 27 #include <schily/fcntl.h> 28 #include <schily/schily.h> 29 #include <schily/errno.h> 30 31 #ifdef NO_USG_STDIO 32 # ifdef HAVE_USG_STDIO 33 # undef HAVE_USG_STDIO 34 # endif 35 #endif 36 37 #ifdef HAVE_LARGEFILES 38 /* 39 * XXX We may need to put this code to a more global place to allow all 40 * XXX users of fseek()/ftell() to automaticaly use fseeko()/ftello() 41 * XXX if the latter are available. 42 * 43 * If HAVE_LARGEFILES is defined, it is guaranteed that fseeko()/ftello() 44 * both are available. 45 */ 46 # define fseek fseeko 47 # define ftell ftello 48 49 #else /* !HAVE_LARGEFILES */ 50 /* 51 * If HAVE_LARGEFILES is not defined, we depend on specific tests for 52 * fseeko()/ftello() which must have been done before the tests for 53 * Large File support have been done. 54 * Note that this only works if the tests used below are really done before 55 * the Large File autoconf test is run. This is because autoconf does no 56 * clean testing but instead cumulatively modifes the envivonment used for 57 * testing. 58 */ 59 #ifdef HAVE_FSEEKO 60 # define fseek fseeko 61 #endif 62 #ifdef HAVE_FTELLO 63 # define ftell ftello 64 #endif 65 66 #endif 67 68 /* 69 * speed things up... 70 */ 71 #ifndef _OPENFD_SRC 72 #ifdef _openfd 73 #undef _openfd 74 #endif 75 #define _openfd(name, omode) (open(name, omode, (mode_t)0666)) 76 #endif 77 78 #define DO_MYFLAG /* use local flags */ 79 80 /* 81 * Flags used during fileopen(), ... by _fcons()/ _cvmod() 82 */ 83 #define FI_NONE 0x0000 /* no flags defined */ 84 85 #define FI_READ 0x0001 /* open for reading */ 86 #define FI_WRITE 0x0002 /* open for writing */ 87 #define FI_BINARY 0x0004 /* open in binary mode */ 88 #define FI_APPEND 0x0008 /* append on each write */ 89 90 #define FI_CREATE 0x0010 /* create if nessecary */ 91 #define FI_TRUNC 0x0020 /* truncate file on open */ 92 #define FI_UNBUF 0x0080 /* dont't buffer io */ 93 #define FI_CLOSE 0x1000 /* close file on error */ 94 95 /* 96 * Additional Schily FILE * flags that are not present with the 97 * standard stdio implementation. 98 */ 99 #define _JS_IONORAISE 01 /* do no raisecond() on errors */ 100 #define _JS_IOUNBUF 02 /* do unbuffered i/o */ 101 102 103 #ifdef DO_MYFLAG 104 105 struct _io_flags { 106 FILE *fl_io; /* file pointer */ 107 struct _io_flags /* pointer to next struct */ 108 *fl_next; /* if more file pointer to same fd */ 109 int fl_flags; /* my flags */ 110 }; 111 112 typedef struct _io_flags _io_fl; 113 114 extern int _io_glflag; /* global default flag */ 115 extern _io_fl *_io_myfl; /* array of structs to hold my flags */ 116 extern int _fl_max; /* max fd currently in _io_myfl */ 117 118 /* 119 * if fileno > max 120 * expand 121 * else if map[fileno].pointer == 0 122 * return 0 123 * else if map[fileno].pointer == p 124 * return map[fileno].flags 125 * else 126 * search list 127 */ 128 #define flp(p) (&_io_myfl[fileno(p)]) 129 130 #ifdef MY_FLAG_IS_MACRO 131 #define my_flag(p) ((int)fileno(p) >= _fl_max ? \ 132 _io_get_my_flag(p) : \ 133 ((flp(p)->fl_io == 0 || flp(p)->fl_io == p) ? \ 134 flp(p)->fl_flags : \ 135 _io_get_my_flag(p))) 136 #else 137 #define my_flag(p) _io_get_my_flag(p) 138 #endif 139 140 #define set_my_flag(p, v) _io_set_my_flag(p, v) 141 #define add_my_flag(p, v) _io_add_my_flag(p, v) 142 143 extern int _io_get_my_flag __PR((FILE *)); 144 extern void _io_set_my_flag __PR((FILE *, int)); 145 extern void _io_add_my_flag __PR((FILE *, int)); 146 147 #else /* DO_MYFLAG */ 148 149 #define my_flag(p) _JS_IONORAISE /* Always noraise */ 150 #define set_my_flag(p, v) /* Ignore */ 151 #define add_my_flag(p, v) /* Ignore */ 152 153 #endif /* DO_MYFLAG */ 154 155 #if defined(HAVE_USG_STDIO) || defined(FAST_GETC_PUTC) 156 /* 157 * We are on a system with AT&T compatible stdio implementation 158 */ 159 160 /* 161 * Use the right filbuf()/flsbuf() function. 162 */ 163 #ifdef FAST_GETC_PUTC 164 165 #define __js_fp (struct SCHILY__FILE_TAG *) 166 167 #ifndef HAVE___FILBUF 168 #define HAVE___FILBUF 169 #endif 170 #endif 171 #ifdef HAVE___FILBUF 172 # define usg_filbuf(fp) __filbuf(fp) 173 # define usg_flsbuf(c, fp) __flsbuf(c, fp) 174 /* 175 * Define prototypes to verify if our interface is right 176 */ 177 extern int __filbuf __PR((FILE *)); 178 #else /* !HAVE___FILBUF */ 179 # ifdef HAVE__FILBUF 180 # define usg_filbuf(fp) _filbuf(fp) 181 # define usg_flsbuf(c, fp) _flsbuf(c, fp) 182 /* 183 * Define prototypes to verify if our interface is right 184 */ 185 extern int _filbuf __PR((FILE *)); 186 # else 187 /* 188 * no filbuf() but this will not happen on USG_STDIO systems. 189 */ 190 # endif 191 #endif /* !HAVE___FILBUF */ 192 /* 193 * Do not check this because flsbuf()'s 1st parameter may be 194 * int SunOS 195 * unsigned int Apollo 196 * unsigned char HP-UX-11 197 * 198 * Note that the interface is now checked by autoconf. 199 */ 200 #else /* !HAVE_USG_STDIO */ 201 /* 202 * If we are on a non USG system we cannot down file pointers 203 * and we do not know about the internals of the FILE structure. 204 */ 205 #undef DO_DOWN 206 #endif /* !HAVE_USG_STDIO */ 207 208 #ifndef __js_fp 209 #define __js_fp 210 #endif 211 212 #ifndef DO_DOWN 213 /* 214 * No stream checking 215 */ 216 #define down(f) 217 #define down1(f, fl1) 218 #define down2(f, fl1, fl2) 219 #else 220 /* 221 * Do stream checking (works only on USG stdio) 222 * 223 * New version of USG stdio. 224 * _iob[] holds only a small amount of pointers. 225 * Aditional space is allocated. 226 * We may check only if the file pointer is != NULL 227 * and if iop->_flag refers to a stream with appropriate modes. 228 * If _iob[] gets expanded by malloc() we cannot check upper bound. 229 */ 230 #define down(f) ((f) == 0 || (__js_fp f)->_flag == 0 ? \ 231 (raisecond(_badfile, 0L), (FILE *)0) : (f)) 232 233 #define down1(f, fl1) ((f) == 0 || (__js_fp f)->_flag == 0 ? \ 234 (raisecond(_badfile, 0L), (FILE *)0) : \ 235 (((__js_fp f)->_flag & fl1) != fl1 ? \ 236 (raisecond(_badop, 0L), (FILE *)0) : \ 237 (f))) 238 239 #define down2(f, fl1, fl2) ((f) == 0 || (__js_fp f)->_flag == 0 ? \ 240 (raisecond(_badfile, 0L), (FILE *)0) : \ 241 (((__js_fp f)->_flag & fl1) != fl1 && \ 242 ((__js_fp f)->_flag & fl2) != fl2 ? \ 243 (raisecond(_badop, 0L), (FILE *)0) : \ 244 (f))) 245 #endif /* DO_DOWN */ 246 247 extern char _badfile[]; 248 extern char _badmode[]; 249 extern char _badop[]; 250 251 #endif /* _STDIO_SCHILYIO_H */ 252