diff options
-rw-r--r-- | source4/librpc/idl/epmapper.idl | 2 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc_util.c | 52 |
2 files changed, 53 insertions, 1 deletions
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 @@ -23,6 +23,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;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, |