From 24c0fbc0e88bf0f7bc34f75c99aa276ca19b0163 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 13 Oct 2004 20:09:46 +0000 Subject: r2956: Fix towers_length for now. I'm currently working on a pidl extension that can generate these kinds of functions (This used to be commit ebca2516502560edfd4056fbb4cfc9718a108efa) --- source4/librpc/idl/epmapper.idl | 2 +- source4/librpc/rpc/dcerpc_util.c | 52 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/source4/librpc/idl/epmapper.idl b/source4/librpc/idl/epmapper.idl index 4898bbda2e..fffd2606c0 100644 --- a/source4/librpc/idl/epmapper.idl +++ b/source4/librpc/idl/epmapper.idl @@ -194,7 +194,7 @@ interface epmapper } epm_towers; typedef struct { - uint32 tower_length; + [value(ndr_size_epm_towers(&r->towers))] uint32 tower_length; [subcontext(4)] epm_towers towers; } epm_twr_t; diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c index 5f3d911d15..fad8417c3f 100644 --- a/source4/librpc/rpc/dcerpc_util.c +++ b/source4/librpc/rpc/dcerpc_util.c @@ -22,6 +22,58 @@ #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;inum_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 */ -- cgit