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