summaryrefslogtreecommitdiff
path: root/source4/librpc/ndr
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-01-21 06:54:10 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:09:01 -0500
commitea923fb4a26f88664a1db36e1a93a2c96239a7a4 (patch)
tree23456be2c837e5c0f56706f9be119b66d32b9590 /source4/librpc/ndr
parente0d2080219c7d52559a5bbcc7294995fccbd5e52 (diff)
downloadsamba-ea923fb4a26f88664a1db36e1a93a2c96239a7a4.tar.gz
samba-ea923fb4a26f88664a1db36e1a93a2c96239a7a4.tar.bz2
samba-ea923fb4a26f88664a1db36e1a93a2c96239a7a4.zip
r4885: added a new NBT client library. Features include:
- structures defined using IDL in nbt.idl - build around our events structure, and talloc - fully async - supports all NBT packet fields as per rfc1002 - easy interfaces for name query and status For the moment there are just a couple of test functions in namequery.c, test_name_query() and test_name_status(). These will be removed when we hook the new library into libcli/ fully The new library will also be a fairly good basis for a nbt server. Although it can't be a server as-is, I wrote it with the needs of a server in mind (for example, extremely scalable idtree based packet handling) (This used to be commit ae7e625bfa4b4a3ee32c64566064b6a4c84ee4b9)
Diffstat (limited to 'source4/librpc/ndr')
-rw-r--r--source4/librpc/ndr/libndr.h3
-rw-r--r--source4/librpc/ndr/ndr.c21
-rw-r--r--source4/librpc/ndr/ndr_basic.c34
3 files changed, 46 insertions, 12 deletions
diff --git a/source4/librpc/ndr/libndr.h b/source4/librpc/ndr/libndr.h
index 288e753cca..b5a5573448 100644
--- a/source4/librpc/ndr/libndr.h
+++ b/source4/librpc/ndr/libndr.h
@@ -102,7 +102,8 @@ struct ndr_print {
#define LIBNDR_FLAG_STR_CONFORMANT (1<<10)
#define LIBNDR_FLAG_STR_CHARLEN (1<<11)
#define LIBNDR_FLAG_STR_UTF8 (1<<12)
-#define LIBNDR_STRING_FLAGS (0x1FFC)
+#define LIBNDR_FLAG_STR_FIXLEN15 (1<<13)
+#define LIBNDR_STRING_FLAGS (0x3FFC)
#define LIBNDR_FLAG_REF_ALLOC (1<<20)
diff --git a/source4/librpc/ndr/ndr.c b/source4/librpc/ndr/ndr.c
index 7cc832c68e..8a25e27cc1 100644
--- a/source4/librpc/ndr/ndr.c
+++ b/source4/librpc/ndr/ndr.c
@@ -883,3 +883,24 @@ size_t ndr_size_struct(const void *p, int flags, ndr_push_flags_fn_t push)
talloc_free(ndr);
return ret;
}
+
+/*
+ generic ndr_size_*() handler for unions
+*/
+size_t ndr_size_union(const void *p, int flags, uint32_t level, ndr_push_union_fn_t push)
+{
+ struct ndr_push *ndr;
+ NTSTATUS status;
+ size_t ret;
+
+ ndr = ndr_push_init_ctx(NULL);
+ if (!ndr) return 0;
+ ndr->flags |= flags;
+ status = push(ndr, NDR_SCALARS|NDR_BUFFERS, level, discard_const(p));
+ if (!NT_STATUS_IS_OK(status)) {
+ return 0;
+ }
+ ret = ndr->offset;
+ talloc_free(ndr);
+ return ret;
+}
diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c
index 29a3009af6..6476f58764 100644
--- a/source4/librpc/ndr/ndr_basic.c
+++ b/source4/librpc/ndr/ndr_basic.c
@@ -718,8 +718,9 @@ NTSTATUS ndr_pull_string(struct ndr_pull *ndr, int ndr_flags, const char **s)
*s = as;
break;
+ case LIBNDR_FLAG_STR_FIXLEN15:
case LIBNDR_FLAG_STR_FIXLEN32:
- len1 = 32;
+ len1 = (flags & LIBNDR_FLAG_STR_FIXLEN32)?32:15;
NDR_PULL_NEED_BYTES(ndr, len1*byte_mul);
ret = convert_string_talloc(ndr, chset, CH_UNIX,
ndr->data+ndr->offset,
@@ -733,7 +734,6 @@ NTSTATUS ndr_pull_string(struct ndr_pull *ndr, int ndr_flags, const char **s)
*s = as;
break;
-
default:
return ndr_pull_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%x\n",
ndr->flags & LIBNDR_STRING_FLAGS);
@@ -748,7 +748,7 @@ NTSTATUS ndr_pull_string(struct ndr_pull *ndr, int ndr_flags, const char **s)
*/
NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s)
{
- ssize_t s_len, c_len;
+ ssize_t s_len, c_len, d_len;
int ret;
int chset = CH_UTF16;
unsigned flags = ndr->flags;
@@ -882,16 +882,18 @@ NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s)
ndr->offset += c_len*byte_mul;
break;
+ case LIBNDR_FLAG_STR_FIXLEN15:
case LIBNDR_FLAG_STR_FIXLEN32:
- NDR_PUSH_NEED_BYTES(ndr, byte_mul*32);
+ d_len = (flags & LIBNDR_FLAG_STR_FIXLEN32)?32:15;
+ NDR_PUSH_NEED_BYTES(ndr, byte_mul*d_len);
ret = convert_string(CH_UNIX, chset,
s, s_len + 1,
- ndr->data+ndr->offset, byte_mul*32);
+ ndr->data+ndr->offset, byte_mul*d_len);
if (ret == -1) {
return ndr_push_error(ndr, NDR_ERR_CHARCNV,
"Bad character conversion");
}
- ndr->offset += byte_mul*32;
+ ndr->offset += byte_mul*d_len;
break;
default:
@@ -915,6 +917,9 @@ size_t ndr_string_array_size(struct ndr_push *ndr, const char *s)
if (flags & LIBNDR_FLAG_STR_FIXLEN32) {
return 32;
}
+ if (flags & LIBNDR_FLAG_STR_FIXLEN15) {
+ return 15;
+ }
c_len = s?strlen_m(s):0;
@@ -1029,11 +1034,18 @@ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type,
void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint_t flag, uint_t value)
{
- /* size can be later used to print something like:
- * ...1.... .........: FLAG1_NAME
- * .....0.. .........: FLAG2_NAME
- */
- ndr->print(ndr, "%s: %-25s", (flag & value)?"1":"0", flag_name);
+ /* this is an attempt to support multi-bit bitmap masks */
+ value &= flag;
+
+ while (!(flag & 1)) {
+ flag >>= 1;
+ value >>= 1;
+ }
+ if (flag == 1) {
+ ndr->print(ndr, " %d: %-25s", value, flag_name);
+ } else {
+ ndr->print(ndr, "0x%02x: %-25s (%d)", value, flag_name, value);
+ }
}
void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v)