diff options
Diffstat (limited to 'source4/librpc')
-rw-r--r-- | source4/librpc/idl/epmapper.idl | 4 | ||||
-rw-r--r-- | source4/librpc/ndr/libndr.h | 5 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr_basic.c | 12 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc_util.c | 52 |
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, |