2 Copyright © 1995-2009, The AROS Development Team. All rights reserved.
6 #include <aros/debug.h>
8 #include <dos/filesystem.h>
13 #include "__arosc_privdata.h"
15 #include "__filesystem_support.h"
19 /* like Dos.Lock but no automatick soft link resolution */
24 /*****************************************************************************
37 Returns information about a file like stat does except that lstat
38 does not follow symbolic links. Information is stored in stat
39 structure. Consult stat() documentation for detailed description
43 path - Pathname of the file
44 sb - Pointer to stat structure that will be filled by the lstat() call.
47 0 on success and -1 on error. If an error occurred, the global
48 variable errno is set.
60 Consult stat() documentation for details.
62 ******************************************************************************/
67 /* check for empty path before potential conversion from "." to "" */
68 if (__doupath
&& path
&& *path
== '\0')
74 path
= __path_u2a(path
);
78 lock
= __lock(path
, SHARED_LOCK
);
81 if ( IoErr() == ERROR_IS_SOFT_LINK
82 || IoErr() == ERROR_OBJECT_IN_USE
)
84 /* either the file is already locked exclusively
85 or it is a soft link, in both cases only way
86 to get info about it is to find it in the
87 parent directory with the ExNext() function
91 return __stat_from_path(path
, sb
);
94 errno
= IoErr2errno(IoErr());
98 res
= __stat(lock
, sb
);
105 #ifdef AROS_DOS_PACKETS
110 return Lock(name
, accessMode
);
124 return Lock(name
, accessMode
);
126 /* Get pointer to process structure */
127 struct Process
*me
= (struct Process
*)FindTask(NULL
);
129 /* Create filehandle */
131 ret
= (struct FileHandle
*)AllocDosObject(DOS_FILEHANDLE
, NULL
);
135 /* Get pointer to I/O request. Use stackspace for now. */
136 struct IOFileSys iofs
;
138 /* Prepare I/O request. */
139 InitIOFS(&iofs
, FSA_OPEN
, DOSBase
);
144 iofs
.io_Union
.io_OPEN
.io_FileMode
= FMF_LOCK
| FMF_READ
;
148 iofs
.io_Union
.io_OPEN
.io_FileMode
= FMF_READ
;
152 D(bug("[Lock] incompatible mode %d\n", accessMode
));
153 FreeDosObject(DOS_FILEHANDLE
, ret
);
154 SetIoErr(ERROR_ACTION_NOT_KNOWN
);
158 iofs
.io_Union
.io_OPEN
.io_Filename
= StripVolume(name
);
163 if ((dvp
= GetDeviceProc(name
, dvp
)) == NULL
) {
168 error
= DoIOFS(&iofs
, dvp
, NULL
, DOSBase
);
169 } while (error
== ERROR_OBJECT_NOT_FOUND
);
171 if (error
== ERROR_NO_MORE_ENTRIES
)
172 error
= me
->pr_Result2
= ERROR_OBJECT_NOT_FOUND
;
178 ret
->fh_Device
= iofs
.IOFS
.io_Device
;
179 ret
->fh_Unit
= iofs
.IOFS
.io_Unit
;
185 FreeDosObject(DOS_FILEHANDLE
, ret
);
190 SetIoErr(ERROR_NO_FREE_STORE
);
195 #endif /* AROS_DOS_PACKETS */