Line data Source code
1 : /*
2 : * Unix SMB/CIFS implementation.
3 : * map unix to NT errors, an excerpt of libsmb/errormap.c
4 : * Copyright (C) Andrew Tridgell 2001
5 : * Copyright (C) Andrew Bartlett 2001
6 : * Copyright (C) Tim Potter 2000
7 : * Copyright (C) Jeremy Allison 2007
8 : *
9 : * This program is free software; you can redistribute it and/or modify
10 : * it under the terms of the GNU General Public License as published by
11 : * the Free Software Foundation; either version 3 of the License, or
12 : * (at your option) any later version.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program; if not, see <http://www.gnu.org/licenses/>.
21 : */
22 :
23 : #include "includes.h"
24 :
25 : /* Mapping from Unix, to NT error numbers */
26 :
27 : static const struct {
28 : int unix_error;
29 : NTSTATUS nt_error;
30 : } unix_nt_errmap[] = {
31 : { EAGAIN, NT_STATUS_NETWORK_BUSY },
32 : { EINTR, NT_STATUS_RETRY },
33 : #ifdef ENOBUFS
34 : { ENOBUFS, NT_STATUS_INSUFFICIENT_RESOURCES },
35 : #endif
36 : #ifdef EWOULDBLOCK
37 : { EWOULDBLOCK, NT_STATUS_NETWORK_BUSY },
38 : #endif
39 : { EPERM, NT_STATUS_ACCESS_DENIED },
40 : { EACCES, NT_STATUS_ACCESS_DENIED },
41 : { ENOENT, NT_STATUS_OBJECT_NAME_NOT_FOUND },
42 : { ENOTDIR, NT_STATUS_NOT_A_DIRECTORY },
43 : { EIO, NT_STATUS_IO_DEVICE_ERROR },
44 : { EBADF, NT_STATUS_INVALID_HANDLE },
45 : { EINVAL, NT_STATUS_INVALID_PARAMETER },
46 : { EEXIST, NT_STATUS_OBJECT_NAME_COLLISION},
47 : { ENFILE, NT_STATUS_TOO_MANY_OPENED_FILES },
48 : { EMFILE, NT_STATUS_TOO_MANY_OPENED_FILES },
49 : { ENOSPC, NT_STATUS_DISK_FULL },
50 : { ENOMEM, NT_STATUS_NO_MEMORY },
51 : { EISDIR, NT_STATUS_FILE_IS_A_DIRECTORY},
52 : { EMSGSIZE, NT_STATUS_PORT_MESSAGE_TOO_LONG },
53 : #ifdef EPIPE
54 : { EPIPE, NT_STATUS_CONNECTION_DISCONNECTED},
55 : #endif
56 : { EMLINK, NT_STATUS_TOO_MANY_LINKS },
57 : { ENOSYS, NT_STATUS_NOT_SUPPORTED },
58 : #ifdef ELOOP
59 : { ELOOP, NT_STATUS_OBJECT_PATH_NOT_FOUND },
60 : #endif
61 : #ifdef EFTYPE
62 : { EFTYPE, NT_STATUS_OBJECT_PATH_NOT_FOUND },
63 : #endif
64 : #ifdef EDQUOT
65 : { EDQUOT, NT_STATUS_DISK_FULL }, /* Windows apps need this, not NT_STATUS_QUOTA_EXCEEDED */
66 : #endif
67 : #ifdef ENOTEMPTY
68 : { ENOTEMPTY, NT_STATUS_DIRECTORY_NOT_EMPTY },
69 : #endif
70 : #ifdef EXDEV
71 : { EXDEV, NT_STATUS_NOT_SAME_DEVICE },
72 : #endif
73 : #ifdef EROFS
74 : { EROFS, NT_STATUS_MEDIA_WRITE_PROTECTED },
75 : #endif
76 : #ifdef ENAMETOOLONG
77 : { ENAMETOOLONG, NT_STATUS_OBJECT_NAME_INVALID },
78 : #endif
79 : #ifdef EFBIG
80 : { EFBIG, NT_STATUS_DISK_FULL },
81 : #endif
82 : #ifdef EADDRINUSE
83 : { EADDRINUSE, NT_STATUS_ADDRESS_ALREADY_ASSOCIATED},
84 : #endif
85 : #ifdef ENETUNREACH
86 : { ENETUNREACH, NT_STATUS_NETWORK_UNREACHABLE},
87 : #endif
88 : #ifdef EHOSTUNREACH
89 : { EHOSTUNREACH, NT_STATUS_HOST_UNREACHABLE},
90 : #endif
91 : #ifdef ECONNREFUSED
92 : { ECONNREFUSED, NT_STATUS_CONNECTION_REFUSED},
93 : #endif
94 : #ifdef ETIMEDOUT
95 : { ETIMEDOUT, NT_STATUS_IO_TIMEOUT},
96 : #endif
97 : #ifdef ECONNABORTED
98 : { ECONNABORTED, NT_STATUS_CONNECTION_ABORTED},
99 : #endif
100 : #ifdef ECONNRESET
101 : { ECONNRESET, NT_STATUS_CONNECTION_RESET},
102 : #endif
103 : #ifdef ENODEV
104 : { ENODEV, NT_STATUS_DEVICE_DOES_NOT_EXIST},
105 : #endif
106 : #ifdef ENOATTR
107 : { ENOATTR, NT_STATUS_NOT_FOUND },
108 : #endif
109 : #ifdef ECANCELED
110 : { ECANCELED, NT_STATUS_CANCELLED},
111 : #endif
112 : #ifdef ENOTSUP
113 : { ENOTSUP, NT_STATUS_NOT_SUPPORTED},
114 : #endif
115 : #ifdef ETXTBSY
116 : { ETXTBSY, NT_STATUS_SHARING_VIOLATION },
117 : #endif
118 : #ifdef EOVERFLOW
119 : { EOVERFLOW, NT_STATUS_ALLOTTED_SPACE_EXCEEDED },
120 : #endif
121 : { EINPROGRESS, NT_STATUS_MORE_PROCESSING_REQUIRED },
122 : #ifdef ERANGE
123 : { ERANGE, NT_STATUS_INTEGER_OVERFLOW },
124 : #endif
125 : #ifdef ENXIO
126 : { ENXIO, NT_STATUS_ILLEGAL_FUNCTION },
127 : #endif
128 : };
129 :
130 : /*********************************************************************
131 : Map an NT error code from a Unix error code.
132 : *********************************************************************/
133 :
134 2044649 : NTSTATUS map_nt_error_from_unix(int unix_error)
135 : {
136 2044649 : size_t i = 0;
137 :
138 2044649 : if (unix_error == 0) {
139 : /* we map this to an error, not success, as this
140 : function is only called in an error path. Lots of
141 : our virtualised functions may fail without making a
142 : unix system call that fails (such as when they are
143 : checking for some handle existing), so unix_error
144 : may be unset
145 : */
146 0 : return NT_STATUS_UNSUCCESSFUL;
147 : }
148 :
149 : /* Look through list */
150 24765434 : for (i=0;i<ARRAY_SIZE(unix_nt_errmap);i++) {
151 24765434 : if (unix_nt_errmap[i].unix_error == unix_error) {
152 2044649 : return unix_nt_errmap[i].nt_error;
153 : }
154 : }
155 :
156 : /* Default return */
157 0 : return NT_STATUS_ACCESS_DENIED;
158 : }
|