summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2011-06-30 12:01:10 +0200
committerAndreas Schneider <asn@samba.org>2011-08-01 08:50:35 +0200
commiteaced2e909b58ce5b83998e6bde9750985f7a99d (patch)
tree69806f63f53fa9712532f07a9a7b46d6ffc5496d
parentc810e475194775c63f32c4efeb9a505d9647b2bc (diff)
downloadsamba-eaced2e909b58ce5b83998e6bde9750985f7a99d.tar.gz
samba-eaced2e909b58ce5b83998e6bde9750985f7a99d.tar.bz2
samba-eaced2e909b58ce5b83998e6bde9750985f7a99d.zip
s3-librpc: Add dcerpc_binding_vector_add_port().
-rw-r--r--source3/librpc/rpc/dcerpc_ep.c57
-rw-r--r--source3/librpc/rpc/dcerpc_ep.h18
2 files changed, 75 insertions, 0 deletions
diff --git a/source3/librpc/rpc/dcerpc_ep.c b/source3/librpc/rpc/dcerpc_ep.c
index bd4e9ee0d9..20936bcbf3 100644
--- a/source3/librpc/rpc/dcerpc_ep.c
+++ b/source3/librpc/rpc/dcerpc_ep.c
@@ -133,6 +133,63 @@ NTSTATUS dcerpc_binding_vector_add_np_default(const struct ndr_interface_table *
return NT_STATUS_OK;
}
+NTSTATUS dcerpc_binding_vector_add_port(const struct ndr_interface_table *iface,
+ struct dcerpc_binding_vector *bvec,
+ const char *host,
+ uint16_t port)
+{
+ 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;
+ }
+
+ if (b->transport != NCACN_IP_TCP) {
+ talloc_free(b);
+ continue;
+ }
+
+ b->object = iface->syntax_id;
+
+ b->host = talloc_strdup(b, host);
+ if (b->host == NULL) {
+ talloc_free(b);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ b->endpoint = talloc_asprintf(b, "%u", port);
+ if (b->endpoint == 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++;
+
+ break;
+ }
+
+ 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 b8ea7abeb4..9375589c68 100644
--- a/source3/librpc/rpc/dcerpc_ep.h
+++ b/source3/librpc/rpc/dcerpc_ep.h
@@ -50,6 +50,24 @@ NTSTATUS dcerpc_binding_vector_new(TALLOC_CTX *mem_ctx,
NTSTATUS dcerpc_binding_vector_add_np_default(const struct ndr_interface_table *iface,
struct dcerpc_binding_vector *bvec);
+/**
+ * @brief Add a tcpip port to a binding vector.
+ *
+ * @param[in] iface The rpc interface to add.
+ *
+ * @param[in] bvec The binding vector to add the intface, host and port.
+ *
+ * @param[in] host The ip address of the network inteface bound.
+ *
+ * @param[in] port The port bound.
+ *
+ * @return An NTSTATUS error code.
+ */
+NTSTATUS dcerpc_binding_vector_add_port(const struct ndr_interface_table *iface,
+ struct dcerpc_binding_vector *bvec,
+ const char *host,
+ uint16_t port);
+
NTSTATUS dcerpc_binding_vector_create(TALLOC_CTX *mem_ctx,
const struct ndr_interface_table *iface,
uint16_t port,