summaryrefslogtreecommitdiff
path: root/source4/librpc
diff options
context:
space:
mode:
Diffstat (limited to 'source4/librpc')
-rw-r--r--source4/librpc/idl/epmapper.idl4
-rw-r--r--source4/librpc/ndr/libndr.h5
-rw-r--r--source4/librpc/ndr/ndr_basic.c12
-rw-r--r--source4/librpc/rpc/dcerpc_util.c52
4 files changed, 19 insertions, 54 deletions
diff --git a/source4/librpc/idl/epmapper.idl b/source4/librpc/idl/epmapper.idl
index 7ea58e354f..18bb6bf7d7 100644
--- a/source4/librpc/idl/epmapper.idl
+++ b/source4/librpc/idl/epmapper.idl
@@ -193,8 +193,8 @@ interface epmapper
epm_floor floors[num_floors];
} epm_towers;
- typedef struct {
- [value(ndr_size_epm_towers(&r->towers))] uint32 tower_length;
+ typedef [gensize] struct {
+ [value(ndr_size_epm_towers(0, &r->towers,ndr->flags))] uint32 tower_length;
[subcontext(4)] epm_towers towers;
} epm_twr_t;
diff --git a/source4/librpc/ndr/libndr.h b/source4/librpc/ndr/libndr.h
index 59e8b744df..306e480c98 100644
--- a/source4/librpc/ndr/libndr.h
+++ b/source4/librpc/ndr/libndr.h
@@ -188,6 +188,11 @@ enum ndr_err_code {
} \
} while(0)
+#define NDR_SIZE_ALIGN(t, n, flags) ((flags & LIBNDR_FLAG_NOALIGN)?(t):(((t) + (n-1)) & ~(n-1)))
+#define ndr_size_uint8(t, p, flags) (NDR_SIZE_ALIGN(t, 1, flags) + 1)
+#define ndr_size_uint16(t, p, flags) (NDR_SIZE_ALIGN(t, 2, flags) + 2)
+#define ndr_size_uint32(t, p, flags) (NDR_SIZE_ALIGN(t, 4, flags) + 4)
+#define ndr_size_ptr(t, p, flags) (NDR_SIZE_ALIGN(t, 4, flags) + 4)
/* these are used to make the error checking on each element in libndr
less tedious, hopefully making the code more readable */
diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c
index edb1590489..5808ae7452 100644
--- a/source4/librpc/ndr/ndr_basic.c
+++ b/source4/librpc/ndr/ndr_basic.c
@@ -1130,3 +1130,15 @@ NTSTATUS ndr_pull_DATA_BLOB(struct ndr_pull *ndr, DATA_BLOB *blob)
ndr->offset += length;
return NT_STATUS_OK;
}
+
+uint32 ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, int flags)
+{
+ return ret + data->length;
+}
+
+uint32 ndr_size_string(int ret, const char **string, int flags)
+{
+ /* FIXME: Is this correct for all strings ? */
+ if(!(*string)) return ret;
+ return ret+strlen(*string)+1;
+}
diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c
index fad8417c3f..5f3d911d15 100644
--- a/source4/librpc/rpc/dcerpc_util.c
+++ b/source4/librpc/rpc/dcerpc_util.c
@@ -23,58 +23,6 @@
#include "includes.h"
/*
- this ndr_size_* stuff should really be auto-generated ....
-*/
-
-static size_t ndr_size_epm_floor(struct epm_floor *fl)
-{
- size_t ret = 5;
- if (fl->lhs.protocol == EPM_PROTOCOL_UUID) {
- ret += 18;
- } else {
- ret += fl->lhs.info.lhs_data.length;
- }
- switch (fl->lhs.protocol) {
- case EPM_PROTOCOL_TCP:
- case EPM_PROTOCOL_UDP:
- case EPM_PROTOCOL_HTTP:
- case EPM_PROTOCOL_UUID:
- ret += 2;
- break;
- case EPM_PROTOCOL_IP:
- ret += 4;
- break;
- case EPM_PROTOCOL_NCADG:
- case EPM_PROTOCOL_NCACN:
- case EPM_PROTOCOL_NCALRPC:
- ret += 2;
- break;
-
- case EPM_PROTOCOL_SMB:
- ret += strlen(fl->rhs.smb.unc)+1;
- break;
- case EPM_PROTOCOL_PIPE:
- ret += strlen(fl->rhs.pipe.path)+1;
- break;
- case EPM_PROTOCOL_NETBIOS:
- ret += strlen(fl->rhs.netbios.name)+1;
- break;
- }
-
- return ret;
-}
-
-size_t ndr_size_epm_towers(struct epm_towers *towers)
-{
- size_t ret = 2;
- int i;
- for (i=0;i<towers->num_floors;i++) {
- ret += ndr_size_epm_floor(&towers->floors[i]);
- }
- return ret;
-}
-
-/*
work out what TCP port to use for a given interface on a given host
*/
NTSTATUS dcerpc_epm_map_tcp_port(const char *server,