1 /*
2    Unix SMB/CIFS implementation.
3    NT error code constants
4    Copyright (C) Andrew Tridgell              1992-2000
5    Copyright (C) John H Terpstra              1996-2000
6    Copyright (C) Luke Kenneth Casson Leighton 1996-2000
7    Copyright (C) Paul Ashton                  1998-2000
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 #ifndef _NTSTATUS_H
24 #define _NTSTATUS_H
25 
26 #include "libcli/util/ntstatus_gen.h"
27 
28 /* the following rather strange looking definitions of NTSTATUS
29    are there in order to catch common coding errors where different error types
30    are mixed up. This is especially important as we slowly convert Samba
31    from using bool for internal functions
32 */
33 
34 #if defined(HAVE_IMMEDIATE_STRUCTURES)
35 typedef struct {uint32_t v;} NTSTATUS;
36 #define NT_STATUS(x) ((NTSTATUS) { x })
37 #define NT_STATUS_V(x) ((x).v)
38 #else
39 typedef uint32_t NTSTATUS;
40 #define NT_STATUS(x) (x)
41 #define NT_STATUS_V(x) (x)
42 #endif
43 
44 /* Win32 status codes. */
45 #define ERROR_INVALID_PARAMETER		  NT_STATUS(0x0057)
46 #define ERROR_INSUFFICIENT_BUFFER	  NT_STATUS(0x007a)
47 #define ERROR_INVALID_DATATYPE		  NT_STATUS(0x070c)
48 #define NT_STATUS_ERROR_DS_OBJ_STRING_NAME_EXISTS	NT_STATUS(0x2071)
49 #define NT_STATUS_ERROR_DS_INCOMPATIBLE_VERSION		NT_STATUS(0x2177)
50 #define NT_STATUS_SMB_NO_PREAUTH_INTEGRITY_HASH_OVERLAP	NT_STATUS(0xC05D0000)
51 
52 /* Other error codes that aren't in the list we use */
53 #define NT_STATUS_OK			  NT_STATUS_SUCCESS
54 
55 #define STATUS_MORE_ENTRIES		  NT_STATUS_MORE_ENTRIES
56 #define STATUS_BUFFER_OVERFLOW		  NT_STATUS_BUFFER_OVERFLOW
57 #define STATUS_NO_MORE_FILES		  NT_STATUS_NO_MORE_FILES
58 #define STATUS_NO_MORE_EAS		  NT_STATUS_NO_MORE_EAS
59 #define STATUS_INVALID_EA_NAME		  NT_STATUS_INVALID_EA_NAME
60 #define STATUS_INVALID_EA_FLAG		  NT_STATUS_INVALID_EA_FLAG
61 #define STATUS_SOME_UNMAPPED 		  NT_STATUS_SOME_NOT_MAPPED
62 #define STATUS_NOTIFY_CLEANUP		  NT_STATUS_NOTIFY_CLEANUP
63 #define STATUS_NOTIFY_ENUM_DIR		  NT_STATUS_NOTIFY_ENUM_DIR
64 #define STATUS_PENDING			  NT_STATUS_PENDING
65 #define STATUS_STOPPED_ON_SYMLINK	  NT_STATUS_STOPPED_ON_SYMLINK
66 #define STATUS_EA_LIST_INCONSISTENT	  NT_STATUS_EA_LIST_INCONSISTENT
67 #define NT_STATUS_INACCESSIBLE_SYSTEM_SHORTCUT		NT_STATUS(0x8000002d)
68 
69 #define NT_STATUS_ABIOS_NOT_PRESENT 		NT_STATUS(0xC0000000 | 0x010f)
70 #define NT_STATUS_ABIOS_LID_NOT_EXIST 		NT_STATUS(0xC0000000 | 0x0110)
71 #define NT_STATUS_ABIOS_LID_ALREADY_OWNED 	NT_STATUS(0xC0000000 | 0x0111)
72 #define NT_STATUS_ABIOS_NOT_LID_OWNER 		NT_STATUS(0xC0000000 | 0x0112)
73 #define NT_STATUS_ABIOS_INVALID_COMMAND 	NT_STATUS(0xC0000000 | 0x0113)
74 #define NT_STATUS_ABIOS_INVALID_LID 		NT_STATUS(0xC0000000 | 0x0114)
75 #define NT_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE 	NT_STATUS(0xC0000000 | 0x0115)
76 #define NT_STATUS_ABIOS_INVALID_SELECTOR 	NT_STATUS(0xC0000000 | 0x0116)
77 
78 #define NT_STATUS_HANDLE_NOT_WAITABLE 		NT_STATUS(0xC0000000 | 0x0036)
79 #define NT_STATUS_DEVICE_POWER_FAILURE 		NT_STATUS(0xC0000000 | 0x009e)
80 #define NT_STATUS_VHD_SHARED			NT_STATUS(0xC05CFF0A)
81 #define NT_STATUS_SMB_BAD_CLUSTER_DIALECT	NT_STATUS(0xC05D0001)
82 #define NT_STATUS_NO_SUCH_JOB 			NT_STATUS(0xC0000000 | 0xEDE)
83 
84 /*
85                        --------------
86                       /              \
87                      /      REST      \
88                     /        IN        \
89                    /       PEACE        \
90                   /                      \
91                   | NT_STATUS_NOPROBLEMO |
92                   |                      |
93                   |                      |
94                   |      4 September     |
95                   |                      |
96                   |         2001         |
97                  *|     *  *  *          | *
98         _________)/\\_//(\/(/\)/\//\/\///|_)_______
99 */
100 
101 /* I use NT_STATUS_FOOBAR when I have no idea what error code to use -
102  * this means we need a torture test */
103 #define NT_STATUS_FOOBAR NT_STATUS_UNSUCCESSFUL
104 
105 /*****************************************************************************
106  returns an NT error message.  not amazingly helpful, but better than a number.
107  *****************************************************************************/
108 const char *nt_errstr(NTSTATUS nt_code);
109 
110 /************************************************************************
111  Print friendler version fo NT error code
112  ***********************************************************************/
113 const char *get_friendly_nt_error_msg(NTSTATUS nt_code);
114 
115 /*****************************************************************************
116  returns an NT_STATUS constant as a string for inclusion in autogen C code
117  *****************************************************************************/
118 const char *get_nt_error_c_code(void *mem_ctx, NTSTATUS nt_code);
119 
120 /*****************************************************************************
121  returns the NT_STATUS constant matching the string supplied (as an NTSTATUS)
122  *****************************************************************************/
123 NTSTATUS nt_status_string_to_code(const char *nt_status_str);
124 
125 /* we need these here for openchange */
126 #ifndef likely
127 #define likely(x) (x)
128 #endif
129 #ifndef unlikely
130 #define unlikely(x) (x)
131 #endif
132 
133 #define NT_STATUS_IS_OK(x) (likely(NT_STATUS_V(x) == 0))
134 #define NT_STATUS_IS_ERR(x) (unlikely((NT_STATUS_V(x) & 0xc0000000) == 0xc0000000))
135 #define NT_STATUS_EQUAL(x,y) (NT_STATUS_V(x) == NT_STATUS_V(y))
136 
137 /*
138  * These macros (with the embedded return) are considered poor coding
139  * style per README.Coding
140  *
141  * Please do not use them in new code, and do not rely on them in
142  * projects external to Samba as they will go away at some point.
143  */
144 
145 #define NT_STATUS_HAVE_NO_MEMORY(x) do { \
146 	if (unlikely(!(x))) {		\
147 		return NT_STATUS_NO_MEMORY;\
148 	}\
149 } while (0)
150 
151 /* This varient is for when you want to free a local
152    temporary memory context in the error path */
153 #define NT_STATUS_HAVE_NO_MEMORY_AND_FREE(x, ctx) do {	\
154 	if (!(x)) {\
155 		talloc_free(ctx); \
156 		return NT_STATUS_NO_MEMORY;\
157 	}\
158 } while (0)
159 
160 #define NT_STATUS_IS_OK_RETURN(x) do { \
161 	if (NT_STATUS_IS_OK(x)) {\
162 		return x;\
163 	}\
164 } while (0)
165 
166 #define NT_STATUS_NOT_OK_RETURN(x) do { \
167 	if (!NT_STATUS_IS_OK(x)) {\
168 		return x;\
169 	}\
170 } while (0)
171 
172 #define NT_STATUS_NOT_OK_RETURN_AND_FREE(x, ctx) do {	\
173 	if (!NT_STATUS_IS_OK(x)) {\
174 		talloc_free(ctx); \
175 		return x;\
176 	}\
177 } while (0)
178 
179 #define NT_STATUS_IS_ERR_RETURN(x) do { \
180 	if (NT_STATUS_IS_ERR(x)) {\
181 		return x;\
182 	}\
183 } while (0)
184 
185 #define NT_STATUS_NOT_ERR_RETURN(x) do { \
186 	if (!NT_STATUS_IS_ERR(x)) {\
187 		return x;\
188 	}\
189 } while (0)
190 
191 /* this defines special NTSTATUS codes to represent DOS errors.  I
192    have chosen this macro to produce status codes in the invalid
193    NTSTATUS range */
194 #define NT_STATUS_DOS(class, code) NT_STATUS(0xF1000000 | ((class)<<16) | code)
195 #define NT_STATUS_IS_DOS(status) ((NT_STATUS_V(status) & 0xFF000000) == 0xF1000000)
196 #define NT_STATUS_DOS_CLASS(status) ((NT_STATUS_V(status) >> 16) & 0xFF)
197 #define NT_STATUS_DOS_CODE(status) (NT_STATUS_V(status) & 0xFFFF)
198 
199 /* define ldap error codes as NTSTATUS codes */
200 #define NT_STATUS_LDAP(code) NT_STATUS(0xF2000000 | code)
201 #define NT_STATUS_IS_LDAP(status) ((NT_STATUS_V(status) & 0xFF000000) == 0xF2000000)
202 #define NT_STATUS_LDAP_CODE(status) (NT_STATUS_V(status) & ~0xFF000000)
203 
204 #define NT_STATUS_IS_RPC(status) \
205 	(((NT_STATUS_V(status) & 0xFFFF) == 0xC0020000) || \
206 	 ((NT_STATUS_V(status) & 0xFFFF) == 0xC0030000))
207 
208 #endif /* _NTSTATUS_H */
209