xref: /aoo42x/main/tools/source/stream/strmunx.cxx (revision 89b56da7)
1*89b56da7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*89b56da7SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*89b56da7SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*89b56da7SAndrew Rist  * distributed with this work for additional information
6*89b56da7SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*89b56da7SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*89b56da7SAndrew Rist  * "License"); you may not use this file except in compliance
9*89b56da7SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*89b56da7SAndrew Rist  *
11*89b56da7SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*89b56da7SAndrew Rist  *
13*89b56da7SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*89b56da7SAndrew Rist  * software distributed under the License is distributed on an
15*89b56da7SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*89b56da7SAndrew Rist  * KIND, either express or implied.  See the License for the
17*89b56da7SAndrew Rist  * specific language governing permissions and limitations
18*89b56da7SAndrew Rist  * under the License.
19*89b56da7SAndrew Rist  *
20*89b56da7SAndrew Rist  *************************************************************/
21*89b56da7SAndrew Rist 
22*89b56da7SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // no include "precompiled_tools.hxx" because this file is included in strmsys.cxx
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include <stdio.h>
27cdf0e10cSrcweir #include <string.h>
28cdf0e10cSrcweir #include <sys/stat.h>
29cdf0e10cSrcweir #include <fcntl.h>
30cdf0e10cSrcweir #include <errno.h>
31cdf0e10cSrcweir #include <unistd.h>
32cdf0e10cSrcweir #include <limits.h>
33cdf0e10cSrcweir #include <stdlib.h>	// fuer getenv()
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <tools/debug.hxx>
36cdf0e10cSrcweir #include <tools/fsys.hxx>
37cdf0e10cSrcweir #include <tools/stream.hxx>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <vos/mutex.hxx>
40cdf0e10cSrcweir #include <osl/thread.h> // osl_getThreadTextEncoding
41cdf0e10cSrcweir 
42cdf0e10cSrcweir // class FileBase
43cdf0e10cSrcweir #include <osl/file.hxx>
44cdf0e10cSrcweir #include <rtl/instance.hxx>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir using namespace osl;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir // -----------------------------------------------------------------------
49cdf0e10cSrcweir 
50cdf0e10cSrcweir // ----------------
51cdf0e10cSrcweir // - InternalLock -
52cdf0e10cSrcweir // ----------------
53cdf0e10cSrcweir 
54cdf0e10cSrcweir class InternalStreamLock;
55cdf0e10cSrcweir DECLARE_LIST( InternalStreamLockList, InternalStreamLock* )
56cdf0e10cSrcweir namespace { struct LockList : public rtl::Static< InternalStreamLockList, LockList > {}; }
57cdf0e10cSrcweir 
58cdf0e10cSrcweir #ifndef BOOTSTRAP
59cdf0e10cSrcweir namespace { struct LockMutex : public rtl::Static< vos::OMutex, LockMutex > {}; }
60cdf0e10cSrcweir #endif
61cdf0e10cSrcweir 
62cdf0e10cSrcweir class InternalStreamLock
63cdf0e10cSrcweir {
64cdf0e10cSrcweir 	sal_Size			m_nStartPos;
65cdf0e10cSrcweir 	sal_Size			m_nEndPos;
66cdf0e10cSrcweir 	SvFileStream*	m_pStream;
67cdf0e10cSrcweir 	struct stat		m_aStat;
68cdf0e10cSrcweir 
69cdf0e10cSrcweir 	InternalStreamLock( sal_Size, sal_Size, SvFileStream* );
70cdf0e10cSrcweir 	~InternalStreamLock();
71cdf0e10cSrcweir public:
72cdf0e10cSrcweir 	static sal_Bool LockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* );
73cdf0e10cSrcweir 	static void UnlockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* );
74cdf0e10cSrcweir };
75cdf0e10cSrcweir 
InternalStreamLock(sal_Size nStart,sal_Size nEnd,SvFileStream * pStream)76cdf0e10cSrcweir InternalStreamLock::InternalStreamLock(
77cdf0e10cSrcweir 	sal_Size nStart,
78cdf0e10cSrcweir 	sal_Size nEnd,
79cdf0e10cSrcweir 	SvFileStream* pStream ) :
80cdf0e10cSrcweir 		m_nStartPos( nStart ),
81cdf0e10cSrcweir 		m_nEndPos( nEnd ),
82cdf0e10cSrcweir 		m_pStream( pStream )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir 	ByteString aFileName(m_pStream->GetFileName(), osl_getThreadTextEncoding());
85cdf0e10cSrcweir 	stat( aFileName.GetBuffer(), &m_aStat );
86cdf0e10cSrcweir 	LockList::get().Insert( this, LIST_APPEND );
87cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
88cdf0e10cSrcweir 	fprintf( stderr, "locked %s", aFileName.GetBuffer() );
89cdf0e10cSrcweir 	if( m_nStartPos || m_nEndPos )
90cdf0e10cSrcweir 		fprintf(stderr, " [ %ld ... %ld ]", m_nStartPos, m_nEndPos );
91cdf0e10cSrcweir 	fprintf( stderr, "\n" );
92cdf0e10cSrcweir #endif
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
~InternalStreamLock()95cdf0e10cSrcweir InternalStreamLock::~InternalStreamLock()
96cdf0e10cSrcweir {
97cdf0e10cSrcweir 	LockList::get().Remove( this );
98cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
99cdf0e10cSrcweir 	ByteString aFileName(m_pStream->GetFileName(), osl_getThreadTextEncoding());
100cdf0e10cSrcweir 	fprintf( stderr, "unlocked %s", aFileName.GetBuffer() );
101cdf0e10cSrcweir 	if( m_nStartPos || m_nEndPos )
102cdf0e10cSrcweir 		fprintf(stderr, " [ %ld ... %ld ]", m_nStartPos, m_nEndPos );
103cdf0e10cSrcweir 	fprintf( stderr, "\n" );
104cdf0e10cSrcweir #endif
105cdf0e10cSrcweir }
106cdf0e10cSrcweir 
LockFile(sal_Size nStart,sal_Size nEnd,SvFileStream * pStream)107cdf0e10cSrcweir sal_Bool InternalStreamLock::LockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* pStream )
108cdf0e10cSrcweir {
109cdf0e10cSrcweir #ifndef BOOTSTRAP
110cdf0e10cSrcweir 	vos:: OGuard  aGuard( LockMutex::get() );
111cdf0e10cSrcweir #endif
112cdf0e10cSrcweir 	ByteString aFileName(pStream->GetFileName(), osl_getThreadTextEncoding());
113cdf0e10cSrcweir 	struct stat aStat;
114cdf0e10cSrcweir 	if( stat( aFileName.GetBuffer(), &aStat ) )
115cdf0e10cSrcweir 		return sal_False;
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	if( S_ISDIR( aStat.st_mode ) )
118cdf0e10cSrcweir 		return sal_True;
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 	InternalStreamLock* pLock = NULL;
121cdf0e10cSrcweir 	InternalStreamLockList &rLockList = LockList::get();
122cdf0e10cSrcweir 	for( sal_uIntPtr i = 0; i < rLockList.Count(); ++i )
123cdf0e10cSrcweir 	{
124cdf0e10cSrcweir 		pLock = rLockList.GetObject( i );
125cdf0e10cSrcweir 		if( aStat.st_ino == pLock->m_aStat.st_ino )
126cdf0e10cSrcweir 		{
127cdf0e10cSrcweir 			sal_Bool bDenyByOptions = sal_False;
128cdf0e10cSrcweir 			StreamMode nLockMode = pLock->m_pStream->GetStreamMode();
129cdf0e10cSrcweir 			StreamMode nNewMode = pStream->GetStreamMode();
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 			if( nLockMode & STREAM_SHARE_DENYALL )
132cdf0e10cSrcweir 				bDenyByOptions = sal_True;
133cdf0e10cSrcweir 			else if( ( nLockMode & STREAM_SHARE_DENYWRITE ) &&
134cdf0e10cSrcweir 					 ( nNewMode & STREAM_WRITE ) )
135cdf0e10cSrcweir 				bDenyByOptions = sal_True;
136cdf0e10cSrcweir 			else if( ( nLockMode & STREAM_SHARE_DENYREAD ) &&
137cdf0e10cSrcweir 					 ( nNewMode & STREAM_READ ) )
138cdf0e10cSrcweir 				bDenyByOptions = sal_True;
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 			if( bDenyByOptions )
141cdf0e10cSrcweir 			{
142cdf0e10cSrcweir 				if( pLock->m_nStartPos == 0 && pLock->m_nEndPos == 0 ) // whole file is already locked
143cdf0e10cSrcweir 					return sal_False;
144cdf0e10cSrcweir 				if( nStart == 0 && nEnd == 0) // cannot lock whole file
145cdf0e10cSrcweir 					return sal_False;
146cdf0e10cSrcweir 
147cdf0e10cSrcweir 				if( ( nStart < pLock->m_nStartPos && nEnd > pLock->m_nStartPos ) ||
148cdf0e10cSrcweir 					( nStart < pLock->m_nEndPos && nEnd > pLock->m_nEndPos ) )
149cdf0e10cSrcweir 					return sal_False;
150cdf0e10cSrcweir 			}
151cdf0e10cSrcweir 		}
152cdf0e10cSrcweir 	}
153cdf0e10cSrcweir 	pLock  = new InternalStreamLock( nStart, nEnd, pStream );
154cdf0e10cSrcweir 	return sal_True;
155cdf0e10cSrcweir }
156cdf0e10cSrcweir 
UnlockFile(sal_Size nStart,sal_Size nEnd,SvFileStream * pStream)157cdf0e10cSrcweir void InternalStreamLock::UnlockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* pStream )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir #ifndef BOOTSTRAP
160cdf0e10cSrcweir 	vos:: OGuard  aGuard( LockMutex::get() );
161cdf0e10cSrcweir #endif
162cdf0e10cSrcweir 	InternalStreamLock* pLock = NULL;
163cdf0e10cSrcweir 	InternalStreamLockList &rLockList = LockList::get();
164cdf0e10cSrcweir 	if( nStart == 0 && nEnd == 0 )
165cdf0e10cSrcweir 	{
166cdf0e10cSrcweir 		for( sal_uIntPtr i = 0; i < rLockList.Count(); ++i )
167cdf0e10cSrcweir 		{
168cdf0e10cSrcweir 			if( ( pLock = rLockList.GetObject( i ) )->m_pStream == pStream )
169cdf0e10cSrcweir 			{
170cdf0e10cSrcweir 				delete pLock;
171cdf0e10cSrcweir 				i--;
172cdf0e10cSrcweir 			}
173cdf0e10cSrcweir 		}
174cdf0e10cSrcweir 		return;
175cdf0e10cSrcweir 	}
176cdf0e10cSrcweir 	for( sal_uIntPtr i = 0; i < rLockList.Count(); ++i )
177cdf0e10cSrcweir 	{
178cdf0e10cSrcweir 		if( ( pLock = rLockList.GetObject( i ) )->m_pStream == pStream &&
179cdf0e10cSrcweir 			nStart == pLock->m_nStartPos && nEnd == pLock->m_nEndPos )
180cdf0e10cSrcweir 		{
181cdf0e10cSrcweir 			delete pLock;
182cdf0e10cSrcweir 			return;
183cdf0e10cSrcweir 		}
184cdf0e10cSrcweir 	}
185cdf0e10cSrcweir }
186cdf0e10cSrcweir 
187cdf0e10cSrcweir // --------------
188cdf0e10cSrcweir // - StreamData -
189cdf0e10cSrcweir // --------------
190cdf0e10cSrcweir 
191cdf0e10cSrcweir class StreamData
192cdf0e10cSrcweir {
193cdf0e10cSrcweir public:
194cdf0e10cSrcweir     int     nHandle;
195cdf0e10cSrcweir 
StreamData()196cdf0e10cSrcweir             StreamData() { nHandle = 0; }
197cdf0e10cSrcweir };
198cdf0e10cSrcweir 
199cdf0e10cSrcweir // -----------------------------------------------------------------------
200cdf0e10cSrcweir 
GetSvError(int nErrno)201cdf0e10cSrcweir static sal_uInt32 GetSvError( int nErrno )
202cdf0e10cSrcweir {
203cdf0e10cSrcweir     static struct { int nErr; sal_uInt32 sv; } errArr[] =
204cdf0e10cSrcweir     {
205cdf0e10cSrcweir         { 0,            SVSTREAM_OK },
206cdf0e10cSrcweir         { EACCES,       SVSTREAM_ACCESS_DENIED },
207cdf0e10cSrcweir         { EBADF,        SVSTREAM_INVALID_HANDLE },
208cdf0e10cSrcweir #if defined( RS6000 ) || defined( ALPHA ) || defined( HP9000 ) || defined( NETBSD ) || defined(FREEBSD) || defined(MACOSX) || defined(__FreeBSD_kernel__)
209cdf0e10cSrcweir         { EDEADLK,      SVSTREAM_LOCKING_VIOLATION },
210cdf0e10cSrcweir #else
211cdf0e10cSrcweir         { EDEADLOCK,    SVSTREAM_LOCKING_VIOLATION },
212cdf0e10cSrcweir #endif
213cdf0e10cSrcweir         { EINVAL,       SVSTREAM_INVALID_PARAMETER },
214cdf0e10cSrcweir         { EMFILE,       SVSTREAM_TOO_MANY_OPEN_FILES },
215cdf0e10cSrcweir         { ENFILE,       SVSTREAM_TOO_MANY_OPEN_FILES },
216cdf0e10cSrcweir         { ENOENT,       SVSTREAM_FILE_NOT_FOUND },
217cdf0e10cSrcweir         { EPERM,        SVSTREAM_ACCESS_DENIED },
218cdf0e10cSrcweir         { EROFS,        SVSTREAM_ACCESS_DENIED },
219cdf0e10cSrcweir         { EAGAIN,       SVSTREAM_LOCKING_VIOLATION },
220cdf0e10cSrcweir         { EISDIR,       SVSTREAM_PATH_NOT_FOUND },
221cdf0e10cSrcweir         { ELOOP,        SVSTREAM_PATH_NOT_FOUND },
222cdf0e10cSrcweir #if ! defined( RS6000 ) && ! defined( ALPHA ) && ! defined( NETBSD ) && ! defined (FREEBSD) && ! defined (MACOSX) && ! defined(__FreeBSD_kernel__)
223cdf0e10cSrcweir         { EMULTIHOP,    SVSTREAM_PATH_NOT_FOUND },
224cdf0e10cSrcweir         { ENOLINK,      SVSTREAM_PATH_NOT_FOUND },
225cdf0e10cSrcweir #endif
226cdf0e10cSrcweir         { ENOTDIR,      SVSTREAM_PATH_NOT_FOUND },
227cdf0e10cSrcweir 		{ ETXTBSY,		SVSTREAM_ACCESS_DENIED	},
228cdf0e10cSrcweir 		{ EEXIST,		SVSTREAM_CANNOT_MAKE    },
229cdf0e10cSrcweir 		{ ENOSPC,		SVSTREAM_DISK_FULL 		},
230cdf0e10cSrcweir         { (int)0xFFFF,  SVSTREAM_GENERALERROR }
231cdf0e10cSrcweir     };
232cdf0e10cSrcweir 
233cdf0e10cSrcweir     sal_uInt32 nRetVal = SVSTREAM_GENERALERROR;    // Standardfehler
234cdf0e10cSrcweir     int i=0;
235cdf0e10cSrcweir     do
236cdf0e10cSrcweir     {
237cdf0e10cSrcweir         if ( errArr[i].nErr == nErrno )
238cdf0e10cSrcweir         {
239cdf0e10cSrcweir             nRetVal = errArr[i].sv;
240cdf0e10cSrcweir             break;
241cdf0e10cSrcweir         }
242cdf0e10cSrcweir         ++i;
243cdf0e10cSrcweir     }
244cdf0e10cSrcweir     while( errArr[i].nErr != 0xFFFF );
245cdf0e10cSrcweir     return nRetVal;
246cdf0e10cSrcweir }
247cdf0e10cSrcweir 
248cdf0e10cSrcweir /*************************************************************************
249cdf0e10cSrcweir |*
250cdf0e10cSrcweir |*    SvFileStream::SvFileStream()
251cdf0e10cSrcweir |*
252cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
253cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
254cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
255cdf0e10cSrcweir |*
256cdf0e10cSrcweir *************************************************************************/
257cdf0e10cSrcweir 
SvFileStream(const String & rFileName,StreamMode nOpenMode)258cdf0e10cSrcweir SvFileStream::SvFileStream( const String& rFileName, StreamMode nOpenMode )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir     bIsOpen             = sal_False;
261cdf0e10cSrcweir     nLockCounter        = 0;
262cdf0e10cSrcweir     bIsWritable         = sal_False;
263cdf0e10cSrcweir     pInstanceData       = new StreamData;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir     SetBufferSize( 1024 );
266cdf0e10cSrcweir 	// convert URL to SystemPath, if necessary
267cdf0e10cSrcweir 	::rtl::OUString aSystemFileName;
268cdf0e10cSrcweir 	if( FileBase::getSystemPathFromFileURL( rFileName , aSystemFileName )
269cdf0e10cSrcweir         != FileBase::E_None )
270cdf0e10cSrcweir 	{
271cdf0e10cSrcweir 		aSystemFileName = rFileName;
272cdf0e10cSrcweir 	}
273cdf0e10cSrcweir 	Open( aSystemFileName, nOpenMode );
274cdf0e10cSrcweir }
275cdf0e10cSrcweir 
276cdf0e10cSrcweir /*************************************************************************
277cdf0e10cSrcweir |*
278cdf0e10cSrcweir |*    SvFileStream::SvFileStream()
279cdf0e10cSrcweir |*
280cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
281cdf0e10cSrcweir |*    Ersterstellung    OV 22.11.94
282cdf0e10cSrcweir |*    Letzte Aenderung  OV 22.11.94
283cdf0e10cSrcweir |*
284cdf0e10cSrcweir *************************************************************************/
285cdf0e10cSrcweir 
SvFileStream()286cdf0e10cSrcweir SvFileStream::SvFileStream()
287cdf0e10cSrcweir {
288cdf0e10cSrcweir     bIsOpen             = sal_False;
289cdf0e10cSrcweir     nLockCounter        = 0;
290cdf0e10cSrcweir     bIsWritable         = sal_False;
291cdf0e10cSrcweir     pInstanceData       = new StreamData;
292cdf0e10cSrcweir     SetBufferSize( 1024 );
293cdf0e10cSrcweir }
294cdf0e10cSrcweir 
295cdf0e10cSrcweir /*************************************************************************
296cdf0e10cSrcweir |*
297cdf0e10cSrcweir |*    SvFileStream::~SvFileStream()
298cdf0e10cSrcweir |*
299cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
300cdf0e10cSrcweir |*    Ersterstellung    OV 22.11.94
301cdf0e10cSrcweir |*    Letzte Aenderung  OV 22.11.94
302cdf0e10cSrcweir |*
303cdf0e10cSrcweir *************************************************************************/
304cdf0e10cSrcweir 
~SvFileStream()305cdf0e10cSrcweir SvFileStream::~SvFileStream()
306cdf0e10cSrcweir {
307cdf0e10cSrcweir     Close();
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 	InternalStreamLock::UnlockFile( 0, 0, this );
310cdf0e10cSrcweir 
311cdf0e10cSrcweir     if (pInstanceData)
312cdf0e10cSrcweir         delete pInstanceData;
313cdf0e10cSrcweir }
314cdf0e10cSrcweir 
315cdf0e10cSrcweir /*************************************************************************
316cdf0e10cSrcweir |*
317cdf0e10cSrcweir |*    SvFileStream::GetFileHandle()
318cdf0e10cSrcweir |*
319cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
320cdf0e10cSrcweir |*    Ersterstellung    OV 22.11.94
321cdf0e10cSrcweir |*    Letzte Aenderung  OV 22.11.94
322cdf0e10cSrcweir |*
323cdf0e10cSrcweir *************************************************************************/
324cdf0e10cSrcweir 
GetFileHandle() const325cdf0e10cSrcweir sal_uInt32 SvFileStream::GetFileHandle() const
326cdf0e10cSrcweir {
327cdf0e10cSrcweir     return (sal_uInt32)pInstanceData->nHandle;
328cdf0e10cSrcweir }
329cdf0e10cSrcweir 
330cdf0e10cSrcweir /*************************************************************************
331cdf0e10cSrcweir |*
332cdf0e10cSrcweir |*    SvFileStream::IsA()
333cdf0e10cSrcweir |*
334cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
335cdf0e10cSrcweir |*    Ersterstellung    OV 14.06.94
336cdf0e10cSrcweir |*    Letzte Aenderung  OV 14.06.94
337cdf0e10cSrcweir |*
338cdf0e10cSrcweir *************************************************************************/
339cdf0e10cSrcweir 
IsA() const340cdf0e10cSrcweir sal_uInt16 SvFileStream::IsA() const
341cdf0e10cSrcweir {
342cdf0e10cSrcweir     return ID_FILESTREAM;
343cdf0e10cSrcweir }
344cdf0e10cSrcweir 
345cdf0e10cSrcweir /*************************************************************************
346cdf0e10cSrcweir |*
347cdf0e10cSrcweir |*    SvFileStream::GetData()
348cdf0e10cSrcweir |*
349cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
350cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
351cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
352cdf0e10cSrcweir |*
353cdf0e10cSrcweir *************************************************************************/
354cdf0e10cSrcweir 
GetData(void * pData,sal_Size nSize)355cdf0e10cSrcweir sal_Size SvFileStream::GetData( void* pData, sal_Size nSize )
356cdf0e10cSrcweir {
357cdf0e10cSrcweir #ifdef DBG_UTIL
358cdf0e10cSrcweir     ByteString aTraceStr( "SvFileStream::GetData(): " );
359cdf0e10cSrcweir     aTraceStr += ByteString::CreateFromInt64(nSize);
360cdf0e10cSrcweir     aTraceStr += " Bytes from ";
361cdf0e10cSrcweir     aTraceStr += ByteString(aFilename, osl_getThreadTextEncoding());
362cdf0e10cSrcweir     DBG_TRACE( aTraceStr.GetBuffer() );
363cdf0e10cSrcweir #endif
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 	int nRead = 0;
366cdf0e10cSrcweir 	if ( IsOpen() )
367cdf0e10cSrcweir 	{
368cdf0e10cSrcweir 		nRead = read(pInstanceData->nHandle,pData,(unsigned)nSize);
369cdf0e10cSrcweir 		if ( nRead == -1 )
370cdf0e10cSrcweir 			SetError( ::GetSvError( errno ));
371cdf0e10cSrcweir 	}
372cdf0e10cSrcweir 	return (sal_Size)nRead;
373cdf0e10cSrcweir }
374cdf0e10cSrcweir 
375cdf0e10cSrcweir /*************************************************************************
376cdf0e10cSrcweir |*
377cdf0e10cSrcweir |*    SvFileStream::PutData()
378cdf0e10cSrcweir |*
379cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
380cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
381cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
382cdf0e10cSrcweir |*
383cdf0e10cSrcweir *************************************************************************/
384cdf0e10cSrcweir 
PutData(const void * pData,sal_Size nSize)385cdf0e10cSrcweir sal_Size SvFileStream::PutData( const void* pData, sal_Size nSize )
386cdf0e10cSrcweir {
387cdf0e10cSrcweir #ifdef DBG_UTIL
388cdf0e10cSrcweir     ByteString aTraceStr( "SvFileStrean::PutData: " );
389cdf0e10cSrcweir     aTraceStr += ByteString::CreateFromInt64(nSize);
390cdf0e10cSrcweir     aTraceStr += " Bytes to ";
391cdf0e10cSrcweir     aTraceStr += ByteString(aFilename, osl_getThreadTextEncoding());
392cdf0e10cSrcweir     DBG_TRACE( aTraceStr.GetBuffer() );
393cdf0e10cSrcweir #endif
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 	int nWrite = 0;
396cdf0e10cSrcweir 	if ( IsOpen() )
397cdf0e10cSrcweir 	{
398cdf0e10cSrcweir 		nWrite = write(pInstanceData->nHandle,pData,(unsigned)nSize);
399cdf0e10cSrcweir 		if ( nWrite == -1 )
400cdf0e10cSrcweir 		SetError( ::GetSvError( errno ) );
401cdf0e10cSrcweir 		else if( !nWrite )
402cdf0e10cSrcweir 		SetError( SVSTREAM_DISK_FULL );
403cdf0e10cSrcweir 	}
404cdf0e10cSrcweir 	return (sal_Size)nWrite;
405cdf0e10cSrcweir }
406cdf0e10cSrcweir 
407cdf0e10cSrcweir /*************************************************************************
408cdf0e10cSrcweir |*
409cdf0e10cSrcweir |*    SvFileStream::SeekPos()
410cdf0e10cSrcweir |*
411cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
412cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
413cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
414cdf0e10cSrcweir |*
415cdf0e10cSrcweir *************************************************************************/
416cdf0e10cSrcweir 
SeekPos(sal_Size nPos)417cdf0e10cSrcweir sal_Size SvFileStream::SeekPos( sal_Size nPos )
418cdf0e10cSrcweir {
419cdf0e10cSrcweir 	if ( IsOpen() )
420cdf0e10cSrcweir 	{
421cdf0e10cSrcweir 		long nNewPos;
422cdf0e10cSrcweir 		if ( nPos != STREAM_SEEK_TO_END )
423cdf0e10cSrcweir 			nNewPos = lseek( pInstanceData->nHandle, (long)nPos, SEEK_SET );
424cdf0e10cSrcweir 		else
425cdf0e10cSrcweir 			nNewPos = lseek( pInstanceData->nHandle, 0L, SEEK_END );
426cdf0e10cSrcweir 
427cdf0e10cSrcweir 		if ( nNewPos == -1 )
428cdf0e10cSrcweir 		{
429cdf0e10cSrcweir 			SetError( SVSTREAM_SEEK_ERROR );
430cdf0e10cSrcweir 			return 0L;
431cdf0e10cSrcweir 		}
432cdf0e10cSrcweir 		// langsam aber sicherer als return nNewPos
433cdf0e10cSrcweir 		return lseek(pInstanceData->nHandle,0L,SEEK_CUR);
434cdf0e10cSrcweir 		// return nNewPos;
435cdf0e10cSrcweir 	}
436cdf0e10cSrcweir     SetError( SVSTREAM_GENERALERROR );
437cdf0e10cSrcweir     return 0L;
438cdf0e10cSrcweir }
439cdf0e10cSrcweir 
440cdf0e10cSrcweir 
441cdf0e10cSrcweir /*************************************************************************
442cdf0e10cSrcweir |*
443cdf0e10cSrcweir |*    SvFileStream::FlushData()
444cdf0e10cSrcweir |*
445cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
446cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
447cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
448cdf0e10cSrcweir |*
449cdf0e10cSrcweir *************************************************************************/
450cdf0e10cSrcweir 
FlushData()451cdf0e10cSrcweir void SvFileStream::FlushData()
452cdf0e10cSrcweir {
453cdf0e10cSrcweir // lokal gibt es nicht
454cdf0e10cSrcweir }
455cdf0e10cSrcweir 
456cdf0e10cSrcweir static char *pFileLockEnvVar = (char*)1;
457cdf0e10cSrcweir 
458cdf0e10cSrcweir /*************************************************************************
459cdf0e10cSrcweir |*
460cdf0e10cSrcweir |*    SvFileStream::LockRange()
461cdf0e10cSrcweir |*
462cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
463cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
464cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
465cdf0e10cSrcweir |*
466cdf0e10cSrcweir *************************************************************************/
467cdf0e10cSrcweir 
LockRange(sal_Size nByteOffset,sal_Size nBytes)468cdf0e10cSrcweir sal_Bool SvFileStream::LockRange( sal_Size nByteOffset, sal_Size nBytes )
469cdf0e10cSrcweir {
470cdf0e10cSrcweir 	struct flock aflock;
471cdf0e10cSrcweir 	aflock.l_start = nByteOffset;
472cdf0e10cSrcweir 	aflock.l_whence = SEEK_SET;
473cdf0e10cSrcweir 	aflock.l_len = nBytes;
474cdf0e10cSrcweir 
475cdf0e10cSrcweir 	int nLockMode = 0;
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 	if ( ! IsOpen() )
478cdf0e10cSrcweir 		return sal_False;
479cdf0e10cSrcweir 
480cdf0e10cSrcweir 	if ( eStreamMode & STREAM_SHARE_DENYALL )
481cdf0e10cSrcweir         {
482cdf0e10cSrcweir 		if (bIsWritable)
483cdf0e10cSrcweir 			nLockMode = F_WRLCK;
484cdf0e10cSrcweir 		else
485cdf0e10cSrcweir 			nLockMode = F_RDLCK;
486cdf0e10cSrcweir         }
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 	if ( eStreamMode & STREAM_SHARE_DENYREAD )
489cdf0e10cSrcweir         {
490cdf0e10cSrcweir 		if (bIsWritable)
491cdf0e10cSrcweir 			nLockMode = F_WRLCK;
492cdf0e10cSrcweir 		else
493cdf0e10cSrcweir 		{
494cdf0e10cSrcweir 			SetError(SVSTREAM_LOCKING_VIOLATION);
495cdf0e10cSrcweir 			return sal_False;
496cdf0e10cSrcweir 		}
497cdf0e10cSrcweir         }
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 	if ( eStreamMode & STREAM_SHARE_DENYWRITE )
500cdf0e10cSrcweir         {
501cdf0e10cSrcweir 		if (bIsWritable)
502cdf0e10cSrcweir 			nLockMode = F_WRLCK;
503cdf0e10cSrcweir 		else
504cdf0e10cSrcweir 			nLockMode = F_RDLCK;
505cdf0e10cSrcweir         }
506cdf0e10cSrcweir 
507cdf0e10cSrcweir 	if (!nLockMode)
508cdf0e10cSrcweir 		return sal_True;
509cdf0e10cSrcweir 
510cdf0e10cSrcweir 	if( ! InternalStreamLock::LockFile( nByteOffset, nByteOffset+nBytes, this ) )
511cdf0e10cSrcweir 	{
512cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
513cdf0e10cSrcweir 		fprintf( stderr, "InternalLock on %s [ %ld ... %ld ] failed\n",
514cdf0e10cSrcweir 				 ByteString(aFilename, osl_getThreadTextEncoding()).GetBuffer(), nByteOffset, nByteOffset+nBytes );
515cdf0e10cSrcweir #endif
516cdf0e10cSrcweir 		return sal_False;
517cdf0e10cSrcweir 	}
518cdf0e10cSrcweir 
519cdf0e10cSrcweir 	// HACK: File-Locking nur via Environmentvariable einschalten
520cdf0e10cSrcweir 	// um einen Haenger im Zusammenspiel mit einem Linux
521cdf0e10cSrcweir 	// NFS-2-Server (kein Lockdaemon) zu verhindern.
522cdf0e10cSrcweir 	// File-Locking ?ber NFS ist generell ein Performancekiller.
523cdf0e10cSrcweir 	//						HR, 22.10.1997 fuer SOLARIS
524cdf0e10cSrcweir 	//						CP, 30.11.1997 fuer HPUX
525cdf0e10cSrcweir 	//						ER, 18.12.1997 fuer IRIX
526cdf0e10cSrcweir 	//						HR, 18.05.1998 Environmentvariable
527cdf0e10cSrcweir 
528cdf0e10cSrcweir 	if ( pFileLockEnvVar == (char*)1 )
529cdf0e10cSrcweir 		pFileLockEnvVar = getenv("STAR_ENABLE_FILE_LOCKING");
530cdf0e10cSrcweir 	if ( ! pFileLockEnvVar )
531cdf0e10cSrcweir 		return sal_True;
532cdf0e10cSrcweir 
533cdf0e10cSrcweir 	aflock.l_type = nLockMode;
534cdf0e10cSrcweir 	if (fcntl(pInstanceData->nHandle, F_GETLK, &aflock) == -1)
535cdf0e10cSrcweir 	{
536cdf0e10cSrcweir 	#if ( defined HPUX && defined BAD_UNION )
537cdf0e10cSrcweir 	#ifdef DBG_UTIL
538cdf0e10cSrcweir 		fprintf( stderr, "***** FCNTL(lock):errno = %d\n", errno );
539cdf0e10cSrcweir 	#endif
540cdf0e10cSrcweir 		if ( errno == EINVAL || errno == ENOSYS )
541cdf0e10cSrcweir 			return sal_True;
542cdf0e10cSrcweir 	#endif
543cdf0e10cSrcweir 	#if defined SINIX
544cdf0e10cSrcweir 		if (errno == EINVAL)
545cdf0e10cSrcweir 			return sal_True;
546cdf0e10cSrcweir 	#endif
547cdf0e10cSrcweir 	#if defined SOLARIS
548cdf0e10cSrcweir 		if (errno == ENOSYS)
549cdf0e10cSrcweir 			return sal_True;
550cdf0e10cSrcweir 	#endif
551cdf0e10cSrcweir 		SetError( ::GetSvError( errno ));
552cdf0e10cSrcweir 		return sal_False;
553cdf0e10cSrcweir 	}
554cdf0e10cSrcweir 	if (aflock.l_type != F_UNLCK)
555cdf0e10cSrcweir 	{
556cdf0e10cSrcweir 		SetError(SVSTREAM_LOCKING_VIOLATION);
557cdf0e10cSrcweir 		return sal_False;
558cdf0e10cSrcweir 	}
559cdf0e10cSrcweir 
560cdf0e10cSrcweir 	aflock.l_type = nLockMode;
561cdf0e10cSrcweir 	if (fcntl(pInstanceData->nHandle, F_SETLK, &aflock) == -1)
562cdf0e10cSrcweir 	{
563cdf0e10cSrcweir 		SetError( ::GetSvError( errno ));
564cdf0e10cSrcweir 		return sal_False;
565cdf0e10cSrcweir 	}
566cdf0e10cSrcweir 	return sal_True;
567cdf0e10cSrcweir }
568cdf0e10cSrcweir 
569cdf0e10cSrcweir /*************************************************************************
570cdf0e10cSrcweir |*
571cdf0e10cSrcweir |*    SvFileStream::UnlockRange()
572cdf0e10cSrcweir |*
573cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
574cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
575cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
576cdf0e10cSrcweir |*
577cdf0e10cSrcweir *************************************************************************/
578cdf0e10cSrcweir 
UnlockRange(sal_Size nByteOffset,sal_Size nBytes)579cdf0e10cSrcweir sal_Bool SvFileStream::UnlockRange( sal_Size nByteOffset, sal_Size nBytes )
580cdf0e10cSrcweir {
581cdf0e10cSrcweir 
582cdf0e10cSrcweir     struct flock aflock;
583cdf0e10cSrcweir     aflock.l_type = F_UNLCK;
584cdf0e10cSrcweir     aflock.l_start = nByteOffset;
585cdf0e10cSrcweir     aflock.l_whence = SEEK_SET;
586cdf0e10cSrcweir     aflock.l_len = nBytes;
587cdf0e10cSrcweir 
588cdf0e10cSrcweir     if ( ! IsOpen() )
589cdf0e10cSrcweir         return sal_False;
590cdf0e10cSrcweir 
591cdf0e10cSrcweir 	InternalStreamLock::UnlockFile( nByteOffset, nByteOffset+nBytes, this );
592cdf0e10cSrcweir 
593cdf0e10cSrcweir     if ( ! (eStreamMode &
594cdf0e10cSrcweir         (STREAM_SHARE_DENYALL | STREAM_SHARE_DENYREAD | STREAM_SHARE_DENYWRITE)))
595cdf0e10cSrcweir         return sal_True;
596cdf0e10cSrcweir 
597cdf0e10cSrcweir 	// wenn File Locking ausgeschaltet, siehe SvFileStream::LockRange
598cdf0e10cSrcweir 	if ( ! pFileLockEnvVar )
599cdf0e10cSrcweir 		return sal_True;
600cdf0e10cSrcweir 
601cdf0e10cSrcweir     if (fcntl(pInstanceData->nHandle, F_SETLK, &aflock) != -1)
602cdf0e10cSrcweir         return sal_True;
603cdf0e10cSrcweir 
604cdf0e10cSrcweir #if ( defined HPUX && defined BAD_UNION )
605cdf0e10cSrcweir #ifdef DBG_UTIL
606cdf0e10cSrcweir         fprintf( stderr, "***** FCNTL(unlock):errno = %d\n", errno );
607cdf0e10cSrcweir #endif
608cdf0e10cSrcweir         if ( errno == EINVAL || errno == ENOSYS )
609cdf0e10cSrcweir             return sal_True;
610cdf0e10cSrcweir #endif
611cdf0e10cSrcweir #if ( defined SINIX )
612cdf0e10cSrcweir 	if (errno == EINVAL)
613cdf0e10cSrcweir 		return sal_True;
614cdf0e10cSrcweir #endif
615cdf0e10cSrcweir 
616cdf0e10cSrcweir     SetError( ::GetSvError( errno ));
617cdf0e10cSrcweir     return sal_False;
618cdf0e10cSrcweir }
619cdf0e10cSrcweir 
620cdf0e10cSrcweir /*************************************************************************
621cdf0e10cSrcweir |*
622cdf0e10cSrcweir |*    SvFileStream::LockFile()
623cdf0e10cSrcweir |*
624cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
625cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
626cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
627cdf0e10cSrcweir |*
628cdf0e10cSrcweir *************************************************************************/
629cdf0e10cSrcweir 
LockFile()630cdf0e10cSrcweir sal_Bool SvFileStream::LockFile()
631cdf0e10cSrcweir {
632cdf0e10cSrcweir   return LockRange( 0UL, 0UL );
633cdf0e10cSrcweir }
634cdf0e10cSrcweir 
635cdf0e10cSrcweir /*************************************************************************
636cdf0e10cSrcweir |*
637cdf0e10cSrcweir |*    SvFileStream::UnlockFile()
638cdf0e10cSrcweir |*
639cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
640cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
641cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
642cdf0e10cSrcweir |*
643cdf0e10cSrcweir *************************************************************************/
644cdf0e10cSrcweir 
UnlockFile()645cdf0e10cSrcweir sal_Bool SvFileStream::UnlockFile()
646cdf0e10cSrcweir {
647cdf0e10cSrcweir     return UnlockRange( 0UL, 0UL );
648cdf0e10cSrcweir }
649cdf0e10cSrcweir 
650cdf0e10cSrcweir /*************************************************************************
651cdf0e10cSrcweir |*
652cdf0e10cSrcweir |*    SvFileStream::Open()
653cdf0e10cSrcweir |*
654cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
655cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
656cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
657cdf0e10cSrcweir |*
658cdf0e10cSrcweir *************************************************************************/
659cdf0e10cSrcweir 
Open(const String & rFilename,StreamMode nOpenMode)660cdf0e10cSrcweir void SvFileStream::Open( const String& rFilename, StreamMode nOpenMode )
661cdf0e10cSrcweir {
662cdf0e10cSrcweir 	int nAccess, nAccessRW;
663cdf0e10cSrcweir 	int nMode;
664cdf0e10cSrcweir 	int nHandleTmp;
665cdf0e10cSrcweir 	struct stat buf;
666cdf0e10cSrcweir 	sal_Bool bStatValid = sal_False;
667cdf0e10cSrcweir 
668cdf0e10cSrcweir 	Close();
669cdf0e10cSrcweir 	errno = 0;
670cdf0e10cSrcweir 	eStreamMode = nOpenMode;
671cdf0e10cSrcweir 	eStreamMode &= ~STREAM_TRUNC; // beim ReOpen nicht cutten
672cdf0e10cSrcweir 
673cdf0e10cSrcweir //    !!! NoOp: Ansonsten ToAbs() verwendern
674cdf0e10cSrcweir //    !!! DirEntry aDirEntry( rFilename );
675cdf0e10cSrcweir //    !!! aFilename = aDirEntry.GetFull();
676cdf0e10cSrcweir 	aFilename = rFilename;
677cdf0e10cSrcweir #ifndef BOOTSTRAP
678cdf0e10cSrcweir 	FSysRedirector::DoRedirect( aFilename );
679cdf0e10cSrcweir #endif
680cdf0e10cSrcweir 	ByteString aLocalFilename(aFilename, osl_getThreadTextEncoding());
681cdf0e10cSrcweir 
682cdf0e10cSrcweir #ifdef DBG_UTIL
683cdf0e10cSrcweir 	ByteString aTraceStr( "SvFileStream::Open(): " );
684cdf0e10cSrcweir 	aTraceStr +=  aLocalFilename;
685cdf0e10cSrcweir 	DBG_TRACE( aTraceStr.GetBuffer() );
686cdf0e10cSrcweir #endif
687cdf0e10cSrcweir 
688cdf0e10cSrcweir 	if ( lstat( aLocalFilename.GetBuffer(), &buf ) == 0 )
689cdf0e10cSrcweir 	  {
690cdf0e10cSrcweir 	    bStatValid = sal_True;
691cdf0e10cSrcweir 		// SvFileStream soll kein Directory oeffnen
692cdf0e10cSrcweir 		if( S_ISDIR( buf.st_mode ) )
693cdf0e10cSrcweir 		  {
694cdf0e10cSrcweir 			SetError( ::GetSvError( EISDIR ) );
695cdf0e10cSrcweir 			return;
696cdf0e10cSrcweir 		  }
697cdf0e10cSrcweir 	  }
698cdf0e10cSrcweir 
699cdf0e10cSrcweir 
700cdf0e10cSrcweir     if ( !( nOpenMode & STREAM_WRITE ) )
701cdf0e10cSrcweir         nAccessRW = O_RDONLY;
702cdf0e10cSrcweir     else if ( !( nOpenMode & STREAM_READ ) )
703cdf0e10cSrcweir         nAccessRW = O_WRONLY;
704cdf0e10cSrcweir     else
705cdf0e10cSrcweir         nAccessRW = O_RDWR;
706cdf0e10cSrcweir 
707cdf0e10cSrcweir     nAccess = 0;
708cdf0e10cSrcweir 	// Fix (MDA, 18.01.95): Bei RD_ONLY nicht mit O_CREAT oeffnen
709cdf0e10cSrcweir 	// Wichtig auf Read-Only-Dateisystemen (wie CDROM)
710cdf0e10cSrcweir     if ( (!( nOpenMode & STREAM_NOCREATE )) && ( nAccessRW != O_RDONLY ) )
711cdf0e10cSrcweir         nAccess |= O_CREAT;
712cdf0e10cSrcweir     if ( nOpenMode & STREAM_TRUNC )
713cdf0e10cSrcweir         nAccess |= O_TRUNC;
714cdf0e10cSrcweir 
715cdf0e10cSrcweir     nMode = S_IREAD | S_IROTH | S_IRGRP;
716cdf0e10cSrcweir     if ( nOpenMode & STREAM_WRITE)
717cdf0e10cSrcweir 	{
718cdf0e10cSrcweir 	  nMode |= (S_IWRITE | S_IWOTH | S_IWGRP);
719cdf0e10cSrcweir 
720cdf0e10cSrcweir 	  if ( nOpenMode & STREAM_COPY_ON_SYMLINK )
721cdf0e10cSrcweir 	  	{
722cdf0e10cSrcweir 		  if ( bStatValid  &&  S_ISLNK( buf.st_mode ) < 0 )
723cdf0e10cSrcweir 			{
724cdf0e10cSrcweir 		      char *pBuf = new char[ 1024+1 ];
725cdf0e10cSrcweir 		      if ( readlink( aLocalFilename.GetBuffer(), pBuf, 1024 ) > 0 )
726cdf0e10cSrcweir 				{
727cdf0e10cSrcweir 				  if (  unlink(aLocalFilename.GetBuffer())  == 0 )
728cdf0e10cSrcweir 		  		    {
729cdf0e10cSrcweir #ifdef DBG_UTIL
730cdf0e10cSrcweir 					  fprintf( stderr,
731cdf0e10cSrcweir 							   "Copying file on symbolic link (%s).\n",
732cdf0e10cSrcweir 							   aLocalFilename.GetBuffer() );
733cdf0e10cSrcweir #endif
734cdf0e10cSrcweir 					  String aTmpString( pBuf, osl_getThreadTextEncoding() );
735cdf0e10cSrcweir 					  const DirEntry aSourceEntry( aTmpString );
736cdf0e10cSrcweir 					  const DirEntry aTargetEntry( aFilename );
737cdf0e10cSrcweir 					  FileCopier aFileCopier( aSourceEntry, aTargetEntry );
738cdf0e10cSrcweir 					  aFileCopier.Execute();
739cdf0e10cSrcweir 					}
740cdf0e10cSrcweir 				}
741cdf0e10cSrcweir 			  delete [] pBuf;
742cdf0e10cSrcweir 			}
743cdf0e10cSrcweir 		}
744cdf0e10cSrcweir 	}
745cdf0e10cSrcweir 
746cdf0e10cSrcweir 
747cdf0e10cSrcweir 	nHandleTmp = open(aLocalFilename.GetBuffer(),nAccessRW|nAccess, nMode );
748cdf0e10cSrcweir 
749cdf0e10cSrcweir     if ( nHandleTmp == -1 )
750cdf0e10cSrcweir     {
751cdf0e10cSrcweir         if ( nAccessRW != O_RDONLY )
752cdf0e10cSrcweir         {
753cdf0e10cSrcweir             // auf Lesen runterschalten
754cdf0e10cSrcweir             nAccessRW = O_RDONLY;
755cdf0e10cSrcweir             nAccess = 0;
756cdf0e10cSrcweir             nMode = S_IREAD | S_IROTH | S_IRGRP;
757cdf0e10cSrcweir             nHandleTmp =open( aLocalFilename.GetBuffer(),
758cdf0e10cSrcweir                               nAccessRW|nAccess,
759cdf0e10cSrcweir                               nMode );
760cdf0e10cSrcweir 	        }
761cdf0e10cSrcweir     }
762cdf0e10cSrcweir     if ( nHandleTmp != -1 )
763cdf0e10cSrcweir     {
764cdf0e10cSrcweir         pInstanceData->nHandle = nHandleTmp;
765cdf0e10cSrcweir         bIsOpen = sal_True;
766cdf0e10cSrcweir         if ( nAccessRW != O_RDONLY )
767cdf0e10cSrcweir             bIsWritable = sal_True;
768cdf0e10cSrcweir 
769cdf0e10cSrcweir         if ( !LockFile() ) // ganze Datei
770cdf0e10cSrcweir         {
771cdf0e10cSrcweir 			close( nHandleTmp );
772cdf0e10cSrcweir             bIsOpen = sal_False;
773cdf0e10cSrcweir             bIsWritable = sal_False;
774cdf0e10cSrcweir             pInstanceData->nHandle = 0;
775cdf0e10cSrcweir         }
776cdf0e10cSrcweir     }
777cdf0e10cSrcweir     else
778cdf0e10cSrcweir         SetError( ::GetSvError( errno ) );
779cdf0e10cSrcweir }
780cdf0e10cSrcweir 
781cdf0e10cSrcweir /*************************************************************************
782cdf0e10cSrcweir |*
783cdf0e10cSrcweir |*    SvFileStream::ReOpen()
784cdf0e10cSrcweir |*
785cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
786cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
787cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
788cdf0e10cSrcweir |*
789cdf0e10cSrcweir *************************************************************************/
790cdf0e10cSrcweir 
ReOpen()791cdf0e10cSrcweir void SvFileStream::ReOpen()
792cdf0e10cSrcweir {
793cdf0e10cSrcweir     if ( !bIsOpen && aFilename.Len() )
794cdf0e10cSrcweir         Open( aFilename, eStreamMode );
795cdf0e10cSrcweir }
796cdf0e10cSrcweir 
797cdf0e10cSrcweir /*************************************************************************
798cdf0e10cSrcweir |*
799cdf0e10cSrcweir |*    SvFileStream::Close()
800cdf0e10cSrcweir |*
801cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
802cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
803cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
804cdf0e10cSrcweir |*
805cdf0e10cSrcweir *************************************************************************/
806cdf0e10cSrcweir 
Close()807cdf0e10cSrcweir void SvFileStream::Close()
808cdf0e10cSrcweir {
809cdf0e10cSrcweir 	InternalStreamLock::UnlockFile( 0, 0, this );
810cdf0e10cSrcweir 
811cdf0e10cSrcweir   if ( IsOpen() )
812cdf0e10cSrcweir     {
813cdf0e10cSrcweir #ifdef DBG_UTIL
814cdf0e10cSrcweir         ByteString aTraceStr( "SvFileStream::Close(): " );
815cdf0e10cSrcweir         aTraceStr += ByteString(aFilename, osl_getThreadTextEncoding());
816cdf0e10cSrcweir         DBG_TRACE( aTraceStr.GetBuffer() );
817cdf0e10cSrcweir #endif
818cdf0e10cSrcweir 
819cdf0e10cSrcweir         Flush();
820cdf0e10cSrcweir         close( pInstanceData->nHandle );
821cdf0e10cSrcweir         pInstanceData->nHandle = 0;
822cdf0e10cSrcweir     }
823cdf0e10cSrcweir 
824cdf0e10cSrcweir     bIsOpen     = sal_False;
825cdf0e10cSrcweir     bIsWritable = sal_False;
826cdf0e10cSrcweir     SvStream::ClearBuffer();
827cdf0e10cSrcweir     SvStream::ClearError();
828cdf0e10cSrcweir }
829cdf0e10cSrcweir 
830cdf0e10cSrcweir /*************************************************************************
831cdf0e10cSrcweir |*
832cdf0e10cSrcweir |*    SvFileStream::ResetError()
833cdf0e10cSrcweir |*
834cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW; Setzt Filepointer auf Dateianfang
835cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
836cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
837cdf0e10cSrcweir |*
838cdf0e10cSrcweir *************************************************************************/
839cdf0e10cSrcweir 
ResetError()840cdf0e10cSrcweir void SvFileStream::ResetError()
841cdf0e10cSrcweir {
842cdf0e10cSrcweir     SvStream::ClearError();
843cdf0e10cSrcweir }
844cdf0e10cSrcweir 
845cdf0e10cSrcweir 
846cdf0e10cSrcweir /*************************************************************************
847cdf0e10cSrcweir |*
848cdf0e10cSrcweir |*    SvFileStream::SetSize()
849cdf0e10cSrcweir |*
850cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW;
851cdf0e10cSrcweir |*    Ersterstellung    OV 15.06.94
852cdf0e10cSrcweir |*    Letzte Aenderung  OV 15.06.94
853cdf0e10cSrcweir |*
854cdf0e10cSrcweir *************************************************************************/
855cdf0e10cSrcweir 
SetSize(sal_Size nSize)856cdf0e10cSrcweir void SvFileStream::SetSize (sal_Size nSize)
857cdf0e10cSrcweir {
858cdf0e10cSrcweir 	if (IsOpen())
859cdf0e10cSrcweir     {
860cdf0e10cSrcweir 		int fd = pInstanceData->nHandle;
861cdf0e10cSrcweir 		if (::ftruncate (fd, (off_t)nSize) < 0)
862cdf0e10cSrcweir 		{
863cdf0e10cSrcweir 			// Save original error.
864cdf0e10cSrcweir 			sal_uInt32 nErr = ::GetSvError (errno);
865cdf0e10cSrcweir 
866cdf0e10cSrcweir 			// Check against current size. Fail upon 'shrink'.
867cdf0e10cSrcweir 			struct stat aStat;
868cdf0e10cSrcweir 			if (::fstat (fd, &aStat) < 0)
869cdf0e10cSrcweir 			{
870cdf0e10cSrcweir 				SetError (nErr);
871cdf0e10cSrcweir 				return;
872cdf0e10cSrcweir 			}
873cdf0e10cSrcweir 			if ((sal::static_int_cast< sal_sSize >(nSize) <= aStat.st_size))
874cdf0e10cSrcweir 			{
875cdf0e10cSrcweir 				// Failure upon 'shrink'. Return original error.
876cdf0e10cSrcweir 				SetError (nErr);
877cdf0e10cSrcweir 				return;
878cdf0e10cSrcweir 			}
879cdf0e10cSrcweir 
880cdf0e10cSrcweir 			// Save current position.
881cdf0e10cSrcweir 			sal_Size nCurPos = (sal_Size)::lseek (fd, (off_t)0, SEEK_CUR);
882cdf0e10cSrcweir 			if (nCurPos == (sal_Size)(-1))
883cdf0e10cSrcweir 			{
884cdf0e10cSrcweir 				SetError (nErr);
885cdf0e10cSrcweir 				return;
886cdf0e10cSrcweir 			}
887cdf0e10cSrcweir 
888cdf0e10cSrcweir 			// Try 'expand' via 'lseek()' and 'write()'.
889cdf0e10cSrcweir 			if (::lseek (fd, (off_t)(nSize - 1), SEEK_SET) < 0)
890cdf0e10cSrcweir 			{
891cdf0e10cSrcweir 				SetError (nErr);
892cdf0e10cSrcweir 				return;
893cdf0e10cSrcweir 			}
894cdf0e10cSrcweir 			if (::write (fd, (char*)"", (size_t)1) < 0)
895cdf0e10cSrcweir 			{
896cdf0e10cSrcweir 				// Failure. Restore saved position.
897cdf0e10cSrcweir 				if (::lseek (fd, (off_t)nCurPos, SEEK_SET) < 0)
898cdf0e10cSrcweir 				{
899cdf0e10cSrcweir 					// Double failure.
900cdf0e10cSrcweir 				}
901cdf0e10cSrcweir 
902cdf0e10cSrcweir 				SetError (nErr);
903cdf0e10cSrcweir 				return;
904cdf0e10cSrcweir 			}
905cdf0e10cSrcweir 
906cdf0e10cSrcweir 			// Success. Restore saved position.
907cdf0e10cSrcweir 			if (::lseek (fd, (off_t)nCurPos, SEEK_SET) < 0)
908cdf0e10cSrcweir 			{
909cdf0e10cSrcweir 				SetError (nErr);
910cdf0e10cSrcweir 				return;
911cdf0e10cSrcweir 			}
912cdf0e10cSrcweir 		}
913cdf0e10cSrcweir     }
914cdf0e10cSrcweir }
915cdf0e10cSrcweir 
916cdf0e10cSrcweir 
917