xref: /haiku/src/tools/fs_shell/stat.cpp (revision b671e9bbdbd10268a042b4f4cc4317ccd03d105e)
1 /*
2  * Copyright 2007, Ingo Weinhold, bonefish@cs.tu-berlin.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 #include "compatibility.h"
7 
8 #include "fssh_stat.h"
9 
10 #include <SupportDefs.h>
11 
12 #include <sys/stat.h>
13 
14 #include "fssh_errno.h"
15 #include "partition_support.h"
16 #include "stat_priv.h"
17 #include "stat_util.h"
18 
19 
20 using FSShell::from_platform_stat;
21 using FSShell::to_platform_mode;
22 
23 
24 #if (!defined(__BEOS__) && !defined(__HAIKU__))
25 	// The _kern_read_stat() defined in libroot_build.so.
26 	extern "C" status_t _kern_read_stat(int fd, const char *path,
27 		bool traverseLink, struct stat *st, size_t statSize);
28 #endif
29 
30 
31 int
32 FSShell::unrestricted_stat(const char *path, struct fssh_stat *fsshStat)
33 {
34 	struct stat st;
35 
36 	// Use the _kern_read_stat() defined in libroot on BeOS incompatible
37 	// systems. Required for support for opening symlinks.
38 #if (defined(__BEOS__) || defined(__HAIKU__))
39 	if (::stat(path, &st) < 0)
40 		return -1;
41 #else
42 	status_t error = _kern_read_stat(-1, path, true, &st, sizeof(st));
43 	if (error < 0) {
44 		fssh_set_errno(error);
45 		return -1;
46 	}
47 #endif
48 
49 	from_platform_stat(&st, fsshStat);
50 
51 	return 0;
52 }
53 
54 
55 int
56 FSShell::unrestricted_fstat(int fd, struct fssh_stat *fsshStat)
57 {
58 	struct stat st;
59 
60 	// Use the _kern_read_stat() defined in libroot on BeOS incompatible
61 	// systems. Required for support for opening symlinks.
62 #if (defined(__BEOS__) || defined(__HAIKU__))
63 	if (fstat(fd, &st) < 0)
64 		return -1;
65 #else
66 	status_t error = _kern_read_stat(fd, NULL, false, &st, sizeof(st));
67 	if (error < 0) {
68 		fssh_set_errno(error);
69 		return -1;
70 	}
71 #endif
72 
73 	from_platform_stat(&st, fsshStat);
74 
75 	return 0;
76 }
77 
78 
79 int
80 FSShell::unrestricted_lstat(const char *path, struct fssh_stat *fsshStat)
81 {
82 	struct stat st;
83 
84 	// Use the _kern_read_stat() defined in libroot on BeOS incompatible
85 	// systems. Required for support for opening symlinks.
86 #if (defined(__BEOS__) || defined(__HAIKU__))
87 	if (lstat(path, &st) < 0)
88 		return -1;
89 #else
90 	status_t error = _kern_read_stat(-1, path, false, &st, sizeof(st));
91 	if (error < 0) {
92 		fssh_set_errno(error);
93 		return -1;
94 	}
95 #endif
96 
97 	from_platform_stat(&st, fsshStat);
98 
99 	return 0;
100 }
101 
102 // #pragma mark -
103 
104 int
105 fssh_mkdir(const char *path, fssh_mode_t mode)
106 {
107 	return mkdir(path, to_platform_mode(mode));
108 }
109 
110 
111 int
112 fssh_stat(const char *path, struct fssh_stat *fsshStat)
113 {
114 	if (FSShell::unrestricted_stat(path, fsshStat) < 0)
115 		return -1;
116 
117 	FSShell::restricted_file_restrict_stat(fsshStat);
118 
119 	return 0;
120 }
121 
122 
123 int
124 fssh_fstat(int fd, struct fssh_stat *fsshStat)
125 {
126 	if (FSShell::unrestricted_fstat(fd, fsshStat) < 0)
127 		return -1;
128 
129 	FSShell::restricted_file_restrict_stat(fsshStat);
130 
131 	return 0;
132 }
133 
134 
135 int
136 fssh_lstat(const char *path, struct fssh_stat *fsshStat)
137 {
138 	if (FSShell::unrestricted_lstat(path, fsshStat) < 0)
139 		return -1;
140 
141 	FSShell::restricted_file_restrict_stat(fsshStat);
142 
143 	return 0;
144 }
145