2005-10-31 15:28:19 +01:00
|
|
|
#include <lib.h>
|
|
|
|
#define lstat _lstat
|
2005-06-10 17:12:03 +02:00
|
|
|
#include <sys/stat.h>
|
2005-10-31 15:28:19 +01:00
|
|
|
#include <string.h>
|
2005-06-10 17:12:03 +02:00
|
|
|
|
2005-10-31 15:28:19 +01:00
|
|
|
PUBLIC int lstat(name, buffer)
|
|
|
|
_CONST char *name;
|
|
|
|
struct stat *buffer;
|
2005-06-10 17:12:03 +02:00
|
|
|
{
|
2005-10-31 15:28:19 +01:00
|
|
|
message m;
|
2005-11-07 14:15:09 +01:00
|
|
|
int r;
|
2011-07-01 21:35:54 +02:00
|
|
|
struct minix_prev_stat old_sb;
|
2005-10-31 15:28:19 +01:00
|
|
|
|
|
|
|
m.m1_i1 = strlen(name) + 1;
|
|
|
|
m.m1_p1 = (char *) name;
|
|
|
|
m.m1_p2 = (char *) buffer;
|
2011-07-01 21:35:54 +02:00
|
|
|
|
2010-06-08 15:58:01 +02:00
|
|
|
if((r = _syscall(VFS_PROC_NR, LSTAT, &m)) >= 0 || errno != ENOSYS)
|
2011-07-01 21:35:54 +02:00
|
|
|
return r;
|
|
|
|
|
|
|
|
errno = 0;
|
|
|
|
|
|
|
|
/* ENOSYS: new binary and old VFS, fallback to PREV_STAT.
|
|
|
|
* User has struct stat (buffer), VFS still fills minix_prev_stat.
|
|
|
|
*/
|
|
|
|
m.m1_i1 = strlen(name) + 1;
|
|
|
|
m.m1_p1 = (char *) name;
|
|
|
|
m.m1_p2 = (char *) &old_sb;
|
|
|
|
|
|
|
|
if((r = _syscall(VFS_PROC_NR, PREV_LSTAT, &m)) < 0)
|
|
|
|
return r;
|
|
|
|
|
|
|
|
memset(buffer, 0, sizeof(struct stat));
|
|
|
|
COPY_PREV_STAT_TO_NEW(buffer, &old_sb);
|
|
|
|
|
|
|
|
return r;
|
2005-06-10 17:12:03 +02:00
|
|
|
}
|