1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. All rights reserved.
3 * Copyright 2002-2009, Axel D��rfler, axeld@pinc-software.de.
4 * Distributed under the terms of the MIT License.
5 */
6
7
8#include <errno.h>
9#include <sys/stat.h>
10
11#include <compat/sys/stat.h>
12
13#include <errno_private.h>
14#include <syscalls.h>
15#include <symbol_versioning.h>
16#include <syscall_utils.h>
17
18
19// prototypes for the compiler
20int _stat_current(const char* path, struct stat* stat);
21int _fstat_current(int fd, struct stat* stat);
22int _lstat_current(const char* path, struct stat* stat);
23int _stat_beos(const char* path, struct stat_beos* beosStat);
24int _fstat_beos(int fd, struct stat_beos* beosStat);
25int _lstat_beos(const char* path, struct stat_beos* beosStat);
26
27
28int
29_stat_current(const char* path, struct stat* stat)
30{
31	int status = _kern_read_stat(-1, path, true, stat, sizeof(struct stat));
32
33	RETURN_AND_SET_ERRNO(status);
34}
35
36
37int
38_fstat_current(int fd, struct stat* stat)
39{
40	int status = _kern_read_stat(fd, NULL, false, stat, sizeof(struct stat));
41
42	RETURN_AND_SET_ERRNO(status);
43}
44
45
46int
47_lstat_current(const char* path, struct stat* stat)
48{
49	int status = _kern_read_stat(-1, path, false, stat, sizeof(struct stat));
50
51	RETURN_AND_SET_ERRNO(status);
52}
53
54
55int
56fstatat(int fd, const char *path, struct stat *st, int flag)
57{
58	int status = _kern_read_stat(fd, path, (flag & AT_SYMLINK_NOFOLLOW) == 0,
59		st, sizeof(struct stat));
60
61	RETURN_AND_SET_ERRNO(status);
62}
63
64
65// #pragma mark - BeOS compatibility
66
67
68void
69convert_to_stat_beos(const struct stat* stat, struct stat_beos* beosStat)
70{
71	if (stat == NULL || beosStat == NULL)
72		return;
73
74	beosStat->st_dev = stat->st_dev;
75	beosStat->st_ino = stat->st_ino;
76	beosStat->st_mode = stat->st_mode;
77	beosStat->st_nlink = stat->st_nlink;
78	beosStat->st_uid = stat->st_uid;
79	beosStat->st_gid = stat->st_gid;
80	beosStat->st_size = stat->st_size;
81	beosStat->st_rdev = stat->st_rdev;
82	beosStat->st_blksize = stat->st_blksize;
83	beosStat->st_atime = stat->st_atime;
84	beosStat->st_mtime = stat->st_mtime;
85	beosStat->st_ctime = stat->st_ctime;
86	beosStat->st_crtime = stat->st_crtime;
87}
88
89
90void
91convert_from_stat_beos(const struct stat_beos* beosStat, struct stat* stat)
92{
93	if (stat == NULL || beosStat == NULL)
94		return;
95
96	stat->st_dev = beosStat->st_dev;
97	stat->st_ino = beosStat->st_ino;
98	stat->st_mode = beosStat->st_mode;
99	stat->st_nlink = beosStat->st_nlink;
100	stat->st_uid = beosStat->st_uid;
101	stat->st_gid = beosStat->st_gid;
102	stat->st_size = beosStat->st_size;
103	stat->st_rdev = beosStat->st_rdev;
104	stat->st_blksize = beosStat->st_blksize;
105	stat->st_atim.tv_sec = beosStat->st_atime;
106	stat->st_atim.tv_nsec = 0;
107	stat->st_mtim.tv_sec = beosStat->st_mtime;
108	stat->st_mtim.tv_nsec = 0;
109	stat->st_ctim.tv_sec = beosStat->st_ctime;
110	stat->st_ctim.tv_nsec = 0;
111	stat->st_crtim.tv_sec = beosStat->st_crtime;
112	stat->st_crtim.tv_nsec = 0;
113	stat->st_type = 0;
114	stat->st_blocks = 0;
115}
116
117
118int
119_stat_beos(const char* path, struct stat_beos* beosStat)
120{
121	struct stat stat;
122	if (_stat_current(path, &stat) != 0)
123		return -1;
124
125	convert_to_stat_beos(&stat, beosStat);
126
127	return 0;
128}
129
130
131int
132_fstat_beos(int fd, struct stat_beos* beosStat)
133{
134	struct stat stat;
135	if (_fstat_current(fd, &stat) != 0)
136		return -1;
137
138	convert_to_stat_beos(&stat, beosStat);
139
140	return 0;
141}
142
143
144int
145_lstat_beos(const char* path, struct stat_beos* beosStat)
146{
147	struct stat stat;
148	if (_lstat_current(path, &stat) != 0)
149		return -1;
150
151	convert_to_stat_beos(&stat, beosStat);
152
153	return 0;
154}
155
156
157DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("_stat_beos", "stat@", "BASE");
158DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("_fstat_beos", "fstat@", "BASE");
159DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("_lstat_beos", "lstat@", "BASE");
160
161DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("_stat_current", "stat@@", "1_ALPHA1");
162DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("_fstat_current", "fstat@@", "1_ALPHA1");
163DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("_lstat_current", "lstat@@", "1_ALPHA1");
164