summaryrefslogtreecommitdiff
path: root/source4/librpc
diff options
context:
space:
mode:
Diffstat (limited to 'source4/librpc')
-rw-r--r--source4/librpc/idl/idl_types.h1
-rw-r--r--source4/librpc/idl/nbt.idl2
-rw-r--r--source4/librpc/idl/winsrepl.idl69
-rw-r--r--source4/librpc/ndr/ndr_basic.c33
4 files changed, 66 insertions, 39 deletions
diff --git a/source4/librpc/idl/idl_types.h b/source4/librpc/idl/idl_types.h
index 1db778476c..d4f2479d48 100644
--- a/source4/librpc/idl/idl_types.h
+++ b/source4/librpc/idl/idl_types.h
@@ -81,7 +81,6 @@
*/
#define utf8string [flag(STR_UTF8|STR_NULLTERM)] string
-
#define NDR_NOALIGN LIBNDR_FLAG_NOALIGN
#define NDR_REMAINING LIBNDR_FLAG_REMAINING
#define NDR_ALIGN2 LIBNDR_FLAG_ALIGN2
diff --git a/source4/librpc/idl/nbt.idl b/source4/librpc/idl/nbt.idl
index a5c5f46962..04fe0c4f90 100644
--- a/source4/librpc/idl/nbt.idl
+++ b/source4/librpc/idl/nbt.idl
@@ -50,7 +50,7 @@ interface nbt
/* we support any 8bit name type, but by defining the common
ones here we get better debug displays */
- typedef [enum8bit,public] enum {
+ typedef [enum8bit] enum {
NBT_NAME_CLIENT = 0x00,
NBT_NAME_MS = 0x01,
NBT_NAME_USER = 0x03,
diff --git a/source4/librpc/idl/winsrepl.idl b/source4/librpc/idl/winsrepl.idl
index 919d3a94bb..cec82a5106 100644
--- a/source4/librpc/idl/winsrepl.idl
+++ b/source4/librpc/idl/winsrepl.idl
@@ -12,63 +12,53 @@
[
uuid("0-1-2-3-4"),
version(0.0),
- pointer_default(unique),
- depends(nbt)
+ pointer_default(unique)
]
interface wrepl
{
const int WINS_REPLICATION_PORT = 42;
- declare enum nbt_name_type;
-
typedef [flag(NDR_BIG_ENDIAN)] struct {
ipv4address owner;
ipv4address ip;
} wrepl_ip;
typedef [flag(NDR_LITTLE_ENDIAN)] struct {
- uint32 num_ips;
- wrepl_ip ips[num_ips];
+ uint32 num_ips;
+ wrepl_ip ips[num_ips];
ipv4address unknown;
} wrepl_address_list;
typedef [nodiscriminant] union {
- [case(0)] wrepl_ip address;
+ [case(0)] wrepl_ip address;
[case(2)] wrepl_address_list addresses;
} wrepl_addresses;
typedef struct {
- uint32 id_high;
- uint32 id_low;
- } wrepl_id;
-
- typedef struct {
- uint32 name_len;
- astring15 name;
- nbt_name_type type;
- uint32 unknown;
- uint32 flags;
+ uint32 name_len;
+ uint8 name[name_len];
+ uint32 flags;
[flag(NDR_LITTLE_ENDIAN)] uint32 group_flag;
- wrepl_id id;
+ udlongr id;
[switch_is(flags & 2)] wrepl_addresses addresses;
} wrepl_wins_name;
typedef struct {
- uint32 num_names;
+ uint32 num_names;
wrepl_wins_name names[num_names];
} wrepl_send_reply;
typedef struct {
ipv4address address;
- wrepl_id max_version;
- wrepl_id min_version;
- uint32 type;
+ udlongr max_version;
+ udlongr min_version;
+ uint32 type;
} wrepl_wins_owner;
typedef struct {
- uint32 partner_count;
+ uint32 partner_count;
wrepl_wins_owner partners[partner_count];
- ipv4address initiator;
+ ipv4address initiator;
} wrepl_table;
typedef [v1_enum] enum {
@@ -82,11 +72,11 @@ interface wrepl
typedef [nodiscriminant] union {
[case(WREPL_REPL_TABLE_QUERY)] ;
- [case(WREPL_REPL_TABLE_REPLY)] wrepl_table table;
+ [case(WREPL_REPL_TABLE_REPLY)] wrepl_table table;
[case(WREPL_REPL_SEND_REQUEST)] wrepl_wins_owner owner;
- [case(WREPL_REPL_SEND_REPLY)] wrepl_send_reply reply;
+ [case(WREPL_REPL_SEND_REPLY)] wrepl_send_reply reply;
[case(WREPL_REPL_UPDATE)] ;
- [case(WREPL_REPL_INFORM)] wrepl_table table;
+ [case(WREPL_REPL_INFORM)] wrepl_table table;
} wrepl_replication_info;
typedef struct {
@@ -112,23 +102,30 @@ interface wrepl
} wrepl_mess_type;
typedef [nodiscriminant] union {
- [case(WREPL_START_ASSOCIATION)] wrepl_start start;
+ [case(WREPL_START_ASSOCIATION)] wrepl_start start;
[case(WREPL_START_ASSOCIATION_REPLY)] wrepl_start start_reply;
- [case(WREPL_STOP_ASSOCIATION)] wrepl_stop stop;
- [case(WREPL_REPLICATION)] wrepl_replication replication;
+ [case(WREPL_STOP_ASSOCIATION)] wrepl_stop stop;
+ [case(WREPL_REPLICATION)] wrepl_replication replication;
} wrepl_message;
+ /*
+ the opcode appears to be a bitfield, but as far as I can tell
+ you must always set the following bits. Additional bits don't
+ seem to matter. Very strange.
+ */
+ const int WREPL_OPCODE_BITS = 0x7800;
+
- typedef [gensize,flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
- uint32 opcode;
- uint32 assoc_ctx;
- wrepl_mess_type mess_type;
+ typedef [gensize,flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
+ uint32 opcode;
+ uint32 assoc_ctx;
+ wrepl_mess_type mess_type;
[switch_is(mess_type)] wrepl_message message;
[flag(NDR_REMAINING)] DATA_BLOB padding;
} wrepl_packet;
- typedef [flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
- [value(ndr_size_wrepl_packet(&r->packet, ndr->flags))] uint32 size;
+ typedef [flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
+ [value(ndr_size_wrepl_packet(&r->packet, ndr->flags))] uint32 size;
wrepl_packet packet;
} wrepl_wrap;
diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c
index 5eecb1d60b..5f91cef2e8 100644
--- a/source4/librpc/ndr/ndr_basic.c
+++ b/source4/librpc/ndr/ndr_basic.c
@@ -132,6 +132,19 @@ NTSTATUS ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
}
/*
+ parse a udlongr
+*/
+NTSTATUS ndr_pull_udlongr(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
+{
+ NDR_PULL_ALIGN(ndr, 4);
+ NDR_PULL_NEED_BYTES(ndr, 8);
+ *v = ((uint64_t)NDR_IVAL(ndr, ndr->offset)) << 32;
+ *v |= NDR_IVAL(ndr, ndr->offset+4);
+ ndr->offset += 8;
+ return NT_STATUS_OK;
+}
+
+/*
parse a dlong
*/
NTSTATUS ndr_pull_dlong(struct ndr_pull *ndr, int ndr_flags, int64_t *v)
@@ -329,7 +342,7 @@ NTSTATUS ndr_push_int32(struct ndr_push *ndr, int ndr_flags, int32_t v)
}
/*
- push a uint64
+ push a udlong
*/
NTSTATUS ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v)
{
@@ -342,6 +355,19 @@ NTSTATUS ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v)
}
/*
+ push a udlongr
+*/
+NTSTATUS ndr_push_udlongr(struct ndr_push *ndr, int ndr_flags, uint64_t v)
+{
+ NDR_PUSH_ALIGN(ndr, 4);
+ NDR_PUSH_NEED_BYTES(ndr, 8);
+ NDR_SIVAL(ndr, ndr->offset+4, (v>>32));
+ NDR_SIVAL(ndr, ndr->offset, (v & 0xFFFFFFFF));
+ ndr->offset += 8;
+ return NT_STATUS_OK;
+}
+
+/*
push a int64
*/
NTSTATUS ndr_push_dlong(struct ndr_push *ndr, int ndr_flags, int64_t v)
@@ -1107,6 +1133,11 @@ void ndr_print_udlong(struct ndr_print *ndr, const char *name, uint64_t v)
v);
}
+void ndr_print_udlongr(struct ndr_print *ndr, const char *name, uint64_t v)
+{
+ ndr_print_udlong(ndr, name, v);
+}
+
void ndr_print_dlong(struct ndr_print *ndr, const char *name, int64_t v)
{
ndr->print(ndr, "%-25s: 0x%08x%08x (%lld)", name,