1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc. 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk. 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies. 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted, 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice. 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__SUNPPRO_CC) && !defined (_STLP_NO_NEW_C_HEADERS) 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <time.h> 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// For sunpro, it chokes if time.h is included through stat.h 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <fstream> 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef __CYGWIN__ 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define __int64 long long 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <cstdio> 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined(__ISCPP__) 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottextern "C" { 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <sys/stat.h> 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined( __MSL__ ) 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <unix.h> 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined(__ISCPP__) 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <c_locale_is/filestat.h> 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined(__BEOS__) && defined(__INTEL__) 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <fcntl.h> 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <sys/stat.h> // For _fstat 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_MSVC) || defined (__MINGW32__) 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <fcntl.h> 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IREAD _S_IREAD 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IWRITE _S_IWRITE 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IFREG _S_IFREG 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // map permission masks 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef S_IRUSR 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IRUSR _S_IREAD 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IWUSR _S_IWRITE 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef S_IRGRP 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IRGRP _S_IREAD 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IWGRP _S_IWRITE 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef S_IROTH 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IROTH _S_IREAD 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IWOTH _S_IWRITE 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef O_RDONLY 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_RDONLY _O_RDONLY 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_WRONLY _O_WRONLY 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_RDWR _O_RDWR 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_APPEND _O_APPEND 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_CREAT _O_CREAT 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_TRUNC _O_TRUNC 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_TEXT _O_TEXT 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_BINARY _O_BINARY 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef O_ACCMODE 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst _STLP_fd INVALID_STLP_FD = -1; 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifdef __MSL__ 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define _O_TEXT 0x0 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined( O_TEXT ) 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define O_TEXT _O_TEXT 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define _S_IFREG S_IFREG 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IREAD S_IRUSR 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IWRITE S_IWUSR 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define S_IEXEC S_IXUSR 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define _S_IWRITE S_IWRITE 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define _S_IREAD S_IREAD 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define _open open 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define _close close 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define _read read 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define _write write 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Compare with streamoff definition in stl/char_traits.h! 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_DEFAULT_FILE_OFFSET) || \ 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (!defined(_LARGEFILE_SOURCE) && !defined(_LARGEFILE64_SOURCE)) 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define FOPEN fopen 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define FSEEK fseek 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define FSTAT fstat 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define STAT stat 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define FTELL ftell 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define FOPEN fopen64 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define FSEEK fseeko64 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define FSTAT fstat64 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define STAT stat64 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define FTELL ftello64 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Helper functions for _Filebuf_base. 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic bool __is_regular_file(_STLP_fd fd) { 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott struct STAT buf; 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return FSTAT(fd, &buf) == 0 && (buf.st_mode & S_IFREG) != 0 ; 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Number of characters in the file. 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic streamoff __file_size(_STLP_fd fd) { 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamoff ret = 0; 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott struct STAT buf; 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (FSTAT(fd, &buf) == 0 && (buf.st_mode & S_IFREG) != 0) 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ret = buf.st_size > 0 ? buf.st_size : 0; 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return ret; 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// All version of Unix have mmap and lseek system calls. Some also have 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// longer versions of those system calls to accommodate 64-bit offsets. 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// If we're on a Unix system, define some macros to encapsulate those 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// differences. 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottsize_t _Filebuf_base::_M_page_size = 4096; 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Filebuf_base::_Filebuf_base() 154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : _M_file_id(INVALID_STLP_FD), 155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_openmode(0), 156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_is_open(false), 157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_should_close(false) 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{} 159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Filebuf_base::_S_initialize() 161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Return the size of the file. This is a wrapper for stat. 166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Returns zero if the size cannot be determined or is ill-defined. 167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstreamoff _Filebuf_base::_M_file_size() 168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return _STLP_PRIV __file_size(_M_file_id); 170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool _Filebuf_base::_M_open(const char* name, ios_base::openmode openmode, 173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott long permission) 174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_fd file_no; 176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_M_is_open) 178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; 179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // use FILE-based i/o 181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* flags; 182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott switch (openmode & (~ios_base::ate)) { 184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::out: 185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::out | ios_base::trunc: 186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "w"; 187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::out | ios_base::binary: 190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::out | ios_base::trunc | ios_base::binary: 191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "wb"; 192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::out | ios_base::app: 195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "a"; 196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::out | ios_base::app | ios_base::binary: 199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "ab"; 200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::in: 203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "r"; 204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::in | ios_base::binary: 207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "rb"; 208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::in | ios_base::out: 211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "r+"; 212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::in | ios_base::out | ios_base::binary: 215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "r+b"; 216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::in | ios_base::out | ios_base::trunc: 219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "w+"; 220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary: 223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott flags = "w+b"; 224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott default: // The above are the only combinations of 227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; // flags allowed by the C++ standard. 228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // fbp : TODO : set permissions ! 231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (void)permission; // currently unused //*TY 02/26/2000 - added to suppress warning message 232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_file = FOPEN(name, flags); 233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_M_file) { 235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott file_no = fileno(_M_file); 236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } else { 237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; 238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // unset buffering immediately 241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott setbuf(_M_file, 0); 242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_is_open = true; 244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (openmode & ios_base::ate) { 246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (FSEEK(_M_file, 0, SEEK_END) != 0) 247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_is_open = false; 248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_file_id = file_no; 251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_should_close = _M_is_open; 252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_openmode = openmode; 253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_M_is_open) 255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_regular_file = _STLP_PRIV __is_regular_file(_M_file_id); 256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return (_M_is_open != 0); 258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool _Filebuf_base::_M_open(const char* name, ios_base::openmode openmode) 262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // This doesn't really grant everyone in the world read/write 264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // access. On Unix, file-creation system calls always clear 265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // bits that are set in the umask from the permissions flag. 266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return this->_M_open(name, openmode, S_IRUSR | S_IWUSR | S_IRGRP | 267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott S_IWGRP | S_IROTH | S_IWOTH); 268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Associated the filebuf with a file descriptor pointing to an already- 271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// open file. Mode is set to be consistent with the way that the file 272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// was opened. 273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool _Filebuf_base::_M_open( int file_no, ios_base::openmode ) 274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_M_is_open || file_no < 0) 276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; 277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott struct STAT buf; 279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (FSTAT(file_no, &buf) != 0) 280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; 281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int mode = buf.st_mode; 282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott switch ( mode & (S_IWRITE | S_IREAD) ) { 284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case S_IREAD: 285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_openmode = ios_base::in; 286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case S_IWRITE: 288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_openmode = ios_base::out; 289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case (S_IWRITE | S_IREAD): 291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_openmode = ios_base::in | ios_base::out; 292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott default: 294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; 295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_file_id = file_no; 297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_is_open = true; 298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_should_close = false; 299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_regular_file = _STLP_PRIV __is_regular_file(_M_file_id); 300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return true; 301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool _Filebuf_base::_M_close() 304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!_M_is_open) 306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; 307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott bool ok = _M_should_close ? (fclose(_M_file) == 0) : true; 309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_is_open = _M_should_close = false; 311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_openmode = 0; 312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return ok; 313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Read up to n characters into a buffer. Return value is number of 316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// characters read. 317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottptrdiff_t _Filebuf_base::_M_read(char* buf, ptrdiff_t n) { 318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return fread(buf, 1, n, _M_file); 319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Write n characters from a buffer. Return value: true if we managed 322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// to write the entire buffer, false if we didn't. 323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool _Filebuf_base::_M_write(char* buf, ptrdiff_t n) 324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (;;) { 326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ptrdiff_t written = fwrite(buf, 1, n, _M_file); 327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (n == written) { 329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return true; 330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (written > 0 && written < n) { 333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott n -= written; 334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott buf += written; 335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } else { 336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; 337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Wrapper for lseek or the like. 342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstreamoff _Filebuf_base::_M_seek(streamoff offset, ios_base::seekdir dir) 343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int whence; 345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott switch ( dir ) { 347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::beg: 348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (offset < 0 /* || offset > _M_file_size() */ ) 349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return streamoff(-1); 350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott whence = SEEK_SET; 351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::cur: 353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott whence = SEEK_CUR; 354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case ios_base::end: 356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (/* offset > 0 || */ -offset > _M_file_size() ) 357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return streamoff(-1); 358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott whence = SEEK_END; 359e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott default: 361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return streamoff(-1); 362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ( FSEEK(_M_file, offset, whence) == 0 ) { 365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return FTELL(_M_file); 366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return streamoff(-1); 369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 371e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Attempts to memory-map len bytes of the current file, starting 373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// at position offset. Precondition: offset is a multiple of the 374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// page size. Postcondition: return value is a null pointer if the 375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// memory mapping failed. Otherwise the return value is a pointer to 376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// the memory-mapped file and the file position is set to offset. 377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid *_Filebuf_base::_M_mmap(streamoff, streamoff ) 378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return 0; 380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Filebuf_base::_M_unmap(void*, streamoff) 383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // precondition : there is a valid mapping at the moment 385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE 388