xref: /aoo41x/main/sal/osl/unx/file_volume.cxx (revision 38fa8b40)
187d2adbcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
387d2adbcSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
487d2adbcSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
587d2adbcSAndrew Rist  * distributed with this work for additional information
687d2adbcSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
787d2adbcSAndrew Rist  * to you under the Apache License, Version 2.0 (the
887d2adbcSAndrew Rist  * "License"); you may not use this file except in compliance
987d2adbcSAndrew Rist  * with the License.  You may obtain a copy of the License at
1087d2adbcSAndrew Rist  *
1187d2adbcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1287d2adbcSAndrew Rist  *
1387d2adbcSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1487d2adbcSAndrew Rist  * software distributed under the License is distributed on an
1587d2adbcSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1687d2adbcSAndrew Rist  * KIND, either express or implied.  See the License for the
1787d2adbcSAndrew Rist  * specific language governing permissions and limitations
1887d2adbcSAndrew Rist  * under the License.
1987d2adbcSAndrew Rist  *
2087d2adbcSAndrew Rist  *************************************************************/
2187d2adbcSAndrew Rist 
2287d2adbcSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "osl/file.h"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "osl/diagnose.h"
27cdf0e10cSrcweir #include "osl/thread.h"
28cdf0e10cSrcweir #include "rtl/alloc.h"
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include "file_error_transl.h"
31cdf0e10cSrcweir #include "file_url.h"
32cdf0e10cSrcweir #include "system.h"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <errno.h>
35cdf0e10cSrcweir #include <limits.h>
36cdf0e10cSrcweir #include <stdio.h>
37cdf0e10cSrcweir #include <string.h>
38cdf0e10cSrcweir #include <unistd.h>
39cdf0e10cSrcweir #include <sys/wait.h>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #ifdef HAVE_STATFS_H
42cdf0e10cSrcweir #undef HAVE_STATFS_H
43cdf0e10cSrcweir #endif
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #if defined(LINUX) && defined(__FreeBSD_kernel__)
46cdf0e10cSrcweir #undef LINUX
47cdf0e10cSrcweir #define FREEBSD 1
48cdf0e10cSrcweir #endif
49cdf0e10cSrcweir 
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #if defined(SOLARIS)
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #include <sys/mnttab.h>
54cdf0e10cSrcweir #include <sys/statvfs.h>
55cdf0e10cSrcweir #define  HAVE_STATFS_H
56cdf0e10cSrcweir #include <sys/fs/ufs_quota.h>
57cdf0e10cSrcweir static const sal_Char* MOUNTTAB="/etc/mnttab";
58cdf0e10cSrcweir 
59cdf0e10cSrcweir #elif defined(LINUX)
60cdf0e10cSrcweir 
61cdf0e10cSrcweir #include <mntent.h>
62cdf0e10cSrcweir #include <sys/vfs.h>
63cdf0e10cSrcweir #define  HAVE_STATFS_H
64cdf0e10cSrcweir #include <sys/quota.h>
65cdf0e10cSrcweir //#include <ctype.h>
66cdf0e10cSrcweir static const sal_Char* MOUNTTAB="/etc/mtab";
67cdf0e10cSrcweir 
68cdf0e10cSrcweir #elif defined(NETBSD) || defined(FREEBSD)
69cdf0e10cSrcweir 
70cdf0e10cSrcweir #include <sys/param.h>
71cdf0e10cSrcweir #include <sys/ucred.h>
72cdf0e10cSrcweir #include <sys/mount.h>
73cdf0e10cSrcweir #include <ufs/ufs/quota.h>
74cdf0e10cSrcweir //#include <ctype.h>
75cdf0e10cSrcweir #define  HAVE_STATFS_H
76cdf0e10cSrcweir 
77cdf0e10cSrcweir /* No mounting table on *BSD
78cdf0e10cSrcweir  * This information is stored only in the kernel. */
79cdf0e10cSrcweir /* static const sal_Char* MOUNTTAB="/etc/mtab"; */
80cdf0e10cSrcweir 
81cdf0e10cSrcweir #elif defined(MACOSX)
82cdf0e10cSrcweir 
83*38fa8b40SHerbert Dürr #include <sys/quota.h>
84cdf0e10cSrcweir #include <sys/param.h>
85cdf0e10cSrcweir #include <sys/mount.h>
86cdf0e10cSrcweir #define HAVE_STATFS_H
87cdf0e10cSrcweir // static const sal_Char* MOUNTTAB="/etc/mtab";
88cdf0e10cSrcweir 
89cdf0e10cSrcweir #endif /* HAVE_STATFS_H */
90cdf0e10cSrcweir 
91cdf0e10cSrcweir /************************************************************************
92cdf0e10cSrcweir  *   ToDo
93cdf0e10cSrcweir  *
94cdf0e10cSrcweir  *   - Fix: check for corresponding struct sizes in exported functions
95cdf0e10cSrcweir  *   - check size/use of oslVolumeDeviceHandle
96cdf0e10cSrcweir  *   - check size/use of oslVolumeInfo
97cdf0e10cSrcweir  ***********************************************************************/
98cdf0e10cSrcweir /******************************************************************************
99cdf0e10cSrcweir  *
100cdf0e10cSrcweir  *                  Data Type Definition
101cdf0e10cSrcweir  *
102cdf0e10cSrcweir  ******************************************************************************/
103cdf0e10cSrcweir 
104cdf0e10cSrcweir typedef struct _oslVolumeDeviceHandleImpl
105cdf0e10cSrcweir {
106cdf0e10cSrcweir     sal_Char pszMountPoint[PATH_MAX];
107cdf0e10cSrcweir     sal_Char pszFilePath[PATH_MAX];
108cdf0e10cSrcweir     sal_Char pszDevice[PATH_MAX];
109cdf0e10cSrcweir     sal_Char ident[4];
110cdf0e10cSrcweir     sal_uInt32   RefCount;
111cdf0e10cSrcweir } oslVolumeDeviceHandleImpl;
112cdf0e10cSrcweir 
113cdf0e10cSrcweir /******************************************************************************
114cdf0e10cSrcweir  *
115cdf0e10cSrcweir  *                  'removeable device' aka floppy functions
116cdf0e10cSrcweir  *
117cdf0e10cSrcweir  *****************************************************************************/
118cdf0e10cSrcweir 
119cdf0e10cSrcweir static oslVolumeDeviceHandle  osl_isFloppyDrive(const sal_Char* pszPath);
120cdf0e10cSrcweir static oslFileError   osl_mountFloppy(oslVolumeDeviceHandle hFloppy);
121cdf0e10cSrcweir static oslFileError   osl_unmountFloppy(oslVolumeDeviceHandle hFloppy);
122cdf0e10cSrcweir 
123cdf0e10cSrcweir #if defined(SOLARIS)
124cdf0e10cSrcweir static sal_Bool       osl_isFloppyMounted(sal_Char* pszPath, sal_Char* pszMountPath);
125cdf0e10cSrcweir static sal_Bool       osl_getFloppyMountEntry(const sal_Char* pszPath, sal_Char* pBuffer);
126cdf0e10cSrcweir static sal_Bool       osl_checkFloppyPath(sal_Char* pszPath, sal_Char* pszFilePath, sal_Char* pszDevicePath);
127cdf0e10cSrcweir #endif /* SOLARIS */
128cdf0e10cSrcweir 
129cdf0e10cSrcweir #if defined(LINUX)
130cdf0e10cSrcweir static sal_Bool       osl_isFloppyMounted(oslVolumeDeviceHandleImpl* pDevice);
131cdf0e10cSrcweir static sal_Bool       osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem);
132cdf0e10cSrcweir #endif /* LINUX */
133cdf0e10cSrcweir 
134cdf0e10cSrcweir #ifdef DEBUG_OSL_FILE
135cdf0e10cSrcweir static void           osl_printFloppyHandle(oslVolumeDeviceHandleImpl* hFloppy);
136cdf0e10cSrcweir #endif /* DEBUG_OSL_FILE */
137cdf0e10cSrcweir 
138cdf0e10cSrcweir /******************************************************************************
139cdf0e10cSrcweir  *
140cdf0e10cSrcweir  *                  C-String Function Declarations
141cdf0e10cSrcweir  *
142cdf0e10cSrcweir  *****************************************************************************/
143cdf0e10cSrcweir 
144cdf0e10cSrcweir static oslFileError osl_psz_getVolumeInformation(const sal_Char* , oslVolumeInfo* pInfo, sal_uInt32 uFieldMask);
145cdf0e10cSrcweir 
146cdf0e10cSrcweir /****************************************************************************/
147cdf0e10cSrcweir /*	osl_getVolumeInformation */
148cdf0e10cSrcweir /****************************************************************************/
149cdf0e10cSrcweir 
osl_getVolumeInformation(rtl_uString * ustrDirectoryURL,oslVolumeInfo * pInfo,sal_uInt32 uFieldMask)150cdf0e10cSrcweir oslFileError osl_getVolumeInformation( rtl_uString* ustrDirectoryURL, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir     char path[PATH_MAX];
153cdf0e10cSrcweir     oslFileError eRet;
154cdf0e10cSrcweir 
155cdf0e10cSrcweir     OSL_ASSERT( ustrDirectoryURL );
156cdf0e10cSrcweir     OSL_ASSERT( pInfo );
157cdf0e10cSrcweir 
158cdf0e10cSrcweir     /* convert directory url to system path */
159cdf0e10cSrcweir     eRet = FileURLToPath( path, PATH_MAX, ustrDirectoryURL );
160cdf0e10cSrcweir     if( eRet != osl_File_E_None )
161cdf0e10cSrcweir         return eRet;
162cdf0e10cSrcweir 
163cdf0e10cSrcweir #ifdef MACOSX
164cdf0e10cSrcweir     if ( macxp_resolveAlias( path, PATH_MAX ) != 0 )
165cdf0e10cSrcweir       return oslTranslateFileError( OSL_FET_ERROR, errno );
166cdf0e10cSrcweir #endif/* MACOSX */
167cdf0e10cSrcweir 
168cdf0e10cSrcweir     return osl_psz_getVolumeInformation( path, pInfo, uFieldMask);
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir /******************************************************************************
172cdf0e10cSrcweir  *
173cdf0e10cSrcweir  *                  C-String Versions of Exported Module Functions
174cdf0e10cSrcweir  *
175cdf0e10cSrcweir  *****************************************************************************/
176cdf0e10cSrcweir 
177cdf0e10cSrcweir #ifdef HAVE_STATFS_H
178cdf0e10cSrcweir 
179cdf0e10cSrcweir #if defined(FREEBSD) || defined(NETBSD) || defined(MACOSX)
180cdf0e10cSrcweir #   define __OSL_STATFS_STRUCT      			struct statfs
181cdf0e10cSrcweir #   define __OSL_STATFS(dir, sfs)   			statfs((dir), (sfs))
182cdf0e10cSrcweir #   define __OSL_STATFS_BLKSIZ(a)   			((sal_uInt64)((a).f_bsize))
183cdf0e10cSrcweir #   define __OSL_STATFS_TYPENAME(a) 			((a).f_fstypename)
184cdf0e10cSrcweir #   define __OSL_STATFS_ISREMOTE(a) 			(((a).f_type & MNT_LOCAL) == 0)
185cdf0e10cSrcweir 
186cdf0e10cSrcweir /* always return true if queried for the properties of
187cdf0e10cSrcweir    the file system. If you think this is wrong under any
188cdf0e10cSrcweir    of the target platforms fix it!!!! */
189cdf0e10cSrcweir #	define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a)	 (1)
190cdf0e10cSrcweir #	define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1)
191cdf0e10cSrcweir #endif /* FREEBSD || NETBSD || MACOSX */
192cdf0e10cSrcweir 
193cdf0e10cSrcweir #if defined(LINUX)
194cdf0e10cSrcweir #	define __OSL_NFS_SUPER_MAGIC				 0x6969
195cdf0e10cSrcweir #	define __OSL_SMB_SUPER_MAGIC				 0x517B
196cdf0e10cSrcweir #	define __OSL_MSDOS_SUPER_MAGIC  			 0x4d44
197cdf0e10cSrcweir #	define __OSL_NTFS_SUPER_MAGIC				 0x5346544e
198cdf0e10cSrcweir #   define __OSL_STATFS_STRUCT       		     struct statfs
199cdf0e10cSrcweir #   define __OSL_STATFS(dir, sfs)    			 statfs((dir), (sfs))
200cdf0e10cSrcweir #   define __OSL_STATFS_BLKSIZ(a)    			 ((sal_uInt64)((a).f_bsize))
201cdf0e10cSrcweir #   define __OSL_STATFS_IS_NFS(a)     			 (__OSL_NFS_SUPER_MAGIC == (a).f_type)
202cdf0e10cSrcweir #   define __OSL_STATFS_IS_SMB(a)     			 (__OSL_SMB_SUPER_MAGIC == (a).f_type)
203cdf0e10cSrcweir #   define __OSL_STATFS_ISREMOTE(a)  			 (__OSL_STATFS_IS_NFS((a)) || __OSL_STATFS_IS_SMB((a)))
204cdf0e10cSrcweir #	define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a)  ((__OSL_MSDOS_SUPER_MAGIC != (a).f_type) && (__OSL_NTFS_SUPER_MAGIC != (a).f_type))
205cdf0e10cSrcweir #	define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) ((__OSL_MSDOS_SUPER_MAGIC != (a).f_type))
206cdf0e10cSrcweir #endif /* LINUX */
207cdf0e10cSrcweir 
208cdf0e10cSrcweir #if defined(SOLARIS)
209cdf0e10cSrcweir #   define __OSL_STATFS_STRUCT          		 struct statvfs
210cdf0e10cSrcweir #   define __OSL_STATFS(dir, sfs)	    		 statvfs((dir), (sfs))
211cdf0e10cSrcweir #   define __OSL_STATFS_BLKSIZ(a)       		 ((sal_uInt64)((a).f_frsize))
212cdf0e10cSrcweir #   define __OSL_STATFS_TYPENAME(a)     		 ((a).f_basetype)
213cdf0e10cSrcweir #   define __OSL_STATFS_ISREMOTE(a)     		 (rtl_str_compare((a).f_basetype, "nfs") == 0)
214cdf0e10cSrcweir 
215cdf0e10cSrcweir /* always return true if queried for the properties of
216cdf0e10cSrcweir    the file system. If you think this is wrong under any
217cdf0e10cSrcweir    of the target platforms fix it!!!! */
218cdf0e10cSrcweir #	define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a)	 (1)
219cdf0e10cSrcweir #	define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1)
220cdf0e10cSrcweir #endif /* SOLARIS */
221cdf0e10cSrcweir 
222cdf0e10cSrcweir #   define __OSL_STATFS_INIT(a) 	    (memset(&(a), 0, sizeof(__OSL_STATFS_STRUCT)))
223cdf0e10cSrcweir 
224cdf0e10cSrcweir #else /* no statfs available */
225cdf0e10cSrcweir 
226cdf0e10cSrcweir #   define __OSL_STATFS_STRUCT        			 struct dummy {int i;}
227cdf0e10cSrcweir #   define __OSL_STATFS_INIT(a)       			 ((void)0)
228cdf0e10cSrcweir #   define __OSL_STATFS(dir, sfs)     		     (1)
229cdf0e10cSrcweir #   define __OSL_STATFS_ISREMOTE(sfs) 			 (0)
230cdf0e10cSrcweir #	define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a)	 (1)
231cdf0e10cSrcweir #	define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1)
232cdf0e10cSrcweir #endif /* HAVE_STATFS_H */
233cdf0e10cSrcweir 
234cdf0e10cSrcweir 
osl_psz_getVolumeInformation(const sal_Char * pszDirectory,oslVolumeInfo * pInfo,sal_uInt32 uFieldMask)235cdf0e10cSrcweir static oslFileError osl_psz_getVolumeInformation (
236cdf0e10cSrcweir 	const sal_Char* pszDirectory, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask)
237cdf0e10cSrcweir {
238cdf0e10cSrcweir     __OSL_STATFS_STRUCT sfs;
239cdf0e10cSrcweir 
240cdf0e10cSrcweir     if (!pInfo)
241cdf0e10cSrcweir         return osl_File_E_INVAL;
242cdf0e10cSrcweir 
243cdf0e10cSrcweir     __OSL_STATFS_INIT(sfs);
244cdf0e10cSrcweir 
245cdf0e10cSrcweir     pInfo->uValidFields = 0;
246cdf0e10cSrcweir     pInfo->uAttributes  = 0;
247cdf0e10cSrcweir 
248cdf0e10cSrcweir 	if ((__OSL_STATFS(pszDirectory, &sfs)) < 0)
249cdf0e10cSrcweir 	{
250cdf0e10cSrcweir 		oslFileError result = oslTranslateFileError(OSL_FET_ERROR, errno);
251cdf0e10cSrcweir 		return (result);
252cdf0e10cSrcweir 	}
253cdf0e10cSrcweir 
254cdf0e10cSrcweir     /* FIXME: how to detect the kind of storage (fixed, cdrom, ...) */
255cdf0e10cSrcweir 	if (uFieldMask & osl_VolumeInfo_Mask_Attributes)
256cdf0e10cSrcweir 	{
257cdf0e10cSrcweir 	    if (__OSL_STATFS_ISREMOTE(sfs))
258cdf0e10cSrcweir 			pInfo->uAttributes  |= osl_Volume_Attribute_Remote;
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 		pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
261cdf0e10cSrcweir 	}
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 	if (uFieldMask & osl_VolumeInfo_Mask_FileSystemCaseHandling)
264cdf0e10cSrcweir 	{
265cdf0e10cSrcweir 		if (__OSL_STATFS_IS_CASE_SENSITIVE_FS(sfs))
266cdf0e10cSrcweir 			pInfo->uAttributes |= osl_Volume_Attribute_Case_Sensitive;
267cdf0e10cSrcweir 
268cdf0e10cSrcweir 		if (__OSL_STATFS_IS_CASE_PRESERVING_FS(sfs))
269cdf0e10cSrcweir 			pInfo->uAttributes |= osl_Volume_Attribute_Case_Is_Preserved;
270cdf0e10cSrcweir 
271cdf0e10cSrcweir 		pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
272cdf0e10cSrcweir 	}
273cdf0e10cSrcweir 
274cdf0e10cSrcweir 	pInfo->uTotalSpace = 0;
275cdf0e10cSrcweir     pInfo->uFreeSpace  = 0;
276cdf0e10cSrcweir     pInfo->uUsedSpace  = 0;
277cdf0e10cSrcweir 
278cdf0e10cSrcweir #if defined(__OSL_STATFS_BLKSIZ)
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 	if ((uFieldMask & osl_VolumeInfo_Mask_TotalSpace) ||
281cdf0e10cSrcweir 		(uFieldMask & osl_VolumeInfo_Mask_UsedSpace))
282cdf0e10cSrcweir 	{
283cdf0e10cSrcweir 		pInfo->uTotalSpace   = __OSL_STATFS_BLKSIZ(sfs);
284cdf0e10cSrcweir 		pInfo->uTotalSpace  *= (sal_uInt64)(sfs.f_blocks);
285cdf0e10cSrcweir 		pInfo->uValidFields |= osl_VolumeInfo_Mask_TotalSpace;
286cdf0e10cSrcweir 	}
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 	if ((uFieldMask & osl_VolumeInfo_Mask_FreeSpace) ||
289cdf0e10cSrcweir 		(uFieldMask & osl_VolumeInfo_Mask_UsedSpace))
290cdf0e10cSrcweir 	{
291cdf0e10cSrcweir 		pInfo->uFreeSpace = __OSL_STATFS_BLKSIZ(sfs);
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 		if (getuid() == 0)
294cdf0e10cSrcweir 			pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bfree);
295cdf0e10cSrcweir 		else
296cdf0e10cSrcweir 			pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bavail);
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 		pInfo->uValidFields |= osl_VolumeInfo_Mask_FreeSpace;
299cdf0e10cSrcweir 	}
300cdf0e10cSrcweir 
301cdf0e10cSrcweir #endif  /* __OSL_STATFS_BLKSIZ */
302cdf0e10cSrcweir 
303cdf0e10cSrcweir 	if ((pInfo->uValidFields & osl_VolumeInfo_Mask_TotalSpace) &&
304cdf0e10cSrcweir 		(pInfo->uValidFields & osl_VolumeInfo_Mask_FreeSpace ))
305cdf0e10cSrcweir 	{
306cdf0e10cSrcweir 		pInfo->uUsedSpace    = pInfo->uTotalSpace - pInfo->uFreeSpace;
307cdf0e10cSrcweir 		pInfo->uValidFields |= osl_VolumeInfo_Mask_UsedSpace;
308cdf0e10cSrcweir 	}
309cdf0e10cSrcweir 
310cdf0e10cSrcweir 	pInfo->uMaxNameLength = 0;
311cdf0e10cSrcweir 	if (uFieldMask & osl_VolumeInfo_Mask_MaxNameLength)
312cdf0e10cSrcweir 	{
313cdf0e10cSrcweir 		long nLen = pathconf(pszDirectory, _PC_NAME_MAX);
314cdf0e10cSrcweir 		if (nLen > 0)
315cdf0e10cSrcweir 		{
316cdf0e10cSrcweir 			pInfo->uMaxNameLength = (sal_uInt32)nLen;
317cdf0e10cSrcweir 			pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxNameLength;
318cdf0e10cSrcweir 		}
319cdf0e10cSrcweir 	}
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 	pInfo->uMaxPathLength = 0;
322cdf0e10cSrcweir 	if (uFieldMask & osl_VolumeInfo_Mask_MaxPathLength)
323cdf0e10cSrcweir 	{
324cdf0e10cSrcweir 		long nLen = pathconf (pszDirectory, _PC_PATH_MAX);
325cdf0e10cSrcweir 		if (nLen > 0)
326cdf0e10cSrcweir 		{
327cdf0e10cSrcweir 			pInfo->uMaxPathLength  = (sal_uInt32)nLen;
328cdf0e10cSrcweir 			pInfo->uValidFields   |= osl_VolumeInfo_Mask_MaxPathLength;
329cdf0e10cSrcweir 		}
330cdf0e10cSrcweir 	}
331cdf0e10cSrcweir 
332cdf0e10cSrcweir #if defined(__OSL_STATFS_TYPENAME)
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 	if (uFieldMask & osl_VolumeInfo_Mask_FileSystemName)
335cdf0e10cSrcweir 	{
336cdf0e10cSrcweir     	rtl_string2UString(
337cdf0e10cSrcweir         	&(pInfo->ustrFileSystemName),
338cdf0e10cSrcweir         	__OSL_STATFS_TYPENAME(sfs),
339cdf0e10cSrcweir         	rtl_str_getLength(__OSL_STATFS_TYPENAME(sfs)),
340cdf0e10cSrcweir         	osl_getThreadTextEncoding(),
341cdf0e10cSrcweir         	OUSTRING_TO_OSTRING_CVTFLAGS);
342cdf0e10cSrcweir         OSL_ASSERT(pInfo->ustrFileSystemName != 0);
343cdf0e10cSrcweir 
344cdf0e10cSrcweir 		pInfo->uValidFields |= osl_VolumeInfo_Mask_FileSystemName;
345cdf0e10cSrcweir 	}
346cdf0e10cSrcweir 
347cdf0e10cSrcweir #endif /* __OSL_STATFS_TYPENAME */
348cdf0e10cSrcweir 
349cdf0e10cSrcweir     if (uFieldMask & osl_VolumeInfo_Mask_DeviceHandle)
350cdf0e10cSrcweir     {
351cdf0e10cSrcweir         /* FIXME: check also entries in mntent for the device
352cdf0e10cSrcweir 		   and fill it with correct values */
353cdf0e10cSrcweir 
354cdf0e10cSrcweir         *pInfo->pDeviceHandle = osl_isFloppyDrive(pszDirectory);
355cdf0e10cSrcweir 
356cdf0e10cSrcweir         if (*pInfo->pDeviceHandle)
357cdf0e10cSrcweir         {
358cdf0e10cSrcweir             pInfo->uValidFields |= osl_VolumeInfo_Mask_DeviceHandle;
359cdf0e10cSrcweir             pInfo->uAttributes  |= osl_Volume_Attribute_Removeable;
360cdf0e10cSrcweir 			pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
361cdf0e10cSrcweir         }
362cdf0e10cSrcweir     }
363cdf0e10cSrcweir     return osl_File_E_None;
364cdf0e10cSrcweir }
365cdf0e10cSrcweir 
366cdf0e10cSrcweir /******************************************************************************
367cdf0e10cSrcweir  *
368cdf0e10cSrcweir  *                  GENERIC FLOPPY FUNCTIONS
369cdf0e10cSrcweir  *
370cdf0e10cSrcweir  *****************************************************************************/
371cdf0e10cSrcweir 
372cdf0e10cSrcweir 
373cdf0e10cSrcweir /*****************************************
374cdf0e10cSrcweir  * osl_unmountVolumeDevice
375cdf0e10cSrcweir  ****************************************/
376cdf0e10cSrcweir 
osl_unmountVolumeDevice(oslVolumeDeviceHandle Handle)377cdf0e10cSrcweir oslFileError osl_unmountVolumeDevice( oslVolumeDeviceHandle Handle )
378cdf0e10cSrcweir {
379cdf0e10cSrcweir     oslFileError tErr = osl_File_E_NOSYS;
380cdf0e10cSrcweir 
381cdf0e10cSrcweir     tErr = osl_unmountFloppy(Handle);
382cdf0e10cSrcweir 
383cdf0e10cSrcweir  	/* Perhaps current working directory is set to mount point */
384cdf0e10cSrcweir 
385cdf0e10cSrcweir  	if ( tErr )
386cdf0e10cSrcweir 	{
387cdf0e10cSrcweir 		sal_Char *pszHomeDir = getenv("HOME");
388cdf0e10cSrcweir 
389cdf0e10cSrcweir 		if ( pszHomeDir && strlen( pszHomeDir ) && 0 == chdir( pszHomeDir ) )
390cdf0e10cSrcweir 		{
391cdf0e10cSrcweir 			/* try again */
392cdf0e10cSrcweir 
393cdf0e10cSrcweir     		tErr = osl_unmountFloppy(Handle);
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 			OSL_ENSURE( tErr, "osl_unmountvolumeDevice: CWD was set to volume mount point" );
396cdf0e10cSrcweir 		}
397cdf0e10cSrcweir 	}
398cdf0e10cSrcweir 
399cdf0e10cSrcweir     return tErr;
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
402cdf0e10cSrcweir /*****************************************
403cdf0e10cSrcweir  * osl_automountVolumeDevice
404cdf0e10cSrcweir  ****************************************/
405cdf0e10cSrcweir 
osl_automountVolumeDevice(oslVolumeDeviceHandle Handle)406cdf0e10cSrcweir oslFileError osl_automountVolumeDevice( oslVolumeDeviceHandle Handle )
407cdf0e10cSrcweir {
408cdf0e10cSrcweir     oslFileError tErr = osl_File_E_NOSYS;
409cdf0e10cSrcweir 
410cdf0e10cSrcweir     tErr = osl_mountFloppy(Handle);
411cdf0e10cSrcweir 
412cdf0e10cSrcweir     return tErr;
413cdf0e10cSrcweir }
414cdf0e10cSrcweir 
415cdf0e10cSrcweir /*****************************************
416cdf0e10cSrcweir  * osl_getVolumeDeviceMountPath
417cdf0e10cSrcweir  ****************************************/
oslMakeUStrFromPsz(const sal_Char * pszStr,rtl_uString ** ustrValid)418cdf0e10cSrcweir static rtl_uString* oslMakeUStrFromPsz(const sal_Char* pszStr, rtl_uString** ustrValid)
419cdf0e10cSrcweir {
420cdf0e10cSrcweir     rtl_string2UString(
421cdf0e10cSrcweir         ustrValid,
422cdf0e10cSrcweir         pszStr,
423cdf0e10cSrcweir         rtl_str_getLength( pszStr ),
424cdf0e10cSrcweir         osl_getThreadTextEncoding(),
425cdf0e10cSrcweir         OUSTRING_TO_OSTRING_CVTFLAGS );
426cdf0e10cSrcweir     OSL_ASSERT(*ustrValid != 0);
427cdf0e10cSrcweir 
428cdf0e10cSrcweir     return *ustrValid;
429cdf0e10cSrcweir }
430cdf0e10cSrcweir 
osl_getVolumeDeviceMountPath(oslVolumeDeviceHandle Handle,rtl_uString ** pstrPath)431cdf0e10cSrcweir oslFileError osl_getVolumeDeviceMountPath( oslVolumeDeviceHandle Handle, rtl_uString **pstrPath )
432cdf0e10cSrcweir {
433cdf0e10cSrcweir     oslVolumeDeviceHandleImpl* pItem = (oslVolumeDeviceHandleImpl*) Handle;
434cdf0e10cSrcweir     sal_Char Buffer[PATH_MAX];
435cdf0e10cSrcweir 
436cdf0e10cSrcweir     Buffer[0] = '\0';
437cdf0e10cSrcweir 
438cdf0e10cSrcweir     if ( pItem == 0 || pstrPath == 0 )
439cdf0e10cSrcweir     {
440cdf0e10cSrcweir         return osl_File_E_INVAL;
441cdf0e10cSrcweir     }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir     if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
444cdf0e10cSrcweir     {
445cdf0e10cSrcweir         return osl_File_E_INVAL;
446cdf0e10cSrcweir     }
447cdf0e10cSrcweir 
448cdf0e10cSrcweir #ifdef DEBUG_OSL_FILE
449cdf0e10cSrcweir     fprintf(stderr,"Handle is:\n");
450cdf0e10cSrcweir     osl_printFloppyHandle(pItem);
451cdf0e10cSrcweir #endif
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 	snprintf(Buffer, sizeof(Buffer), "file://%s", pItem->pszMountPoint);
454cdf0e10cSrcweir 
455cdf0e10cSrcweir #ifdef DEBUG_OSL_FILE
456cdf0e10cSrcweir     fprintf(stderr,"Mount Point is: '%s'\n",Buffer);
457cdf0e10cSrcweir #endif
458cdf0e10cSrcweir 
459cdf0e10cSrcweir     oslMakeUStrFromPsz(Buffer, pstrPath);
460cdf0e10cSrcweir 
461cdf0e10cSrcweir     return osl_File_E_None;
462cdf0e10cSrcweir }
463cdf0e10cSrcweir 
464cdf0e10cSrcweir /*****************************************
465cdf0e10cSrcweir  * osl_acquireVolumeDeviceHandle
466cdf0e10cSrcweir  ****************************************/
467cdf0e10cSrcweir 
osl_acquireVolumeDeviceHandle(oslVolumeDeviceHandle Handle)468cdf0e10cSrcweir oslFileError SAL_CALL osl_acquireVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
469cdf0e10cSrcweir {
470cdf0e10cSrcweir     oslVolumeDeviceHandleImpl* pItem =(oslVolumeDeviceHandleImpl*) Handle;
471cdf0e10cSrcweir 
472cdf0e10cSrcweir     if ( pItem == 0 )
473cdf0e10cSrcweir     {
474cdf0e10cSrcweir         return osl_File_E_INVAL;
475cdf0e10cSrcweir     }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir     if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
478cdf0e10cSrcweir     {
479cdf0e10cSrcweir         return osl_File_E_INVAL;
480cdf0e10cSrcweir     }
481cdf0e10cSrcweir 
482cdf0e10cSrcweir     ++pItem->RefCount;
483cdf0e10cSrcweir 
484cdf0e10cSrcweir     return osl_File_E_None;
485cdf0e10cSrcweir }
486cdf0e10cSrcweir 
487cdf0e10cSrcweir /*****************************************
488cdf0e10cSrcweir  * osl_releaseVolumeDeviceHandle
489cdf0e10cSrcweir  ****************************************/
490cdf0e10cSrcweir 
osl_releaseVolumeDeviceHandle(oslVolumeDeviceHandle Handle)491cdf0e10cSrcweir oslFileError osl_releaseVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
492cdf0e10cSrcweir {
493cdf0e10cSrcweir     oslVolumeDeviceHandleImpl* pItem =(oslVolumeDeviceHandleImpl*) Handle;
494cdf0e10cSrcweir 
495cdf0e10cSrcweir     if ( pItem == 0 )
496cdf0e10cSrcweir     {
497cdf0e10cSrcweir         return osl_File_E_INVAL;
498cdf0e10cSrcweir     }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir     if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
501cdf0e10cSrcweir     {
502cdf0e10cSrcweir         return osl_File_E_INVAL;
503cdf0e10cSrcweir     }
504cdf0e10cSrcweir 
505cdf0e10cSrcweir     --pItem->RefCount;
506cdf0e10cSrcweir 
507cdf0e10cSrcweir     if ( pItem->RefCount == 0 )
508cdf0e10cSrcweir     {
509cdf0e10cSrcweir         rtl_freeMemory(pItem);
510cdf0e10cSrcweir     }
511cdf0e10cSrcweir 
512cdf0e10cSrcweir     return osl_File_E_None;
513cdf0e10cSrcweir }
514cdf0e10cSrcweir 
515cdf0e10cSrcweir #ifndef MACOSX
516cdf0e10cSrcweir 
517cdf0e10cSrcweir /*****************************************
518cdf0e10cSrcweir  * osl_newVolumeDeviceHandleImpl
519cdf0e10cSrcweir  ****************************************/
520cdf0e10cSrcweir 
osl_newVolumeDeviceHandleImpl()521cdf0e10cSrcweir static oslVolumeDeviceHandleImpl* osl_newVolumeDeviceHandleImpl()
522cdf0e10cSrcweir {
523cdf0e10cSrcweir     oslVolumeDeviceHandleImpl* pHandle;
524cdf0e10cSrcweir     const size_t               nSizeOfHandle = sizeof(oslVolumeDeviceHandleImpl);
525cdf0e10cSrcweir 
526cdf0e10cSrcweir     pHandle = (oslVolumeDeviceHandleImpl*) rtl_allocateMemory (nSizeOfHandle);
527cdf0e10cSrcweir     if (pHandle != NULL)
528cdf0e10cSrcweir     {
529cdf0e10cSrcweir         pHandle->ident[0]         = 'O';
530cdf0e10cSrcweir         pHandle->ident[1]         = 'V';
531cdf0e10cSrcweir         pHandle->ident[2]         = 'D';
532cdf0e10cSrcweir         pHandle->ident[3]         = 'H';
533cdf0e10cSrcweir         pHandle->pszMountPoint[0] = '\0';
534cdf0e10cSrcweir         pHandle->pszFilePath[0]   = '\0';
535cdf0e10cSrcweir         pHandle->pszDevice[0]     = '\0';
536cdf0e10cSrcweir         pHandle->RefCount         = 1;
537cdf0e10cSrcweir     }
538cdf0e10cSrcweir     return pHandle;
539cdf0e10cSrcweir }
540cdf0e10cSrcweir 
541cdf0e10cSrcweir /*****************************************
542cdf0e10cSrcweir  * osl_freeVolumeDeviceHandleImpl
543cdf0e10cSrcweir  ****************************************/
544cdf0e10cSrcweir 
osl_freeVolumeDeviceHandleImpl(oslVolumeDeviceHandleImpl * pHandle)545cdf0e10cSrcweir static void osl_freeVolumeDeviceHandleImpl (oslVolumeDeviceHandleImpl* pHandle)
546cdf0e10cSrcweir {
547cdf0e10cSrcweir     if (pHandle != NULL)
548cdf0e10cSrcweir         rtl_freeMemory (pHandle);
549cdf0e10cSrcweir }
550cdf0e10cSrcweir #endif
551cdf0e10cSrcweir 
552cdf0e10cSrcweir /******************************************************************************
553cdf0e10cSrcweir  *
554cdf0e10cSrcweir  *                  SOLARIS FLOPPY FUNCTIONS
555cdf0e10cSrcweir  *
556cdf0e10cSrcweir  *****************************************************************************/
557cdf0e10cSrcweir 
558cdf0e10cSrcweir #if defined(SOLARIS)
559cdf0e10cSrcweir /* compare a given devicename with the typical device names on a Solaris box */
560cdf0e10cSrcweir static sal_Bool
osl_isAFloppyDevice(const char * pDeviceName)561cdf0e10cSrcweir osl_isAFloppyDevice (const char* pDeviceName)
562cdf0e10cSrcweir {
563cdf0e10cSrcweir     const char* pFloppyDevice [] = {
564cdf0e10cSrcweir         "/dev/fd",           "/dev/rfd",
565cdf0e10cSrcweir         "/dev/diskette",     "/dev/rdiskette",
566cdf0e10cSrcweir         "/vol/dev/diskette", "/vol/dev/rdiskette"
567cdf0e10cSrcweir     };
568cdf0e10cSrcweir 
569cdf0e10cSrcweir     int i;
570cdf0e10cSrcweir     for (i = 0; i < (sizeof(pFloppyDevice)/sizeof(pFloppyDevice[0])); i++)
571cdf0e10cSrcweir     {
572cdf0e10cSrcweir         if (strncmp(pDeviceName, pFloppyDevice[i], strlen(pFloppyDevice[i])) == 0)
573cdf0e10cSrcweir             return sal_True;
574cdf0e10cSrcweir     }
575cdf0e10cSrcweir     return sal_False;
576cdf0e10cSrcweir }
577cdf0e10cSrcweir 
578cdf0e10cSrcweir /* compare two directories whether the first may be a parent of the second. this
579cdf0e10cSrcweir  * does not realpath() resolving */
580cdf0e10cSrcweir static sal_Bool
osl_isAParentDirectory(const char * pParentDir,const char * pSubDir)581cdf0e10cSrcweir osl_isAParentDirectory (const char* pParentDir, const char* pSubDir)
582cdf0e10cSrcweir {
583cdf0e10cSrcweir     return strncmp(pParentDir, pSubDir, strlen(pParentDir)) == 0;
584cdf0e10cSrcweir }
585cdf0e10cSrcweir 
586cdf0e10cSrcweir /* the name of the routine is obviously silly. But anyway create a
587cdf0e10cSrcweir  * oslVolumeDeviceHandle with correct mount point, device name and a resolved filepath
588cdf0e10cSrcweir  * only if pszPath points to file or directory on a floppy */
589cdf0e10cSrcweir static oslVolumeDeviceHandle
osl_isFloppyDrive(const sal_Char * pszPath)590cdf0e10cSrcweir osl_isFloppyDrive(const sal_Char* pszPath)
591cdf0e10cSrcweir {
592cdf0e10cSrcweir     FILE*                       pMountTab;
593cdf0e10cSrcweir     struct mnttab               aMountEnt;
594cdf0e10cSrcweir     oslVolumeDeviceHandleImpl*  pHandle;
595cdf0e10cSrcweir 
596cdf0e10cSrcweir     if ((pHandle = osl_newVolumeDeviceHandleImpl()) == NULL)
597cdf0e10cSrcweir     {
598cdf0e10cSrcweir         return NULL;
599cdf0e10cSrcweir     }
600cdf0e10cSrcweir     if (realpath(pszPath, pHandle->pszFilePath) == NULL)
601cdf0e10cSrcweir     {
602cdf0e10cSrcweir         osl_freeVolumeDeviceHandleImpl (pHandle);
603cdf0e10cSrcweir         return NULL;
604cdf0e10cSrcweir     }
605cdf0e10cSrcweir     if ((pMountTab = fopen (MOUNTTAB, "r")) == NULL)
606cdf0e10cSrcweir     {
607cdf0e10cSrcweir         osl_freeVolumeDeviceHandleImpl (pHandle);
608cdf0e10cSrcweir         return NULL;
609cdf0e10cSrcweir     }
610cdf0e10cSrcweir 
611cdf0e10cSrcweir     while (getmntent(pMountTab, &aMountEnt) == 0)
612cdf0e10cSrcweir     {
613cdf0e10cSrcweir         const char *pMountPoint = aMountEnt.mnt_mountp;
614cdf0e10cSrcweir         const char *pDevice     = aMountEnt.mnt_special;
615cdf0e10cSrcweir         if (   osl_isAParentDirectory (aMountEnt.mnt_mountp, pHandle->pszFilePath)
616cdf0e10cSrcweir             && osl_isAFloppyDevice    (aMountEnt.mnt_special))
617cdf0e10cSrcweir         {
618cdf0e10cSrcweir             /* skip the last item for it is the name of the disk */
619cdf0e10cSrcweir             char * pc = strrchr( aMountEnt.mnt_special, '/' );
620cdf0e10cSrcweir 
621cdf0e10cSrcweir             if ( NULL != pc )
622cdf0e10cSrcweir             {
623cdf0e10cSrcweir                 int len = pc - aMountEnt.mnt_special;
624cdf0e10cSrcweir 
625cdf0e10cSrcweir                 strncpy( pHandle->pszDevice, aMountEnt.mnt_special, len );
626cdf0e10cSrcweir                 pHandle->pszDevice[len] = '\0';
627cdf0e10cSrcweir             }
628cdf0e10cSrcweir             else
629cdf0e10cSrcweir 			{
630cdf0e10cSrcweir 				/* #106048 use save str functions to avoid buffer overflows */
631cdf0e10cSrcweir 				memset(pHandle->pszDevice, 0, sizeof(pHandle->pszDevice));
632cdf0e10cSrcweir 				strncpy(pHandle->pszDevice, aMountEnt.mnt_special, sizeof(pHandle->pszDevice) - 1);
633cdf0e10cSrcweir             }
634cdf0e10cSrcweir 
635cdf0e10cSrcweir             /* remember the mount point */
636cdf0e10cSrcweir 			memset(pHandle->pszMountPoint, 0, sizeof(pHandle->pszMountPoint));
637cdf0e10cSrcweir 			strncpy(pHandle->pszMountPoint, aMountEnt.mnt_mountp, sizeof(pHandle->pszMountPoint) - 1);
638cdf0e10cSrcweir 
639cdf0e10cSrcweir             fclose (pMountTab);
640cdf0e10cSrcweir             return pHandle;
641cdf0e10cSrcweir         }
642cdf0e10cSrcweir     }
643cdf0e10cSrcweir 
644cdf0e10cSrcweir     fclose (pMountTab);
645cdf0e10cSrcweir     osl_freeVolumeDeviceHandleImpl (pHandle);
646cdf0e10cSrcweir     return NULL;
647cdf0e10cSrcweir }
648cdf0e10cSrcweir 
osl_mountFloppy(oslVolumeDeviceHandle hFloppy)649cdf0e10cSrcweir static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy)
650cdf0e10cSrcweir {
651cdf0e10cSrcweir     FILE*                       pMountTab;
652cdf0e10cSrcweir     struct mnttab               aMountEnt;
653cdf0e10cSrcweir     oslVolumeDeviceHandleImpl*  pHandle = (oslVolumeDeviceHandleImpl*) hFloppy;
654cdf0e10cSrcweir 
655cdf0e10cSrcweir     int nRet=0;
656cdf0e10cSrcweir     sal_Char pszCmd[512] = "";
657cdf0e10cSrcweir 
658cdf0e10cSrcweir     if ( pHandle == 0 )
659cdf0e10cSrcweir         return osl_File_E_INVAL;
660cdf0e10cSrcweir 
661cdf0e10cSrcweir     /* FIXME: don't know what this is good for */
662cdf0e10cSrcweir     if ( pHandle->ident[0] != 'O' || pHandle->ident[1] != 'V' || pHandle->ident[2] != 'D' || pHandle->ident[3] != 'H' )
663cdf0e10cSrcweir         return osl_File_E_INVAL;
664cdf0e10cSrcweir 
665cdf0e10cSrcweir     snprintf(pszCmd, sizeof(pszCmd), "eject -q %s > /dev/null 2>&1", pHandle->pszDevice);
666cdf0e10cSrcweir 
667cdf0e10cSrcweir     nRet = system( pszCmd );
668cdf0e10cSrcweir 
669cdf0e10cSrcweir     switch ( WEXITSTATUS(nRet) )
670cdf0e10cSrcweir     {
671cdf0e10cSrcweir     case 0:
672cdf0e10cSrcweir         {
673cdf0e10cSrcweir             /* lookup the device in mount tab again */
674cdf0e10cSrcweir             if ((pMountTab = fopen (MOUNTTAB, "r")) == NULL)
675cdf0e10cSrcweir                 return osl_File_E_BUSY;
676cdf0e10cSrcweir 
677cdf0e10cSrcweir             while (getmntent(pMountTab, &aMountEnt) == 0)
678cdf0e10cSrcweir             {
679cdf0e10cSrcweir                 const char *pMountPoint = aMountEnt.mnt_mountp;
680cdf0e10cSrcweir                 const char *pDevice     = aMountEnt.mnt_special;
681cdf0e10cSrcweir                 if ( 0 == strncmp( pHandle->pszDevice, aMountEnt.mnt_special, strlen(pHandle->pszDevice) ) )
682cdf0e10cSrcweir                 {
683cdf0e10cSrcweir 					memset(pHandle->pszMountPoint, 0, sizeof(pHandle->pszMountPoint));
684cdf0e10cSrcweir                     strncpy (pHandle->pszMountPoint, aMountEnt.mnt_mountp, sizeof(pHandle->pszMountPoint) - 1);
685cdf0e10cSrcweir 
686cdf0e10cSrcweir                     fclose (pMountTab);
687cdf0e10cSrcweir                     return osl_File_E_None;
688cdf0e10cSrcweir                 }
689cdf0e10cSrcweir             }
690cdf0e10cSrcweir 
691cdf0e10cSrcweir             fclose (pMountTab);
692cdf0e10cSrcweir             return osl_File_E_BUSY;
693cdf0e10cSrcweir         }
694cdf0e10cSrcweir         //break; // break not necessary here, see return statements before
695cdf0e10cSrcweir 
696cdf0e10cSrcweir     case 1:
697cdf0e10cSrcweir         return osl_File_E_BUSY;
698cdf0e10cSrcweir 
699cdf0e10cSrcweir     default:
700cdf0e10cSrcweir         break;
701cdf0e10cSrcweir     }
702cdf0e10cSrcweir 
703cdf0e10cSrcweir     return osl_File_E_BUSY;
704cdf0e10cSrcweir }
705cdf0e10cSrcweir 
osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)706cdf0e10cSrcweir static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)
707cdf0e10cSrcweir {
708cdf0e10cSrcweir //    FILE*                       pMountTab;
709cdf0e10cSrcweir //    struct mnttab               aMountEnt;
710cdf0e10cSrcweir     oslVolumeDeviceHandleImpl*  pHandle = (oslVolumeDeviceHandleImpl*) hFloppy;
711cdf0e10cSrcweir 
712cdf0e10cSrcweir     int nRet=0;
713cdf0e10cSrcweir     sal_Char pszCmd[512] = "";
714cdf0e10cSrcweir 
715cdf0e10cSrcweir     if ( pHandle == 0 )
716cdf0e10cSrcweir         return osl_File_E_INVAL;
717cdf0e10cSrcweir 
718cdf0e10cSrcweir     /* FIXME: don't know what this is good for */
719cdf0e10cSrcweir     if ( pHandle->ident[0] != 'O' || pHandle->ident[1] != 'V' || pHandle->ident[2] != 'D' || pHandle->ident[3] != 'H' )
720cdf0e10cSrcweir         return osl_File_E_INVAL;
721cdf0e10cSrcweir 
722cdf0e10cSrcweir     snprintf(pszCmd, sizeof(pszCmd), "eject %s > /dev/null 2>&1", pHandle->pszDevice);
723cdf0e10cSrcweir 
724cdf0e10cSrcweir     nRet = system( pszCmd );
725cdf0e10cSrcweir 
726cdf0e10cSrcweir     switch ( WEXITSTATUS(nRet) )
727cdf0e10cSrcweir     {
728cdf0e10cSrcweir     case 0:
729cdf0e10cSrcweir         {
730cdf0e10cSrcweir             FILE*         pMountTab;
731cdf0e10cSrcweir             struct mnttab aMountEnt;
732cdf0e10cSrcweir 
733cdf0e10cSrcweir             /* lookup if device is still in mount tab */
734cdf0e10cSrcweir             if ((pMountTab = fopen (MOUNTTAB, "r")) == NULL)
735cdf0e10cSrcweir                 return osl_File_E_BUSY;
736cdf0e10cSrcweir 
737cdf0e10cSrcweir             while (getmntent(pMountTab, &aMountEnt) == 0)
738cdf0e10cSrcweir             {
739cdf0e10cSrcweir                 const char *pMountPoint = aMountEnt.mnt_mountp;
740cdf0e10cSrcweir                 const char *pDevice     = aMountEnt.mnt_special;
741cdf0e10cSrcweir                 if ( 0 == strncmp( pHandle->pszDevice, aMountEnt.mnt_special, strlen(pHandle->pszDevice) ) )
742cdf0e10cSrcweir                 {
743cdf0e10cSrcweir                     fclose (pMountTab);
744cdf0e10cSrcweir                     return osl_File_E_BUSY;
745cdf0e10cSrcweir                 }
746cdf0e10cSrcweir             }
747cdf0e10cSrcweir 
748cdf0e10cSrcweir             fclose (pMountTab);
749cdf0e10cSrcweir             pHandle->pszMountPoint[0] = 0;
750cdf0e10cSrcweir             return osl_File_E_None;
751cdf0e10cSrcweir         }
752cdf0e10cSrcweir 
753cdf0e10cSrcweir         //break; //break not necessary, see return statements before
754cdf0e10cSrcweir 
755cdf0e10cSrcweir     case 1:
756cdf0e10cSrcweir         return osl_File_E_NODEV;
757cdf0e10cSrcweir 
758cdf0e10cSrcweir     case 4:
759cdf0e10cSrcweir         pHandle->pszMountPoint[0] = 0;
760cdf0e10cSrcweir         return osl_File_E_None;
761cdf0e10cSrcweir 
762cdf0e10cSrcweir     default:
763cdf0e10cSrcweir         break;
764cdf0e10cSrcweir     }
765cdf0e10cSrcweir 
766cdf0e10cSrcweir     return osl_File_E_BUSY;
767cdf0e10cSrcweir }
768cdf0e10cSrcweir 
769cdf0e10cSrcweir #endif /* SOLARIS */
770cdf0e10cSrcweir 
771cdf0e10cSrcweir /******************************************************************************
772cdf0e10cSrcweir  *
773cdf0e10cSrcweir  *                  LINUX FLOPPY FUNCTIONS
774cdf0e10cSrcweir  *
775cdf0e10cSrcweir  *****************************************************************************/
776cdf0e10cSrcweir 
777cdf0e10cSrcweir #if defined(LINUX)
778cdf0e10cSrcweir static oslVolumeDeviceHandle
osl_isFloppyDrive(const sal_Char * pszPath)779cdf0e10cSrcweir osl_isFloppyDrive (const sal_Char* pszPath)
780cdf0e10cSrcweir {
781cdf0e10cSrcweir     oslVolumeDeviceHandleImpl* pItem = osl_newVolumeDeviceHandleImpl();
782cdf0e10cSrcweir     if (osl_getFloppyMountEntry(pszPath, pItem))
783cdf0e10cSrcweir         return (oslVolumeDeviceHandle) pItem;
784cdf0e10cSrcweir 
785cdf0e10cSrcweir     osl_freeVolumeDeviceHandleImpl (pItem);
786cdf0e10cSrcweir     return 0;
787cdf0e10cSrcweir }
788cdf0e10cSrcweir #endif /* LINUX */
789cdf0e10cSrcweir 
790cdf0e10cSrcweir #if defined(LINUX)
osl_mountFloppy(oslVolumeDeviceHandle hFloppy)791cdf0e10cSrcweir static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy)
792cdf0e10cSrcweir {
793cdf0e10cSrcweir     sal_Bool bRet = sal_False;
794cdf0e10cSrcweir     oslVolumeDeviceHandleImpl* pItem=0;
795cdf0e10cSrcweir     int nRet;
796cdf0e10cSrcweir     sal_Char  pszCmd[PATH_MAX];
797cdf0e10cSrcweir     const sal_Char* pszMountProg = "mount";
798cdf0e10cSrcweir     sal_Char* pszSuDo = 0;
799cdf0e10cSrcweir     sal_Char* pszTmp = 0;
800cdf0e10cSrcweir 
801cdf0e10cSrcweir     pszCmd[0] = '\0';
802cdf0e10cSrcweir 
803cdf0e10cSrcweir #ifdef TRACE_OSL_FILE
804cdf0e10cSrcweir     fprintf(stderr,"In  osl_mountFloppy\n");
805cdf0e10cSrcweir #endif
806cdf0e10cSrcweir 
807cdf0e10cSrcweir     pItem = (oslVolumeDeviceHandleImpl*) hFloppy;
808cdf0e10cSrcweir 
809cdf0e10cSrcweir     if ( pItem == 0 )
810cdf0e10cSrcweir     {
811cdf0e10cSrcweir #ifdef TRACE_OSL_FILE
812cdf0e10cSrcweir         fprintf(stderr,"Out osl_mountFloppy [pItem == 0]\n");
813cdf0e10cSrcweir #endif
814cdf0e10cSrcweir 
815cdf0e10cSrcweir         return osl_File_E_INVAL;
816cdf0e10cSrcweir     }
817cdf0e10cSrcweir 
818cdf0e10cSrcweir     if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
819cdf0e10cSrcweir     {
820cdf0e10cSrcweir #ifdef TRACE_OSL_FILE
821cdf0e10cSrcweir         fprintf(stderr,"Out osl_mountFloppy [invalid handle]\n");
822cdf0e10cSrcweir #endif
823cdf0e10cSrcweir         return osl_File_E_INVAL;
824cdf0e10cSrcweir     }
825cdf0e10cSrcweir 
826cdf0e10cSrcweir     bRet = osl_isFloppyMounted(pItem);
827cdf0e10cSrcweir     if ( bRet == sal_True )
828cdf0e10cSrcweir     {
829cdf0e10cSrcweir #ifdef DEBUG_OSL_FILE
830cdf0e10cSrcweir         fprintf(stderr,"detected mounted floppy at '%s'\n",pItem->pszMountPoint);
831cdf0e10cSrcweir #endif
832cdf0e10cSrcweir         return osl_File_E_BUSY;
833cdf0e10cSrcweir     }
834cdf0e10cSrcweir 
835cdf0e10cSrcweir     /* mfe: we can't use the mount(2) system call!!!   */
836cdf0e10cSrcweir     /*      even if we are root                        */
837cdf0e10cSrcweir     /*      since mtab is not updated!!!               */
838cdf0e10cSrcweir     /*      but we need it to be updated               */
839cdf0e10cSrcweir     /*      some "magic" must be done                  */
840cdf0e10cSrcweir 
841cdf0e10cSrcweir /*      nRet = mount(pItem->pszDevice,pItem->pszMountPoint,0,0,0); */
842cdf0e10cSrcweir /*      if ( nRet != 0 ) */
843cdf0e10cSrcweir /*      { */
844cdf0e10cSrcweir /*          nRet=errno; */
845cdf0e10cSrcweir /*  #ifdef DEBUG_OSL_FILE */
846cdf0e10cSrcweir /*          perror("mount"); */
847cdf0e10cSrcweir /*  #endif */
848cdf0e10cSrcweir /*      } */
849cdf0e10cSrcweir 
850cdf0e10cSrcweir     pszTmp = getenv("SAL_MOUNT_MOUNTPROG");
851cdf0e10cSrcweir     if ( pszTmp != 0 )
852cdf0e10cSrcweir     {
853cdf0e10cSrcweir         pszMountProg=pszTmp;
854cdf0e10cSrcweir     }
855cdf0e10cSrcweir 
856cdf0e10cSrcweir     pszTmp=getenv("SAL_MOUNT_SU_DO");
857cdf0e10cSrcweir     if ( pszTmp != 0 )
858cdf0e10cSrcweir     {
859cdf0e10cSrcweir         pszSuDo=pszTmp;
860cdf0e10cSrcweir     }
861cdf0e10cSrcweir 
862cdf0e10cSrcweir     if ( pszSuDo != 0 )
863cdf0e10cSrcweir     {
864cdf0e10cSrcweir         snprintf(pszCmd, sizeof(pszCmd), "%s %s %s %s",pszSuDo,pszMountProg,pItem->pszDevice,pItem->pszMountPoint);
865cdf0e10cSrcweir     }
866cdf0e10cSrcweir     else
867cdf0e10cSrcweir     {
868cdf0e10cSrcweir         snprintf(pszCmd, sizeof(pszCmd), "%s %s",pszMountProg,pItem->pszMountPoint);
869cdf0e10cSrcweir     }
870cdf0e10cSrcweir 
871cdf0e10cSrcweir 
872cdf0e10cSrcweir #ifdef DEBUG_OSL_FILE
873cdf0e10cSrcweir     fprintf(stderr,"executing '%s'\n",pszCmd);
874cdf0e10cSrcweir #endif
875cdf0e10cSrcweir 
876cdf0e10cSrcweir     nRet = system(pszCmd);
877cdf0e10cSrcweir 
878cdf0e10cSrcweir #ifdef DEBUG_OSL_FILE
879cdf0e10cSrcweir     fprintf(stderr,"call returned '%i'\n",nRet);
880cdf0e10cSrcweir     fprintf(stderr,"exit status is '%i'\n", WEXITSTATUS(nRet));
881cdf0e10cSrcweir #endif
882cdf0e10cSrcweir 
883cdf0e10cSrcweir 
884cdf0e10cSrcweir     switch ( WEXITSTATUS(nRet) )
885cdf0e10cSrcweir     {
886cdf0e10cSrcweir     case 0:
887cdf0e10cSrcweir         nRet=0;
888cdf0e10cSrcweir         break;
889cdf0e10cSrcweir 
890cdf0e10cSrcweir     case 2:
891cdf0e10cSrcweir         nRet=EPERM;
892cdf0e10cSrcweir         break;
893cdf0e10cSrcweir 
894cdf0e10cSrcweir     case 4:
895cdf0e10cSrcweir         nRet=ENOENT;
896cdf0e10cSrcweir         break;
897cdf0e10cSrcweir 
898cdf0e10cSrcweir     case 8:
899cdf0e10cSrcweir         nRet=EINTR;
900cdf0e10cSrcweir         break;
901cdf0e10cSrcweir 
902cdf0e10cSrcweir     case 16:
903cdf0e10cSrcweir         nRet=EPERM;
904cdf0e10cSrcweir         break;
905cdf0e10cSrcweir 
906cdf0e10cSrcweir     case 32:
907cdf0e10cSrcweir         nRet=EBUSY;
908cdf0e10cSrcweir         break;
909cdf0e10cSrcweir 
910cdf0e10cSrcweir     case 64:
911cdf0e10cSrcweir         nRet=EAGAIN;
912cdf0e10cSrcweir         break;
913cdf0e10cSrcweir 
914cdf0e10cSrcweir     default:
915cdf0e10cSrcweir         nRet=EBUSY;
916cdf0e10cSrcweir         break;
917cdf0e10cSrcweir     }
918cdf0e10cSrcweir 
919cdf0e10cSrcweir     return ((0 == nRet) ? oslTranslateFileError(OSL_FET_SUCCESS, nRet) : oslTranslateFileError(OSL_FET_ERROR, nRet));
920cdf0e10cSrcweir }
921cdf0e10cSrcweir #endif /* LINUX */
922cdf0e10cSrcweir 
923cdf0e10cSrcweir 
924cdf0e10cSrcweir #if defined(LINUX)
osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)925cdf0e10cSrcweir static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)
926cdf0e10cSrcweir {
927cdf0e10cSrcweir     oslVolumeDeviceHandleImpl* pItem=0;
928cdf0e10cSrcweir     int nRet=0;
929cdf0e10cSrcweir     sal_Char pszCmd[PATH_MAX];
930cdf0e10cSrcweir     sal_Char* pszTmp = 0;
931cdf0e10cSrcweir     sal_Char* pszSuDo = 0;
932cdf0e10cSrcweir     const sal_Char* pszUmountProg = "umount";
933cdf0e10cSrcweir 
934cdf0e10cSrcweir     pszCmd[0] = '\0';
935cdf0e10cSrcweir 
936cdf0e10cSrcweir #ifdef TRACE_OSL_FILE
937cdf0e10cSrcweir     fprintf(stderr,"In  osl_unmountFloppy\n");
938cdf0e10cSrcweir #endif
939cdf0e10cSrcweir 
940cdf0e10cSrcweir     pItem = (oslVolumeDeviceHandleImpl*) hFloppy;
941cdf0e10cSrcweir 
942cdf0e10cSrcweir     if ( pItem == 0 )
943cdf0e10cSrcweir     {
944cdf0e10cSrcweir #ifdef TRACE_OSL_FILE
945cdf0e10cSrcweir         fprintf(stderr,"Out osl_unmountFloppy [pItem==0]\n");
946cdf0e10cSrcweir #endif
947cdf0e10cSrcweir         return osl_File_E_INVAL;
948cdf0e10cSrcweir     }
949cdf0e10cSrcweir 
950cdf0e10cSrcweir     if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
951cdf0e10cSrcweir     {
952cdf0e10cSrcweir #ifdef TRACE_OSL_FILE
953cdf0e10cSrcweir         fprintf(stderr,"Out osl_unmountFloppy [invalid handle]\n");
954cdf0e10cSrcweir #endif
955cdf0e10cSrcweir         return osl_File_E_INVAL;
956cdf0e10cSrcweir     }
957cdf0e10cSrcweir 
958cdf0e10cSrcweir     /* mfe: we can't use the umount(2) system call!!!  */
959cdf0e10cSrcweir     /*      even if we are root                        */
960cdf0e10cSrcweir     /*      since mtab is not updated!!!               */
961cdf0e10cSrcweir     /*      but we need it to be updated               */
962cdf0e10cSrcweir     /*      some "magic" must be done                  */
963cdf0e10cSrcweir 
964cdf0e10cSrcweir /*      nRet=umount(pItem->pszDevice); */
965cdf0e10cSrcweir /*      if ( nRet != 0 ) */
966cdf0e10cSrcweir /*      { */
967cdf0e10cSrcweir /*          nRet = errno; */
968cdf0e10cSrcweir 
969cdf0e10cSrcweir /*  #ifdef DEBUG_OSL_FILE */
970cdf0e10cSrcweir /*          perror("mount"); */
971cdf0e10cSrcweir /*  #endif */
972cdf0e10cSrcweir /*      } */
973cdf0e10cSrcweir 
974cdf0e10cSrcweir 
975cdf0e10cSrcweir     pszTmp = getenv("SAL_MOUNT_UMOUNTPROG");
976cdf0e10cSrcweir     if ( pszTmp != 0 )
977cdf0e10cSrcweir     {
978cdf0e10cSrcweir         pszUmountProg=pszTmp;
979cdf0e10cSrcweir     }
980cdf0e10cSrcweir 
981cdf0e10cSrcweir     pszTmp = getenv("SAL_MOUNT_SU_DO");
982cdf0e10cSrcweir     if ( pszTmp != 0 )
983cdf0e10cSrcweir     {
984cdf0e10cSrcweir         pszSuDo=pszTmp;
985cdf0e10cSrcweir     }
986cdf0e10cSrcweir 
987cdf0e10cSrcweir     if ( pszSuDo != 0 )
988cdf0e10cSrcweir     {
989cdf0e10cSrcweir         snprintf(pszCmd, sizeof(pszCmd), "%s %s %s",pszSuDo,pszUmountProg,pItem->pszMountPoint);
990cdf0e10cSrcweir     }
991cdf0e10cSrcweir     else
992cdf0e10cSrcweir     {
993cdf0e10cSrcweir         snprintf(pszCmd, sizeof(pszCmd), "%s %s",pszUmountProg,pItem->pszMountPoint);
994cdf0e10cSrcweir     }
995cdf0e10cSrcweir 
996cdf0e10cSrcweir 
997cdf0e10cSrcweir #ifdef DEBUG_OSL_FILE
998cdf0e10cSrcweir     fprintf(stderr,"executing '%s'\n",pszCmd);
999cdf0e10cSrcweir #endif
1000cdf0e10cSrcweir 
1001cdf0e10cSrcweir     nRet = system(pszCmd);
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir #ifdef DEBUG_OSL_FILE
1004cdf0e10cSrcweir     fprintf(stderr,"call returned '%i'\n",nRet);
1005cdf0e10cSrcweir     fprintf(stderr,"exit status is '%i'\n", WEXITSTATUS(nRet));
1006cdf0e10cSrcweir #endif
1007cdf0e10cSrcweir 
1008cdf0e10cSrcweir     switch ( WEXITSTATUS(nRet) )
1009cdf0e10cSrcweir     {
1010cdf0e10cSrcweir     case 0:
1011cdf0e10cSrcweir         nRet=0;
1012cdf0e10cSrcweir         break;
1013cdf0e10cSrcweir 
1014cdf0e10cSrcweir     default:
1015cdf0e10cSrcweir         nRet=EBUSY;
1016cdf0e10cSrcweir         break;
1017cdf0e10cSrcweir     }
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir #ifdef TRACE_OSL_FILE
1020cdf0e10cSrcweir     fprintf(stderr,"Out osl_unmountFloppy [ok]\n");
1021cdf0e10cSrcweir #endif
1022cdf0e10cSrcweir 
1023cdf0e10cSrcweir     return ((0 == nRet) ? oslTranslateFileError(OSL_FET_SUCCESS, nRet) : oslTranslateFileError(OSL_FET_ERROR, nRet));
1024cdf0e10cSrcweir 
1025cdf0e10cSrcweir /*    return osl_File_E_None;*/
1026cdf0e10cSrcweir }
1027cdf0e10cSrcweir 
1028cdf0e10cSrcweir #endif /* LINUX */
1029cdf0e10cSrcweir 
1030cdf0e10cSrcweir #if defined(LINUX)
1031cdf0e10cSrcweir static sal_Bool
osl_getFloppyMountEntry(const sal_Char * pszPath,oslVolumeDeviceHandleImpl * pItem)1032cdf0e10cSrcweir osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem)
1033cdf0e10cSrcweir {
1034cdf0e10cSrcweir     struct mntent* pMountEnt;
1035cdf0e10cSrcweir     FILE*          pMountTab;
1036cdf0e10cSrcweir 
1037cdf0e10cSrcweir     pMountTab = setmntent (MOUNTTAB, "r");
1038cdf0e10cSrcweir     if (pMountTab == 0)
1039cdf0e10cSrcweir         return sal_False;
1040cdf0e10cSrcweir 
1041cdf0e10cSrcweir     while ((pMountEnt = getmntent(pMountTab)) != 0)
1042cdf0e10cSrcweir     {
1043cdf0e10cSrcweir         if (   strncmp(pMountEnt->mnt_dir,    pszPath,   strlen(pMountEnt->mnt_dir)) == 0
1044cdf0e10cSrcweir             && strncmp(pMountEnt->mnt_fsname, "/dev/fd", strlen("/dev/fd")) == 0)
1045cdf0e10cSrcweir         {
1046cdf0e10cSrcweir 			memset(pItem->pszMountPoint, 0, sizeof(pItem->pszMountPoint));
1047cdf0e10cSrcweir             strncpy(pItem->pszMountPoint, pMountEnt->mnt_dir, sizeof(pItem->pszMountPoint) - 1);
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir 			memset(pItem->pszFilePath, 0, sizeof(pItem->pszFilePath));
1050cdf0e10cSrcweir             strncpy(pItem->pszFilePath, pMountEnt->mnt_dir, sizeof(pItem->pszFilePath) - 1);
1051cdf0e10cSrcweir 
1052cdf0e10cSrcweir 			memset(pItem->pszDevice, 0, sizeof(pItem->pszDevice));
1053cdf0e10cSrcweir             strncpy(pItem->pszDevice, pMountEnt->mnt_fsname, sizeof(pItem->pszDevice) - 1);
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir             endmntent (pMountTab);
1056cdf0e10cSrcweir             return sal_True;
1057cdf0e10cSrcweir         }
1058cdf0e10cSrcweir     }
1059cdf0e10cSrcweir 
1060cdf0e10cSrcweir     endmntent (pMountTab);
1061cdf0e10cSrcweir     return sal_False;
1062cdf0e10cSrcweir }
1063cdf0e10cSrcweir #endif /* LINUX */
1064cdf0e10cSrcweir 
1065cdf0e10cSrcweir #if defined(LINUX)
1066cdf0e10cSrcweir static sal_Bool
osl_isFloppyMounted(oslVolumeDeviceHandleImpl * pDevice)1067cdf0e10cSrcweir osl_isFloppyMounted (oslVolumeDeviceHandleImpl* pDevice)
1068cdf0e10cSrcweir {
1069cdf0e10cSrcweir     oslVolumeDeviceHandleImpl aItem;
1070cdf0e10cSrcweir 
1071cdf0e10cSrcweir     if (   osl_getFloppyMountEntry (pDevice->pszMountPoint, &aItem)
1072cdf0e10cSrcweir         && strcmp (aItem.pszMountPoint, pDevice->pszMountPoint) == 0
1073cdf0e10cSrcweir         && strcmp (aItem.pszDevice,     pDevice->pszDevice) == 0)
1074cdf0e10cSrcweir     {
1075cdf0e10cSrcweir         return sal_True;
1076cdf0e10cSrcweir     }
1077cdf0e10cSrcweir     return sal_False;
1078cdf0e10cSrcweir }
1079cdf0e10cSrcweir #endif /* LINUX */
1080cdf0e10cSrcweir 
1081cdf0e10cSrcweir /* NetBSD floppy functions have to be added here. Until we have done that,
1082cdf0e10cSrcweir  * we use the MACOSX definitions for nonexistent floppy.
1083cdf0e10cSrcweir  * */
1084cdf0e10cSrcweir 
1085cdf0e10cSrcweir /******************************************************************************
1086cdf0e10cSrcweir  *
1087cdf0e10cSrcweir  *                  MAC OS X FLOPPY FUNCTIONS
1088cdf0e10cSrcweir  *
1089cdf0e10cSrcweir  *****************************************************************************/
1090cdf0e10cSrcweir 
1091cdf0e10cSrcweir #if (defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
osl_isFloppyDrive(const sal_Char * pszPath)1092cdf0e10cSrcweir static oslVolumeDeviceHandle osl_isFloppyDrive(const sal_Char* pszPath)
1093cdf0e10cSrcweir {
1094cdf0e10cSrcweir     return NULL;
1095cdf0e10cSrcweir }
1096cdf0e10cSrcweir #endif /* MACOSX */
1097cdf0e10cSrcweir 
1098cdf0e10cSrcweir #if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
osl_mountFloppy(oslVolumeDeviceHandle hFloppy)1099cdf0e10cSrcweir static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy)
1100cdf0e10cSrcweir {
1101cdf0e10cSrcweir     return osl_File_E_BUSY;
1102cdf0e10cSrcweir }
1103cdf0e10cSrcweir #endif /* MACOSX */
1104cdf0e10cSrcweir 
1105cdf0e10cSrcweir #if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)1106cdf0e10cSrcweir static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)
1107cdf0e10cSrcweir {
1108cdf0e10cSrcweir     return osl_File_E_BUSY;
1109cdf0e10cSrcweir }
1110cdf0e10cSrcweir #endif /* MACOSX */
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir #if ( defined(NETBSD) || defined(FREEBSD) )
osl_getFloppyMountEntry(const sal_Char * pszPath,oslVolumeDeviceHandleImpl * pItem)1113cdf0e10cSrcweir static sal_Bool osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem)
1114cdf0e10cSrcweir {
1115cdf0e10cSrcweir     return sal_False;
1116cdf0e10cSrcweir }
1117cdf0e10cSrcweir #endif /* NETBSD || FREEBSD */
1118cdf0e10cSrcweir 
1119cdf0e10cSrcweir #if ( defined(NETBSD) || defined(FREEBSD) )
osl_isFloppyMounted(oslVolumeDeviceHandleImpl * pDevice)1120cdf0e10cSrcweir static sal_Bool osl_isFloppyMounted(oslVolumeDeviceHandleImpl* pDevice)
1121cdf0e10cSrcweir {
1122cdf0e10cSrcweir     return sal_False;
1123cdf0e10cSrcweir }
1124cdf0e10cSrcweir #endif /* NETBSD || FREEBSD */
1125cdf0e10cSrcweir 
1126cdf0e10cSrcweir 
1127cdf0e10cSrcweir #ifdef DEBUG_OSL_FILE
osl_printFloppyHandle(oslVolumeDeviceHandleImpl * pItem)1128cdf0e10cSrcweir static void osl_printFloppyHandle(oslVolumeDeviceHandleImpl* pItem)
1129cdf0e10cSrcweir {
1130cdf0e10cSrcweir     if (pItem == 0 )
1131cdf0e10cSrcweir     {
1132cdf0e10cSrcweir         fprintf(stderr,"NULL Handle\n");
1133cdf0e10cSrcweir         return;
1134cdf0e10cSrcweir     }
1135cdf0e10cSrcweir     if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
1136cdf0e10cSrcweir     {
1137cdf0e10cSrcweir #ifdef TRACE_OSL_FILE
1138cdf0e10cSrcweir         fprintf(stderr,"Invalid Handle]\n");
1139cdf0e10cSrcweir #endif
1140cdf0e10cSrcweir         return;
1141cdf0e10cSrcweir     }
1142cdf0e10cSrcweir 
1143cdf0e10cSrcweir 
1144cdf0e10cSrcweir     fprintf(stderr,"MountPoint : '%s'\n",pItem->pszMountPoint);
1145cdf0e10cSrcweir     fprintf(stderr,"FilePath   : '%s'\n",pItem->pszFilePath);
1146cdf0e10cSrcweir     fprintf(stderr,"Device     : '%s'\n",pItem->pszDevice);
1147cdf0e10cSrcweir 
1148cdf0e10cSrcweir     return;
1149cdf0e10cSrcweir }
1150cdf0e10cSrcweir #endif
1151