Added initial unfs3 sources for version 0.9.22+dfsg-1maemo2
[unfs3] / unfs3 / error.c
1
2 /*
3  * UNFS3 error translation
4  * (C) 2004, Pascal Schmidt
5  * see file LICENSE for license details
6  */
7
8 /*
9  * translations from Unix errno to NFS error numbers
10  */
11
12 #include "config.h"
13
14 #include <rpc/rpc.h>
15 #include <errno.h>
16
17 #include "nfs.h"
18 #include "error.h"
19 #include "backend.h"
20
21 static int is_stale(void)
22 {
23     if (errno == ENOTDIR || errno == ELOOP || errno == ENOENT ||
24         errno == ENAMETOOLONG)
25         return -1;
26     else
27         return 0;
28 }
29
30 nfsstat3 symlink_err(void)
31 {
32     if (errno == EACCES || errno == EPERM)
33         return NFS3ERR_ACCES;
34     else if (is_stale())
35         return NFS3ERR_STALE;
36     else if (errno == EROFS)
37         return NFS3ERR_ROFS;
38     else if (errno == EEXIST)
39         return NFS3ERR_EXIST;
40     else if (errno == ENOSPC)
41         return NFS3ERR_NOSPC;
42 #ifdef EDQUOT
43     else if (errno == EDQUOT)
44         return NFS3ERR_DQUOT;
45 #endif
46     else if (errno == ENOSYS)
47         return NFS3ERR_NOTSUPP;
48     else if (errno == EINVAL)
49         return NFS3ERR_INVAL;
50     else
51         return NFS3ERR_IO;
52 }
53
54 nfsstat3 mkdir_err(void)
55 {
56     return symlink_err();
57 }
58
59 nfsstat3 mknod_err(void)
60 {
61     return symlink_err();
62 }
63
64 nfsstat3 link_err(void)
65 {
66     if (errno == EXDEV)
67         return NFS3ERR_XDEV;
68     else if (errno == EMLINK)
69         return NFS3ERR_MLINK;
70 #ifdef EDQUOT
71     else if (errno == EDQUOT)
72         return NFS3ERR_DQUOT;
73 #endif
74     else
75         return symlink_err();
76 }
77
78 nfsstat3 lookup_err(void)
79 {
80     if (errno == ENOENT)
81         return NFS3ERR_NOENT;
82 #ifdef ENOMEDIUM
83     else if (errno == ENOMEDIUM)
84         return NFS3ERR_NOENT;
85 #endif
86     else if (errno == EACCES)
87         return NFS3ERR_ACCES;
88     else if (errno == ENOTDIR || errno == ELOOP || errno == ENAMETOOLONG)
89         return NFS3ERR_STALE;
90     else if (errno == EINVAL)
91         return NFS3ERR_INVAL;
92     else
93         return NFS3ERR_IO;
94 }
95
96 nfsstat3 readlink_err(void)
97 {
98     if (errno == EINVAL)
99         return NFS3ERR_INVAL;
100     else if (errno == EACCES)
101         return NFS3ERR_ACCES;
102     else if (errno == ENOSYS)
103         return NFS3ERR_NOTSUPP;
104     else if (is_stale())
105         return NFS3ERR_STALE;
106     else
107         return NFS3ERR_IO;
108 }
109
110 nfsstat3 read_err(void)
111 {
112     if (errno == EINVAL)
113         return NFS3ERR_INVAL;
114     else if (is_stale())
115         return NFS3ERR_STALE;
116     else if (errno == EACCES)
117         return NFS3ERR_ACCES;
118     else if (errno == ENXIO || errno == ENODEV)
119         return NFS3ERR_NXIO;
120     else
121         return NFS3ERR_IO;
122 }
123
124 nfsstat3 write_open_err(void)
125 {
126     if (errno == EACCES)
127         return NFS3ERR_ACCES;
128     else if (is_stale())
129         return NFS3ERR_STALE;
130     else if (errno == EINVAL)
131         return NFS3ERR_INVAL;
132     else if (errno == EROFS)
133         return NFS3ERR_ROFS;
134     else
135         return NFS3ERR_IO;
136 }
137
138 nfsstat3 write_write_err(void)
139 {
140     if (errno == EINVAL)
141         return NFS3ERR_INVAL;
142     else if (errno == EFBIG)
143         return NFS3ERR_FBIG;
144     else if (errno == ENOSPC)
145         return NFS3ERR_NOSPC;
146 #ifdef EDQUOT
147     else if (errno == EDQUOT)
148         return NFS3ERR_DQUOT;
149 #endif
150     else
151         return NFS3ERR_IO;
152 }
153
154 nfsstat3 create_err(void)
155 {
156     if (errno == EACCES)
157         return NFS3ERR_ACCES;
158     else if (is_stale())
159         return NFS3ERR_STALE;
160     else if (errno == EROFS)
161         return NFS3ERR_ROFS;
162     else if (errno == ENOSPC)
163         return NFS3ERR_NOSPC;
164     else if (errno == EEXIST)
165         return NFS3ERR_EXIST;
166 #ifdef EDQUOT
167     else if (errno == EDQUOT)
168         return NFS3ERR_DQUOT;
169 #endif
170     else
171         return NFS3ERR_IO;
172 }
173
174 nfsstat3 rename_err(void)
175 {
176     if (errno == EISDIR)
177         return NFS3ERR_ISDIR;
178     else if (errno == EXDEV)
179         return NFS3ERR_XDEV;
180     else if (errno == EEXIST)
181         return NFS3ERR_EXIST;
182     else if (errno == ENOTEMPTY)
183         return NFS3ERR_NOTEMPTY;
184     else if (errno == EINVAL)
185         return NFS3ERR_INVAL;
186     else if (errno == ENOTDIR)
187         return NFS3ERR_NOTDIR;
188     else if (errno == EACCES || errno == EPERM)
189         return NFS3ERR_ACCES;
190     else if (errno == ENOENT)
191         return NFS3ERR_NOENT;
192     else if (errno == ELOOP || errno == ENAMETOOLONG)
193         return NFS3ERR_STALE;
194     else if (errno == EROFS)
195         return NFS3ERR_ROFS;
196     else if (errno == ENOSPC)
197         return NFS3ERR_NOSPC;
198 #ifdef EDQUOT
199     else if (errno == EDQUOT)
200         return NFS3ERR_DQUOT;
201 #endif
202     else
203         return NFS3ERR_IO;
204 }
205
206 nfsstat3 remove_err(void)
207 {
208     if (errno == EACCES || errno == EPERM)
209         return NFS3ERR_ACCES;
210     else if (errno == ENOENT)
211         return ENOENT;
212     else if (errno == ENOTDIR || errno == ELOOP || errno == ENAMETOOLONG)
213         return NFS3ERR_STALE;
214     else if (errno == EINVAL)
215         return NFS3ERR_INVAL;
216     else if (errno == EROFS)
217         return NFS3ERR_ROFS;
218     else
219         return NFS3ERR_IO;
220 }
221
222 nfsstat3 rmdir_err(void)
223 {
224     if (errno == ENOTEMPTY)
225         return NFS3ERR_NOTEMPTY;
226     else
227         return remove_err();
228 }
229
230 nfsstat3 setattr_err(void)
231 {
232     if (errno == EPERM)
233         return NFS3ERR_PERM;
234     else if (errno == EROFS)
235         return NFS3ERR_ROFS;
236     else if (is_stale())
237         return NFS3ERR_STALE;
238     else if (errno == EACCES)
239         return NFS3ERR_ACCES;
240 #ifdef EDQUOT
241     else if (errno == EDQUOT)
242         return NFS3ERR_DQUOT;
243 #endif
244     else if (errno == EINVAL)
245         return NFS3ERR_INVAL;
246     else
247         return NFS3ERR_IO;
248 }
249
250 nfsstat3 readdir_err(void)
251 {
252     if (errno == EPERM)
253         return NFS3ERR_PERM;
254     else if (errno == EACCES)
255         return NFS3ERR_ACCES;
256     else if (errno == ENOTDIR)
257         return NFS3ERR_NOTDIR;
258     else if (is_stale())
259         return NFS3ERR_STALE;
260     else if (errno == EINVAL)
261         return NFS3ERR_INVAL;
262     else
263         return NFS3ERR_IO;
264 }
265
266 /*
267  * combine two error values
268  */
269 nfsstat3 join(nfsstat3 x, nfsstat3 y)
270 {
271     return (x != NFS3_OK) ? x : y;
272 }
273
274 /*
275  * combine three error values
276  */
277 nfsstat3 join3(nfsstat3 x, nfsstat3 y, nfsstat3 z)
278 {
279     return (x != NFS3_OK) ? x : join(y, z);
280 }