diff options
author | Volker Lendecke <vl@samba.org> | 2015-06-23 19:07:44 +0200 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2015-07-14 09:56:25 +0200 |
commit | 539125c99dfe03aeac5b324106273d8dc10bd7f9 (patch) | |
tree | 9aaac86f142d02a628a1a591ad421efb78e6e45e /source3 | |
parent | 55233940c67a1854e4354766451023a3724c7967 (diff) | |
download | samba-539125c99dfe03aeac5b324106273d8dc10bd7f9.tar.gz |
ctdbd_conn: Move release_ip handling into process.c
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Volker Lendecke <vl@samba.org>
Autobuild-Date(master): Tue Jul 14 09:56:25 CEST 2015 on sn-devel-104
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/ctdbd_conn.h | 6 | ||||
-rw-r--r-- | source3/lib/ctdb_dummy.c | 6 | ||||
-rw-r--r-- | source3/lib/ctdbd_conn.c | 60 | ||||
-rw-r--r-- | source3/smbd/process.c | 23 |
4 files changed, 32 insertions, 63 deletions
diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h index bbfb4c42d17..b60a0e5de56 100644 --- a/source3/include/ctdbd_conn.h +++ b/source3/include/ctdbd_conn.h @@ -75,8 +75,10 @@ NTSTATUS ctdbd_traverse(uint32_t db_id, NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn, const struct sockaddr_storage *server, const struct sockaddr_storage *client, - bool (*release_ip_handler)(const char *ip_addr, - void *private_data), + int (*cb)(uint32_t src_vnn, uint32_t dst_vnn, + uint64_t dst_srvid, + const uint8_t *msg, size_t msglen, + void *private_data), void *private_data); NTSTATUS ctdbd_control_local(struct ctdbd_connection *conn, uint32_t opcode, diff --git a/source3/lib/ctdb_dummy.c b/source3/lib/ctdb_dummy.c index 23b84ae1a3a..df05de757ef 100644 --- a/source3/lib/ctdb_dummy.c +++ b/source3/lib/ctdb_dummy.c @@ -49,8 +49,10 @@ NTSTATUS register_with_ctdbd(struct ctdbd_connection *conn, uint64_t srvid, NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn, const struct sockaddr_storage *_server, const struct sockaddr_storage *_client, - bool (*release_ip_handler)(const char *ip_addr, - void *private_data), + int (*cb)(uint32_t src_vnn, uint32_t dst_vnn, + uint64_t dst_srvid, + const uint8_t *msg, size_t msglen, + void *private_data), void *private_data) { return NT_STATUS_NOT_IMPLEMENTED; diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c index cc59d3992f2..1acce128442 100644 --- a/source3/lib/ctdbd_conn.c +++ b/source3/lib/ctdbd_conn.c @@ -50,9 +50,6 @@ struct ctdbd_connection { struct ctdbd_srvid_cb *callbacks; int fd; struct tevent_fd *fde; - - bool (*release_ip_handler)(const char *ip_addr, void *private_data); - void *release_ip_priv; }; static uint32_t ctdbd_next_reqid(struct ctdbd_connection *conn) @@ -399,30 +396,6 @@ static int ctdb_read_req(struct ctdbd_connection *conn, uint32_t reqid, goto next_pkt; } - if ((conn->release_ip_handler != NULL) - && (msg->srvid == CTDB_SRVID_RELEASE_IP)) { - bool ok; - - /* must be dispatched immediately */ - DEBUG(10, ("received CTDB_SRVID_RELEASE_IP\n")); - ok = conn->release_ip_handler((const char *)msg->data, - conn->release_ip_priv); - TALLOC_FREE(hdr); - - if (ok) { - /* - * We need to release the ip, - * so return an error to the upper layers. - * - * We make sure we don't trigger this again. - */ - conn->release_ip_handler = NULL; - conn->release_ip_priv = NULL; - return EADDRNOTAVAIL; - } - goto next_pkt; - } - ret = ctdbd_msg_call_back(conn, msg); if (ret != 0) { TALLOC_FREE(hdr); @@ -562,26 +535,6 @@ static int ctdb_handle_message(struct ctdbd_connection *conn, msg = (struct ctdb_req_message *)hdr; - if ((conn->release_ip_handler != NULL) - && (msg->srvid == CTDB_SRVID_RELEASE_IP)) { - bool ret; - - /* must be dispatched immediately */ - DEBUG(10, ("received CTDB_SRVID_RELEASE_IP\n")); - ret = conn->release_ip_handler((const char *)msg->data, - conn->release_ip_priv); - if (ret) { - /* - * We need to release the ip. - * - * We make sure we don't trigger this again. - */ - conn->release_ip_handler = NULL; - conn->release_ip_priv = NULL; - } - return 0; - } - ctdbd_msg_call_back(conn, msg); return 0; @@ -1499,8 +1452,10 @@ static void smbd_ctdb_canonicalize_ip(const struct sockaddr_storage *in, NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn, const struct sockaddr_storage *_server, const struct sockaddr_storage *_client, - bool (*release_ip_handler)(const char *ip_addr, - void *private_data), + int (*cb)(uint32_t src_vnn, uint32_t dst_vnn, + uint64_t dst_srvid, + const uint8_t *msg, size_t msglen, + void *private_data), void *private_data) { struct ctdb_control_tcp_addr p; @@ -1512,7 +1467,6 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn, /* * Only one connection so far */ - SMB_ASSERT(conn->release_ip_handler == NULL); smbd_ctdb_canonicalize_ip(_client, &client); smbd_ctdb_canonicalize_ip(_server, &server); @@ -1530,14 +1484,12 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn, return NT_STATUS_INTERNAL_ERROR; } - conn->release_ip_handler = release_ip_handler; - conn->release_ip_priv = private_data; - /* * We want to be told about IP releases */ - status = register_with_ctdbd(conn, CTDB_SRVID_RELEASE_IP, NULL, NULL); + status = register_with_ctdbd(conn, CTDB_SRVID_RELEASE_IP, + cb, private_data); if (!NT_STATUS_IS_OK(status)) { return status; } diff --git a/source3/smbd/process.c b/source3/smbd/process.c index c83f3bcfa72..12ce0d1619c 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -2616,18 +2616,31 @@ static void smbd_release_ip_immediate(struct tevent_context *ctx, /**************************************************************************** received when we should release a specific IP ****************************************************************************/ -static bool release_ip(const char *ip, void *priv) +static int release_ip(uint32_t src_vnn, uint32_t dst_vnn, + uint64_t dst_srvid, + const uint8_t *msg, size_t msglen, + void *private_data) { struct smbd_release_ip_state *state = - talloc_get_type_abort(priv, + talloc_get_type_abort(private_data, struct smbd_release_ip_state); struct smbXsrv_connection *xconn = state->xconn; + const char *ip; const char *addr = state->addr; const char *p = addr; + if (msglen == 0) { + return 0; + } + if (msg[msglen-1] != '\0') { + return 0; + } + + ip = (const char *)msg; + if (!NT_STATUS_IS_OK(xconn->transport.status)) { /* avoid recursion */ - return false; + return 0; } if (strncmp("::ffff:", addr, 7) == 0) { @@ -2668,10 +2681,10 @@ static bool release_ip(const char *ip, void *priv) * Make sure we don't get any io on the connection. */ xconn->transport.status = NT_STATUS_ADDRESS_CLOSED; - return true; + return EADDRNOTAVAIL; } - return false; + return 0; } static NTSTATUS smbd_register_ips(struct smbXsrv_connection *xconn, |