summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/librpc/rpc/dcerpc_ep.c67
-rw-r--r--source3/librpc/rpc/dcerpc_ep.h12
2 files changed, 79 insertions, 0 deletions
diff --git a/source3/librpc/rpc/dcerpc_ep.c b/source3/librpc/rpc/dcerpc_ep.c
index cd8b656a7b..bd4e9ee0d9 100644
--- a/source3/librpc/rpc/dcerpc_ep.c
+++ b/source3/librpc/rpc/dcerpc_ep.c
@@ -28,6 +28,25 @@
#define EPM_MAX_ANNOTATION_SIZE 64
+static bool binding_vector_realloc(struct dcerpc_binding_vector *bvec)
+{
+ if (bvec->count >= bvec->allocated) {
+ struct dcerpc_binding *tmp;
+
+ tmp = talloc_realloc(bvec,
+ bvec->bindings,
+ struct dcerpc_binding,
+ bvec->allocated * 2);
+ if (tmp == NULL) {
+ return false;
+ }
+ bvec->bindings = tmp;
+ bvec->allocated = bvec->allocated * 2;
+ }
+
+ return true;
+}
+
NTSTATUS dcerpc_binding_vector_new(TALLOC_CTX *mem_ctx,
struct dcerpc_binding_vector **pbvec)
{
@@ -66,6 +85,54 @@ done:
return status;
}
+NTSTATUS dcerpc_binding_vector_add_np_default(const struct ndr_interface_table *iface,
+ struct dcerpc_binding_vector *bvec)
+{
+ uint32_t ep_count = iface->endpoints->count;
+ uint32_t i;
+ NTSTATUS status;
+ bool ok;
+
+ for (i = 0; i < ep_count; i++) {
+ struct dcerpc_binding *b;
+
+ b = talloc_zero(bvec->bindings, struct dcerpc_binding);
+ if (b == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ status = dcerpc_parse_binding(b, iface->endpoints->names[i], &b);
+ if (!NT_STATUS_IS_OK(status)) {
+ return NT_STATUS_UNSUCCESSFUL;
+ }
+
+ /* Only add the named pipes defined in the iface endpoints */
+ if (b->transport != NCACN_NP) {
+ talloc_free(b);
+ continue;
+ }
+
+ b->object = iface->syntax_id;
+
+ b->host = talloc_asprintf(b, "\\\\%s", lp_netbios_name());
+ if (b->host == NULL) {
+ talloc_free(b);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ ok = binding_vector_realloc(bvec);
+ if (!ok) {
+ talloc_free(b);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ bvec->bindings[bvec->count] = *b;
+ bvec->count++;
+ }
+
+ return NT_STATUS_OK;
+}
+
NTSTATUS dcerpc_binding_vector_create(TALLOC_CTX *mem_ctx,
const struct ndr_interface_table *iface,
uint16_t port,
diff --git a/source3/librpc/rpc/dcerpc_ep.h b/source3/librpc/rpc/dcerpc_ep.h
index 61b85e23dc..b8ea7abeb4 100644
--- a/source3/librpc/rpc/dcerpc_ep.h
+++ b/source3/librpc/rpc/dcerpc_ep.h
@@ -38,6 +38,18 @@ struct dcerpc_binding_vector {
NTSTATUS dcerpc_binding_vector_new(TALLOC_CTX *mem_ctx,
struct dcerpc_binding_vector **pbvec);
+/**
+ * @brief Add default named pipes to the binding vector.
+ *
+ * @param[in] iface The rpc interface to add.
+ *
+ * @param[in] bvec The binding vector to add the interface.
+ *
+ * @return An NTSTATUS error code.
+ */
+NTSTATUS dcerpc_binding_vector_add_np_default(const struct ndr_interface_table *iface,
+ struct dcerpc_binding_vector *bvec);
+
NTSTATUS dcerpc_binding_vector_create(TALLOC_CTX *mem_ctx,
const struct ndr_interface_table *iface,
uint16_t port,