summaryrefslogtreecommitdiff
path: root/source4/lib/messaging
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2014-07-17 15:05:30 +0000
committerVolker Lendecke <vl@samba.org>2014-07-21 20:28:53 +0200
commit1dd64341d801d9adc66aa6432dc3afb64644e29b (patch)
treea169c4d5124b2465146d17d9a93500a853ddbb6b /source4/lib/messaging
parent53d1bbd20d252b7b759f6a5feb43a0f94b824437 (diff)
downloadsamba-1dd64341d801d9adc66aa6432dc3afb64644e29b.tar.gz
messaging4: Change irpc_servers_by_name to NTSTATUS
For me, counted arrays are easier to deal with than NULL-terminated ones. Here we also had a "server_id_is_disconnection" convention, which was not really obvious. Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> Autobuild-User(master): Volker Lendecke <vl@samba.org> Autobuild-Date(master): Mon Jul 21 20:28:53 CEST 2014 on sn-devel-104
Diffstat (limited to 'source4/lib/messaging')
-rw-r--r--source4/lib/messaging/irpc.h5
-rw-r--r--source4/lib/messaging/messaging.c43
-rw-r--r--source4/lib/messaging/pymessaging.c18
3 files changed, 36 insertions, 30 deletions
diff --git a/source4/lib/messaging/irpc.h b/source4/lib/messaging/irpc.h
index 96f67e1dcb7..ebf30afdb3f 100644
--- a/source4/lib/messaging/irpc.h
+++ b/source4/lib/messaging/irpc.h
@@ -73,7 +73,10 @@ void irpc_binding_handle_add_security_token(struct dcerpc_binding_handle *h,
struct security_token *token);
NTSTATUS irpc_add_name(struct imessaging_context *msg_ctx, const char *name);
-struct server_id *irpc_servers_byname(struct imessaging_context *msg_ctx, TALLOC_CTX *mem_ctx, const char *name);
+NTSTATUS irpc_servers_byname(struct imessaging_context *msg_ctx,
+ TALLOC_CTX *mem_ctx, const char *name,
+ unsigned *num_servers,
+ struct server_id **servers);
struct irpc_name_records *irpc_all_servers(struct imessaging_context *msg_ctx,
TALLOC_CTX *mem_ctx);
void irpc_remove_name(struct imessaging_context *msg_ctx, const char *name);
diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c
index 00cff1210df..137d859f2bf 100644
--- a/source4/lib/messaging/messaging.c
+++ b/source4/lib/messaging/messaging.c
@@ -951,32 +951,38 @@ NTSTATUS irpc_add_name(struct imessaging_context *msg_ctx, const char *name)
/*
return a list of server ids for a server name
*/
-struct server_id *irpc_servers_byname(struct imessaging_context *msg_ctx,
- TALLOC_CTX *mem_ctx,
- const char *name)
+NTSTATUS irpc_servers_byname(struct imessaging_context *msg_ctx,
+ TALLOC_CTX *mem_ctx, const char *name,
+ unsigned *num_servers,
+ struct server_id **servers)
{
struct tdb_wrap *t = msg_ctx->names_db;
TDB_DATA rec;
- int count, i;
+ unsigned count;
struct server_id *ret;
rec = tdb_fetch_bystring(t->tdb, name);
if (rec.dptr == NULL) {
- return NULL;
+ enum TDB_ERROR err = tdb_error(t->tdb);
+ return map_nt_error_from_tdb(err);
}
+
count = rec.dsize / sizeof(struct server_id);
- ret = talloc_array(mem_ctx, struct server_id, count+1);
+ if (count == 0) {
+ return NT_STATUS_NOT_FOUND;
+ }
+
+ ret = talloc_array(mem_ctx, struct server_id, count);
if (ret == NULL) {
free(rec.dptr);
- return NULL;
- }
- for (i=0;i<count;i++) {
- ret[i] = ((struct server_id *)rec.dptr)[i];
+ return NT_STATUS_NO_MEMORY;
}
- server_id_set_disconnected(&ret[i]);
+ memcpy(ret, rec.dptr, count * sizeof(struct server_id));
free(rec.dptr);
- return ret;
+ *num_servers = count;
+ *servers = ret;
+ return NT_STATUS_OK;
}
static int all_servers_func(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *state)
@@ -1380,17 +1386,16 @@ struct dcerpc_binding_handle *irpc_binding_handle_by_name(TALLOC_CTX *mem_ctx,
const struct ndr_interface_table *table)
{
struct dcerpc_binding_handle *h;
+ unsigned num_sids;
struct server_id *sids;
struct server_id sid;
+ NTSTATUS status;
/* find the server task */
- sids = irpc_servers_byname(msg_ctx, mem_ctx, dest_task);
- if (sids == NULL) {
- errno = EADDRNOTAVAIL;
- return NULL;
- }
- if (server_id_is_disconnected(&sids[0])) {
- talloc_free(sids);
+
+ status = irpc_servers_byname(msg_ctx, mem_ctx, dest_task,
+ &num_sids, &sids);
+ if (!NT_STATUS_IS_OK(status)) {
errno = EADDRNOTAVAIL;
return NULL;
}
diff --git a/source4/lib/messaging/pymessaging.c b/source4/lib/messaging/pymessaging.c
index 62370ae7567..1e9588c6737 100644
--- a/source4/lib/messaging/pymessaging.c
+++ b/source4/lib/messaging/pymessaging.c
@@ -235,10 +235,12 @@ static PyObject *py_irpc_servers_byname(PyObject *self, PyObject *args, PyObject
{
imessaging_Object *iface = (imessaging_Object *)self;
char *server_name;
+ unsigned i, num_ids;
struct server_id *ids;
PyObject *pylist;
- int i;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
+ NTSTATUS status;
+
if (!mem_ctx) {
PyErr_NoMemory();
return NULL;
@@ -249,25 +251,21 @@ static PyObject *py_irpc_servers_byname(PyObject *self, PyObject *args, PyObject
return NULL;
}
- ids = irpc_servers_byname(iface->msg_ctx, mem_ctx, server_name);
-
- if (ids == NULL) {
+ status = irpc_servers_byname(iface->msg_ctx, mem_ctx, server_name,
+ &num_ids, &ids);
+ if (!NT_STATUS_IS_OK(status)) {
TALLOC_FREE(mem_ctx);
PyErr_SetString(PyExc_KeyError, "No such name");
return NULL;
}
- for (i = 0; !server_id_is_disconnected(&ids[i]); i++) {
- /* Do nothing */
- }
-
- pylist = PyList_New(i);
+ pylist = PyList_New(num_ids);
if (pylist == NULL) {
TALLOC_FREE(mem_ctx);
PyErr_NoMemory();
return NULL;
}
- for (i = 0; !server_id_is_disconnected(&ids[i]); i++) {
+ for (i = 0; i < num_ids; i++) {
PyObject *py_server_id;
struct server_id *p_server_id = talloc(NULL, struct server_id);
if (!p_server_id) {