/src/samba/libcli/util/doserr.c
Line | Count | Source |
1 | | /* |
2 | | * Unix SMB/CIFS implementation. |
3 | | * DOS error routines |
4 | | * Copyright (C) Tim Potter 2002. |
5 | | * |
6 | | * This program is free software; you can redistribute it and/or modify |
7 | | * it under the terms of the GNU General Public License as published by |
8 | | * the Free Software Foundation; either version 3 of the License, or |
9 | | * (at your option) any later version. |
10 | | * |
11 | | * This program is distributed in the hope that it will be useful, |
12 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | | * GNU General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU General Public License |
17 | | * along with this program; if not, see <http://www.gnu.org/licenses/>. |
18 | | */ |
19 | | |
20 | | /* DOS error codes. please read doserr.h */ |
21 | | |
22 | | #include "replace.h" |
23 | | #include "libcli/util/werror.h" |
24 | | #include "libcli/util/hresult.h" |
25 | | |
26 | | struct werror_code_struct { |
27 | | const char *dos_errstr; |
28 | | WERROR werror; |
29 | | }; |
30 | | |
31 | | struct werror_str_struct { |
32 | | WERROR werror; |
33 | | const char *friendly_errstr; |
34 | | }; |
35 | | |
36 | | static const struct werror_code_struct special_errs[] = |
37 | | { |
38 | | { "WERR_DNS_ERROR_NOT_ALLOWED_ON_ACTIVE_SKD", WERR_DNS_ERROR_NOT_ALLOWED_ON_ACTIVE_SKD }, |
39 | | { "WERR_DNS_ERROR_INVALID_NSEC3_PARAMETERS", WERR_DNS_ERROR_INVALID_NSEC3_PARAMETERS }, |
40 | | { "WERR_DNS_ERROR_DNSSEC_IS_DISABLED", WERR_DNS_ERROR_DNSSEC_IS_DISABLED }, |
41 | | { "WERR_DNS_ERROR_NOT_ALLOWED_ON_UNSIGNED_ZONE", WERR_DNS_ERROR_NOT_ALLOWED_ON_UNSIGNED_ZONE }, |
42 | | { "WERR_DNS_ERROR_KSP_DOES_NOT_SUPPORT_PROTECTION", WERR_DNS_ERROR_KSP_DOES_NOT_SUPPORT_PROTECTION }, |
43 | | { "WERR_DNS_ERROR_BAD_KEYMASTER", WERR_DNS_ERROR_BAD_KEYMASTER }, |
44 | | { "WERR_USER_APC", WERR_USER_APC }, |
45 | | { "WERR_DNS_ERROR_UNEXPECTED_DATA_PROTECTION_ERROR", WERR_DNS_ERROR_UNEXPECTED_DATA_PROTECTION_ERROR }, |
46 | | { "WERR_WAIT_2", WERR_WAIT_2 }, |
47 | | { "WERR_WAIT_3", WERR_WAIT_3 }, |
48 | | { "WERR_WAIT_1", WERR_WAIT_1 }, |
49 | | { "WERR_DNS_ERROR_NSEC3_NAME_COLLISION", WERR_DNS_ERROR_NSEC3_NAME_COLLISION }, |
50 | | { "WERR_DNS_ERROR_KSP_NOT_ACCESSIBLE", WERR_DNS_ERROR_KSP_NOT_ACCESSIBLE }, |
51 | | { "WERR_DNS_ERROR_ROLLOVER_NOT_POKEABLE", WERR_DNS_ERROR_ROLLOVER_NOT_POKEABLE }, |
52 | | { "WERR_DNS_ERROR_INVALID_KEY_SIZE", WERR_DNS_ERROR_INVALID_KEY_SIZE }, |
53 | | { "WERR_DNS_ERROR_ROLLOVER_ALREADY_QUEUED", WERR_DNS_ERROR_ROLLOVER_ALREADY_QUEUED }, |
54 | | { "WERR_DNS_ERROR_UNKNOWN_SIGNING_PARAMETER_VERSION", WERR_DNS_ERROR_UNKNOWN_SIGNING_PARAMETER_VERSION }, |
55 | | { "WERR_DNS_ERROR_INVALID_INITIAL_ROLLOVER_OFFSET", WERR_DNS_ERROR_INVALID_INITIAL_ROLLOVER_OFFSET }, |
56 | | { "WERR_DNS_ERROR_SIGNING_KEY_NOT_ACCESSIBLE", WERR_DNS_ERROR_SIGNING_KEY_NOT_ACCESSIBLE }, |
57 | | { "WERR_DNS_REQUEST_PENDING", WERR_DNS_REQUEST_PENDING }, |
58 | | { "WERR_LOG_HARD_ERROR", WERR_LOG_HARD_ERROR }, |
59 | | { "WERR_DNS_ERROR_NOT_ALLOWED_ON_ZSK", WERR_DNS_ERROR_NOT_ALLOWED_ON_ZSK }, |
60 | | { "WERR_OK", WERR_OK }, |
61 | | { "WERR_DNS_ERROR_KEYMASTER_REQUIRED", WERR_DNS_ERROR_KEYMASTER_REQUIRED }, |
62 | | { "WERR_STATUS_MORE_ENTRIES", WERR_STATUS_MORE_ENTRIES }, |
63 | | { "WERR_DS_INVALID_ATTRIBUTE_SYNTAX", WERR_DS_INVALID_ATTRIBUTE_SYNTAX }, |
64 | | { "WERR_ALERTED", WERR_ALERTED }, |
65 | | { "WERR_DNS_ERROR_UNSUPPORTED_ALGORITHM", WERR_DNS_ERROR_UNSUPPORTED_ALGORITHM }, |
66 | | { "WERR_DNS_ERROR_INVALID_NSEC3_ITERATION_COUNT", WERR_DNS_ERROR_INVALID_NSEC3_ITERATION_COUNT }, |
67 | | { "WERR_DNS_ERROR_INVALID_XML", WERR_DNS_ERROR_INVALID_XML }, |
68 | | { "WERR_DNS_ERROR_DELEGATION_REQUIRED", WERR_DNS_ERROR_DELEGATION_REQUIRED }, |
69 | | { "WERR_ABANDONED_WAIT_63", WERR_ABANDONED_WAIT_63 }, |
70 | | { "WERR_DNS_ERROR_UNEXPECTED_CNG_ERROR", WERR_DNS_ERROR_UNEXPECTED_CNG_ERROR }, |
71 | | { "WERR_DNS_ERROR_DNAME_COLLISION", WERR_DNS_ERROR_DNAME_COLLISION }, |
72 | | { "WERR_DNS_ERROR_INVALID_POLICY_TABLE", WERR_DNS_ERROR_INVALID_POLICY_TABLE }, |
73 | | { "WERR_DNS_ERROR_NO_VALID_TRUST_ANCHORS", WERR_DNS_ERROR_NO_VALID_TRUST_ANCHORS }, |
74 | | { "WERR_MULTIPLE_FAULT_VIOLATION", WERR_MULTIPLE_FAULT_VIOLATION }, |
75 | | { "WERR_DNS_ERROR_INVALID_ROLLOVER_PERIOD", WERR_DNS_ERROR_INVALID_ROLLOVER_PERIOD }, |
76 | | { "WERR_DNS_ERROR_INVALID_SIGNATURE_VALIDITY_PERIOD", WERR_DNS_ERROR_INVALID_SIGNATURE_VALIDITY_PERIOD }, |
77 | | { "WERR_DNS_ERROR_NOT_ENOUGH_SIGNING_KEY_DESCRIPTORS", WERR_DNS_ERROR_NOT_ENOUGH_SIGNING_KEY_DESCRIPTORS }, |
78 | | { "WERR_INVALID_PRIMARY_GROUP", WERR_INVALID_PRIMARY_GROUP }, |
79 | | { "WERR_KERNEL_APC", WERR_KERNEL_APC }, |
80 | | { "WERR_DNS_ERROR_NOT_ALLOWED_UNDER_DNAME", WERR_DNS_ERROR_NOT_ALLOWED_UNDER_DNAME }, |
81 | | { "WERR_DNS_ERROR_TOO_MANY_SKDS", WERR_DNS_ERROR_TOO_MANY_SKDS }, |
82 | | { "WERR_DNS_ERROR_NODE_IS_DNMAE", WERR_DNS_ERROR_NODE_IS_DNAME }, |
83 | | { "WERR_DNS_ERROR_NODE_IS_DNAME", WERR_DNS_ERROR_NODE_IS_DNAME }, |
84 | | { "WERR_SERVICE_NOTIFICATION", WERR_SERVICE_NOTIFICATION }, |
85 | | { "WERR_WAIT_63", WERR_WAIT_63 }, |
86 | | { "WERR_DNS_ERROR_STANDBY_KEY_NOT_PRESENT", WERR_DNS_ERROR_STANDBY_KEY_NOT_PRESENT }, |
87 | | { "WERR_DNS_ERROR_ALIAS_LOOP", WERR_DNS_ERROR_ALIAS_LOOP }, |
88 | | { "WERR_DNS_ERROR_ROLLOVER_IN_PROGRESS", WERR_DNS_ERROR_ROLLOVER_IN_PROGRESS }, |
89 | | { "WERR_DNS_ERROR_NOT_ALLOWED_ON_SIGNED_ZONE", WERR_DNS_ERROR_NOT_ALLOWED_ON_SIGNED_ZONE }, |
90 | | { 0, W_ERROR(0) } |
91 | | }; |
92 | | |
93 | | /***************************************************************************** |
94 | | returns a windows error message. not amazingly helpful, but better than a number. |
95 | | *****************************************************************************/ |
96 | | const char *win_errstr(WERROR werror) |
97 | 24.8M | { |
98 | 24.8M | static char msg[40]; |
99 | 24.8M | int idx = 0; |
100 | | |
101 | 1.20G | while (special_errs[idx].dos_errstr != NULL) { |
102 | 1.18G | if (W_ERROR_V(special_errs[idx].werror) == |
103 | 1.18G | W_ERROR_V(werror)) |
104 | 3.85M | return special_errs[idx].dos_errstr; |
105 | 1.17G | idx++; |
106 | 1.17G | } |
107 | | |
108 | 21.0M | idx = 0; |
109 | | |
110 | 21.0M | switch W_ERROR_V(werror) { |
111 | 0 | #include "werror_gen.c" |
112 | 18.9M | default: |
113 | 18.9M | break; |
114 | 21.0M | } |
115 | | |
116 | | /* |
117 | | * WERROR codes are 16-bit only, if the |
118 | | * upper 16-bit are not 0, it's likely |
119 | | * an HRESULT. |
120 | | * |
121 | | * E.g. we should display HRES_SEC_E_WRONG_PRINCIPAL instead of |
122 | | * 'DOS code 0x80090322' |
123 | | */ |
124 | 18.9M | if ((W_ERROR_V(werror) & 0xFFFF0000) != 0) { |
125 | 17.3M | HRESULT hres = HRES_ERROR(W_ERROR_V(werror)); |
126 | 17.3M | return hresult_errstr(hres); |
127 | 17.3M | } |
128 | | |
129 | 1.65M | slprintf(msg, sizeof(msg), "DOS code 0x%08x", W_ERROR_V(werror)); |
130 | | |
131 | 1.65M | return msg; |
132 | 18.9M | } |
133 | | |
134 | | /***************************************************************************** |
135 | | Get friendly error string for WERRORs |
136 | | *****************************************************************************/ |
137 | | |
138 | | const char *get_friendly_werror_msg(WERROR werror) |
139 | 0 | { |
140 | 0 | switch W_ERROR_V(werror) { |
141 | 0 | #include "werror_friendly_gen.c" |
142 | 0 | default: |
143 | 0 | break; |
144 | 0 | } |
145 | | |
146 | 0 | return win_errstr(werror); |
147 | 0 | } |