Use NameFromFH and ExamineFH if a file handle is passed to __stat().
[AROS.git] / compiler / clib / lstat.c
blob2a6f219c1c410c485642df92fb72cd083266ecba
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include <aros/debug.h>
8 #include <dos/filesystem.h>
9 #include <proto/dos.h>
11 #include <errno.h>
13 #include "__arosc_privdata.h"
14 #include "__errno.h"
15 #include "__filesystem_support.h"
16 #include "__stat.h"
17 #include "__upath.h"
19 /* like Dos_Lock() but no automatic soft link resolution */
20 static BPTR __lock(
21 const char* name,
22 LONG accessMode);
24 /*****************************************************************************
26 NAME */
28 #include <sys/stat.h>
30 int lstat(
32 /* SYNOPSIS */
33 const char *path,
34 struct stat *sb)
36 /* FUNCTION
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
40 of that structure.
42 INPUTS
43 path - Pathname of the file
44 sb - Pointer to stat structure that will be filled by the lstat() call.
46 RESULT
47 0 on success and -1 on error. If an error occurred, the global
48 variable errno is set.
50 NOTES
52 EXAMPLE
54 BUGS
56 SEE ALSO
57 stat(), fstat()
59 INTERNALS
60 Consult stat() documentation for details.
62 ******************************************************************************/
64 int res = 0;
65 BPTR lock;
67 /* check for empty path before potential conversion from "." to "" */
68 if (__doupath && path && *path == '\0')
70 errno = ENOENT;
71 return -1;
74 path = __path_u2a(path);
75 if (path == NULL)
76 return -1;
78 lock = __lock(path, SHARED_LOCK);
79 if (!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
90 SetIoErr(0);
91 return __stat_from_path(path, sb);
94 errno = IoErr2errno(IoErr());
95 return -1;
97 else
98 res = __stat(lock, sb, FALSE);
100 UnLock(lock);
102 return res;
105 static BPTR __lock(
106 const char* name,
107 LONG accessMode)
109 return Lock(name, accessMode);