diff options
Diffstat (limited to 'source4/libcli/util')
-rw-r--r-- | source4/libcli/util/asn1.c | 303 | ||||
-rw-r--r-- | source4/libcli/util/clierror.c | 72 | ||||
-rw-r--r-- | source4/libcli/util/clilsa.c | 3 | ||||
-rw-r--r-- | source4/libcli/util/doserr.c | 3 | ||||
-rw-r--r-- | source4/libcli/util/doserr.h | 125 | ||||
-rw-r--r-- | source4/libcli/util/error.h | 29 | ||||
-rw-r--r-- | source4/libcli/util/errormap.c | 5 | ||||
-rw-r--r-- | source4/libcli/util/nt_status.h | 122 | ||||
-rw-r--r-- | source4/libcli/util/nterr.c | 3 | ||||
-rw-r--r-- | source4/libcli/util/ntstatus.h (renamed from source4/libcli/util/nterr.h) | 93 | ||||
-rw-r--r-- | source4/libcli/util/werror.h | 193 |
11 files changed, 470 insertions, 481 deletions
diff --git a/source4/libcli/util/asn1.c b/source4/libcli/util/asn1.c index e7a2e163aa..58cb5f07be 100644 --- a/source4/libcli/util/asn1.c +++ b/source4/libcli/util/asn1.c @@ -37,41 +37,41 @@ void asn1_free(struct asn1_data *data) } /* write to the ASN1 buffer, advancing the buffer pointer */ -BOOL asn1_write(struct asn1_data *data, const void *p, int len) +bool asn1_write(struct asn1_data *data, const void *p, int len) { - if (data->has_error) return False; + if (data->has_error) return false; if (data->length < data->ofs+len) { uint8_t *newp; newp = talloc_realloc(data, data->data, uint8_t, data->ofs+len); if (!newp) { asn1_free(data); - data->has_error = True; - return False; + data->has_error = true; + return false; } data->data = newp; data->length = data->ofs+len; } memcpy(data->data + data->ofs, p, len); data->ofs += len; - return True; + return true; } /* useful fn for writing a uint8_t */ -BOOL asn1_write_uint8(struct asn1_data *data, uint8_t v) +bool asn1_write_uint8(struct asn1_data *data, uint8_t v) { return asn1_write(data, &v, 1); } /* push a tag onto the asn1 data buffer. Used for nested structures */ -BOOL asn1_push_tag(struct asn1_data *data, uint8_t tag) +bool asn1_push_tag(struct asn1_data *data, uint8_t tag) { struct nesting *nesting; asn1_write_uint8(data, tag); nesting = talloc(data, struct nesting); if (!nesting) { - data->has_error = True; - return False; + data->has_error = true; + return false; } nesting->start = data->ofs; @@ -81,7 +81,7 @@ BOOL asn1_push_tag(struct asn1_data *data, uint8_t tag) } /* pop a tag */ -BOOL asn1_pop_tag(struct asn1_data *data) +bool asn1_pop_tag(struct asn1_data *data) { struct nesting *nesting; size_t len; @@ -89,8 +89,8 @@ BOOL asn1_pop_tag(struct asn1_data *data) nesting = data->nesting; if (!nesting) { - data->has_error = True; - return False; + data->has_error = true; + return false; } len = data->ofs - (nesting->start+1); /* yes, this is ugly. We don't know in advance how many bytes the length @@ -98,10 +98,10 @@ BOOL asn1_pop_tag(struct asn1_data *data) need to correct our mistake */ if (len > 0xFFFFFF) { data->data[nesting->start] = 0x84; - if (!asn1_write_uint8(data, 0)) return False; - if (!asn1_write_uint8(data, 0)) return False; - if (!asn1_write_uint8(data, 0)) return False; - if (!asn1_write_uint8(data, 0)) return False; + if (!asn1_write_uint8(data, 0)) return false; + if (!asn1_write_uint8(data, 0)) return false; + if (!asn1_write_uint8(data, 0)) return false; + if (!asn1_write_uint8(data, 0)) return false; memmove(data->data+nesting->start+5, data->data+nesting->start+1, len); data->data[nesting->start+1] = (len>>24) & 0xFF; data->data[nesting->start+2] = (len>>16) & 0xFF; @@ -109,23 +109,23 @@ BOOL asn1_pop_tag(struct asn1_data *data) data->data[nesting->start+4] = len&0xff; } else if (len > 0xFFFF) { data->data[nesting->start] = 0x83; - if (!asn1_write_uint8(data, 0)) return False; - if (!asn1_write_uint8(data, 0)) return False; - if (!asn1_write_uint8(data, 0)) return False; + if (!asn1_write_uint8(data, 0)) return false; + if (!asn1_write_uint8(data, 0)) return false; + if (!asn1_write_uint8(data, 0)) return false; memmove(data->data+nesting->start+4, data->data+nesting->start+1, len); data->data[nesting->start+1] = (len>>16) & 0xFF; data->data[nesting->start+2] = (len>>8) & 0xFF; data->data[nesting->start+3] = len&0xff; } else if (len > 255) { data->data[nesting->start] = 0x82; - if (!asn1_write_uint8(data, 0)) return False; - if (!asn1_write_uint8(data, 0)) return False; + if (!asn1_write_uint8(data, 0)) return false; + if (!asn1_write_uint8(data, 0)) return false; memmove(data->data+nesting->start+3, data->data+nesting->start+1, len); data->data[nesting->start+1] = len>>8; data->data[nesting->start+2] = len&0xff; } else if (len > 127) { data->data[nesting->start] = 0x81; - if (!asn1_write_uint8(data, 0)) return False; + if (!asn1_write_uint8(data, 0)) return false; memmove(data->data+nesting->start+2, data->data+nesting->start+1, len); data->data[nesting->start+1] = len; } else { @@ -134,20 +134,20 @@ BOOL asn1_pop_tag(struct asn1_data *data) data->nesting = nesting->next; talloc_free(nesting); - return True; + return true; } /* "i" is the one's complement representation, as is the normal result of an * implicit signed->unsigned conversion */ -static BOOL push_int_bigendian(struct asn1_data *data, unsigned int i, BOOL negative) +static bool push_int_bigendian(struct asn1_data *data, unsigned int i, bool negative) { uint8_t lowest = i & 0xFF; i = i >> 8; if (i != 0) if (!push_int_bigendian(data, i, negative)) - return False; + return false; if (data->nesting->start+1 == data->ofs) { @@ -157,14 +157,14 @@ static BOOL push_int_bigendian(struct asn1_data *data, unsigned int i, BOOL nega if (negative) { /* Don't write leading 0xff's */ if (lowest == 0xFF) - return True; + return true; if ((lowest & 0x80) == 0) { /* The only exception for a leading 0xff is if * the highest bit is 0, which would indicate * a positive value */ if (!asn1_write_uint8(data, 0xff)) - return False; + return false; } } else { if (lowest & 0x80) { @@ -172,7 +172,7 @@ static BOOL push_int_bigendian(struct asn1_data *data, unsigned int i, BOOL nega * this would indicate a negative number. Push * a 0 to indicate a positive one */ if (!asn1_write_uint8(data, 0)) - return False; + return false; } } } @@ -183,7 +183,7 @@ static BOOL push_int_bigendian(struct asn1_data *data, unsigned int i, BOOL nega /* write an Integer without the tag framing. Needed for example for the LDAP * Abandon Operation */ -BOOL asn1_write_implicit_Integer(struct asn1_data *data, int i) +bool asn1_write_implicit_Integer(struct asn1_data *data, int i) { if (i == -1) { /* -1 is special as it consists of all-0xff bytes. In @@ -198,14 +198,14 @@ BOOL asn1_write_implicit_Integer(struct asn1_data *data, int i) /* write an integer */ -BOOL asn1_write_Integer(struct asn1_data *data, int i) +bool asn1_write_Integer(struct asn1_data *data, int i) { - if (!asn1_push_tag(data, ASN1_INTEGER)) return False; - if (!asn1_write_implicit_Integer(data, i)) return False; + if (!asn1_push_tag(data, ASN1_INTEGER)) return false; + if (!asn1_write_implicit_Integer(data, i)) return false; return asn1_pop_tag(data); } -BOOL ber_write_OID_String(DATA_BLOB *blob, const char *OID) +bool ber_write_OID_String(DATA_BLOB *blob, const char *OID) { uint_t v, v2; const char *p = (const char *)OID; @@ -213,16 +213,16 @@ BOOL ber_write_OID_String(DATA_BLOB *blob, const char *OID) int i; v = strtoul(p, &newp, 10); - if (newp[0] != '.') return False; + if (newp[0] != '.') return false; p = newp + 1; v2 = strtoul(p, &newp, 10); - if (newp[0] != '.') return False; + if (newp[0] != '.') return false; p = newp + 1; /*the ber representation can't use more space then the string one */ *blob = data_blob(NULL, strlen(OID)); - if (!blob->data) return False; + if (!blob->data) return false; blob->data[0] = 40*v + v2; @@ -235,7 +235,7 @@ BOOL ber_write_OID_String(DATA_BLOB *blob, const char *OID) p = newp; } else { data_blob_free(blob); - return False; + return false; } if (v >= (1<<28)) blob->data[i++] = (0x80 | ((v>>28)&0x7f)); if (v >= (1<<21)) blob->data[i++] = (0x80 | ((v>>21)&0x7f)); @@ -246,31 +246,31 @@ BOOL ber_write_OID_String(DATA_BLOB *blob, const char *OID) blob->length = i; - return True; + return true; } /* write an object ID to a ASN1 buffer */ -BOOL asn1_write_OID(struct asn1_data *data, const char *OID) +bool asn1_write_OID(struct asn1_data *data, const char *OID) { DATA_BLOB blob; - if (!asn1_push_tag(data, ASN1_OID)) return False; + if (!asn1_push_tag(data, ASN1_OID)) return false; if (!ber_write_OID_String(&blob, OID)) { - data->has_error = True; - return False; + data->has_error = true; + return false; } if (!asn1_write(data, blob.data, blob.length)) { - data->has_error = True; - return False; + data->has_error = true; + return false; } data_blob_free(&blob); return asn1_pop_tag(data); } /* write an octet string */ -BOOL asn1_write_OctetString(struct asn1_data *data, const void *p, size_t length) +bool asn1_write_OctetString(struct asn1_data *data, const void *p, size_t length) { asn1_push_tag(data, ASN1_OCTET_STRING); asn1_write(data, p, length); @@ -279,14 +279,14 @@ BOOL asn1_write_OctetString(struct asn1_data *data, const void *p, size_t length } /* write a LDAP string */ -BOOL asn1_write_LDAPString(struct asn1_data *data, const char *s) +bool asn1_write_LDAPString(struct asn1_data *data, const char *s) { asn1_write(data, s, strlen(s)); return !data->has_error; } /* write a general string */ -BOOL asn1_write_GeneralString(struct asn1_data *data, const char *s) +bool asn1_write_GeneralString(struct asn1_data *data, const char *s) { asn1_push_tag(data, ASN1_GENERAL_STRING); asn1_write_LDAPString(data, s); @@ -294,7 +294,7 @@ BOOL asn1_write_GeneralString(struct asn1_data *data, const char *s) return !data->has_error; } -BOOL asn1_write_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *blob) +bool asn1_write_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *blob) { asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(num)); asn1_write(data, blob->data, blob->length); @@ -303,7 +303,7 @@ BOOL asn1_write_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *bl } /* write a BOOLEAN */ -BOOL asn1_write_BOOLEAN(struct asn1_data *data, BOOL v) +bool asn1_write_BOOLEAN(struct asn1_data *data, bool v) { asn1_push_tag(data, ASN1_BOOLEAN); asn1_write_uint8(data, v ? 0xFF : 0); @@ -311,137 +311,140 @@ BOOL asn1_write_BOOLEAN(struct asn1_data *data, BOOL v) return !data->has_error; } -BOOL asn1_read_BOOLEAN(struct asn1_data *data, BOOL *v) +bool asn1_read_BOOLEAN(struct asn1_data *data, bool *v) { uint8_t tmp = 0; asn1_start_tag(data, ASN1_BOOLEAN); asn1_read_uint8(data, &tmp); if (tmp == 0xFF) { - *v = True; + *v = true; } else { - *v = False; + *v = false; } asn1_end_tag(data); return !data->has_error; } /* check a BOOLEAN */ -BOOL asn1_check_BOOLEAN(struct asn1_data *data, BOOL v) +bool asn1_check_BOOLEAN(struct asn1_data *data, bool v) { uint8_t b = 0; asn1_read_uint8(data, &b); if (b != ASN1_BOOLEAN) { - data->has_error = True; - return False; + data->has_error = true; + return false; } asn1_read_uint8(data, &b); if (b != v) { - data->has_error = True; - return False; + data->has_error = true; + return false; } return !data->has_error; } /* load a struct asn1_data structure with a lump of data, ready to be parsed */ -BOOL asn1_load(struct asn1_data *data, DATA_BLOB blob) +bool asn1_load(struct asn1_data *data, DATA_BLOB blob) { ZERO_STRUCTP(data); data->data = talloc_memdup(data, blob.data, blob.length); if (!data->data) { - data->has_error = True; - return False; + data->has_error = true; + return false; } data->length = blob.length; - return True; + return true; } /* Peek into an ASN1 buffer, not advancing the pointer */ -BOOL asn1_peek(struct asn1_data *data, void *p, int len) +bool asn1_peek(struct asn1_data *data, void *p, int len) { + if (data->has_error) + return false; + if (len < 0 || data->ofs + len < data->ofs || data->ofs + len < len) - return False; + return false; if (data->ofs + len > data->length) { /* we need to mark the buffer as consumed, so the caller knows this was an out of data error, and not a decode error */ data->ofs = data->length; - return False; + return false; } memcpy(p, data->data + data->ofs, len); - return True; + return true; } /* read from a ASN1 buffer, advancing the buffer pointer */ -BOOL asn1_read(struct asn1_data *data, void *p, int len) +bool asn1_read(struct asn1_data *data, void *p, int len) { if (!asn1_peek(data, p, len)) { - data->has_error = True; - return False; + data->has_error = true; + return false; } data->ofs += len; - return True; + return true; } /* read a uint8_t from a ASN1 buffer */ -BOOL asn1_read_uint8(struct asn1_data *data, uint8_t *v) +bool asn1_read_uint8(struct asn1_data *data, uint8_t *v) { return asn1_read(data, v, 1); } -BOOL asn1_peek_uint8(struct asn1_data *data, uint8_t *v) +bool asn1_peek_uint8(struct asn1_data *data, uint8_t *v) { return asn1_peek(data, v, 1); } -BOOL asn1_peek_tag(struct asn1_data *data, uint8_t tag) +bool asn1_peek_tag(struct asn1_data *data, uint8_t tag) { uint8_t b; if (asn1_tag_remaining(data) <= 0) { - return False; + return false; } - if (!asn1_peek(data, &b, sizeof(b))) - return False; + if (!asn1_peek_uint8(data, &b)) + return false; return (b == tag); } /* start reading a nested asn1 structure */ -BOOL asn1_start_tag(struct asn1_data *data, uint8_t tag) +bool asn1_start_tag(struct asn1_data *data, uint8_t tag) { uint8_t b; struct nesting *nesting; if (!asn1_read_uint8(data, &b)) - return False; + return false; if (b != tag) { - data->has_error = True; - return False; + data->has_error = true; + return false; } nesting = talloc(data, struct nesting); if (!nesting) { - data->has_error = True; - return False; + data->has_error = true; + return false; } if (!asn1_read_uint8(data, &b)) { - return False; + return false; } if (b & 0x80) { int n = b & 0x7f; if (!asn1_read_uint8(data, &b)) - return False; + return false; nesting->taglen = b; while (n > 1) { if (!asn1_read_uint8(data, &b)) - return False; + return false; nesting->taglen = (nesting->taglen << 8) | b; n--; } @@ -452,32 +455,32 @@ BOOL asn1_start_tag(struct asn1_data *data, uint8_t tag) nesting->next = data->nesting; data->nesting = nesting; if (asn1_tag_remaining(data) == -1) { - return False; + return false; } return !data->has_error; } /* stop reading a tag */ -BOOL asn1_end_tag(struct asn1_data *data) +bool asn1_end_tag(struct asn1_data *data) { struct nesting *nesting; /* make sure we read it all */ if (asn1_tag_remaining(data) != 0) { - data->has_error = True; - return False; + data->has_error = true; + return false; } nesting = data->nesting; if (!nesting) { - data->has_error = True; - return False; + data->has_error = true; + return false; } data->nesting = nesting->next; talloc_free(nesting); - return True; + return true; } /* work out how many bytes are left in this nested tag */ @@ -489,38 +492,38 @@ int asn1_tag_remaining(struct asn1_data *data) } if (!data->nesting) { - data->has_error = True; + data->has_error = true; return -1; } remaining = data->nesting->taglen - (data->ofs - data->nesting->start); if (remaining > (data->length - data->ofs)) { - data->has_error = True; + data->has_error = true; return -1; } return remaining; } /* read an object ID from a data blob */ -BOOL ber_read_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **OID) +bool ber_read_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **OID) { int i; uint8_t *b; uint_t v; char *tmp_oid = NULL; - if (blob.length < 2) return False; + if (blob.length < 2) return false; b = blob.data; tmp_oid = talloc_asprintf(mem_ctx, "%u", b[0]/40); if (!tmp_oid) goto nomem; - tmp_oid = talloc_asprintf_append(tmp_oid, ".%u", b[0]%40); + tmp_oid = talloc_asprintf_append_buffer(tmp_oid, ".%u", b[0]%40); if (!tmp_oid) goto nomem; for(i = 1, v = 0; i < blob.length; i++) { v = (v<<7) | (b[i]&0x7f); if ( ! (b[i] & 0x80)) { - tmp_oid = talloc_asprintf_append(tmp_oid, ".%u", v); + tmp_oid = talloc_asprintf_append_buffer(tmp_oid, ".%u", v); v = 0; } if (!tmp_oid) goto nomem; @@ -528,82 +531,82 @@ BOOL ber_read_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **OID) if (v != 0) { talloc_free(tmp_oid); - return False; + return false; } *OID = tmp_oid; - return True; + return true; nomem: - return False; + return false; } /* read an object ID from a ASN1 buffer */ -BOOL asn1_read_OID(struct asn1_data *data, TALLOC_CTX *mem_ctx, const char **OID) +bool asn1_read_OID(struct asn1_data *data, TALLOC_CTX *mem_ctx, const char **OID) { DATA_BLOB blob; int len; - if (!asn1_start_tag(data, ASN1_OID)) return False; + if (!asn1_start_tag(data, ASN1_OID)) return false; len = asn1_tag_remaining(data); if (len < 0) { - data->has_error = True; - return False; + data->has_error = true; + return false; } blob = data_blob(NULL, len); if (!blob.data) { - data->has_error = True; - return False; + data->has_error = true; + return false; } asn1_read(data, blob.data, len); asn1_end_tag(data); if (data->has_error) { data_blob_free(&blob); - return False; + return false; } if (!ber_read_OID_String(mem_ctx, blob, OID)) { - data->has_error = True; + data->has_error = true; data_blob_free(&blob); - return False; + return false; } data_blob_free(&blob); - return True; + return true; } /* check that the next object ID is correct */ -BOOL asn1_check_OID(struct asn1_data *data, const char *OID) +bool asn1_check_OID(struct asn1_data *data, const char *OID) { const char *id; - if (!asn1_read_OID(data, data, &id)) return False; + if (!asn1_read_OID(data, data, &id)) return false; if (strcmp(id, OID) != 0) { talloc_free(discard_const(id)); - data->has_error = True; - return False; + data->has_error = true; + return false; } talloc_free(discard_const(id)); - return True; + return true; } /* read a LDAPString from a ASN1 buffer */ -BOOL asn1_read_LDAPString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s) +bool asn1_read_LDAPString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s) { int len; len = asn1_tag_remaining(data); if (len < 0) { - data->has_error = True; - return False; + data->has_error = true; + return false; } - *s = talloc_size(mem_ctx, len+1); + *s = talloc_array(mem_ctx, char, len+1); if (! *s) { - data->has_error = True; - return False; + data->has_error = true; + return false; } asn1_read(data, *s, len); (*s)[len] = 0; @@ -612,29 +615,29 @@ BOOL asn1_read_LDAPString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s) /* read a GeneralString from a ASN1 buffer */ -BOOL asn1_read_GeneralString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s) +bool asn1_read_GeneralString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s) { - if (!asn1_start_tag(data, ASN1_GENERAL_STRING)) return False; - if (!asn1_read_LDAPString(data, mem_ctx, s)) return False; + if (!asn1_start_tag(data, ASN1_GENERAL_STRING)) return false; + if (!asn1_read_LDAPString(data, mem_ctx, s)) return false; return asn1_end_tag(data); } /* read a octet string blob */ -BOOL asn1_read_OctetString(struct asn1_data *data, TALLOC_CTX *mem_ctx, DATA_BLOB *blob) +bool asn1_read_OctetString(struct asn1_data *data, TALLOC_CTX *mem_ctx, DATA_BLOB *blob) { int len; ZERO_STRUCTP(blob); - if (!asn1_start_tag(data, ASN1_OCTET_STRING)) return False; + if (!asn1_start_tag(data, ASN1_OCTET_STRING)) return false; len = asn1_tag_remaining(data); if (len < 0) { - data->has_error = True; - return False; + data->has_error = true; + return false; } *blob = data_blob_talloc(mem_ctx, NULL, len+1); if (!blob->data) { - data->has_error = True; - return False; + data->has_error = true; + return false; } asn1_read(data, blob->data, len); asn1_end_tag(data); @@ -644,25 +647,25 @@ BOOL asn1_read_OctetString(struct asn1_data *data, TALLOC_CTX *mem_ctx, DATA_BLO if (data->has_error) { data_blob_free(blob); *blob = data_blob(NULL, 0); - return False; + return false; } - return True; + return true; } -BOOL asn1_read_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *blob) +bool asn1_read_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *blob) { int len; ZERO_STRUCTP(blob); - if (!asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(num))) return False; + if (!asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(num))) return false; len = asn1_tag_remaining(data); if (len < 0) { - data->has_error = True; - return False; + data->has_error = true; + return false; } *blob = data_blob(NULL, len); if ((len != 0) && (!blob->data)) { - data->has_error = True; - return False; + data->has_error = true; + return false; } asn1_read(data, blob->data, len); asn1_end_tag(data); @@ -670,13 +673,13 @@ BOOL asn1_read_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *blo } /* read an interger without tag*/ -BOOL asn1_read_implicit_Integer(struct asn1_data *data, int *i) +bool asn1_read_implicit_Integer(struct asn1_data *data, int *i) { uint8_t b; *i = 0; while (!data->has_error && asn1_tag_remaining(data)>0) { - if (!asn1_read_uint8(data, &b)) return False; + if (!asn1_read_uint8(data, &b)) return false; *i = (*i << 8) + b; } return !data->has_error; @@ -684,21 +687,21 @@ BOOL asn1_read_implicit_Integer(struct asn1_data *data, int *i) } /* read an interger */ -BOOL asn1_read_Integer(struct asn1_data *data, int *i) +bool asn1_read_Integer(struct asn1_data *data, int *i) { *i = 0; - if (!asn1_start_tag(data, ASN1_INTEGER)) return False; - if (!asn1_read_implicit_Integer(data, i)) return False; + if (!asn1_start_tag(data, ASN1_INTEGER)) return false; + if (!asn1_read_implicit_Integer(data, i)) return false; return asn1_end_tag(data); } /* read an interger */ -BOOL asn1_read_enumerated(struct asn1_data *data, int *v) +bool asn1_read_enumerated(struct asn1_data *data, int *v) { *v = 0; - if (!asn1_start_tag(data, ASN1_ENUMERATED)) return False; + if (!asn1_start_tag(data, ASN1_ENUMERATED)) return false; while (!data->has_error && asn1_tag_remaining(data)>0) { uint8_t b; asn1_read_uint8(data, &b); @@ -708,23 +711,23 @@ BOOL asn1_read_enumerated(struct asn1_data *data, int *v) } /* check a enumarted value is correct */ -BOOL asn1_check_enumerated(struct asn1_data *data, int v) +bool asn1_check_enumerated(struct asn1_data *data, int v) { uint8_t b; - if (!asn1_start_tag(data, ASN1_ENUMERATED)) return False; + if (!asn1_start_tag(data, ASN1_ENUMERATED)) return false; asn1_read_uint8(data, &b); asn1_end_tag(data); if (v != b) - data->has_error = False; + data->has_error = false; return !data->has_error; } /* write an enumarted value to the stream */ -BOOL asn1_write_enumerated(struct asn1_data *data, uint8_t v) +bool asn1_write_enumerated(struct asn1_data *data, uint8_t v) { - if (!asn1_push_tag(data, ASN1_ENUMERATED)) return False; + if (!asn1_push_tag(data, ASN1_ENUMERATED)) return false; asn1_write_uint8(data, v); asn1_pop_tag(data); return !data->has_error; diff --git a/source4/libcli/util/clierror.c b/source4/libcli/util/clierror.c deleted file mode 100644 index 89bba21ed6..0000000000 --- a/source4/libcli/util/clierror.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - Unix SMB/CIFS implementation. - client error handling routines - Copyright (C) Andrew Tridgell 1994-1998 - Copyright (C) James Myers 2003 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include "includes.h" -#include "libcli/raw/libcliraw.h" - - -/*************************************************************************** - Return an error message from the last response -****************************************************************************/ -const char *smbcli_errstr(struct smbcli_tree *tree) -{ - switch (tree->session->transport->error.etype) { - case ETYPE_SMB: - return nt_errstr(tree->session->transport->error.e.nt_status); - - case ETYPE_SOCKET: - return "socket_error"; - - case ETYPE_NBT: - return "nbt_error"; - - case ETYPE_NONE: - return "no_error"; - } - return NULL; -} - - -/* Return the 32-bit NT status code from the last packet */ -NTSTATUS smbcli_nt_error(struct smbcli_tree *tree) -{ - switch (tree->session->transport->error.etype) { - case ETYPE_SMB: - return tree->session->transport->error.e.nt_status; - - case ETYPE_SOCKET: - return NT_STATUS_UNSUCCESSFUL; - - case ETYPE_NBT: - return NT_STATUS_UNSUCCESSFUL; - - case ETYPE_NONE: - return NT_STATUS_OK; - } - - return NT_STATUS_UNSUCCESSFUL; -} - - -/* Return true if the last packet was an error */ -BOOL smbcli_is_error(struct smbcli_tree *tree) -{ - return NT_STATUS_IS_ERR(smbcli_nt_error(tree)); -} diff --git a/source4/libcli/util/clilsa.c b/source4/libcli/util/clilsa.c index 6fd84bbe74..7c32294648 100644 --- a/source4/libcli/util/clilsa.c +++ b/source4/libcli/util/clilsa.c @@ -31,6 +31,7 @@ #include "libcli/security/security.h" #include "librpc/gen_ndr/ndr_lsa.h" #include "librpc/gen_ndr/ndr_lsa_c.h" +#include "libcli/util/clilsa.h" struct smblsa_state { struct dcerpc_pipe *pipe; @@ -60,7 +61,7 @@ static NTSTATUS smblsa_connect(struct smbcli_state *cli) return NT_STATUS_NO_MEMORY; } - lsa->ipc_tree = smbcli_tree_init(cli->session, lsa, False); + lsa->ipc_tree = smbcli_tree_init(cli->session, lsa, false); if (lsa->ipc_tree == NULL) { return NT_STATUS_NO_MEMORY; } diff --git a/source4/libcli/util/doserr.c b/source4/libcli/util/doserr.c index d62a31c1fa..49818e573a 100644 --- a/source4/libcli/util/doserr.c +++ b/source4/libcli/util/doserr.c @@ -20,7 +20,6 @@ /* DOS error codes. please read doserr.h */ #include "includes.h" -#include "pstring.h" struct werror_code_struct { const char *dos_errstr; @@ -133,7 +132,7 @@ static const struct werror_code_struct dos_errs[] = *****************************************************************************/ const char *win_errstr(WERROR werror) { - static pstring msg; + static char msg[40]; int idx = 0; while (dos_errs[idx].dos_errstr != NULL) { diff --git a/source4/libcli/util/doserr.h b/source4/libcli/util/doserr.h index 0478eff947..bec268a565 100644 --- a/source4/libcli/util/doserr.h +++ b/source4/libcli/util/doserr.h @@ -161,133 +161,8 @@ #define ERRsharebufexc 36 /* share buffer exceeded */ #define ERRdiskfull 39 - -/* these are win32 error codes. There are only a few places where - these matter for Samba, primarily in the NT printing code */ -#define WERR_OK W_ERROR(0) -#define WERR_BADFUNC W_ERROR(1) -#define WERR_BADFILE W_ERROR(2) -#define WERR_ACCESS_DENIED W_ERROR(5) -#define WERR_BADFID W_ERROR(6) -#define WERR_NOMEM W_ERROR(8) -#define WERR_GENERAL_FAILURE W_ERROR(31) -#define WERR_NOT_SUPPORTED W_ERROR(50) -#define WERR_BAD_NETPATH W_ERROR(53) -#define WERR_BAD_NET_RESP W_ERROR(58) -#define WERR_UNEXP_NET_ERR W_ERROR(59) -#define WERR_PRINTQ_FULL W_ERROR(61) -#define WERR_NO_SPOOL_SPACE W_ERROR(62) -#define WERR_NO_SUCH_SHARE W_ERROR(67) -#define WERR_FILE_EXISTS W_ERROR(80) -#define WERR_BAD_PASSWORD W_ERROR(86) -#define WERR_INVALID_PARAM W_ERROR(87) -#define WERR_INSUFFICIENT_BUFFER W_ERROR(122) -#define WERR_INVALID_NAME W_ERROR(123) -#define WERR_UNKNOWN_LEVEL W_ERROR(124) -#define WERR_OBJECT_PATH_INVALID W_ERROR(161) -#define WERR_ALREADY_EXISTS W_ERROR(183) -#define WERR_NO_MORE_ITEMS W_ERROR(259) -#define WERR_MORE_DATA W_ERROR(234) -#define WERR_CAN_NOT_COMPLETE W_ERROR(1003) -#define WERR_NOT_FOUND W_ERROR(1168) -#define WERR_INVALID_COMPUTERNAME W_ERROR(1210) -#define WERR_INVALID_DOMAINNAME W_ERROR(1212) -#define WERR_UNKNOWN_REVISION W_ERROR(1305) -#define WERR_REVISION_MISMATCH W_ERROR(1306) -#define WERR_INVALID_OWNER W_ERROR(1307) -#define WERR_NO_LOGON_SERVERS W_ERROR(1311) -#define WERR_NO_SUCH_PRIVILEGE W_ERROR(1313) -#define WERR_PRIVILEGE_NOT_HELD W_ERROR(1314) -#define WERR_NO_SUCH_USER W_ERROR(1317) -#define WERR_LOGON_FAILURE W_ERROR(1326) -#define WERR_INVALID_SECURITY_DESCRIPTOR W_ERROR(1338) -#define WERR_INVALID_DOMAIN_ROLE W_ERROR(1354) -#define WERR_NO_SUCH_DOMAIN W_ERROR(1355) -#define WERR_NO_SYSTEM_RESOURCES W_ERROR(1450) -#define WERR_SERVER_UNAVAILABLE W_ERROR(1722) -#define WERR_INVALID_FORM_NAME W_ERROR(1902) -#define WERR_INVALID_FORM_SIZE W_ERROR(1903) -#define WERR_ALREADY_SHARED W_ERROR(2118) -#define WERR_BUF_TOO_SMALL W_ERROR(2123) -#define WERR_JOB_NOT_FOUND W_ERROR(2151) -#define WERR_DEST_NOT_FOUND W_ERROR(2152) -#define WERR_SESSION_NOT_FOUND W_ERROR(2312) -#define WERR_FID_NOT_FOUND W_ERROR(2314) -#define WERR_NOT_LOCAL_DOMAIN W_ERROR(2320) -#define WERR_DOMAIN_CONTROLLER_NOT_FOUND W_ERROR(2453) -#define WERR_DEVICE_NOT_AVAILABLE W_ERROR(4319) -#define WERR_STATUS_MORE_ENTRIES W_ERROR(0x0105) - -#define WERR_PRINTER_DRIVER_ALREADY_INSTALLED W_ERROR(ERRdriveralreadyinstalled) -#define WERR_UNKNOWN_PORT W_ERROR(ERRunknownprinterport) -#define WERR_UNKNOWN_PRINTER_DRIVER W_ERROR(ERRunknownprinterdriver) -#define WERR_UNKNOWN_PRINTPROCESSOR W_ERROR(ERRunknownprintprocessor) -#define WERR_INVALID_SEPARATOR_FILE W_ERROR(ERRinvalidseparatorfile) -#define WERR_INVALID_PRIORITY W_ERROR(ERRinvalidjobpriority) -#define WERR_INVALID_PRINTER_NAME W_ERROR(ERRinvalidprintername) -#define WERR_PRINTER_ALREADY_EXISTS W_ERROR(ERRprinteralreadyexists) -#define WERR_INVALID_PRINTER_COMMAND W_ERROR(ERRinvalidprintercommand) -#define WERR_INVALID_DATATYPE W_ERROR(ERRinvaliddatatype) -#define WERR_INVALID_ENVIRONMENT W_ERROR(ERRinvalidenvironment) - -#define WERR_UNKNOWN_PRINT_MONITOR W_ERROR(ERRunknownprintmonitor) -#define WERR_PRINTER_DRIVER_IN_USE W_ERROR(ERRprinterdriverinuse) -#define WERR_SPOOL_FILE_NOT_FOUND W_ERROR(ERRspoolfilenotfound) -#define WERR_SPL_NO_STARTDOC W_ERROR(ERRnostartdoc) -#define WERR_SPL_NO_ADDJOB W_ERROR(ERRnoaddjob) -#define WERR_PRINT_PROCESSOR_ALREADY_INSTALLED W_ERROR(ERRprintprocessoralreadyinstalled) -#define WERR_PRINT_MONITOR_ALREADY_INSTALLED W_ERROR(ERRprintmonitoralreadyinstalled) -#define WERR_INVALID_PRINT_MONITOR W_ERROR(ERRinvalidprintmonitor) -#define WERR_PRINT_MONITOR_IN_USE W_ERROR(ERRprintmonitorinuse) -#define WERR_PRINTER_HAS_JOBS_QUEUED W_ERROR(ERRprinterhasjobsqueued) - -#define WERR_CLASS_NOT_REGISTERED W_ERROR(0x40154) -#define WERR_NO_SHUTDOWN_IN_PROGRESS W_ERROR(0x45c) -#define WERR_SHUTDOWN_ALREADY_IN_PROGRESS W_ERROR(0x45b) - - #ifndef NERR_BASE #define NERR_BASE (2100) #endif -#define WERR_NET_NAME_NOT_FOUND W_ERROR(NERR_BASE+210) -#define WERR_DEVICE_NOT_SHARED W_ERROR(NERR_BASE+211) - -/* DFS errors */ -#define WERR_DFS_NO_SUCH_VOL W_ERROR(NERR_BASE+562) -#define WERR_DFS_NO_SUCH_SHARE W_ERROR(NERR_BASE+565) -#define WERR_DFS_NO_SUCH_SERVER W_ERROR(NERR_BASE+573) -#define WERR_DFS_INTERNAL_ERROR W_ERROR(NERR_BASE+590) -#define WERR_DFS_CANT_CREATE_JUNCT W_ERROR(NERR_BASE+569) - -/* DS errors */ -#define WERR_DS_SERVICE_BUSY W_ERROR(0x0000200e) -#define WERR_DS_SERVICE_UNAVAILABLE W_ERROR(0x0000200f) -#define WERR_DS_NO_SUCH_OBJECT W_ERROR(0x00002030) -#define WERR_DS_OBJ_NOT_FOUND W_ERROR(0x0000208d) -#define WERR_DS_SCHEMA_NOT_LOADED W_ERROR(0x20de) -#define WERR_DS_SCHEMA_ALLOC_FAILED W_ERROR(0x20df) -#define WERR_DS_ATT_SCHEMA_REQ_SYNTAX W_ERROR(0x000020e0) -#define WERR_DS_DRA_SCHEMA_MISMATCH W_ERROR(0x000020e2) -#define WERR_DS_DRA_INVALID_PARAMETER W_ERROR(0x000020f5) -#define WERR_DS_DRA_BAD_DN W_ERROR(0x000020f7) -#define WERR_DS_DRA_BAD_NC W_ERROR(0x000020f8) -#define WERR_DS_DRA_INTERNAL_ERROR W_ERROR(0x000020fa) -#define WERR_DS_DRA_OUT_OF_MEM W_ERROR(0x000020fe) -#define WERR_DS_SINGLE_VALUE_CONSTRAINT W_ERROR(0x00002081) -#define WERR_DS_DRA_DB_ERROR W_ERROR(0x00002103) -#define WERR_DS_DRA_NO_REPLICA W_ERROR(0x00002104) -#define WERR_DS_DRA_ACCESS_DENIED W_ERROR(0x00002105) -#define WERR_DS_DNS_LOOKUP_FAILURE W_ERROR(0x0000214c) -#define WERR_DS_WRONG_LINKED_ATTRIBUTE_SYNTAX W_ERROR(0x00002150) -#define WERR_DS_NO_MSDS_INTID W_ERROR(0x00002194) -#define WERR_DS_DUP_MSDS_INTID W_ERROR(0x00002195) - -/* SEC errors */ -#define WERR_SEC_E_ENCRYPT_FAILURE W_ERROR(0x80090329) -#define WERR_SEC_E_DECRYPT_FAILURE W_ERROR(0x80090330) -#define WERR_SEC_E_ALGORITHM_MISMATCH W_ERROR(0x80090331) - -#define WERR_FOOBAR WERR_GENERAL_FAILURE - #endif /* _DOSERR_H */ diff --git a/source4/libcli/util/error.h b/source4/libcli/util/error.h index 8a641c8eb9..dd2de3da75 100644 --- a/source4/libcli/util/error.h +++ b/source4/libcli/util/error.h @@ -19,8 +19,33 @@ #ifndef _SAMBA_ERROR_H_ #define _SAMBA_ERROR_H_ -#include "libcli/util/nterr.h" +#include "libcli/util/werror.h" #include "libcli/util/doserr.h" -#include "libcli/util/proto.h" +#include "libcli/util/ntstatus.h" + +/** NT error on DOS connection! (NT_STATUS_OK) */ +bool ntstatus_dos_equal(NTSTATUS status1, NTSTATUS status2); + +/***************************************************************************** +convert a NT status code to a dos class/code + *****************************************************************************/ +void ntstatus_to_dos(NTSTATUS ntstatus, uint8_t *eclass, uint32_t *ecode); + +/***************************************************************************** +convert a WERROR to a NT status32 code + *****************************************************************************/ +NTSTATUS werror_to_ntstatus(WERROR error); + +/***************************************************************************** +convert a NTSTATUS to a WERROR + *****************************************************************************/ +WERROR ntstatus_to_werror(NTSTATUS error); + +/********************************************************************* + Map an NT error code from a Unix error code. +*********************************************************************/ +NTSTATUS map_nt_error_from_unix(int unix_error); + + #endif /* _SAMBA_ERROR_H */ diff --git a/source4/libcli/util/errormap.c b/source4/libcli/util/errormap.c index 711f02a626..8d088e1e4b 100644 --- a/source4/libcli/util/errormap.c +++ b/source4/libcli/util/errormap.c @@ -20,6 +20,7 @@ */ #include "includes.h" +#include "param/param.h" /* This map was extracted by the ERRMAPEXTRACT smbtorture command. The setup was a Samba HEAD (2002-01-03) PDC and an Win2k member @@ -1161,13 +1162,13 @@ static const struct { /* check if a DOS encoded NTSTATUS code maps to the given NTSTATUS code */ -BOOL ntstatus_dos_equal(NTSTATUS status1, NTSTATUS status2) +bool ntstatus_dos_equal(NTSTATUS status1, NTSTATUS status2) { /* when we negotiate nt status support, we don't want to consider the mapping of dos codes, as we want to catch the cases where a forced dos code is needed */ - if (lp_nt_status_support()) { + if (lp_nt_status_support(global_loadparm)) { return NT_STATUS_V(status1) == NT_STATUS_V(status2); } diff --git a/source4/libcli/util/nt_status.h b/source4/libcli/util/nt_status.h deleted file mode 100644 index 8d81aab175..0000000000 --- a/source4/libcli/util/nt_status.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB parameters and setup, plus a whole lot more. - - Copyright (C) Andrew Tridgell 2001 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef _NT_STATUS_H -#define _NT_STATUS_H - -#include <stdint.h> - -/* the following rather strange looking definitions of NTSTATUS and WERROR - and there in order to catch common coding errors where different error types - are mixed up. This is especially important as we slowly convert Samba - from using BOOL for internal functions -*/ - -#if defined(HAVE_IMMEDIATE_STRUCTURES) -typedef struct {uint32_t v;} NTSTATUS; -#define NT_STATUS(x) ((NTSTATUS) { x }) -#define NT_STATUS_V(x) ((x).v) -#else -typedef uint32_t NTSTATUS; -#define NT_STATUS(x) (x) -#define NT_STATUS_V(x) (x) -#endif - -#if defined(HAVE_IMMEDIATE_STRUCTURES) -typedef struct {uint32_t v;} WERROR; -#define W_ERROR(x) ((WERROR) { x }) -#define W_ERROR_V(x) ((x).v) -#else -typedef uint32_t WERROR; -#define W_ERROR(x) (x) -#define W_ERROR_V(x) (x) -#endif - -#define NT_STATUS_IS_OK(x) (NT_STATUS_V(x) == 0) -#define NT_STATUS_IS_ERR(x) ((NT_STATUS_V(x) & 0xc0000000) == 0xc0000000) -/* checking for DOS error mapping here is ugly, but unfortunately the - alternative is a very intrusive rewrite of the torture code */ -#define NT_STATUS_EQUAL(x,y) (NT_STATUS_IS_DOS(x)||NT_STATUS_IS_DOS(y)?ntstatus_dos_equal(x,y):NT_STATUS_V(x) == NT_STATUS_V(y)) - -#define NT_STATUS_HAVE_NO_MEMORY(x) do { \ - if (!(x)) {\ - return NT_STATUS_NO_MEMORY;\ - }\ -} while (0) - -#define NT_STATUS_IS_OK_RETURN(x) do { \ - if (NT_STATUS_IS_OK(x)) {\ - return x;\ - }\ -} while (0) - -#define NT_STATUS_NOT_OK_RETURN(x) do { \ - if (!NT_STATUS_IS_OK(x)) {\ - return x;\ - }\ -} while (0) - -#define NT_STATUS_IS_ERR_RETURN(x) do { \ - if (NT_STATUS_IS_ERR(x)) {\ - return x;\ - }\ -} while (0) - -#define NT_STATUS_NOT_ERR_RETURN(x) do { \ - if (!NT_STATUS_IS_ERR(x)) {\ - return x;\ - }\ -} while (0) - -#define W_ERROR_IS_OK(x) (W_ERROR_V(x) == 0) -#define W_ERROR_EQUAL(x,y) (W_ERROR_V(x) == W_ERROR_V(y)) - -#define W_ERROR_HAVE_NO_MEMORY(x) do { \ - if (!(x)) {\ - return WERR_NOMEM;\ - }\ -} while (0) - -#define W_ERROR_IS_OK_RETURN(x) do { \ - if (W_ERROR_IS_OK(x)) {\ - return x;\ - }\ -} while (0) - -#define W_ERROR_NOT_OK_RETURN(x) do { \ - if (!W_ERROR_IS_OK(x)) {\ - return x;\ - }\ -} while (0) - -/* this defines special NTSTATUS codes to represent DOS errors. I - have chosen this macro to produce status codes in the invalid - NTSTATUS range */ -#define NT_STATUS_DOS(class, code) NT_STATUS(0xF1000000 | ((class)<<16) | code) -#define NT_STATUS_IS_DOS(status) ((NT_STATUS_V(status) & 0xFF000000) == 0xF1000000) -#define NT_STATUS_DOS_CLASS(status) ((NT_STATUS_V(status) >> 16) & 0xFF) -#define NT_STATUS_DOS_CODE(status) (NT_STATUS_V(status) & 0xFFFF) - -/* define ldap error codes as NTSTATUS codes */ -#define NT_STATUS_LDAP(code) NT_STATUS(0xF2000000 | code) -#define NT_STATUS_IS_LDAP(status) ((NT_STATUS_V(status) & 0xFF000000) == 0xF2000000) -#define NT_STATUS_LDAP_CODE(status) (NT_STATUS_V(status) & ~0xFF000000) - -#endif diff --git a/source4/libcli/util/nterr.c b/source4/libcli/util/nterr.c index 3aea0b51bc..b1f345016d 100644 --- a/source4/libcli/util/nterr.c +++ b/source4/libcli/util/nterr.c @@ -20,7 +20,6 @@ /* NT error codes. please read nterr.h */ #include "includes.h" -#include "pstring.h" #include "libcli/ldap/ldap.h" typedef struct @@ -862,7 +861,7 @@ const char *get_friendly_nt_error_msg(NTSTATUS nt_code) *****************************************************************************/ const char *get_nt_error_c_code(NTSTATUS nt_code) { - static pstring out; + static char out[40]; int idx = 0; while (nt_errs[idx].nt_errstr != NULL) { diff --git a/source4/libcli/util/nterr.h b/source4/libcli/util/ntstatus.h index 1ee867a0aa..026b5162db 100644 --- a/source4/libcli/util/nterr.h +++ b/source4/libcli/util/ntstatus.h @@ -20,8 +20,24 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef _NTERR_H -#define _NTERR_H +#ifndef _NTSTATUS_H +#define _NTSTATUS_H + +/* the following rather strange looking definitions of NTSTATUS + are there in order to catch common coding errors where different error types + are mixed up. This is especially important as we slowly convert Samba + from using bool for internal functions +*/ + +#if defined(HAVE_IMMEDIATE_STRUCTURES) +typedef struct {uint32_t v;} NTSTATUS; +#define NT_STATUS(x) ((NTSTATUS) { x }) +#define NT_STATUS_V(x) ((x).v) +#else +typedef uint32_t NTSTATUS; +#define NT_STATUS(x) (x) +#define NT_STATUS_V(x) (x) +#endif /* Win32 Status codes. */ @@ -585,4 +601,75 @@ * this means we need a torture test */ #define NT_STATUS_FOOBAR NT_STATUS_UNSUCCESSFUL -#endif /* _NTERR_H */ +/***************************************************************************** + returns an NT error message. not amazingly helpful, but better than a number. + *****************************************************************************/ +const char *nt_errstr(NTSTATUS nt_code); + +/************************************************************************ + Print friendler version fo NT error code + ***********************************************************************/ +const char *get_friendly_nt_error_msg(NTSTATUS nt_code); + +/***************************************************************************** + returns an NT_STATUS constant as a string for inclusion in autogen C code + *****************************************************************************/ +const char *get_nt_error_c_code(NTSTATUS nt_code); + +/***************************************************************************** + returns the NT_STATUS constant matching the string supplied (as an NTSTATUS) + *****************************************************************************/ +NTSTATUS nt_status_string_to_code(const char *nt_status_str); + +#define NT_STATUS_IS_OK(x) (NT_STATUS_V(x) == 0) +#define NT_STATUS_IS_ERR(x) ((NT_STATUS_V(x) & 0xc0000000) == 0xc0000000) +/* checking for DOS error mapping here is ugly, but unfortunately the + alternative is a very intrusive rewrite of the torture code */ +#define NT_STATUS_EQUAL(x,y) (NT_STATUS_IS_DOS(x)||NT_STATUS_IS_DOS(y)?ntstatus_dos_equal(x,y):NT_STATUS_V(x) == NT_STATUS_V(y)) + +#define NT_STATUS_HAVE_NO_MEMORY(x) do { \ + if (!(x)) {\ + return NT_STATUS_NO_MEMORY;\ + }\ +} while (0) + +#define NT_STATUS_IS_OK_RETURN(x) do { \ + if (NT_STATUS_IS_OK(x)) {\ + return x;\ + }\ +} while (0) + +#define NT_STATUS_NOT_OK_RETURN(x) do { \ + if (!NT_STATUS_IS_OK(x)) {\ + return x;\ + }\ +} while (0) + +#define NT_STATUS_IS_ERR_RETURN(x) do { \ + if (NT_STATUS_IS_ERR(x)) {\ + return x;\ + }\ +} while (0) + +#define NT_STATUS_NOT_ERR_RETURN(x) do { \ + if (!NT_STATUS_IS_ERR(x)) {\ + return x;\ + }\ +} while (0) + +/* this defines special NTSTATUS codes to represent DOS errors. I + have chosen this macro to produce status codes in the invalid + NTSTATUS range */ +#define NT_STATUS_DOS(class, code) NT_STATUS(0xF1000000 | ((class)<<16) | code) +#define NT_STATUS_IS_DOS(status) ((NT_STATUS_V(status) & 0xFF000000) == 0xF1000000) +#define NT_STATUS_DOS_CLASS(status) ((NT_STATUS_V(status) >> 16) & 0xFF) +#define NT_STATUS_DOS_CODE(status) (NT_STATUS_V(status) & 0xFFFF) + +/* define ldap error codes as NTSTATUS codes */ +#define NT_STATUS_LDAP(code) NT_STATUS(0xF2000000 | code) +#define NT_STATUS_IS_LDAP(status) ((NT_STATUS_V(status) & 0xFF000000) == 0xF2000000) +#define NT_STATUS_LDAP_CODE(status) (NT_STATUS_V(status) & ~0xFF000000) + + + +#endif /* _NTSTATUS_H */ diff --git a/source4/libcli/util/werror.h b/source4/libcli/util/werror.h new file mode 100644 index 0000000000..55a4faa6a5 --- /dev/null +++ b/source4/libcli/util/werror.h @@ -0,0 +1,193 @@ +/* + Unix SMB/CIFS implementation. + SMB parameters and setup, plus a whole lot more. + + Copyright (C) Andrew Tridgell 2001 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef _WERROR_H_ +#define _WERROR_H_ + +#include <stdint.h> + +/* the following rather strange looking definitions of NTSTATUS and WERROR + and there in order to catch common coding errors where different error types + are mixed up. This is especially important as we slowly convert Samba + from using bool for internal functions +*/ + +#if defined(HAVE_IMMEDIATE_STRUCTURES) +typedef struct {uint32_t v;} WERROR; +#define W_ERROR(x) ((WERROR) { x }) +#define W_ERROR_V(x) ((x).v) +#else +typedef uint32_t WERROR; +#define W_ERROR(x) (x) +#define W_ERROR_V(x) (x) +#endif + +#define W_ERROR_IS_OK(x) (W_ERROR_V(x) == 0) +#define W_ERROR_EQUAL(x,y) (W_ERROR_V(x) == W_ERROR_V(y)) + +#define W_ERROR_HAVE_NO_MEMORY(x) do { \ + if (!(x)) {\ + return WERR_NOMEM;\ + }\ +} while (0) + +#define W_ERROR_IS_OK_RETURN(x) do { \ + if (W_ERROR_IS_OK(x)) {\ + return x;\ + }\ +} while (0) + +#define W_ERROR_NOT_OK_RETURN(x) do { \ + if (!W_ERROR_IS_OK(x)) {\ + return x;\ + }\ +} while (0) + +/* these are win32 error codes. There are only a few places where + these matter for Samba, primarily in the NT printing code */ +#define WERR_OK W_ERROR(0) +#define WERR_BADFUNC W_ERROR(1) +#define WERR_BADFILE W_ERROR(2) +#define WERR_ACCESS_DENIED W_ERROR(5) +#define WERR_BADFID W_ERROR(6) +#define WERR_NOMEM W_ERROR(8) +#define WERR_GENERAL_FAILURE W_ERROR(31) +#define WERR_NOT_SUPPORTED W_ERROR(50) +#define WERR_BAD_NETPATH W_ERROR(53) +#define WERR_BAD_NET_RESP W_ERROR(58) +#define WERR_UNEXP_NET_ERR W_ERROR(59) +#define WERR_PRINTQ_FULL W_ERROR(61) +#define WERR_NO_SPOOL_SPACE W_ERROR(62) +#define WERR_NO_SUCH_SHARE W_ERROR(67) +#define WERR_FILE_EXISTS W_ERROR(80) +#define WERR_BAD_PASSWORD W_ERROR(86) +#define WERR_INVALID_PARAM W_ERROR(87) +#define WERR_INSUFFICIENT_BUFFER W_ERROR(122) +#define WERR_INVALID_NAME W_ERROR(123) +#define WERR_UNKNOWN_LEVEL W_ERROR(124) +#define WERR_OBJECT_PATH_INVALID W_ERROR(161) +#define WERR_ALREADY_EXISTS W_ERROR(183) +#define WERR_NO_MORE_ITEMS W_ERROR(259) +#define WERR_MORE_DATA W_ERROR(234) +#define WERR_CAN_NOT_COMPLETE W_ERROR(1003) +#define WERR_NOT_FOUND W_ERROR(1168) +#define WERR_INVALID_COMPUTERNAME W_ERROR(1210) +#define WERR_INVALID_DOMAINNAME W_ERROR(1212) +#define WERR_UNKNOWN_REVISION W_ERROR(1305) +#define WERR_REVISION_MISMATCH W_ERROR(1306) +#define WERR_INVALID_OWNER W_ERROR(1307) +#define WERR_NO_LOGON_SERVERS W_ERROR(1311) +#define WERR_NO_SUCH_PRIVILEGE W_ERROR(1313) +#define WERR_PRIVILEGE_NOT_HELD W_ERROR(1314) +#define WERR_NO_SUCH_USER W_ERROR(1317) +#define WERR_LOGON_FAILURE W_ERROR(1326) +#define WERR_INVALID_SECURITY_DESCRIPTOR W_ERROR(1338) +#define WERR_INVALID_DOMAIN_ROLE W_ERROR(1354) +#define WERR_NO_SUCH_DOMAIN W_ERROR(1355) +#define WERR_NO_SYSTEM_RESOURCES W_ERROR(1450) +#define WERR_SERVER_UNAVAILABLE W_ERROR(1722) +#define WERR_INVALID_FORM_NAME W_ERROR(1902) +#define WERR_INVALID_FORM_SIZE W_ERROR(1903) +#define WERR_ALREADY_SHARED W_ERROR(2118) +#define WERR_BUF_TOO_SMALL W_ERROR(2123) +#define WERR_JOB_NOT_FOUND W_ERROR(2151) +#define WERR_DEST_NOT_FOUND W_ERROR(2152) +#define WERR_SESSION_NOT_FOUND W_ERROR(2312) +#define WERR_FID_NOT_FOUND W_ERROR(2314) +#define WERR_NOT_LOCAL_DOMAIN W_ERROR(2320) +#define WERR_DOMAIN_CONTROLLER_NOT_FOUND W_ERROR(2453) +#define WERR_DEVICE_NOT_AVAILABLE W_ERROR(4319) +#define WERR_STATUS_MORE_ENTRIES W_ERROR(0x0105) + +#define WERR_PRINTER_DRIVER_ALREADY_INSTALLED W_ERROR(ERRdriveralreadyinstalled) +#define WERR_UNKNOWN_PORT W_ERROR(ERRunknownprinterport) +#define WERR_UNKNOWN_PRINTER_DRIVER W_ERROR(ERRunknownprinterdriver) +#define WERR_UNKNOWN_PRINTPROCESSOR W_ERROR(ERRunknownprintprocessor) +#define WERR_INVALID_SEPARATOR_FILE W_ERROR(ERRinvalidseparatorfile) +#define WERR_INVALID_PRIORITY W_ERROR(ERRinvalidjobpriority) +#define WERR_INVALID_PRINTER_NAME W_ERROR(ERRinvalidprintername) +#define WERR_PRINTER_ALREADY_EXISTS W_ERROR(ERRprinteralreadyexists) +#define WERR_INVALID_PRINTER_COMMAND W_ERROR(ERRinvalidprintercommand) +#define WERR_INVALID_DATATYPE W_ERROR(ERRinvaliddatatype) +#define WERR_INVALID_ENVIRONMENT W_ERROR(ERRinvalidenvironment) + +#define WERR_UNKNOWN_PRINT_MONITOR W_ERROR(ERRunknownprintmonitor) +#define WERR_PRINTER_DRIVER_IN_USE W_ERROR(ERRprinterdriverinuse) +#define WERR_SPOOL_FILE_NOT_FOUND W_ERROR(ERRspoolfilenotfound) +#define WERR_SPL_NO_STARTDOC W_ERROR(ERRnostartdoc) +#define WERR_SPL_NO_ADDJOB W_ERROR(ERRnoaddjob) +#define WERR_PRINT_PROCESSOR_ALREADY_INSTALLED W_ERROR(ERRprintprocessoralreadyinstalled) +#define WERR_PRINT_MONITOR_ALREADY_INSTALLED W_ERROR(ERRprintmonitoralreadyinstalled) +#define WERR_INVALID_PRINT_MONITOR W_ERROR(ERRinvalidprintmonitor) +#define WERR_PRINT_MONITOR_IN_USE W_ERROR(ERRprintmonitorinuse) +#define WERR_PRINTER_HAS_JOBS_QUEUED W_ERROR(ERRprinterhasjobsqueued) + +#define WERR_CLASS_NOT_REGISTERED W_ERROR(0x40154) +#define WERR_NO_SHUTDOWN_IN_PROGRESS W_ERROR(0x45c) +#define WERR_SHUTDOWN_ALREADY_IN_PROGRESS W_ERROR(0x45b) + +#define WERR_NET_NAME_NOT_FOUND W_ERROR(NERR_BASE+210) +#define WERR_DEVICE_NOT_SHARED W_ERROR(NERR_BASE+211) + +/* DFS errors */ +#define WERR_DFS_NO_SUCH_VOL W_ERROR(NERR_BASE+562) +#define WERR_DFS_NO_SUCH_SHARE W_ERROR(NERR_BASE+565) +#define WERR_DFS_NO_SUCH_SERVER W_ERROR(NERR_BASE+573) +#define WERR_DFS_INTERNAL_ERROR W_ERROR(NERR_BASE+590) +#define WERR_DFS_CANT_CREATE_JUNCT W_ERROR(NERR_BASE+569) + +/* DS errors */ +#define WERR_DS_SERVICE_BUSY W_ERROR(0x0000200e) +#define WERR_DS_SERVICE_UNAVAILABLE W_ERROR(0x0000200f) +#define WERR_DS_NO_SUCH_OBJECT W_ERROR(0x00002030) +#define WERR_DS_OBJ_NOT_FOUND W_ERROR(0x0000208d) +#define WERR_DS_SCHEMA_NOT_LOADED W_ERROR(0x20de) +#define WERR_DS_SCHEMA_ALLOC_FAILED W_ERROR(0x20df) +#define WERR_DS_ATT_SCHEMA_REQ_SYNTAX W_ERROR(0x000020e0) +#define WERR_DS_DRA_SCHEMA_MISMATCH W_ERROR(0x000020e2) +#define WERR_DS_DRA_INVALID_PARAMETER W_ERROR(0x000020f5) +#define WERR_DS_DRA_BAD_DN W_ERROR(0x000020f7) +#define WERR_DS_DRA_BAD_NC W_ERROR(0x000020f8) +#define WERR_DS_DRA_INTERNAL_ERROR W_ERROR(0x000020fa) +#define WERR_DS_DRA_OUT_OF_MEM W_ERROR(0x000020fe) +#define WERR_DS_SINGLE_VALUE_CONSTRAINT W_ERROR(0x00002081) +#define WERR_DS_DRA_DB_ERROR W_ERROR(0x00002103) +#define WERR_DS_DRA_NO_REPLICA W_ERROR(0x00002104) +#define WERR_DS_DRA_ACCESS_DENIED W_ERROR(0x00002105) +#define WERR_DS_DNS_LOOKUP_FAILURE W_ERROR(0x0000214c) +#define WERR_DS_WRONG_LINKED_ATTRIBUTE_SYNTAX W_ERROR(0x00002150) +#define WERR_DS_NO_MSDS_INTID W_ERROR(0x00002194) +#define WERR_DS_DUP_MSDS_INTID W_ERROR(0x00002195) + +/* SEC errors */ +#define WERR_SEC_E_ENCRYPT_FAILURE W_ERROR(0x80090329) +#define WERR_SEC_E_DECRYPT_FAILURE W_ERROR(0x80090330) +#define WERR_SEC_E_ALGORITHM_MISMATCH W_ERROR(0x80090331) + +#define WERR_FOOBAR WERR_GENERAL_FAILURE + +/***************************************************************************** + returns a windows error message. not amazingly helpful, but better than a number. + *****************************************************************************/ +const char *win_errstr(WERROR werror); + + + +#endif |