Upgraded GRUB2 to 2.00 release.
[AROS.git] / compiler / clib / lstat.c
blob046800331775797502c4ee0468e2ff883824909d
1 /*
2 Copyright © 1995-2012, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include <aros/debug.h>
8 #include <proto/dos.h>
10 #include <errno.h>
12 #include "__arosc_privdata.h"
13 #include "__filesystem_support.h"
14 #include "__stat.h"
15 #include "__upath.h"
17 /* like Dos_Lock() but no automatic soft link resolution */
18 static BPTR __lock(
19 const char* name,
20 LONG accessMode);
22 /*****************************************************************************
24 NAME */
26 #include <sys/stat.h>
28 int lstat(
30 /* SYNOPSIS */
31 const char *path,
32 struct stat *sb)
34 /* FUNCTION
35 Returns information about a file like stat does except that lstat
36 does not follow symbolic links. Information is stored in stat
37 structure. Consult stat() documentation for detailed description
38 of that structure.
40 INPUTS
41 path - Pathname of the file
42 sb - Pointer to stat structure that will be filled by the lstat() call.
44 RESULT
45 0 on success and -1 on error. If an error occurred, the global
46 variable errno is set.
48 NOTES
50 EXAMPLE
52 BUGS
54 SEE ALSO
55 stat(), fstat()
57 INTERNALS
58 Consult stat() documentation for details.
60 ******************************************************************************/
62 struct aroscbase *aroscbase = __aros_getbase();
63 int res = 0;
64 BPTR lock;
66 /* check for empty path before potential conversion from "." to "" */
67 if (aroscbase->acb_doupath && path && *path == '\0')
69 errno = ENOENT;
70 return -1;
73 path = __path_u2a(path);
74 if (path == NULL)
75 return -1;
77 lock = __lock(path, SHARED_LOCK);
78 if (!lock)
80 if ( IoErr() == ERROR_IS_SOFT_LINK
81 || IoErr() == ERROR_OBJECT_IN_USE)
83 /* either the file is already locked exclusively
84 or it is a soft link, in both cases only way
85 to get info about it is to find it in the
86 parent directory with the ExNext() function
89 SetIoErr(0);
90 return __stat_from_path(path, sb);
93 errno = __arosc_ioerr2errno(IoErr());
94 return -1;
96 else
97 res = __stat(lock, sb, FALSE);
99 UnLock(lock);
101 return res;
104 static BPTR __lock(
105 const char* name,
106 LONG accessMode)
108 return Lock(name, accessMode);