From e44c76ebd75af22f15b4ab2dd87421e66632eac0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:37:13 +0000 Subject: r11004: r10083@SERNOX: metze | 2005-09-08 16:50:32 +0200 This is the start of a WINS-Replicaton server: The design is to handle incoming and outgoing connections, in one process, because it make thing much easier, and there's no need to it otherwise. The current code only parses incoming packets, and can reply to them, but currently only a standard error packets STOP_ASSOCIATON with reason == 4 (I think it means your are not configured as a wins partner of me) (the server service is called "wrepl") metze (This used to be commit 55a2016ba379d035cd559fb55a280e2ee9f15178) --- source4/wrepl_server/wrepl_server.c | 499 ++++++++++++++++++++++++++++++++++++ 1 file changed, 499 insertions(+) create mode 100644 source4/wrepl_server/wrepl_server.c (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c new file mode 100644 index 0000000000..10dc824507 --- /dev/null +++ b/source4/wrepl_server/wrepl_server.c @@ -0,0 +1,499 @@ +/* + Unix SMB/CIFS implementation. + + WINS Replication server + + Copyright (C) Stefan Metzmacher 2005 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "dlinklist.h" +#include "lib/events/events.h" +#include "lib/socket/socket.h" +#include "smbd/service_task.h" +#include "smbd/service_stream.h" +#include "lib/messaging/irpc.h" +#include "librpc/gen_ndr/ndr_winsrepl.h" + +struct wreplsrv_service; +struct wreplsrv_in_connection; +struct wreplsrv_out_connection; +struct wreplsrv_partner; +struct wreplsrv_pull_partner_item; +struct wreplsrv_push_partner_item; + +/* + state of an incoming wrepl call +*/ +struct wreplsrv_in_call { + struct wreplsrv_in_connection *wreplconn; + struct wrepl_packet req_packet; + struct wrepl_packet rep_packet; +}; + +/* + state of an incoming wrepl connection +*/ +struct wreplsrv_in_connection { + struct wreplsrv_in_connection *prev,*next; + struct stream_connection *conn; + + /* our global service context */ + struct wreplsrv_service *service; + + /* + * the partner that connects us, + * can be NULL, when we got a connection + * from an unknown address + */ + struct wreplsrv_partner *partner; + + /* + * we need to take care of our own ip address, + * as this is the WINS-Owner ID the peer expect + * from us. + */ + const char *our_ip; + + /* the partial input on the connection */ + DATA_BLOB partial; + size_t partial_read; + + /* + * are we currently processing a request? + * this prevents loops, with half async code + */ + BOOL processing; + + /* the list of outgoing DATA_BLOB's that needs to be send */ + struct data_blob_list_item *send_queue; +}; + +/* + state of an outcoming wrepl connection +*/ +struct wreplsrv_out_connection { + struct wreplsrv_partner *partner; +}; + +/* + state of the whole wrepl service +*/ +struct wreplsrv_service { + /* the whole wrepl service is in one task */ + struct task_server *task; + + /* all incoming connections */ + struct wreplsrv_in_connection *in_connections; + + /* all partners (pull and push) */ + struct wreplsrv_partner *partners; + + /* all pull partners */ + struct wreplsrv_pull_partner *pull_partners; + + /* all push partners */ + struct wreplsrv_push_partner *push_partners; +}; + +static void wreplsrv_terminate_connection(struct wreplsrv_in_connection *wreplconn, const char *reason) +{ + stream_terminate_connection(wreplconn->conn, reason); +} + +static NTSTATUS wreplsrv_in_start_association(struct wreplsrv_in_call *call) +{ + struct wrepl_stop *stop; + + call->rep_packet.opcode = WREPL_OPCODE_BITS; + call->rep_packet.assoc_ctx = 0; + call->rep_packet.mess_type = WREPL_STOP_ASSOCIATION; + stop = &call->rep_packet.message.stop; + stop->reason = 4; + + return NT_STATUS_OK; +} + +static NTSTATUS wreplsrv_in_replication(struct wreplsrv_in_call *call) +{ + struct wrepl_replication *repl_in = &call->req_packet.message.replication; + struct wrepl_stop *stop_out; + + switch (repl_in->command) { + case WREPL_REPL_TABLE_QUERY: + break; + case WREPL_REPL_TABLE_REPLY: + break; + case WREPL_REPL_SEND_REQUEST: + break; + case WREPL_REPL_SEND_REPLY: + break; + case WREPL_REPL_UPDATE: + break; + case WREPL_REPL_INFORM: + break; + } + + call->rep_packet.opcode = WREPL_OPCODE_BITS; + call->rep_packet.assoc_ctx = 0; + call->rep_packet.mess_type = WREPL_STOP_ASSOCIATION; + stop_out = &call->rep_packet.message.stop; + stop_out->reason = 4; + + return NT_STATUS_OK; +} + +static NTSTATUS wreplsrv_in_call(struct wreplsrv_in_call *call) +{ + struct wrepl_stop *stop_out; + + /* TODO: check opcode and assoc_ctx */ + + switch (call->req_packet.mess_type) { + case WREPL_START_ASSOCIATION: + return wreplsrv_in_start_association(call); + + case WREPL_START_ASSOCIATION_REPLY: + /* this is not valid here */ + break; + case WREPL_STOP_ASSOCIATION: + /* this is not valid here */ + break; + + case WREPL_REPLICATION: + return wreplsrv_in_replication(call); + } + + call->rep_packet.opcode = WREPL_OPCODE_BITS; + call->rep_packet.assoc_ctx = 0; + call->rep_packet.mess_type = WREPL_STOP_ASSOCIATION; + call->rep_packet.padding = data_blob(NULL, 0); + stop_out = &call->rep_packet.message.stop; + stop_out->reason = 4; + + return NT_STATUS_OK; +} + +/* + called when we get a new connection +*/ +static void wreplsrv_accept(struct stream_connection *conn) +{ + struct wreplsrv_service *service = talloc_get_type(conn->private, struct wreplsrv_service); + struct wreplsrv_in_connection *wreplconn; + + wreplconn = talloc_zero(conn, struct wreplsrv_in_connection); + if (!wreplconn) { + stream_terminate_connection(conn, "wreplsrv_accept: out of memory"); + return; + } + + wreplconn->conn = conn; + wreplconn->service = service; + wreplconn->our_ip = socket_get_my_addr(conn->socket, wreplconn); + if (!wreplconn->our_ip) { + wreplsrv_terminate_connection(wreplconn, "wreplsrv_accept: out of memory"); + return; + } + + conn->private = wreplconn; + + irpc_add_name(conn->msg_ctx, "wreplsrv_connection"); +} + +/* + receive some data on a WREPL connection +*/ +static void wreplsrv_recv(struct stream_connection *conn, uint16_t flags) +{ + struct wreplsrv_in_connection *wreplconn = talloc_get_type(conn->private, struct wreplsrv_in_connection); + struct wreplsrv_in_call *call; + DATA_BLOB packet_in_blob; + DATA_BLOB packet_out_blob; + struct wrepl_wrap packet_out_wrap; + struct data_blob_list_item *rep; + NTSTATUS status = NT_STATUS_UNSUCCESSFUL; + size_t nread; + + /* avoid recursion, because of half async code */ + if (wreplconn->processing) { + EVENT_FD_NOT_READABLE(conn->event.fde); + return; + } + + if (wreplconn->partial.length == 0) { + wreplconn->partial = data_blob_talloc(wreplconn, NULL, 4); + if (wreplconn->partial.data == NULL) { + status = NT_STATUS_NO_MEMORY; + goto failed; + } + wreplconn->partial_read = 0; + } + + /* read in the packet length */ + if (wreplconn->partial_read < 4) { + uint32_t packet_length; + + status = socket_recv(conn->socket, + wreplconn->partial.data + wreplconn->partial_read, + 4 - wreplconn->partial_read, + &nread, 0); + if (NT_STATUS_IS_ERR(status)) goto failed; + if (!NT_STATUS_IS_OK(status)) return; + + wreplconn->partial_read += nread; + if (wreplconn->partial_read != 4) return; + + packet_length = RIVAL(wreplconn->partial.data, 0) + 4; + + wreplconn->partial.data = talloc_realloc(wreplconn, wreplconn->partial.data, + uint8_t, packet_length); + if (wreplconn->partial.data == NULL) { + status = NT_STATUS_NO_MEMORY; + goto failed; + } + wreplconn->partial.length = packet_length; + } + + /* read in the body */ + status = socket_recv(conn->socket, + wreplconn->partial.data + wreplconn->partial_read, + wreplconn->partial.length - wreplconn->partial_read, + &nread, 0); + if (NT_STATUS_IS_ERR(status)) goto failed; + if (!NT_STATUS_IS_OK(status)) return; + + wreplconn->partial_read += nread; + if (wreplconn->partial_read != wreplconn->partial.length) return; + + packet_in_blob.data = wreplconn->partial.data + 4; + packet_in_blob.length = wreplconn->partial.length - 4; + + call = talloc(wreplconn, struct wreplsrv_in_call); + if (!call) { + status = NT_STATUS_NO_MEMORY; + goto failed; + } + call->wreplconn = wreplconn; + + /* we have a full request - parse it */ + status = ndr_pull_struct_blob(&packet_in_blob, + call, &call->req_packet, + (ndr_pull_flags_fn_t)ndr_pull_wrepl_packet); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(2,("Failed to parse incoming WINS-Replication packet - %s\n", + nt_errstr(status))); + DEBUG(10,("packet length %u\n", wreplconn->partial.length)); + NDR_PRINT_DEBUG(wrepl_packet, &call->req_packet); + goto failed; + } + + /* + * we have parsed the request, so we can reset the wreplconn->partial_read, + * maybe we could also free wreplconn->partial, but for now we keep it, + * and overwrite it the next time + */ + wreplconn->partial_read = 0; + + if (DEBUGLVL(10)) { + DEBUG(10,("Received WINS-Replication packet of length %u\n", wreplconn->partial.length)); + NDR_PRINT_DEBUG(wrepl_packet, &call->req_packet); + } + + /* actually process the request */ + wreplconn->processing = True; + status = wreplsrv_in_call(call); + wreplconn->processing = False; + if (!NT_STATUS_IS_OK(status)) goto failed; + + /* and now encode the reply */ + packet_out_wrap.packet = call->rep_packet; + status = ndr_push_struct_blob(&packet_out_blob, call, &packet_out_wrap, + (ndr_push_flags_fn_t)ndr_push_wrepl_wrap); + if (!NT_STATUS_IS_OK(status)) goto failed; + + if (DEBUGLVL(10)) { + DEBUG(10,("Sending WINS-Replication packet of length %d\n", (int)packet_out_blob.length)); + NDR_PRINT_DEBUG(wrepl_packet, &call->rep_packet); + } + + rep = talloc(wreplconn, struct data_blob_list_item); + if (!rep) { + status = NT_STATUS_NO_MEMORY; + goto failed; + } + + rep->blob = packet_out_blob; + talloc_steal(rep, packet_out_blob.data); + /* we don't need the call anymore */ + talloc_free(call); + + if (!wreplconn->send_queue) { + EVENT_FD_WRITEABLE(conn->event.fde); + } + DLIST_ADD_END(wreplconn->send_queue, rep, struct data_blob_list_item *); + + EVENT_FD_READABLE(conn->event.fde); + return; + +failed: + wreplsrv_terminate_connection(wreplconn, nt_errstr(status)); +} + +/* + called when we can write to a connection +*/ +static void wreplsrv_send(struct stream_connection *conn, uint16_t flags) +{ + struct wreplsrv_in_connection *wreplconn = talloc_get_type(conn->private, struct wreplsrv_in_connection); + NTSTATUS status; + + while (wreplconn->send_queue) { + struct data_blob_list_item *rep = wreplconn->send_queue; + size_t sendlen; + + status = socket_send(conn->socket, &rep->blob, &sendlen, 0); + if (NT_STATUS_IS_ERR(status)) goto failed; + if (!NT_STATUS_IS_OK(status)) return; + + rep->blob.length -= sendlen; + rep->blob.data += sendlen; + + if (rep->blob.length == 0) { + DLIST_REMOVE(wreplconn->send_queue, rep); + talloc_free(rep); + } + } + + EVENT_FD_NOT_WRITEABLE(conn->event.fde); + return; + +failed: + wreplsrv_terminate_connection(wreplconn, nt_errstr(status)); +} + +static const struct stream_server_ops wreplsrv_stream_ops = { + .name = "wreplsrv", + .accept_connection = wreplsrv_accept, + .recv_handler = wreplsrv_recv, + .send_handler = wreplsrv_send, +}; + +/* + startup the wrepl port 42 server sockets +*/ +static NTSTATUS wreplsrv_setup_sockets(struct wreplsrv_service *service) +{ + NTSTATUS status; + struct task_server *task = service->task; + const struct model_ops *model_ops; + const char *address; + uint16_t port = WINS_REPLICATION_PORT; + + /* within the wrepl task we want to be a single process, so + ask for the single process model ops and pass these to the + stream_setup_socket() call. */ + model_ops = process_model_byname("single"); + if (!model_ops) { + DEBUG(0,("Can't find 'single' process model_ops")); + return NT_STATUS_INTERNAL_ERROR; + } + + if (lp_interfaces() && lp_bind_interfaces_only()) { + int num_interfaces = iface_count(); + int i; + + /* We have been given an interfaces line, and been + told to only bind to those interfaces. Create a + socket per interface and bind to only these. + */ + for(i = 0; i < num_interfaces; i++) { + address = iface_n_ip(i); + status = stream_setup_socket(task->event_ctx, model_ops, &wreplsrv_stream_ops, + "ipv4", address, &port, NULL); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("stream_setup_socket(address=%s,port=%u) failed - %s\n", + address, port, nt_errstr(status))); + return status; + } + } + } else { + address = lp_socket_address(); + status = stream_setup_socket(task->event_ctx, model_ops, &wreplsrv_stream_ops, + "ipv4", address, &port, NULL); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("stream_setup_socket(address=%s,port=%u) failed - %s\n", + address, port, nt_errstr(status))); + return status; + } + } + + return NT_STATUS_OK; +} + +/* + startup the wrepl task +*/ +static void wreplsrv_task_init(struct task_server *task) +{ + NTSTATUS status; + struct wreplsrv_service *service; + + service = talloc_zero(task, struct wreplsrv_service); + if (!service) { + task_server_terminate(task, "wreplsrv_task_init: out of memory"); + return; + } + service->task = task; + task->private = service; + + /* + * TODO: setup up all partners, and open the winsdb + */ + + /* + * setup listen sockets, so we can anwser requests from our partners, + * which pull from us + */ + status = wreplsrv_setup_sockets(service); + if (!NT_STATUS_IS_OK(status)) { + task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_sockets() failed"); + return; + } + + /* + * TODO: setup timed events for each partner we want to pull from + */ + + irpc_add_name(task->msg_ctx, "wrepl_server"); +} + +/* + initialise the WREPL server + */ +static NTSTATUS wreplsrv_init(struct event_context *event_ctx, const struct model_ops *model_ops) +{ + return task_server_startup(event_ctx, model_ops, wreplsrv_task_init); +} + +/* + register ourselves as a available server +*/ +NTSTATUS server_service_wrepl_init(void) +{ + return register_server_service("wrepl", wreplsrv_init); +} -- cgit From b2da403af9963b9242f0a61ce0ed1d005acf2bd7 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:38:07 +0000 Subject: r11007: r10109@SERNOX: metze | 2005-09-09 12:29:12 +0200 - move structs to a seperate header file - move the code for the wreplsrv_in_call handling to a seperate file metze (This used to be commit c9a8544446312d96ecadcf370af76d9dc5b2531a) --- source4/wrepl_server/wrepl_server.c | 157 +----------------------------------- 1 file changed, 2 insertions(+), 155 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 10dc824507..50be38e8d6 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -28,166 +28,13 @@ #include "smbd/service_stream.h" #include "lib/messaging/irpc.h" #include "librpc/gen_ndr/ndr_winsrepl.h" +#include "wrepl_server/wrepl_server.h" -struct wreplsrv_service; -struct wreplsrv_in_connection; -struct wreplsrv_out_connection; -struct wreplsrv_partner; -struct wreplsrv_pull_partner_item; -struct wreplsrv_push_partner_item; - -/* - state of an incoming wrepl call -*/ -struct wreplsrv_in_call { - struct wreplsrv_in_connection *wreplconn; - struct wrepl_packet req_packet; - struct wrepl_packet rep_packet; -}; - -/* - state of an incoming wrepl connection -*/ -struct wreplsrv_in_connection { - struct wreplsrv_in_connection *prev,*next; - struct stream_connection *conn; - - /* our global service context */ - struct wreplsrv_service *service; - - /* - * the partner that connects us, - * can be NULL, when we got a connection - * from an unknown address - */ - struct wreplsrv_partner *partner; - - /* - * we need to take care of our own ip address, - * as this is the WINS-Owner ID the peer expect - * from us. - */ - const char *our_ip; - - /* the partial input on the connection */ - DATA_BLOB partial; - size_t partial_read; - - /* - * are we currently processing a request? - * this prevents loops, with half async code - */ - BOOL processing; - - /* the list of outgoing DATA_BLOB's that needs to be send */ - struct data_blob_list_item *send_queue; -}; - -/* - state of an outcoming wrepl connection -*/ -struct wreplsrv_out_connection { - struct wreplsrv_partner *partner; -}; - -/* - state of the whole wrepl service -*/ -struct wreplsrv_service { - /* the whole wrepl service is in one task */ - struct task_server *task; - - /* all incoming connections */ - struct wreplsrv_in_connection *in_connections; - - /* all partners (pull and push) */ - struct wreplsrv_partner *partners; - - /* all pull partners */ - struct wreplsrv_pull_partner *pull_partners; - - /* all push partners */ - struct wreplsrv_push_partner *push_partners; -}; - -static void wreplsrv_terminate_connection(struct wreplsrv_in_connection *wreplconn, const char *reason) +void wreplsrv_terminate_connection(struct wreplsrv_in_connection *wreplconn, const char *reason) { stream_terminate_connection(wreplconn->conn, reason); } -static NTSTATUS wreplsrv_in_start_association(struct wreplsrv_in_call *call) -{ - struct wrepl_stop *stop; - - call->rep_packet.opcode = WREPL_OPCODE_BITS; - call->rep_packet.assoc_ctx = 0; - call->rep_packet.mess_type = WREPL_STOP_ASSOCIATION; - stop = &call->rep_packet.message.stop; - stop->reason = 4; - - return NT_STATUS_OK; -} - -static NTSTATUS wreplsrv_in_replication(struct wreplsrv_in_call *call) -{ - struct wrepl_replication *repl_in = &call->req_packet.message.replication; - struct wrepl_stop *stop_out; - - switch (repl_in->command) { - case WREPL_REPL_TABLE_QUERY: - break; - case WREPL_REPL_TABLE_REPLY: - break; - case WREPL_REPL_SEND_REQUEST: - break; - case WREPL_REPL_SEND_REPLY: - break; - case WREPL_REPL_UPDATE: - break; - case WREPL_REPL_INFORM: - break; - } - - call->rep_packet.opcode = WREPL_OPCODE_BITS; - call->rep_packet.assoc_ctx = 0; - call->rep_packet.mess_type = WREPL_STOP_ASSOCIATION; - stop_out = &call->rep_packet.message.stop; - stop_out->reason = 4; - - return NT_STATUS_OK; -} - -static NTSTATUS wreplsrv_in_call(struct wreplsrv_in_call *call) -{ - struct wrepl_stop *stop_out; - - /* TODO: check opcode and assoc_ctx */ - - switch (call->req_packet.mess_type) { - case WREPL_START_ASSOCIATION: - return wreplsrv_in_start_association(call); - - case WREPL_START_ASSOCIATION_REPLY: - /* this is not valid here */ - break; - case WREPL_STOP_ASSOCIATION: - /* this is not valid here */ - break; - - case WREPL_REPLICATION: - return wreplsrv_in_replication(call); - } - - call->rep_packet.opcode = WREPL_OPCODE_BITS; - call->rep_packet.assoc_ctx = 0; - call->rep_packet.mess_type = WREPL_STOP_ASSOCIATION; - call->rep_packet.padding = data_blob(NULL, 0); - stop_out = &call->rep_packet.message.stop; - stop_out->reason = 4; - - return NT_STATUS_OK; -} - /* called when we get a new connection */ -- cgit From d49e67f06f55054f23dbef609b4debb11c157ffa Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:44:47 +0000 Subject: r11014: r10139@SERNOX: metze | 2005-09-10 10:32:36 +0200 - w2k just ignores invalid packets, so we do now - w2k only checks the assoc_ctx when the opcode has the sepcific obcode bit's set - terminate the connection, when getting a WREPL_STOP_ASSOCIATION packet - some more special error handling proper torture test for all this cases are following later metze (This used to be commit 42b69461aad3942dde361d61b950445dd39882aa) --- source4/wrepl_server/wrepl_server.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 50be38e8d6..63fb6cd902 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -57,6 +57,8 @@ static void wreplsrv_accept(struct stream_connection *conn) return; } + /* TODO: find out if it's a partner */ + conn->private = wreplconn; irpc_add_name(conn->msg_ctx, "wreplsrv_connection"); @@ -130,7 +132,7 @@ static void wreplsrv_recv(struct stream_connection *conn, uint16_t flags) packet_in_blob.data = wreplconn->partial.data + 4; packet_in_blob.length = wreplconn->partial.length - 4; - call = talloc(wreplconn, struct wreplsrv_in_call); + call = talloc_zero(wreplconn, struct wreplsrv_in_call); if (!call) { status = NT_STATUS_NO_MEMORY; goto failed; @@ -165,7 +167,13 @@ static void wreplsrv_recv(struct stream_connection *conn, uint16_t flags) wreplconn->processing = True; status = wreplsrv_in_call(call); wreplconn->processing = False; - if (!NT_STATUS_IS_OK(status)) goto failed; + if (NT_STATUS_IS_ERR(status)) goto failed; + if (!NT_STATUS_IS_OK(status)) { + /* w2k just ignores invalid packets, so we do */ + DEBUG(10,("Received WINS-Replication packet was invalid, we just ignore it\n")); + talloc_free(call); + return; + } /* and now encode the reply */ packet_out_wrap.packet = call->rep_packet; @@ -194,7 +202,11 @@ static void wreplsrv_recv(struct stream_connection *conn, uint16_t flags) } DLIST_ADD_END(wreplconn->send_queue, rep, struct data_blob_list_item *); - EVENT_FD_READABLE(conn->event.fde); + if (wreplconn->terminate) { + EVENT_FD_NOT_READABLE(conn->event.fde); + } else { + EVENT_FD_READABLE(conn->event.fde); + } return; failed: @@ -226,6 +238,11 @@ static void wreplsrv_send(struct stream_connection *conn, uint16_t flags) } } + if (wreplconn->terminate) { + wreplsrv_terminate_connection(wreplconn, "connection terminated after all pending packets are send"); + return; + } + EVENT_FD_NOT_WRITEABLE(conn->event.fde); return; -- cgit From cbe9ae1234d03bd0f79444676f05cc871b143e71 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:48:20 +0000 Subject: r11023: r10310@SERNOX: metze | 2005-09-19 11:21:39 +0200 - open the winsdb in the wrepl server - add dummy function for setup the replication partners metze (This used to be commit da3d18e4545da3bd1841ffc31f253e533f7ea016) --- source4/wrepl_server/wrepl_server.c | 41 ++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 63fb6cd902..c0b5e3c08d 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -257,6 +257,27 @@ static const struct stream_server_ops wreplsrv_stream_ops = { .send_handler = wreplsrv_send, }; +/* + open winsdb +*/ +static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) +{ + service->wins_db = winsdb_connect(service); + if (!service->wins_db) { + return NT_STATUS_INTERNAL_DB_ERROR; + } + + return NT_STATUS_OK; +} + +/* + setup our replication partners +*/ +static NTSTATUS wreplsrv_setup_partners(struct wreplsrv_service *service) +{ + return NT_STATUS_OK; +} + /* startup the wrepl port 42 server sockets */ @@ -326,8 +347,22 @@ static void wreplsrv_task_init(struct task_server *task) task->private = service; /* - * TODO: setup up all partners, and open the winsdb + * setup up all partners, and open the winsdb */ + status = wreplsrv_open_winsdb(service); + if (!NT_STATUS_IS_OK(status)) { + task_server_terminate(task, "wreplsrv_task_init: wreplsrv_open_winsdb() failed"); + return; + } + + /* + * setup timed events for each partner we want to pull from + */ + status = wreplsrv_setup_partners(service); + if (!NT_STATUS_IS_OK(status)) { + task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_partners() failed"); + return; + } /* * setup listen sockets, so we can anwser requests from our partners, @@ -339,10 +374,6 @@ static void wreplsrv_task_init(struct task_server *task) return; } - /* - * TODO: setup timed events for each partner we want to pull from - */ - irpc_add_name(task->msg_ctx, "wrepl_server"); } -- cgit From e5c518bebd22fa1520ce217b4177309e7717d0fc Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:52:35 +0000 Subject: r11032: r10342@SERNOX: metze | 2005-09-20 11:00:26 +0200 - load our wins partners at start time: # this is a sample partner record: dn: name=SERNOX4-1,CN=PARTNERS objectClass: wreplPartner name: SERNOX4-9 address: 172.31.1.1 ourAddress: 172.31.9.1 type: 0x3 pullInterval: 3600 - go through all winsdb records in the database and create the wins_owner table, but don't add ourself to it as out nbt task will update the db too, we refetch the local max_versiion, each time we need it, (that typicaly onces per replication cycle) metze (This used to be commit 4490a2864e21f957547c30675e5f096a4409e5fb) --- source4/wrepl_server/wrepl_server.c | 219 +++++++++++++++++++++++++++++++++++- 1 file changed, 216 insertions(+), 3 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index c0b5e3c08d..7486c31ed8 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -29,12 +29,27 @@ #include "lib/messaging/irpc.h" #include "librpc/gen_ndr/ndr_winsrepl.h" #include "wrepl_server/wrepl_server.h" +#include "nbt_server/wins/winsdb.h" +#include "ldb/include/ldb.h" void wreplsrv_terminate_connection(struct wreplsrv_in_connection *wreplconn, const char *reason) { stream_terminate_connection(wreplconn->conn, reason); } +static struct wreplsrv_partner *wreplsrv_find_partner(struct wreplsrv_service *service, const char *peer_addr) +{ + struct wreplsrv_partner *cur; + + for (cur = service->partners; cur; cur = cur->next) { + if (strcmp(cur->address, peer_addr) == 0) { + return cur; + } + } + + return NULL; +} + /* called when we get a new connection */ @@ -42,6 +57,7 @@ static void wreplsrv_accept(struct stream_connection *conn) { struct wreplsrv_service *service = talloc_get_type(conn->private, struct wreplsrv_service); struct wreplsrv_in_connection *wreplconn; + const char *peer_ip; wreplconn = talloc_zero(conn, struct wreplsrv_in_connection); if (!wreplconn) { @@ -57,7 +73,13 @@ static void wreplsrv_accept(struct stream_connection *conn) return; } - /* TODO: find out if it's a partner */ + peer_ip = socket_get_peer_addr(conn->socket, wreplconn); + if (!peer_ip) { + wreplsrv_terminate_connection(wreplconn, "wreplsrv_accept: out of memory"); + return; + } + + wreplconn->partner = wreplsrv_find_partner(service, peer_ip); conn->private = wreplconn; @@ -270,11 +292,202 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) return NT_STATUS_OK; } +/* + load our replication partners +*/ +static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) +{ + struct ldb_message **res = NULL; + int ret; + TALLOC_CTX *tmp_ctx = talloc_new(service); + int i; + + /* find the record in the WINS database */ + ret = ldb_search(service->wins_db, ldb_dn_explode(tmp_ctx, "CN=PARTNERS"), LDB_SCOPE_ONELEVEL, + "(objectClass=wreplPartner)", NULL, &res); + if (res != NULL) { + talloc_steal(tmp_ctx, res); + } + if (ret < 0) goto failed; + if (ret == 0) goto done; + + for (i=0; i < ret; i++) { + struct wreplsrv_partner *partner; + + partner = talloc(service, struct wreplsrv_partner); + if (partner == NULL) goto failed; + + partner->address = ldb_msg_find_string(res[i], "address", NULL); + if (!partner->address) goto failed; + partner->name = ldb_msg_find_string(res[i], "name", partner->address); + partner->type = ldb_msg_find_int(res[i], "type", WINSREPL_PARTNER_BOTH); + partner->pull.interval = ldb_msg_find_int(res[i], "pullInterval", WINSREPL_DEFAULT_PULL_INTERVAL); + partner->our_address = ldb_msg_find_string(res[i], "ourAddress", NULL); + + talloc_steal(partner, partner->address); + talloc_steal(partner, partner->name); + talloc_steal(partner, partner->our_address); + + DLIST_ADD(service->partners, partner); + } +done: + talloc_free(tmp_ctx); + return NT_STATUS_OK; +failed: + talloc_free(tmp_ctx); + return NT_STATUS_FOOBAR; +} + +uint64_t wreplsrv_local_max_version(struct wreplsrv_service *service) +{ + int ret; + struct ldb_context *ldb = service->wins_db; + struct ldb_dn *dn; + struct ldb_message **res = NULL; + TALLOC_CTX *tmp_ctx = talloc_new(service); + uint64_t maxVersion = 0; + + dn = ldb_dn_explode(tmp_ctx, "CN=VERSION"); + if (!dn) goto failed; + + /* find the record in the WINS database */ + ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, + NULL, NULL, &res); + if (res != NULL) { + talloc_steal(tmp_ctx, res); + } + if (ret < 0) goto failed; + if (ret > 1) goto failed; + + if (ret == 1) { + maxVersion = ldb_msg_find_uint64(res[0], "maxVersion", 0); + } + +failed: + talloc_free(tmp_ctx); + return maxVersion; +} + +static struct wreplsrv_owner *wreplsrv_find_owner(struct wreplsrv_owner *table, const char *wins_owner) +{ + struct wreplsrv_owner *cur; + + for (cur = table; cur; cur = cur->next) { + if (strcmp(cur->owner.address, wins_owner) == 0) { + return cur; + } + } + + return NULL; +} + +/* + update the wins_owner_table max_version, if the given version is the highest version + if no entry for the wins_owner exists yet, create one +*/ +static NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, + TALLOC_CTX *mem_ctx, struct wreplsrv_owner **_table, + const char *wins_owner, uint64_t version) +{ + struct wreplsrv_owner *table = *_table; + struct wreplsrv_owner *cur; + + if (strcmp(WINSDB_OWNER_LOCAL, wins_owner) == 0) { + return NT_STATUS_OK; + } + + cur = wreplsrv_find_owner(table, wins_owner); + + /* if it doesn't exists yet, create one */ + if (!cur) { + cur = talloc_zero(mem_ctx, struct wreplsrv_owner); + NT_STATUS_HAVE_NO_MEMORY(cur); + + cur->owner.address = talloc_strdup(cur, wins_owner); + NT_STATUS_HAVE_NO_MEMORY(cur->owner.address); + cur->owner.min_version = 0; + cur->owner.max_version = 0; + cur->owner.type = 1; /* don't know why this is always 1 */ + + cur->partner = wreplsrv_find_partner(service, wins_owner); + + DLIST_ADD(table, cur); + *_table = table; + } + + /* the min_version is always 0 here, and won't be updated */ + + /* if the given version is higher the then current nax_version, update */ + if (cur->owner.max_version < version) { + cur->owner.max_version = version; + } + + return NT_STATUS_OK; +} + +/* + load the partner table +*/ +static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) +{ + struct ldb_message **res = NULL; + int ret; + NTSTATUS status; + TALLOC_CTX *tmp_ctx = talloc_new(service); + int i; + const char *wins_owner; + uint64_t version; + const char * const attrs[] = { + "winsOwner", + "version", + NULL + }; + + /* find the record in the WINS database */ + ret = ldb_search(service->wins_db, NULL, LDB_SCOPE_SUBTREE, + "(objectClass=wins)", attrs, &res); + if (res != NULL) { + talloc_steal(tmp_ctx, res); + } + status = NT_STATUS_INTERNAL_DB_CORRUPTION; + if (ret < 0) goto failed; + if (ret == 0) goto done; + + for (i=0; i < ret; i++) { + wins_owner = ldb_msg_find_string(res[i], "winsOwner", NULL); + version = ldb_msg_find_uint64(res[i], "version", 0); + + if (wins_owner) { + status = wreplsrv_add_table(service, + service, &service->table, + wins_owner, version); + if (!NT_STATUS_IS_OK(status)) goto failed; + } + talloc_free(res[i]); + + /* TODO: what's abut the per address owners? */ + } +done: + talloc_free(tmp_ctx); + return NT_STATUS_OK; +failed: + talloc_free(tmp_ctx); + return status; +} + /* setup our replication partners */ static NTSTATUS wreplsrv_setup_partners(struct wreplsrv_service *service) { + NTSTATUS status; + + status = wreplsrv_load_partners(service); + NT_STATUS_NOT_OK_RETURN(status); + + status = wreplsrv_load_table(service); + NT_STATUS_NOT_OK_RETURN(status); + return NT_STATUS_OK; } @@ -309,7 +522,7 @@ static NTSTATUS wreplsrv_setup_sockets(struct wreplsrv_service *service) for(i = 0; i < num_interfaces; i++) { address = iface_n_ip(i); status = stream_setup_socket(task->event_ctx, model_ops, &wreplsrv_stream_ops, - "ipv4", address, &port, NULL); + "ipv4", address, &port, service); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("stream_setup_socket(address=%s,port=%u) failed - %s\n", address, port, nt_errstr(status))); @@ -319,7 +532,7 @@ static NTSTATUS wreplsrv_setup_sockets(struct wreplsrv_service *service) } else { address = lp_socket_address(); status = stream_setup_socket(task->event_ctx, model_ops, &wreplsrv_stream_ops, - "ipv4", address, &port, NULL); + "ipv4", address, &port, service); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("stream_setup_socket(address=%s,port=%u) failed - %s\n", address, port, nt_errstr(status))); -- cgit From 681ba379e4d8cd45eab60996f8428f2c232582f3 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:54:06 +0000 Subject: r11035: r10347@SERNOX: metze | 2005-09-20 13:40:24 +0200 make wreplsrv_find_owner public metze (This used to be commit 6fa37c0a2bc1d2f0d29c69d8448276c1f1791a45) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 7486c31ed8..e2da68d2b4 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -368,7 +368,7 @@ failed: return maxVersion; } -static struct wreplsrv_owner *wreplsrv_find_owner(struct wreplsrv_owner *table, const char *wins_owner) +struct wreplsrv_owner *wreplsrv_find_owner(struct wreplsrv_owner *table, const char *wins_owner) { struct wreplsrv_owner *cur; -- cgit From 8755cd4a9ce7ff053c77d51a65a9c91761aea28d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:55:41 +0000 Subject: r11039: r10352@SERNOX: metze | 2005-09-20 16:50:04 +0200 move stuff the belong to incoming connections only into a seperate file wrepl_in_connection.c metze (This used to be commit c2b2b582203d9fe2596ebc9cf2600d52e6f61831) --- source4/wrepl_server/wrepl_server.c | 308 ++---------------------------------- 1 file changed, 11 insertions(+), 297 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index e2da68d2b4..866090f400 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -32,12 +32,20 @@ #include "nbt_server/wins/winsdb.h" #include "ldb/include/ldb.h" -void wreplsrv_terminate_connection(struct wreplsrv_in_connection *wreplconn, const char *reason) +/* + open winsdb +*/ +static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) { - stream_terminate_connection(wreplconn->conn, reason); + service->wins_db = winsdb_connect(service); + if (!service->wins_db) { + return NT_STATUS_INTERNAL_DB_ERROR; + } + + return NT_STATUS_OK; } -static struct wreplsrv_partner *wreplsrv_find_partner(struct wreplsrv_service *service, const char *peer_addr) +struct wreplsrv_partner *wreplsrv_find_partner(struct wreplsrv_service *service, const char *peer_addr) { struct wreplsrv_partner *cur; @@ -50,248 +58,6 @@ static struct wreplsrv_partner *wreplsrv_find_partner(struct wreplsrv_service *s return NULL; } -/* - called when we get a new connection -*/ -static void wreplsrv_accept(struct stream_connection *conn) -{ - struct wreplsrv_service *service = talloc_get_type(conn->private, struct wreplsrv_service); - struct wreplsrv_in_connection *wreplconn; - const char *peer_ip; - - wreplconn = talloc_zero(conn, struct wreplsrv_in_connection); - if (!wreplconn) { - stream_terminate_connection(conn, "wreplsrv_accept: out of memory"); - return; - } - - wreplconn->conn = conn; - wreplconn->service = service; - wreplconn->our_ip = socket_get_my_addr(conn->socket, wreplconn); - if (!wreplconn->our_ip) { - wreplsrv_terminate_connection(wreplconn, "wreplsrv_accept: out of memory"); - return; - } - - peer_ip = socket_get_peer_addr(conn->socket, wreplconn); - if (!peer_ip) { - wreplsrv_terminate_connection(wreplconn, "wreplsrv_accept: out of memory"); - return; - } - - wreplconn->partner = wreplsrv_find_partner(service, peer_ip); - - conn->private = wreplconn; - - irpc_add_name(conn->msg_ctx, "wreplsrv_connection"); -} - -/* - receive some data on a WREPL connection -*/ -static void wreplsrv_recv(struct stream_connection *conn, uint16_t flags) -{ - struct wreplsrv_in_connection *wreplconn = talloc_get_type(conn->private, struct wreplsrv_in_connection); - struct wreplsrv_in_call *call; - DATA_BLOB packet_in_blob; - DATA_BLOB packet_out_blob; - struct wrepl_wrap packet_out_wrap; - struct data_blob_list_item *rep; - NTSTATUS status = NT_STATUS_UNSUCCESSFUL; - size_t nread; - - /* avoid recursion, because of half async code */ - if (wreplconn->processing) { - EVENT_FD_NOT_READABLE(conn->event.fde); - return; - } - - if (wreplconn->partial.length == 0) { - wreplconn->partial = data_blob_talloc(wreplconn, NULL, 4); - if (wreplconn->partial.data == NULL) { - status = NT_STATUS_NO_MEMORY; - goto failed; - } - wreplconn->partial_read = 0; - } - - /* read in the packet length */ - if (wreplconn->partial_read < 4) { - uint32_t packet_length; - - status = socket_recv(conn->socket, - wreplconn->partial.data + wreplconn->partial_read, - 4 - wreplconn->partial_read, - &nread, 0); - if (NT_STATUS_IS_ERR(status)) goto failed; - if (!NT_STATUS_IS_OK(status)) return; - - wreplconn->partial_read += nread; - if (wreplconn->partial_read != 4) return; - - packet_length = RIVAL(wreplconn->partial.data, 0) + 4; - - wreplconn->partial.data = talloc_realloc(wreplconn, wreplconn->partial.data, - uint8_t, packet_length); - if (wreplconn->partial.data == NULL) { - status = NT_STATUS_NO_MEMORY; - goto failed; - } - wreplconn->partial.length = packet_length; - } - - /* read in the body */ - status = socket_recv(conn->socket, - wreplconn->partial.data + wreplconn->partial_read, - wreplconn->partial.length - wreplconn->partial_read, - &nread, 0); - if (NT_STATUS_IS_ERR(status)) goto failed; - if (!NT_STATUS_IS_OK(status)) return; - - wreplconn->partial_read += nread; - if (wreplconn->partial_read != wreplconn->partial.length) return; - - packet_in_blob.data = wreplconn->partial.data + 4; - packet_in_blob.length = wreplconn->partial.length - 4; - - call = talloc_zero(wreplconn, struct wreplsrv_in_call); - if (!call) { - status = NT_STATUS_NO_MEMORY; - goto failed; - } - call->wreplconn = wreplconn; - - /* we have a full request - parse it */ - status = ndr_pull_struct_blob(&packet_in_blob, - call, &call->req_packet, - (ndr_pull_flags_fn_t)ndr_pull_wrepl_packet); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(2,("Failed to parse incoming WINS-Replication packet - %s\n", - nt_errstr(status))); - DEBUG(10,("packet length %u\n", wreplconn->partial.length)); - NDR_PRINT_DEBUG(wrepl_packet, &call->req_packet); - goto failed; - } - - /* - * we have parsed the request, so we can reset the wreplconn->partial_read, - * maybe we could also free wreplconn->partial, but for now we keep it, - * and overwrite it the next time - */ - wreplconn->partial_read = 0; - - if (DEBUGLVL(10)) { - DEBUG(10,("Received WINS-Replication packet of length %u\n", wreplconn->partial.length)); - NDR_PRINT_DEBUG(wrepl_packet, &call->req_packet); - } - - /* actually process the request */ - wreplconn->processing = True; - status = wreplsrv_in_call(call); - wreplconn->processing = False; - if (NT_STATUS_IS_ERR(status)) goto failed; - if (!NT_STATUS_IS_OK(status)) { - /* w2k just ignores invalid packets, so we do */ - DEBUG(10,("Received WINS-Replication packet was invalid, we just ignore it\n")); - talloc_free(call); - return; - } - - /* and now encode the reply */ - packet_out_wrap.packet = call->rep_packet; - status = ndr_push_struct_blob(&packet_out_blob, call, &packet_out_wrap, - (ndr_push_flags_fn_t)ndr_push_wrepl_wrap); - if (!NT_STATUS_IS_OK(status)) goto failed; - - if (DEBUGLVL(10)) { - DEBUG(10,("Sending WINS-Replication packet of length %d\n", (int)packet_out_blob.length)); - NDR_PRINT_DEBUG(wrepl_packet, &call->rep_packet); - } - - rep = talloc(wreplconn, struct data_blob_list_item); - if (!rep) { - status = NT_STATUS_NO_MEMORY; - goto failed; - } - - rep->blob = packet_out_blob; - talloc_steal(rep, packet_out_blob.data); - /* we don't need the call anymore */ - talloc_free(call); - - if (!wreplconn->send_queue) { - EVENT_FD_WRITEABLE(conn->event.fde); - } - DLIST_ADD_END(wreplconn->send_queue, rep, struct data_blob_list_item *); - - if (wreplconn->terminate) { - EVENT_FD_NOT_READABLE(conn->event.fde); - } else { - EVENT_FD_READABLE(conn->event.fde); - } - return; - -failed: - wreplsrv_terminate_connection(wreplconn, nt_errstr(status)); -} - -/* - called when we can write to a connection -*/ -static void wreplsrv_send(struct stream_connection *conn, uint16_t flags) -{ - struct wreplsrv_in_connection *wreplconn = talloc_get_type(conn->private, struct wreplsrv_in_connection); - NTSTATUS status; - - while (wreplconn->send_queue) { - struct data_blob_list_item *rep = wreplconn->send_queue; - size_t sendlen; - - status = socket_send(conn->socket, &rep->blob, &sendlen, 0); - if (NT_STATUS_IS_ERR(status)) goto failed; - if (!NT_STATUS_IS_OK(status)) return; - - rep->blob.length -= sendlen; - rep->blob.data += sendlen; - - if (rep->blob.length == 0) { - DLIST_REMOVE(wreplconn->send_queue, rep); - talloc_free(rep); - } - } - - if (wreplconn->terminate) { - wreplsrv_terminate_connection(wreplconn, "connection terminated after all pending packets are send"); - return; - } - - EVENT_FD_NOT_WRITEABLE(conn->event.fde); - return; - -failed: - wreplsrv_terminate_connection(wreplconn, nt_errstr(status)); -} - -static const struct stream_server_ops wreplsrv_stream_ops = { - .name = "wreplsrv", - .accept_connection = wreplsrv_accept, - .recv_handler = wreplsrv_recv, - .send_handler = wreplsrv_send, -}; - -/* - open winsdb -*/ -static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) -{ - service->wins_db = winsdb_connect(service); - if (!service->wins_db) { - return NT_STATUS_INTERNAL_DB_ERROR; - } - - return NT_STATUS_OK; -} - /* load our replication partners */ @@ -491,58 +257,6 @@ static NTSTATUS wreplsrv_setup_partners(struct wreplsrv_service *service) return NT_STATUS_OK; } -/* - startup the wrepl port 42 server sockets -*/ -static NTSTATUS wreplsrv_setup_sockets(struct wreplsrv_service *service) -{ - NTSTATUS status; - struct task_server *task = service->task; - const struct model_ops *model_ops; - const char *address; - uint16_t port = WINS_REPLICATION_PORT; - - /* within the wrepl task we want to be a single process, so - ask for the single process model ops and pass these to the - stream_setup_socket() call. */ - model_ops = process_model_byname("single"); - if (!model_ops) { - DEBUG(0,("Can't find 'single' process model_ops")); - return NT_STATUS_INTERNAL_ERROR; - } - - if (lp_interfaces() && lp_bind_interfaces_only()) { - int num_interfaces = iface_count(); - int i; - - /* We have been given an interfaces line, and been - told to only bind to those interfaces. Create a - socket per interface and bind to only these. - */ - for(i = 0; i < num_interfaces; i++) { - address = iface_n_ip(i); - status = stream_setup_socket(task->event_ctx, model_ops, &wreplsrv_stream_ops, - "ipv4", address, &port, service); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0,("stream_setup_socket(address=%s,port=%u) failed - %s\n", - address, port, nt_errstr(status))); - return status; - } - } - } else { - address = lp_socket_address(); - status = stream_setup_socket(task->event_ctx, model_ops, &wreplsrv_stream_ops, - "ipv4", address, &port, service); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0,("stream_setup_socket(address=%s,port=%u) failed - %s\n", - address, port, nt_errstr(status))); - return status; - } - } - - return NT_STATUS_OK; -} - /* startup the wrepl task */ -- cgit From 676b220f3e8c975824bfdae407e9f7938d79118c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:55:59 +0000 Subject: r11040: r10357@SERNOX: metze | 2005-09-20 21:28:11 +0200 - as the old records are broken sinse the last winsdb_dn() changes, (the dn components order was reversed) we can use nicer attribute and objectClass names... - use much more verbose error handling for winsdb_* - print a debug message when we found a corrupted record metze (This used to be commit 82bad3f3efec5b706a65e65054787f1486d7c875) --- source4/wrepl_server/wrepl_server.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 866090f400..dd49b37d78 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -205,13 +205,13 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) uint64_t version; const char * const attrs[] = { "winsOwner", - "version", + "versionID", NULL }; /* find the record in the WINS database */ ret = ldb_search(service->wins_db, NULL, LDB_SCOPE_SUBTREE, - "(objectClass=wins)", attrs, &res); + "(objectClass=winsRecord)", attrs, &res); if (res != NULL) { talloc_steal(tmp_ctx, res); } @@ -221,7 +221,7 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) for (i=0; i < ret; i++) { wins_owner = ldb_msg_find_string(res[i], "winsOwner", NULL); - version = ldb_msg_find_uint64(res[i], "version", 0); + version = ldb_msg_find_uint64(res[i], "versionID", 0); if (wins_owner) { status = wreplsrv_add_table(service, -- cgit From 8aebec1be5bdd768b59d0f0d3a7c59ead9876eb1 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:56:42 +0000 Subject: r11043: r10362@SERNOX: metze | 2005-09-20 22:37:28 +0200 repare for pull replication support metze (This used to be commit a75402c45f5bcd3b199ad30af06ee34161c5560b) --- source4/wrepl_server/wrepl_server.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index dd49b37d78..97fa23cdf1 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -254,6 +254,9 @@ static NTSTATUS wreplsrv_setup_partners(struct wreplsrv_service *service) status = wreplsrv_load_table(service); NT_STATUS_NOT_OK_RETURN(status); + status = wreplsrv_setup_out_connections(service); + NT_STATUS_NOT_OK_RETURN(status); + return NT_STATUS_OK; } -- cgit From cffd522b5c806508dfacfb10234e4c0a115c0a98 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 14:02:47 +0000 Subject: r11052: bring samba4 uptodate with the samba4-winsrepl branch, before the bad merge metze (This used to be commit 471c0ca4abb17fb5f73c0efed195c67628c1c06e) --- source4/wrepl_server/wrepl_server.c | 77 +++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 4 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 97fa23cdf1..b044ef8296 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -80,14 +80,17 @@ static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) for (i=0; i < ret; i++) { struct wreplsrv_partner *partner; - partner = talloc(service, struct wreplsrv_partner); + partner = talloc_zero(service, struct wreplsrv_partner); if (partner == NULL) goto failed; + partner->service = service; partner->address = ldb_msg_find_string(res[i], "address", NULL); if (!partner->address) goto failed; partner->name = ldb_msg_find_string(res[i], "name", partner->address); partner->type = ldb_msg_find_int(res[i], "type", WINSREPL_PARTNER_BOTH); partner->pull.interval = ldb_msg_find_int(res[i], "pullInterval", WINSREPL_DEFAULT_PULL_INTERVAL); + partner->pull.retry_interval = ldb_msg_find_int(res[i], "pullRetryInterval", + WINSREPL_DEFAULT_PULL_RETRY_INTERVAL); partner->our_address = ldb_msg_find_string(res[i], "ourAddress", NULL); talloc_steal(partner, partner->address); @@ -104,6 +107,29 @@ failed: return NT_STATUS_FOOBAR; } +BOOL wreplsrv_is_our_address(struct wreplsrv_service *service, const char *address) +{ + const char *our_address; + + if (lp_interfaces() && lp_bind_interfaces_only()) { + int num_interfaces = iface_count(); + int i; + for(i = 0; i < num_interfaces; i++) { + our_address = iface_n_ip(i); + if (strcasecmp(our_address, address) == 0) { + return True; + } + } + } else { + our_address = lp_socket_address(); + if (strcasecmp(our_address, address) == 0) { + return True; + } + } + + return False; +} + uint64_t wreplsrv_local_max_version(struct wreplsrv_service *service) { int ret; @@ -134,6 +160,49 @@ failed: return maxVersion; } +NTSTATUS wreplsrv_fill_wrepl_table(struct wreplsrv_service *service, + TALLOC_CTX *mem_ctx, + struct wrepl_table *table_out, + const char *our_ip, + const char *initiator, + BOOL full_table) +{ + struct wreplsrv_owner *cur; + uint64_t local_max_version; + uint32_t i = 0; + + table_out->partner_count = 0; + table_out->partners = NULL; + table_out->initiator = initiator; + + local_max_version = wreplsrv_local_max_version(service); + if (local_max_version > 0) { + table_out->partner_count++; + } + + for (cur = service->table; full_table && cur; cur = cur->next) { + table_out->partner_count++; + } + + table_out->partners = talloc_array(mem_ctx, struct wrepl_wins_owner, table_out->partner_count); + NT_STATUS_HAVE_NO_MEMORY(table_out->partners); + + if (local_max_version > 0) { + table_out->partners[i].address = our_ip; + table_out->partners[i].min_version = 0; + table_out->partners[i].max_version = local_max_version; + table_out->partners[i].type = 1; + i++; + } + + for (cur = service->table; full_table && cur; cur = cur->next) { + table_out->partners[i] = cur->owner; + i++; + } + + return NT_STATUS_OK; +} + struct wreplsrv_owner *wreplsrv_find_owner(struct wreplsrv_owner *table, const char *wins_owner) { struct wreplsrv_owner *cur; @@ -151,9 +220,9 @@ struct wreplsrv_owner *wreplsrv_find_owner(struct wreplsrv_owner *table, const c update the wins_owner_table max_version, if the given version is the highest version if no entry for the wins_owner exists yet, create one */ -static NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, - TALLOC_CTX *mem_ctx, struct wreplsrv_owner **_table, - const char *wins_owner, uint64_t version) +NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, + TALLOC_CTX *mem_ctx, struct wreplsrv_owner **_table, + const char *wins_owner, uint64_t version) { struct wreplsrv_owner *table = *_table; struct wreplsrv_owner *cur; -- cgit From 305b2b0c492626a0f03a1a53ffba60a94061d94d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 15 Oct 2005 11:04:46 +0000 Subject: r11089: start the winsreplication task when we run with wins support = yes metze (This used to be commit d49a1d2b15c7d17a5d6928a971fbe87d13686c2d) --- source4/wrepl_server/wrepl_server.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index b044ef8296..06a323d103 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -381,6 +381,10 @@ static void wreplsrv_task_init(struct task_server *task) */ static NTSTATUS wreplsrv_init(struct event_context *event_ctx, const struct model_ops *model_ops) { + if (!lp_wins_support()) { + return NT_STATUS_OK; + } + return task_server_startup(event_ctx, model_ops, wreplsrv_task_init); } -- cgit From c643b10d09f0083f3bcb437b0960e5053b6f5a64 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 7 Nov 2005 13:22:51 +0000 Subject: r11547: - don't do pull replication when pullIntervall is 0 - don't do push replication when pushChangeCount is 0 metze (This used to be commit 4122e9ec3a4394738fa3c261dc92938ea86c3822) --- source4/wrepl_server/wrepl_server.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 06a323d103..f4c44c55c0 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -84,14 +84,17 @@ static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) if (partner == NULL) goto failed; partner->service = service; - partner->address = ldb_msg_find_string(res[i], "address", NULL); + partner->address = ldb_msg_find_string(res[i], "address", NULL); if (!partner->address) goto failed; - partner->name = ldb_msg_find_string(res[i], "name", partner->address); - partner->type = ldb_msg_find_int(res[i], "type", WINSREPL_PARTNER_BOTH); - partner->pull.interval = ldb_msg_find_int(res[i], "pullInterval", WINSREPL_DEFAULT_PULL_INTERVAL); - partner->pull.retry_interval = ldb_msg_find_int(res[i], "pullRetryInterval", - WINSREPL_DEFAULT_PULL_RETRY_INTERVAL); - partner->our_address = ldb_msg_find_string(res[i], "ourAddress", NULL); + partner->name = ldb_msg_find_string(res[i], "name", partner->address); + partner->type = ldb_msg_find_uint(res[i], "type", WINSREPL_PARTNER_BOTH); + partner->pull.interval = ldb_msg_find_uint(res[i], "pullInterval", + WINSREPL_DEFAULT_PULL_INTERVAL); + partner->pull.retry_interval = ldb_msg_find_uint(res[i], "pullRetryInterval", + WINSREPL_DEFAULT_PULL_RETRY_INTERVAL); + partner->our_address = ldb_msg_find_string(res[i], "ourAddress", NULL); + partner->push.change_count = ldb_msg_find_uint(res[i], "pushChangeCount", + WINSREPL_DEFAULT_PUSH_CHANGE_COUNT); talloc_steal(partner, partner->address); talloc_steal(partner, partner->name); -- cgit From 0c3376939930b216a6bef63c93bb5893161211f8 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 7 Nov 2005 14:34:49 +0000 Subject: r11552: fix indent metze (This used to be commit 021060b4292dfe2495bcea635f6ce6467ca731ad) --- source4/wrepl_server/wrepl_server.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index f4c44c55c0..e49b5879dc 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -89,12 +89,12 @@ static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) partner->name = ldb_msg_find_string(res[i], "name", partner->address); partner->type = ldb_msg_find_uint(res[i], "type", WINSREPL_PARTNER_BOTH); partner->pull.interval = ldb_msg_find_uint(res[i], "pullInterval", - WINSREPL_DEFAULT_PULL_INTERVAL); + WINSREPL_DEFAULT_PULL_INTERVAL); partner->pull.retry_interval = ldb_msg_find_uint(res[i], "pullRetryInterval", - WINSREPL_DEFAULT_PULL_RETRY_INTERVAL); + WINSREPL_DEFAULT_PULL_RETRY_INTERVAL); partner->our_address = ldb_msg_find_string(res[i], "ourAddress", NULL); partner->push.change_count = ldb_msg_find_uint(res[i], "pushChangeCount", - WINSREPL_DEFAULT_PUSH_CHANGE_COUNT); + WINSREPL_DEFAULT_PUSH_CHANGE_COUNT); talloc_steal(partner, partner->address); talloc_steal(partner, partner->name); -- cgit From 5c9590587197dcb95007fdc54318187d5716c7c6 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Tue, 8 Nov 2005 00:11:45 +0000 Subject: r11567: Ldb API change patch. This patch changes the way lsb_search is called and the meaning of the returned integer. The last argument of ldb_search is changed from struct ldb_message to struct ldb_result which contains a pointer to a struct ldb_message list and a count of the number of messages. The return is not the count of messages anymore but instead it is an ldb error value. I tryed to keep the patch as tiny as possible bu as you can guess I had to change a good amount of places. I also tried to double check all my changes being sure that the calling functions would still behave as before. But this patch is big enough that I fear some bug may have been introduced anyway even if it passes the test suite. So if you are currently working on any file being touched please give it a deep look and blame me for any error. Simo. (This used to be commit 22c8c97e6fb466b41859e090e959d7f1134be780) --- source4/wrepl_server/wrepl_server.c | 61 +++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 33 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index e49b5879dc..8249e6ac31 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -31,6 +31,7 @@ #include "wrepl_server/wrepl_server.h" #include "nbt_server/wins/winsdb.h" #include "ldb/include/ldb.h" +#include "ldb/include/ldb_errors.h" /* open winsdb @@ -63,7 +64,7 @@ struct wreplsrv_partner *wreplsrv_find_partner(struct wreplsrv_service *service, */ static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) { - struct ldb_message **res = NULL; + struct ldb_result *res = NULL; int ret; TALLOC_CTX *tmp_ctx = talloc_new(service); int i; @@ -71,29 +72,27 @@ static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) /* find the record in the WINS database */ ret = ldb_search(service->wins_db, ldb_dn_explode(tmp_ctx, "CN=PARTNERS"), LDB_SCOPE_ONELEVEL, "(objectClass=wreplPartner)", NULL, &res); - if (res != NULL) { - talloc_steal(tmp_ctx, res); - } - if (ret < 0) goto failed; - if (ret == 0) goto done; + if (ret != LDB_SUCCESS) goto failed; + talloc_steal(tmp_ctx, res); + if (res->count == 0) goto done; - for (i=0; i < ret; i++) { + for (i=0; i < res->count; i++) { struct wreplsrv_partner *partner; partner = talloc_zero(service, struct wreplsrv_partner); if (partner == NULL) goto failed; - partner->service = service; - partner->address = ldb_msg_find_string(res[i], "address", NULL); + partner->service = service; + partner->address = ldb_msg_find_string(res->msgs[i], "address", NULL); if (!partner->address) goto failed; - partner->name = ldb_msg_find_string(res[i], "name", partner->address); - partner->type = ldb_msg_find_uint(res[i], "type", WINSREPL_PARTNER_BOTH); - partner->pull.interval = ldb_msg_find_uint(res[i], "pullInterval", + partner->name = ldb_msg_find_string(res->msgs[i], "name", partner->address); + partner->type = ldb_msg_find_uint(res->msgs[i], "type", WINSREPL_PARTNER_BOTH); + partner->pull.interval = ldb_msg_find_uint(res->msgs[i], "pullInterval", WINSREPL_DEFAULT_PULL_INTERVAL); - partner->pull.retry_interval = ldb_msg_find_uint(res[i], "pullRetryInterval", + partner->pull.retry_interval = ldb_msg_find_uint(res->msgs[i], "pullRetryInterval", WINSREPL_DEFAULT_PULL_RETRY_INTERVAL); - partner->our_address = ldb_msg_find_string(res[i], "ourAddress", NULL); - partner->push.change_count = ldb_msg_find_uint(res[i], "pushChangeCount", + partner->our_address = ldb_msg_find_string(res->msgs[i], "ourAddress", NULL); + partner->push.change_count = ldb_msg_find_uint(res->msgs[i], "pushChangeCount", WINSREPL_DEFAULT_PUSH_CHANGE_COUNT); talloc_steal(partner, partner->address); @@ -138,7 +137,7 @@ uint64_t wreplsrv_local_max_version(struct wreplsrv_service *service) int ret; struct ldb_context *ldb = service->wins_db; struct ldb_dn *dn; - struct ldb_message **res = NULL; + struct ldb_result *res = NULL; TALLOC_CTX *tmp_ctx = talloc_new(service); uint64_t maxVersion = 0; @@ -148,14 +147,12 @@ uint64_t wreplsrv_local_max_version(struct wreplsrv_service *service) /* find the record in the WINS database */ ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, NULL, NULL, &res); - if (res != NULL) { - talloc_steal(tmp_ctx, res); - } - if (ret < 0) goto failed; - if (ret > 1) goto failed; + if (ret != LDB_SUCCESS) goto failed; + talloc_steal(tmp_ctx, res); + if (res->count > 1) goto failed; - if (ret == 1) { - maxVersion = ldb_msg_find_uint64(res[0], "maxVersion", 0); + if (res->count == 1) { + maxVersion = ldb_msg_find_uint64(res->msgs[0], "maxVersion", 0); } failed: @@ -268,7 +265,7 @@ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, */ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) { - struct ldb_message **res = NULL; + struct ldb_result *res = NULL; int ret; NTSTATUS status; TALLOC_CTX *tmp_ctx = talloc_new(service); @@ -284,16 +281,14 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) /* find the record in the WINS database */ ret = ldb_search(service->wins_db, NULL, LDB_SCOPE_SUBTREE, "(objectClass=winsRecord)", attrs, &res); - if (res != NULL) { - talloc_steal(tmp_ctx, res); - } status = NT_STATUS_INTERNAL_DB_CORRUPTION; - if (ret < 0) goto failed; - if (ret == 0) goto done; + if (ret != LDB_SUCCESS) goto failed; + talloc_steal(tmp_ctx, res); + if (res->count == 0) goto done; - for (i=0; i < ret; i++) { - wins_owner = ldb_msg_find_string(res[i], "winsOwner", NULL); - version = ldb_msg_find_uint64(res[i], "versionID", 0); + for (i=0; i < res->count; i++) { + wins_owner = ldb_msg_find_string(res->msgs[i], "winsOwner", NULL); + version = ldb_msg_find_uint64(res->msgs[i], "versionID", 0); if (wins_owner) { status = wreplsrv_add_table(service, @@ -301,7 +296,7 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) wins_owner, version); if (!NT_STATUS_IS_OK(status)) goto failed; } - talloc_free(res[i]); + talloc_free(res->msgs[i]); /* TODO: what's abut the per address owners? */ } -- cgit From 4725c3a83d0ba72a0a764710a9810e49ac18436d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 23 Nov 2005 09:38:44 +0000 Subject: r11873: add some interval vars to the service context metze (This used to be commit 1d80ba062ae8a0854e35eb8a3fdae56990b790b8) --- source4/wrepl_server/wrepl_server.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 8249e6ac31..effd547260 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -43,6 +43,18 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) return NT_STATUS_INTERNAL_DB_ERROR; } + /* the default renew interval is 6 days */ + service->config.renew_interval = lp_parm_int(-1,"wreplsrv","renew_interval", 6*24*60*60); + + /* the default tombstone (extinction) interval is 6 days */ + service->config.tombstone_interval= lp_parm_int(-1,"wreplsrv","tombstone_interval", 6*24*60*60); + + /* the default tombstone (extinction) timeout is 1 day */ + service->config.tombstone_timeout = lp_parm_int(-1,"wreplsrv","tombstone_timeout", 1*24*60*60); + + /* the default verify interval is 24 days */ + service->config.verify_interval = lp_parm_int(-1,"wreplsrv","verify_interval", 24*24*60*60); + return NT_STATUS_OK; } -- cgit From 39f914d4e70356bdad9fcdbca379565c9a608988 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 14 Dec 2005 10:56:43 +0000 Subject: r12230: prepare for a generic periodic processing scheduling of pull,push,scavenging and reread-config events metze (This used to be commit 977117278c4b9fc1b7845b6aa6d5862e5a776651) --- source4/wrepl_server/wrepl_server.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index effd547260..5a7ad57f86 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -55,6 +55,9 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) /* the default verify interval is 24 days */ service->config.verify_interval = lp_parm_int(-1,"wreplsrv","verify_interval", 24*24*60*60); + /* the maximun interval to the next periodic processing event */ + service->config.periodic_interval = lp_parm_int(-1,"wreplsrv","periodic_interval", 60); + return NT_STATUS_OK; } @@ -333,9 +336,6 @@ static NTSTATUS wreplsrv_setup_partners(struct wreplsrv_service *service) status = wreplsrv_load_table(service); NT_STATUS_NOT_OK_RETURN(status); - status = wreplsrv_setup_out_connections(service); - NT_STATUS_NOT_OK_RETURN(status); - return NT_STATUS_OK; } @@ -383,6 +383,12 @@ static void wreplsrv_task_init(struct task_server *task) return; } + status = wreplsrv_setup_periodic(service); + if (!NT_STATUS_IS_OK(status)) { + task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_periodic() failed"); + return; + } + irpc_add_name(task->msg_ctx, "wrepl_server"); } -- cgit From 1d91ad0f73c8dc6c8a06c9bc2633516ac8b32e77 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 14 Dec 2005 19:19:43 +0000 Subject: r12242: - make the push notifications triggered by the change count - for now we fake the change count to '1', so we'll still have periodicly triggered push notifies, the interval is the 'wreplsrv:periodic_interval=60' - add the 'pushUseInform' attribute to the wreplPartner objectClass to configure if we'll use WREPL_REPL_INFORM notifies metze (This used to be commit fa1a5660bb2ef7fabd72ad9b993dd91d59ac409e) --- source4/wrepl_server/wrepl_server.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 5a7ad57f86..157a39ec85 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -109,6 +109,7 @@ static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) partner->our_address = ldb_msg_find_string(res->msgs[i], "ourAddress", NULL); partner->push.change_count = ldb_msg_find_uint(res->msgs[i], "pushChangeCount", WINSREPL_DEFAULT_PUSH_CHANGE_COUNT); + partner->push.use_inform = ldb_msg_find_uint(res->msgs[i], "pushUseInform", False); talloc_steal(partner, partner->address); talloc_steal(partner, partner->name); -- cgit From 736543016e35882d2ad784c3598a3e8c2c7fcc7b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 17 Dec 2005 15:45:38 +0000 Subject: r12304: split out the wins partner configuration into a seperate ldb. now $privatedir/wins_config.ldb contains the wins partners and $lockdir/wins.ldb contains the name records metze (This used to be commit baa4a7a9d4f16adf476846850a63dfbfd51b10b3) --- source4/wrepl_server/wrepl_server.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 157a39ec85..3b800333ed 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -33,6 +33,12 @@ #include "ldb/include/ldb.h" #include "ldb/include/ldb_errors.h" +static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx) +{ + return ldb_wrap_connect(mem_ctx, private_path(mem_ctx, lp_wins_config_url()), + system_session(mem_ctx), NULL, 0, NULL); +} + /* open winsdb */ @@ -43,6 +49,11 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) return NT_STATUS_INTERNAL_DB_ERROR; } + service->config.ldb = wins_config_db_connect(service); + if (!service->config.ldb) { + return NT_STATUS_INTERNAL_DB_ERROR; + } + /* the default renew interval is 6 days */ service->config.renew_interval = lp_parm_int(-1,"wreplsrv","renew_interval", 6*24*60*60); @@ -85,7 +96,7 @@ static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) int i; /* find the record in the WINS database */ - ret = ldb_search(service->wins_db, ldb_dn_explode(tmp_ctx, "CN=PARTNERS"), LDB_SCOPE_ONELEVEL, + ret = ldb_search(service->config.ldb, ldb_dn_explode(tmp_ctx, "CN=PARTNERS"), LDB_SCOPE_SUBTREE, "(objectClass=wreplPartner)", NULL, &res); if (ret != LDB_SUCCESS) goto failed; talloc_steal(tmp_ctx, res); -- cgit From c05019a04bbfc882092a55f8e97682abd2c3ec8b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 22 Dec 2005 11:40:14 +0000 Subject: r12434: implement database scavenging, the only missing part is the verifying of active replicas with the owning wins server, after the verify interval passes. metze (This used to be commit 7d1f7ae9c65c09f8bf72e159b771f231f96e8591) --- source4/wrepl_server/wrepl_server.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 3b800333ed..ad1bca3e60 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -63,9 +63,16 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) /* the default tombstone (extinction) timeout is 1 day */ service->config.tombstone_timeout = lp_parm_int(-1,"wreplsrv","tombstone_timeout", 1*24*60*60); + /* the default tombstone extra timeout is 3 days */ + service->config.tombstone_extra_timeout = lp_parm_int(-1,"wreplsrv","tombstone_extra_timeout", 3*24*60*60); + /* the default verify interval is 24 days */ service->config.verify_interval = lp_parm_int(-1,"wreplsrv","verify_interval", 24*24*60*60); + /* the default scavenging interval is 'renew_interval/2' */ + service->config.scavenging_interval=lp_parm_int(-1,"wreplsrv","scavenging_interval", + service->config.renew_interval/2); + /* the maximun interval to the next periodic processing event */ service->config.periodic_interval = lp_parm_int(-1,"wreplsrv","periodic_interval", 60); @@ -364,8 +371,9 @@ static void wreplsrv_task_init(struct task_server *task) task_server_terminate(task, "wreplsrv_task_init: out of memory"); return; } - service->task = task; - task->private = service; + service->task = task; + service->startup_time = timeval_current(); + task->private = service; /* * setup up all partners, and open the winsdb -- cgit From bc97484e39682c86cae9afef970eb26fa4e521f8 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 23 Dec 2005 12:42:04 +0000 Subject: r12448: add some usefull debug messages metze (This used to be commit 806d76134dc50e9f4eb1f17ead9d1ec9e27f7153) --- source4/wrepl_server/wrepl_server.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index ad1bca3e60..47b3da480b 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -134,8 +134,13 @@ static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) talloc_steal(partner, partner->our_address); DLIST_ADD(service->partners, partner); + + DEBUG(3,("wreplsrv_load_partners: found partner: %s type: 0x%X\n", + partner->address, partner->type)); } done: + DEBUG(1,("wreplsrv_load_partners: %u partners found\n", res->count)); + talloc_free(tmp_ctx); return NT_STATUS_OK; failed: -- cgit From 2cd5ca7d25f12aa9198bf8c2deb6aea282f573ee Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 28 Dec 2005 15:38:36 +0000 Subject: r12542: Move some more prototypes out to seperate headers (This used to be commit 0aca5fd5130d980d07398f3291d294202aefe3c2) --- source4/wrepl_server/wrepl_server.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 47b3da480b..aead6a1997 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -32,6 +32,7 @@ #include "nbt_server/wins/winsdb.h" #include "ldb/include/ldb.h" #include "ldb/include/ldb_errors.h" +#include "auth/auth.h" static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx) { -- cgit From d4de4c2d210d2e8c9b5aedf70695594809ad6a0b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 30 Dec 2005 13:16:54 +0000 Subject: r12608: Remove some unused #include lines. (This used to be commit 70e7449318aa0e9d2639c76730a7d1683b2f4981) --- source4/wrepl_server/wrepl_server.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index aead6a1997..5f182cd513 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -22,10 +22,7 @@ #include "includes.h" #include "dlinklist.h" -#include "lib/events/events.h" -#include "lib/socket/socket.h" #include "smbd/service_task.h" -#include "smbd/service_stream.h" #include "lib/messaging/irpc.h" #include "librpc/gen_ndr/ndr_winsrepl.h" #include "wrepl_server/wrepl_server.h" -- cgit From 0391b1cb3a1527aed5beefbdda67a6ce5062bbab Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 30 Dec 2005 20:08:52 +0000 Subject: r12617: create a winsdb_handle and pass that arround, so we later can hang the local owner address, on this handle too metze (This used to be commit 49ba4cc11144671cafcbe2967954bfd786ea6e76) --- source4/wrepl_server/wrepl_server.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 5f182cd513..2682ca6721 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -172,7 +172,7 @@ BOOL wreplsrv_is_our_address(struct wreplsrv_service *service, const char *addre uint64_t wreplsrv_local_max_version(struct wreplsrv_service *service) { int ret; - struct ldb_context *ldb = service->wins_db; + struct ldb_context *ldb = service->wins_db->ldb; struct ldb_dn *dn; struct ldb_result *res = NULL; TALLOC_CTX *tmp_ctx = talloc_new(service); @@ -306,6 +306,7 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) int ret; NTSTATUS status; TALLOC_CTX *tmp_ctx = talloc_new(service); + struct ldb_context *ldb = service->wins_db->ldb; int i; const char *wins_owner; uint64_t version; @@ -316,7 +317,7 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) }; /* find the record in the WINS database */ - ret = ldb_search(service->wins_db, NULL, LDB_SCOPE_SUBTREE, + ret = ldb_search(ldb, NULL, LDB_SCOPE_SUBTREE, "(objectClass=winsRecord)", attrs, &res); status = NT_STATUS_INTERNAL_DB_CORRUPTION; if (ret != LDB_SUCCESS) goto failed; -- cgit From 905c3ff8e1e63f2151f63552e556086968424118 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 30 Dec 2005 21:12:15 +0000 Subject: r12618: use our primary interface address or the "winsdb:local_owner" -address as winsOwner: attrbute for owned records metze (This used to be commit 37dece8304c0b9887740f4d4e8096732045a1785) --- source4/wrepl_server/wrepl_server.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 2682ca6721..9f1664bc22 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -264,7 +264,8 @@ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, struct wreplsrv_owner *table = *_table; struct wreplsrv_owner *cur; - if (strcmp(WINSDB_OWNER_LOCAL, wins_owner) == 0) { + if (strcmp(service->wins_db->local_owner, wins_owner) == 0 || + strcmp("0.0.0.0", wins_owner) == 0) { return NT_STATUS_OK; } -- cgit From 60d27d8505c483c2fac852d3ddc9148f476dfc6b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 31 Dec 2005 09:44:04 +0000 Subject: r12642: only do push notifications when something changed metze (This used to be commit 61f1c8c347d26f34e3e924ceae55e99e6c1461f7) --- source4/wrepl_server/wrepl_server.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 9f1664bc22..018b137d7e 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -197,6 +197,34 @@ failed: return maxVersion; } +uint64_t wreplsrv_local_db_seqnumber(struct wreplsrv_service *service) +{ + int ret; + struct ldb_context *ldb = service->wins_db->ldb; + struct ldb_dn *dn; + struct ldb_result *res = NULL; + TALLOC_CTX *tmp_ctx = talloc_new(service); + uint64_t seqnumber = 0; + + dn = ldb_dn_explode(tmp_ctx, "@BASEINFO"); + if (!dn) goto failed; + + /* find the record in the WINS database */ + ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, + NULL, NULL, &res); + if (ret != LDB_SUCCESS) goto failed; + talloc_steal(tmp_ctx, res); + if (res->count > 1) goto failed; + + if (res->count == 1) { + seqnumber = ldb_msg_find_uint64(res->msgs[0], "sequenceNumber", 0); + } + +failed: + talloc_free(tmp_ctx); + return seqnumber; +} + NTSTATUS wreplsrv_fill_wrepl_table(struct wreplsrv_service *service, TALLOC_CTX *mem_ctx, struct wrepl_table *table_out, -- cgit From 40b9d4f62d10d1de8cd45eaa9e74d4749c827c02 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 2 Jan 2006 16:14:08 +0000 Subject: r12674: make use of the winsdb functions metze (This used to be commit 9a7da608e2099ea1d037b6985358649a6e35a714) --- source4/wrepl_server/wrepl_server.c | 53 +------------------------------------ 1 file changed, 1 insertion(+), 52 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 018b137d7e..e9dbd3b872 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -171,58 +171,7 @@ BOOL wreplsrv_is_our_address(struct wreplsrv_service *service, const char *addre uint64_t wreplsrv_local_max_version(struct wreplsrv_service *service) { - int ret; - struct ldb_context *ldb = service->wins_db->ldb; - struct ldb_dn *dn; - struct ldb_result *res = NULL; - TALLOC_CTX *tmp_ctx = talloc_new(service); - uint64_t maxVersion = 0; - - dn = ldb_dn_explode(tmp_ctx, "CN=VERSION"); - if (!dn) goto failed; - - /* find the record in the WINS database */ - ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, - NULL, NULL, &res); - if (ret != LDB_SUCCESS) goto failed; - talloc_steal(tmp_ctx, res); - if (res->count > 1) goto failed; - - if (res->count == 1) { - maxVersion = ldb_msg_find_uint64(res->msgs[0], "maxVersion", 0); - } - -failed: - talloc_free(tmp_ctx); - return maxVersion; -} - -uint64_t wreplsrv_local_db_seqnumber(struct wreplsrv_service *service) -{ - int ret; - struct ldb_context *ldb = service->wins_db->ldb; - struct ldb_dn *dn; - struct ldb_result *res = NULL; - TALLOC_CTX *tmp_ctx = talloc_new(service); - uint64_t seqnumber = 0; - - dn = ldb_dn_explode(tmp_ctx, "@BASEINFO"); - if (!dn) goto failed; - - /* find the record in the WINS database */ - ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, - NULL, NULL, &res); - if (ret != LDB_SUCCESS) goto failed; - talloc_steal(tmp_ctx, res); - if (res->count > 1) goto failed; - - if (res->count == 1) { - seqnumber = ldb_msg_find_uint64(res->msgs[0], "sequenceNumber", 0); - } - -failed: - talloc_free(tmp_ctx); - return seqnumber; + return winsdb_get_maxVersion(service->wins_db); } NTSTATUS wreplsrv_fill_wrepl_table(struct wreplsrv_service *service, -- cgit From b75ed7d7ac9b3d5beca71926a15cfec5e3a0092c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 2 Jan 2006 17:19:09 +0000 Subject: r12677: get rid of the special cases for the local wins owner table entry, the call to winsdb_get_maxVersion() is moved into place. This allows us to fetch records with the owner address that matches our local_owner address, this is important if the restart with an empty wins.ldb. w2k3 does this in the same way when you remove the database files from disk and restart the WINS-Service. metze (This used to be commit e43de87d06614206a858e1102cd82e7f02163bba) --- source4/wrepl_server/wrepl_server.c | 133 ++++++++++++++++++++---------------- 1 file changed, 76 insertions(+), 57 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index e9dbd3b872..0407f7fa6a 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -146,83 +146,66 @@ failed: return NT_STATUS_FOOBAR; } -BOOL wreplsrv_is_our_address(struct wreplsrv_service *service, const char *address) -{ - const char *our_address; - - if (lp_interfaces() && lp_bind_interfaces_only()) { - int num_interfaces = iface_count(); - int i; - for(i = 0; i < num_interfaces; i++) { - our_address = iface_n_ip(i); - if (strcasecmp(our_address, address) == 0) { - return True; - } - } - } else { - our_address = lp_socket_address(); - if (strcasecmp(our_address, address) == 0) { - return True; - } - } - - return False; -} - -uint64_t wreplsrv_local_max_version(struct wreplsrv_service *service) -{ - return winsdb_get_maxVersion(service->wins_db); -} - NTSTATUS wreplsrv_fill_wrepl_table(struct wreplsrv_service *service, TALLOC_CTX *mem_ctx, struct wrepl_table *table_out, - const char *our_ip, const char *initiator, BOOL full_table) { struct wreplsrv_owner *cur; - uint64_t local_max_version; uint32_t i = 0; table_out->partner_count = 0; table_out->partners = NULL; table_out->initiator = initiator; - local_max_version = wreplsrv_local_max_version(service); - if (local_max_version > 0) { - table_out->partner_count++; - } + for (cur = service->table; cur; cur = cur->next) { + if (full_table) { + table_out->partner_count++; + continue; + } + + if (strcmp(initiator, cur->owner.address) != 0) continue; - for (cur = service->table; full_table && cur; cur = cur->next) { table_out->partner_count++; + break; } table_out->partners = talloc_array(mem_ctx, struct wrepl_wins_owner, table_out->partner_count); NT_STATUS_HAVE_NO_MEMORY(table_out->partners); - if (local_max_version > 0) { - table_out->partners[i].address = our_ip; - table_out->partners[i].min_version = 0; - table_out->partners[i].max_version = local_max_version; - table_out->partners[i].type = 1; - i++; - } + for (cur = service->table; cur && i < table_out->partner_count; cur = cur->next) { + if (full_table) { + table_out->partners[i] = cur->owner; + i++; + continue; + } + + if (strcmp(initiator, cur->owner.address) != 0) continue; - for (cur = service->table; full_table && cur; cur = cur->next) { table_out->partners[i] = cur->owner; i++; + break; } return NT_STATUS_OK; } -struct wreplsrv_owner *wreplsrv_find_owner(struct wreplsrv_owner *table, const char *wins_owner) +struct wreplsrv_owner *wreplsrv_find_owner(struct wreplsrv_service *service, + struct wreplsrv_owner *table, + const char *wins_owner) { struct wreplsrv_owner *cur; for (cur = table; cur; cur = cur->next) { if (strcmp(cur->owner.address, wins_owner) == 0) { + /* + * if it's our local entry + * update the max version + */ + if (cur == service->owner) { + cur->owner.max_version = winsdb_get_maxVersion(service->wins_db); + } return cur; } } @@ -241,12 +224,11 @@ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, struct wreplsrv_owner *table = *_table; struct wreplsrv_owner *cur; - if (strcmp(service->wins_db->local_owner, wins_owner) == 0 || - strcmp("0.0.0.0", wins_owner) == 0) { - return NT_STATUS_OK; + if (!wins_owner || strcmp(wins_owner, "0.0.0.0") == 0) { + wins_owner = service->wins_db->local_owner; } - cur = wreplsrv_find_owner(table, wins_owner); + cur = wreplsrv_find_owner(service, table, wins_owner); /* if it doesn't exists yet, create one */ if (!cur) { @@ -261,7 +243,7 @@ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, cur->partner = wreplsrv_find_partner(service, wins_owner); - DLIST_ADD(table, cur); + DLIST_ADD_END(table, cur, struct wreplsrv_owner *); *_table = table; } @@ -270,6 +252,16 @@ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, /* if the given version is higher the then current nax_version, update */ if (cur->owner.max_version < version) { cur->owner.max_version = version; + /* if it's for our local db, we need to update the wins.ldb too */ + if (cur == service->owner) { + uint64_t ret; + ret = winsdb_set_maxVersion(service->wins_db, cur->owner.max_version); + if (ret != cur->owner.max_version) { + DEBUG(0,("winsdb_set_maxVersion(%llu) failed: %llu\n", + cur->owner.max_version, ret)); + return NT_STATUS_INTERNAL_DB_CORRUPTION; + } + } } return NT_STATUS_OK; @@ -286,6 +278,7 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) TALLOC_CTX *tmp_ctx = talloc_new(service); struct ldb_context *ldb = service->wins_db->ldb; int i; + struct wreplsrv_owner *local_owner; const char *wins_owner; uint64_t version; const char * const attrs[] = { @@ -294,6 +287,21 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) NULL }; + /* + * make sure we have our local entry in the list, + * but we set service->owner when we're done + * to avoid to many calls to wreplsrv_local_max_version() + */ + status = wreplsrv_add_table(service, + service, &service->table, + service->wins_db->local_owner, 0); + if (!NT_STATUS_IS_OK(status)) goto failed; + local_owner = wreplsrv_find_owner(service, service->table, service->wins_db->local_owner); + if (!local_owner) { + status = NT_STATUS_INTERNAL_ERROR; + goto failed; + } + /* find the record in the WINS database */ ret = ldb_search(ldb, NULL, LDB_SCOPE_SUBTREE, "(objectClass=winsRecord)", attrs, &res); @@ -306,17 +314,28 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) wins_owner = ldb_msg_find_string(res->msgs[i], "winsOwner", NULL); version = ldb_msg_find_uint64(res->msgs[i], "versionID", 0); - if (wins_owner) { - status = wreplsrv_add_table(service, - service, &service->table, - wins_owner, version); - if (!NT_STATUS_IS_OK(status)) goto failed; - } + status = wreplsrv_add_table(service, + service, &service->table, + wins_owner, version); + if (!NT_STATUS_IS_OK(status)) goto failed; talloc_free(res->msgs[i]); - - /* TODO: what's abut the per address owners? */ } done: + /* + * this makes sure we call wreplsrv_local_max_version() before returning in + * wreplsrv_find_owner() + */ + service->owner = local_owner; + + /* + * this makes sure the maxVersion in the database is updated, + * with the highest version we found, if this is higher than the current stored one + */ + status = wreplsrv_add_table(service, + service, &service->table, + service->wins_db->local_owner, local_owner->owner.max_version); + if (!NT_STATUS_IS_OK(status)) goto failed; + talloc_free(tmp_ctx); return NT_STATUS_OK; failed: -- cgit From 733dc7b07380b55e6ce84d9aa4405ef1a40b9c97 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 3 Jan 2006 20:19:39 +0000 Subject: r12702: - reload the partner configuration, when the sequenceNumber of the wins_config.ldb changes - use a periodic run interval of 15 secs per default, as we no longer send push notifies with each run metze (This used to be commit 0382b3135c770847be33fbf8ee500f2c0bf265e2) --- source4/wrepl_server/wrepl_server.c | 100 ++++++++++++++++++++++++++++-------- 1 file changed, 80 insertions(+), 20 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 0407f7fa6a..60d6f3f36b 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -37,6 +37,33 @@ static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx) system_session(mem_ctx), NULL, 0, NULL); } +static uint64_t wins_config_db_get_seqnumber(struct ldb_context *ldb) +{ + int ret; + struct ldb_dn *dn; + struct ldb_result *res = NULL; + TALLOC_CTX *tmp_ctx = talloc_new(ldb); + uint64_t seqnumber = 0; + + dn = ldb_dn_explode(tmp_ctx, "@BASEINFO"); + if (!dn) goto failed; + + /* find the record in the WINS database */ + ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, + NULL, NULL, &res); + if (ret != LDB_SUCCESS) goto failed; + talloc_steal(tmp_ctx, res); + if (res->count > 1) goto failed; + + if (res->count == 1) { + seqnumber = ldb_msg_find_uint64(res->msgs[0], "sequenceNumber", 0); + } + +failed: + talloc_free(tmp_ctx); + return seqnumber; +} + /* open winsdb */ @@ -72,7 +99,7 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) service->config.renew_interval/2); /* the maximun interval to the next periodic processing event */ - service->config.periodic_interval = lp_parm_int(-1,"wreplsrv","periodic_interval", 60); + service->config.periodic_interval = lp_parm_int(-1,"wreplsrv","periodic_interval", 15); return NT_STATUS_OK; } @@ -93,51 +120,85 @@ struct wreplsrv_partner *wreplsrv_find_partner(struct wreplsrv_service *service, /* load our replication partners */ -static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) +NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) { + struct wreplsrv_partner *partner; struct ldb_result *res = NULL; int ret; TALLOC_CTX *tmp_ctx = talloc_new(service); int i; + uint64_t new_seqnumber; + + new_seqnumber = wins_config_db_get_seqnumber(service->config.ldb); + + /* if it's not the first run and nothing changed we're done */ + if (service->config.seqnumber != 0 && service->config.seqnumber == new_seqnumber) { + return NT_STATUS_OK; + } + + service->config.seqnumber = new_seqnumber; /* find the record in the WINS database */ ret = ldb_search(service->config.ldb, ldb_dn_explode(tmp_ctx, "CN=PARTNERS"), LDB_SCOPE_SUBTREE, "(objectClass=wreplPartner)", NULL, &res); if (ret != LDB_SUCCESS) goto failed; talloc_steal(tmp_ctx, res); - if (res->count == 0) goto done; + + /* first disable all existing partners */ + for (partner=service->partners; partner; partner = partner->next) { + partner->type = WINSREPL_PARTNER_NONE; + } for (i=0; i < res->count; i++) { - struct wreplsrv_partner *partner; + const char *address; + + address = ldb_msg_find_string(res->msgs[i], "address", NULL); + if (!address) { + goto failed; + } + + partner = wreplsrv_find_partner(service, address); + if (partner) { + if (partner->name != partner->address) { + talloc_free(discard_const(partner->name)); + } + partner->name = NULL; + talloc_free(discard_const(partner->our_address)); + partner->our_address = NULL; + + /* force rescheduling of pulling */ + partner->pull.next_run = timeval_zero(); + } else { + partner = talloc_zero(service, struct wreplsrv_partner); + if (partner == NULL) goto failed; - partner = talloc_zero(service, struct wreplsrv_partner); - if (partner == NULL) goto failed; + partner->service = service; + partner->address = address; + talloc_steal(partner, partner->address); + + DLIST_ADD_END(service->partners, partner, struct wreplsrv_partner *); + } - partner->service = service; - partner->address = ldb_msg_find_string(res->msgs[i], "address", NULL); - if (!partner->address) goto failed; partner->name = ldb_msg_find_string(res->msgs[i], "name", partner->address); + talloc_steal(partner, partner->name); + partner->our_address = ldb_msg_find_string(res->msgs[i], "ourAddress", NULL); + talloc_steal(partner, partner->our_address); + partner->type = ldb_msg_find_uint(res->msgs[i], "type", WINSREPL_PARTNER_BOTH); partner->pull.interval = ldb_msg_find_uint(res->msgs[i], "pullInterval", WINSREPL_DEFAULT_PULL_INTERVAL); partner->pull.retry_interval = ldb_msg_find_uint(res->msgs[i], "pullRetryInterval", WINSREPL_DEFAULT_PULL_RETRY_INTERVAL); - partner->our_address = ldb_msg_find_string(res->msgs[i], "ourAddress", NULL); partner->push.change_count = ldb_msg_find_uint(res->msgs[i], "pushChangeCount", WINSREPL_DEFAULT_PUSH_CHANGE_COUNT); partner->push.use_inform = ldb_msg_find_uint(res->msgs[i], "pushUseInform", False); - talloc_steal(partner, partner->address); - talloc_steal(partner, partner->name); - talloc_steal(partner, partner->our_address); - - DLIST_ADD(service->partners, partner); - DEBUG(3,("wreplsrv_load_partners: found partner: %s type: 0x%X\n", partner->address, partner->type)); } -done: - DEBUG(1,("wreplsrv_load_partners: %u partners found\n", res->count)); + + DEBUG(2,("wreplsrv_load_partners: %u partners found: wins_config_db seqnumber %llu\n", + res->count, service->config.seqnumber)); talloc_free(tmp_ctx); return NT_STATUS_OK; @@ -308,7 +369,6 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) status = NT_STATUS_INTERNAL_DB_CORRUPTION; if (ret != LDB_SUCCESS) goto failed; talloc_steal(tmp_ctx, res); - if (res->count == 0) goto done; for (i=0; i < res->count; i++) { wins_owner = ldb_msg_find_string(res->msgs[i], "winsOwner", NULL); @@ -320,7 +380,7 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) if (!NT_STATUS_IS_OK(status)) goto failed; talloc_free(res->msgs[i]); } -done: + /* * this makes sure we call wreplsrv_local_max_version() before returning in * wreplsrv_find_owner() -- cgit From cd9752d61f49a07a1e943b524c56e0bb75cdeb61 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 13 Jan 2006 16:58:04 +0000 Subject: r12909: add an ldb module for the wins.ldb, it currently doesn't do much, but it's later prevent adding corrupted records via ldbedit, and will take care of the versionID counter metze (This used to be commit a6f279bc43c74cf4dc116cb6ba99f1aed13a4de9) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 60d6f3f36b..299f0648e6 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -69,7 +69,7 @@ failed: */ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) { - service->wins_db = winsdb_connect(service); + service->wins_db = winsdb_connect(service, WINSDB_HANDLE_CALLER_WREPL); if (!service->wins_db) { return NT_STATUS_INTERNAL_DB_ERROR; } -- cgit From 092fb9e791bcdaf6adeff1060abe36488fa773fd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 19 Jan 2006 16:34:05 +0000 Subject: r13037: fill in the corrent maxVersion in table replies metze (This used to be commit 165538245b0772c4618895779cd468feac8494c0) --- source4/wrepl_server/wrepl_server.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 299f0648e6..a4dc6e2c74 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -236,6 +236,14 @@ NTSTATUS wreplsrv_fill_wrepl_table(struct wreplsrv_service *service, NT_STATUS_HAVE_NO_MEMORY(table_out->partners); for (cur = service->table; cur && i < table_out->partner_count; cur = cur->next) { + /* + * if it's our local entry + * update the max version + */ + if (cur == service->owner) { + cur->owner.max_version = winsdb_get_maxVersion(service->wins_db); + } + if (full_table) { table_out->partners[i] = cur->owner; i++; -- cgit From 4ac2be99588b48b0652a524bf12fb1aa9c3f5fbb Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 7 Mar 2006 11:07:23 +0000 Subject: r13924: Split more prototypes out of include/proto.h + initial work on header file dependencies (This used to be commit 122835876748a3eaf5e8d31ad1abddab9acb8781) --- source4/wrepl_server/wrepl_server.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index a4dc6e2c74..29d3246d62 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -30,6 +30,7 @@ #include "ldb/include/ldb.h" #include "ldb/include/ldb_errors.h" #include "auth/auth.h" +#include "db_wrap.h" static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx) { -- cgit From 9bd7dd912124d8ffda6f9967d6ba358c16be2aa0 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 7 Mar 2006 12:08:58 +0000 Subject: r13926: More header splitups. (This used to be commit 930daa9f416ecba1d75b8ad46bb42e336545672f) --- source4/wrepl_server/wrepl_server.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 29d3246d62..49eb13909a 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -23,6 +23,7 @@ #include "includes.h" #include "dlinklist.h" #include "smbd/service_task.h" +#include "smbd/service.h" #include "lib/messaging/irpc.h" #include "librpc/gen_ndr/ndr_winsrepl.h" #include "wrepl_server/wrepl_server.h" -- cgit From 651ca6553edadb2b97339fd3c112fdb6ef6c08bc Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 9 Mar 2006 17:48:41 +0000 Subject: r14079: I just found the setproctitle library from alt linux:-) - add set_title hook to the process models - use setproctitle library in process_model standard if available - the the title for the task servers and on connections metze (This used to be commit 526f20bbecc9bbd607595637c15fc4001d3f0c70) --- source4/wrepl_server/wrepl_server.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 49eb13909a..885307d0c3 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -437,6 +437,8 @@ static void wreplsrv_task_init(struct task_server *task) NTSTATUS status; struct wreplsrv_service *service; + task_server_set_title(task, "task[wreplsrv]"); + service = talloc_zero(task, struct wreplsrv_service); if (!service) { task_server_terminate(task, "wreplsrv_task_init: out of memory"); -- cgit From 8528016978b084213ef53d66e1b6e831b1a01acc Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 16 Mar 2006 00:23:11 +0000 Subject: r14464: Don't include ndr_BASENAME.h files unless strictly required, instead try to include just the BASENAME.h files (containing only structs) (This used to be commit 3dd477ca5147f28a962b8437e2611a8222d706bd) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 885307d0c3..688471c332 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -25,7 +25,7 @@ #include "smbd/service_task.h" #include "smbd/service.h" #include "lib/messaging/irpc.h" -#include "librpc/gen_ndr/ndr_winsrepl.h" +#include "librpc/gen_ndr/winsrepl.h" #include "wrepl_server/wrepl_server.h" #include "nbt_server/wins/winsdb.h" #include "ldb/include/ldb.h" -- cgit From e3a6c6be79326578a1e9c7cb8547234eab62235f Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Thu, 8 Jun 2006 15:20:05 +0000 Subject: r16100: Patch from Michael Wood : s/then/than/ for correct grammar (This used to be commit 26a2fa97e4c819e630bc9b50e11c8d5328c7b8c8) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 688471c332..f32c4bb9bf 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -320,7 +320,7 @@ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, /* the min_version is always 0 here, and won't be updated */ - /* if the given version is higher the then current nax_version, update */ + /* if the given version is higher than the current max_version, update */ if (cur->owner.max_version < version) { cur->owner.max_version = version; /* if it's for our local db, we need to update the wins.ldb too */ -- cgit From a23b63a8e54db7d0ec98ad95cdca11dd4d039e17 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sun, 13 Aug 2006 08:00:36 +0000 Subject: r17516: Change helper function names to make more clear what they are meant to do (This used to be commit ad75cf869550af66119d0293503024d41d834e02) --- source4/wrepl_server/wrepl_server.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index f32c4bb9bf..d18f7e8517 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -58,7 +58,7 @@ static uint64_t wins_config_db_get_seqnumber(struct ldb_context *ldb) if (res->count > 1) goto failed; if (res->count == 1) { - seqnumber = ldb_msg_find_uint64(res->msgs[0], "sequenceNumber", 0); + seqnumber = ldb_msg_find_attr_as_uint64(res->msgs[0], "sequenceNumber", 0); } failed: @@ -154,7 +154,7 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) for (i=0; i < res->count; i++) { const char *address; - address = ldb_msg_find_string(res->msgs[i], "address", NULL); + address = ldb_msg_find_attr_as_string(res->msgs[i], "address", NULL); if (!address) { goto failed; } @@ -181,19 +181,19 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) DLIST_ADD_END(service->partners, partner, struct wreplsrv_partner *); } - partner->name = ldb_msg_find_string(res->msgs[i], "name", partner->address); + partner->name = ldb_msg_find_attr_as_string(res->msgs[i], "name", partner->address); talloc_steal(partner, partner->name); - partner->our_address = ldb_msg_find_string(res->msgs[i], "ourAddress", NULL); + partner->our_address = ldb_msg_find_attr_as_string(res->msgs[i], "ourAddress", NULL); talloc_steal(partner, partner->our_address); - partner->type = ldb_msg_find_uint(res->msgs[i], "type", WINSREPL_PARTNER_BOTH); - partner->pull.interval = ldb_msg_find_uint(res->msgs[i], "pullInterval", + partner->type = ldb_msg_find_attr_as_uint(res->msgs[i], "type", WINSREPL_PARTNER_BOTH); + partner->pull.interval = ldb_msg_find_attr_as_uint(res->msgs[i], "pullInterval", WINSREPL_DEFAULT_PULL_INTERVAL); - partner->pull.retry_interval = ldb_msg_find_uint(res->msgs[i], "pullRetryInterval", + partner->pull.retry_interval = ldb_msg_find_attr_as_uint(res->msgs[i], "pullRetryInterval", WINSREPL_DEFAULT_PULL_RETRY_INTERVAL); - partner->push.change_count = ldb_msg_find_uint(res->msgs[i], "pushChangeCount", + partner->push.change_count = ldb_msg_find_attr_as_uint(res->msgs[i], "pushChangeCount", WINSREPL_DEFAULT_PUSH_CHANGE_COUNT); - partner->push.use_inform = ldb_msg_find_uint(res->msgs[i], "pushUseInform", False); + partner->push.use_inform = ldb_msg_find_attr_as_uint(res->msgs[i], "pushUseInform", False); DEBUG(3,("wreplsrv_load_partners: found partner: %s type: 0x%X\n", partner->address, partner->type)); @@ -381,8 +381,8 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service) talloc_steal(tmp_ctx, res); for (i=0; i < res->count; i++) { - wins_owner = ldb_msg_find_string(res->msgs[i], "winsOwner", NULL); - version = ldb_msg_find_uint64(res->msgs[i], "versionID", 0); + wins_owner = ldb_msg_find_attr_as_string(res->msgs[i], "winsOwner", NULL); + version = ldb_msg_find_attr_as_uint64(res->msgs[i], "versionID", 0); status = wreplsrv_add_table(service, service, &service->table, -- cgit From 0329d755a7611ba3897fc1ee9bdce410cc33d7f8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 30 Aug 2006 11:29:34 +0000 Subject: r17930: Merge noinclude branch: * Move dlinklist.h, smb.h to subsystem-specific directories * Clean up ads.h and move what is left of it to dsdb/ (only place where it's used) (This used to be commit f7afa1cb77f3cfa7020b57de12e6003db7cfcc42) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index d18f7e8517..cfd0151eb3 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -21,7 +21,7 @@ */ #include "includes.h" -#include "dlinklist.h" +#include "lib/util/dlinklist.h" #include "smbd/service_task.h" #include "smbd/service.h" #include "lib/messaging/irpc.h" -- cgit From 30ee8beb9316a99e8a49993306252591106cb349 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 9 Sep 2006 10:05:58 +0000 Subject: r18301: I discovered how to load the warnings from a build farm build into emacs compile mode (hint, paste to a file, and compile as "cat filename"). This allowed me to fix nearly all the warnings for a IA_64 SuSE build very quickly. (This used to be commit eba6c84efff735bb0ca941ac4b755ce2b0591667) --- source4/wrepl_server/wrepl_server.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index cfd0151eb3..55ab76c228 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -200,7 +200,7 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) } DEBUG(2,("wreplsrv_load_partners: %u partners found: wins_config_db seqnumber %llu\n", - res->count, service->config.seqnumber)); + res->count, (unsigned long long)service->config.seqnumber)); talloc_free(tmp_ctx); return NT_STATUS_OK; @@ -329,7 +329,8 @@ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, ret = winsdb_set_maxVersion(service->wins_db, cur->owner.max_version); if (ret != cur->owner.max_version) { DEBUG(0,("winsdb_set_maxVersion(%llu) failed: %llu\n", - cur->owner.max_version, ret)); + (unsigned long long)cur->owner.max_version, + (unsigned long long)ret)); return NT_STATUS_INTERNAL_DB_CORRUPTION; } } -- cgit From 4889eb9f7aae9349e426d0f6d2217adff67eaebd Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 22 Nov 2006 00:59:34 +0000 Subject: r19831: Big ldb_dn optimization and interfaces enhancement patch This patch changes a lot of the code in ldb_dn.c, and also removes and add a number of manipulation functions around. The aim is to avoid validating a dn if not necessary as the validation code is necessarily slow. This is mainly to speed up internal operations where input is not user generated and so we can assume the DNs need no validation. The code is designed to keep the data as a string if possible. The code is not yet 100% perfect, but pass all the tests so far. A memleak is certainly present, I'll work on that next. Simo. (This used to be commit a580c871d3784602a9cce32d33419e63c8236e63) --- source4/wrepl_server/wrepl_server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 55ab76c228..bc24ae1abd 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -47,7 +47,7 @@ static uint64_t wins_config_db_get_seqnumber(struct ldb_context *ldb) TALLOC_CTX *tmp_ctx = talloc_new(ldb); uint64_t seqnumber = 0; - dn = ldb_dn_explode(tmp_ctx, "@BASEINFO"); + dn = ldb_dn_new(tmp_ctx, ldb, "@BASEINFO"); if (!dn) goto failed; /* find the record in the WINS database */ @@ -141,7 +141,7 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) service->config.seqnumber = new_seqnumber; /* find the record in the WINS database */ - ret = ldb_search(service->config.ldb, ldb_dn_explode(tmp_ctx, "CN=PARTNERS"), LDB_SCOPE_SUBTREE, + ret = ldb_search(service->config.ldb, ldb_dn_new(tmp_ctx, service->config.ldb, "CN=PARTNERS"), LDB_SCOPE_SUBTREE, "(objectClass=wreplPartner)", NULL, &res); if (ret != LDB_SUCCESS) goto failed; talloc_steal(tmp_ctx, res); -- cgit From 4d0650e0239d6f448c3660a6049a06658ac94566 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 19 Apr 2007 17:00:15 +0000 Subject: r22382: fix memory leak metze (This used to be commit 1998961e34f4c0ce6cdcfa193770b371d5e7727c) --- source4/wrepl_server/wrepl_server.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index bc24ae1abd..f7ad7cf284 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -127,7 +127,7 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) struct wreplsrv_partner *partner; struct ldb_result *res = NULL; int ret; - TALLOC_CTX *tmp_ctx = talloc_new(service); + TALLOC_CTX *tmp_ctx; int i; uint64_t new_seqnumber; @@ -138,6 +138,9 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) return NT_STATUS_OK; } + tmp_ctx = talloc_new(service); + NT_STATUS_HAVE_NO_MEMORY(tmp_ctx); + service->config.seqnumber = new_seqnumber; /* find the record in the WINS database */ -- cgit From 0479a2f1cbae51fcd8dbdc3c148c808421fb4d25 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 02:07:03 +0000 Subject: r23792: convert Samba4 to GPLv3 There are still a few tidyups of old FSF addresses to come (in both s3 and s4). More commits soon. (This used to be commit fcf38a38ac691abd0fa51b89dc951a08e89fdafa) --- source4/wrepl_server/wrepl_server.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index f7ad7cf284..dfbc97a6b7 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -7,7 +7,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,8 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ #include "includes.h" -- cgit From ffeee68e4b72dd94fee57366bd8d38b8c284c3d4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Sep 2007 12:42:09 +0000 Subject: r25026: Move param/param.h out of includes.h (This used to be commit abe8349f9b4387961ff3665d8c589d61cd2edf31) --- source4/wrepl_server/wrepl_server.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index dfbc97a6b7..6ac7fed0cc 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -31,6 +31,7 @@ #include "ldb/include/ldb_errors.h" #include "auth/auth.h" #include "db_wrap.h" +#include "param/param.h" static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx) { -- cgit From 98b57d5eb61094a9c88e2f7d90d3e21b7e74e9d8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Sep 2007 16:46:30 +0000 Subject: r25035: Fix some more warnings, use service pointer rather than service number in more places. (This used to be commit df9cebcb97e20564359097148665bd519f31bc6f) --- source4/wrepl_server/wrepl_server.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 6ac7fed0cc..503034cac1 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -82,26 +82,26 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) } /* the default renew interval is 6 days */ - service->config.renew_interval = lp_parm_int(-1,"wreplsrv","renew_interval", 6*24*60*60); + service->config.renew_interval = lp_parm_int(NULL,"wreplsrv","renew_interval", 6*24*60*60); /* the default tombstone (extinction) interval is 6 days */ - service->config.tombstone_interval= lp_parm_int(-1,"wreplsrv","tombstone_interval", 6*24*60*60); + service->config.tombstone_interval= lp_parm_int(NULL,"wreplsrv","tombstone_interval", 6*24*60*60); /* the default tombstone (extinction) timeout is 1 day */ - service->config.tombstone_timeout = lp_parm_int(-1,"wreplsrv","tombstone_timeout", 1*24*60*60); + service->config.tombstone_timeout = lp_parm_int(NULL,"wreplsrv","tombstone_timeout", 1*24*60*60); /* the default tombstone extra timeout is 3 days */ - service->config.tombstone_extra_timeout = lp_parm_int(-1,"wreplsrv","tombstone_extra_timeout", 3*24*60*60); + service->config.tombstone_extra_timeout = lp_parm_int(NULL,"wreplsrv","tombstone_extra_timeout", 3*24*60*60); /* the default verify interval is 24 days */ - service->config.verify_interval = lp_parm_int(-1,"wreplsrv","verify_interval", 24*24*60*60); + service->config.verify_interval = lp_parm_int(NULL,"wreplsrv","verify_interval", 24*24*60*60); /* the default scavenging interval is 'renew_interval/2' */ - service->config.scavenging_interval=lp_parm_int(-1,"wreplsrv","scavenging_interval", + service->config.scavenging_interval=lp_parm_int(NULL,"wreplsrv","scavenging_interval", service->config.renew_interval/2); /* the maximun interval to the next periodic processing event */ - service->config.periodic_interval = lp_parm_int(-1,"wreplsrv","periodic_interval", 15); + service->config.periodic_interval = lp_parm_int(NULL,"wreplsrv","periodic_interval", 15); return NT_STATUS_OK; } -- cgit From 37d53832a4623653f706e77985a79d84bd7c6694 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 28 Sep 2007 01:17:46 +0000 Subject: r25398: Parse loadparm context to all lp_*() functions. (This used to be commit 3fcc960839c6e5ca4de2c3c042f12f369ac5f238) --- source4/wrepl_server/wrepl_server.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 503034cac1..be01cb3f24 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -35,7 +35,8 @@ static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx) { - return ldb_wrap_connect(mem_ctx, private_path(mem_ctx, lp_wins_config_url()), + return ldb_wrap_connect(mem_ctx, private_path(mem_ctx, + lp_wins_config_url(global_loadparm)), system_session(mem_ctx), NULL, 0, NULL); } @@ -494,7 +495,7 @@ static void wreplsrv_task_init(struct task_server *task) */ static NTSTATUS wreplsrv_init(struct event_context *event_ctx, const struct model_ops *model_ops) { - if (!lp_wins_support()) { + if (!lp_wins_support(global_loadparm)) { return NT_STATUS_OK; } -- cgit From 60a1046c5c5783799bd64fe18e03534670f83d82 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 29 Sep 2007 18:00:19 +0000 Subject: r25430: Add the loadparm context to all parametric options. (This used to be commit fd697d77c9fe67a00939a1f04b35c451316fff58) --- source4/wrepl_server/wrepl_server.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index be01cb3f24..9e7e87887a 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -83,26 +83,26 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) } /* the default renew interval is 6 days */ - service->config.renew_interval = lp_parm_int(NULL,"wreplsrv","renew_interval", 6*24*60*60); + service->config.renew_interval = lp_parm_int(global_loadparm, NULL,"wreplsrv","renew_interval", 6*24*60*60); /* the default tombstone (extinction) interval is 6 days */ - service->config.tombstone_interval= lp_parm_int(NULL,"wreplsrv","tombstone_interval", 6*24*60*60); + service->config.tombstone_interval= lp_parm_int(global_loadparm, NULL,"wreplsrv","tombstone_interval", 6*24*60*60); /* the default tombstone (extinction) timeout is 1 day */ - service->config.tombstone_timeout = lp_parm_int(NULL,"wreplsrv","tombstone_timeout", 1*24*60*60); + service->config.tombstone_timeout = lp_parm_int(global_loadparm, NULL,"wreplsrv","tombstone_timeout", 1*24*60*60); /* the default tombstone extra timeout is 3 days */ - service->config.tombstone_extra_timeout = lp_parm_int(NULL,"wreplsrv","tombstone_extra_timeout", 3*24*60*60); + service->config.tombstone_extra_timeout = lp_parm_int(global_loadparm, NULL,"wreplsrv","tombstone_extra_timeout", 3*24*60*60); /* the default verify interval is 24 days */ - service->config.verify_interval = lp_parm_int(NULL,"wreplsrv","verify_interval", 24*24*60*60); + service->config.verify_interval = lp_parm_int(global_loadparm, NULL,"wreplsrv","verify_interval", 24*24*60*60); /* the default scavenging interval is 'renew_interval/2' */ - service->config.scavenging_interval=lp_parm_int(NULL,"wreplsrv","scavenging_interval", + service->config.scavenging_interval=lp_parm_int(global_loadparm, NULL,"wreplsrv","scavenging_interval", service->config.renew_interval/2); /* the maximun interval to the next periodic processing event */ - service->config.periodic_interval = lp_parm_int(NULL,"wreplsrv","periodic_interval", 15); + service->config.periodic_interval = lp_parm_int(global_loadparm, NULL,"wreplsrv","periodic_interval", 15); return NT_STATUS_OK; } -- cgit From 2f3551ca7cee59d4d053cceb87abdf1da1b3a1ad Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 1 Oct 2007 18:52:55 +0000 Subject: r25446: Merge some changes I made on the way home from SFO: 2007-09-29 More higher-level passing around of lp_ctx. 2007-09-29 Fix warning. 2007-09-29 Pass loadparm contexts on a higher level. 2007-09-29 Avoid using global loadparm context. (This used to be commit 3468952e771ab31f90b6c374ade01c5550810f42) --- source4/wrepl_server/wrepl_server.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 9e7e87887a..f4b48ae916 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -35,8 +35,9 @@ static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx) { - return ldb_wrap_connect(mem_ctx, private_path(mem_ctx, - lp_wins_config_url(global_loadparm)), + return ldb_wrap_connect(mem_ctx, global_loadparm, private_path(mem_ctx, + global_loadparm, + lp_wins_config_url(global_loadparm)), system_session(mem_ctx), NULL, 0, NULL); } -- cgit From af0a85bc30223d65f09dc57dea4427a7773d6ddb Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 6 Oct 2007 21:48:28 +0000 Subject: r25549: Convert to standard bool type. (This used to be commit 318bf1f7441678860adfff5cdb0d3d2448e58f4b) --- source4/wrepl_server/wrepl_server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index f4b48ae916..be606b2a0c 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -198,7 +198,7 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service) WINSREPL_DEFAULT_PULL_RETRY_INTERVAL); partner->push.change_count = ldb_msg_find_attr_as_uint(res->msgs[i], "pushChangeCount", WINSREPL_DEFAULT_PUSH_CHANGE_COUNT); - partner->push.use_inform = ldb_msg_find_attr_as_uint(res->msgs[i], "pushUseInform", False); + partner->push.use_inform = ldb_msg_find_attr_as_uint(res->msgs[i], "pushUseInform", false); DEBUG(3,("wreplsrv_load_partners: found partner: %s type: 0x%X\n", partner->address, partner->type)); @@ -218,7 +218,7 @@ NTSTATUS wreplsrv_fill_wrepl_table(struct wreplsrv_service *service, TALLOC_CTX *mem_ctx, struct wrepl_table *table_out, const char *initiator, - BOOL full_table) + bool full_table) { struct wreplsrv_owner *cur; uint32_t i = 0; -- cgit From ca0b72a1fdb7bd965065e833df34662afef0423e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 16 Nov 2007 20:12:00 +0100 Subject: r26003: Split up DB_WRAP, as first step in an attempt to sanitize dependencies. (This used to be commit 56dfcb4f2f8e74c9d8b2fe3a0df043781188a555) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index be606b2a0c..834d9a70e8 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -30,7 +30,7 @@ #include "ldb/include/ldb.h" #include "ldb/include/ldb_errors.h" #include "auth/auth.h" -#include "db_wrap.h" +#include "ldb_wrap.h" #include "param/param.h" static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx) -- cgit From 33f26f8e547dae1c06282d6e6f89b3b37979a730 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 2 Dec 2007 16:20:41 +0100 Subject: r26225: Remove use of global_loadparm in wins server. (This used to be commit 98c29e090fd448193ca6fca8f90751bfd0cb2e74) --- source4/wrepl_server/wrepl_server.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 834d9a70e8..cec2e6e65e 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -33,11 +33,11 @@ #include "ldb_wrap.h" #include "param/param.h" -static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx) +static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx) { - return ldb_wrap_connect(mem_ctx, global_loadparm, private_path(mem_ctx, - global_loadparm, - lp_wins_config_url(global_loadparm)), + return ldb_wrap_connect(mem_ctx, lp_ctx, private_path(mem_ctx, + lp_ctx, lp_wins_config_url(lp_ctx)), system_session(mem_ctx), NULL, 0, NULL); } @@ -71,39 +71,40 @@ failed: /* open winsdb */ -static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service) +static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service, + struct loadparm_context *lp_ctx) { service->wins_db = winsdb_connect(service, WINSDB_HANDLE_CALLER_WREPL); if (!service->wins_db) { return NT_STATUS_INTERNAL_DB_ERROR; } - service->config.ldb = wins_config_db_connect(service); + service->config.ldb = wins_config_db_connect(service, lp_ctx); if (!service->config.ldb) { return NT_STATUS_INTERNAL_DB_ERROR; } /* the default renew interval is 6 days */ - service->config.renew_interval = lp_parm_int(global_loadparm, NULL,"wreplsrv","renew_interval", 6*24*60*60); + service->config.renew_interval = lp_parm_int(lp_ctx, NULL,"wreplsrv","renew_interval", 6*24*60*60); /* the default tombstone (extinction) interval is 6 days */ - service->config.tombstone_interval= lp_parm_int(global_loadparm, NULL,"wreplsrv","tombstone_interval", 6*24*60*60); + service->config.tombstone_interval= lp_parm_int(lp_ctx, NULL,"wreplsrv","tombstone_interval", 6*24*60*60); /* the default tombstone (extinction) timeout is 1 day */ - service->config.tombstone_timeout = lp_parm_int(global_loadparm, NULL,"wreplsrv","tombstone_timeout", 1*24*60*60); + service->config.tombstone_timeout = lp_parm_int(lp_ctx, NULL,"wreplsrv","tombstone_timeout", 1*24*60*60); /* the default tombstone extra timeout is 3 days */ - service->config.tombstone_extra_timeout = lp_parm_int(global_loadparm, NULL,"wreplsrv","tombstone_extra_timeout", 3*24*60*60); + service->config.tombstone_extra_timeout = lp_parm_int(lp_ctx, NULL,"wreplsrv","tombstone_extra_timeout", 3*24*60*60); /* the default verify interval is 24 days */ - service->config.verify_interval = lp_parm_int(global_loadparm, NULL,"wreplsrv","verify_interval", 24*24*60*60); + service->config.verify_interval = lp_parm_int(lp_ctx, NULL,"wreplsrv","verify_interval", 24*24*60*60); /* the default scavenging interval is 'renew_interval/2' */ - service->config.scavenging_interval=lp_parm_int(global_loadparm, NULL,"wreplsrv","scavenging_interval", + service->config.scavenging_interval=lp_parm_int(lp_ctx, NULL,"wreplsrv","scavenging_interval", service->config.renew_interval/2); /* the maximun interval to the next periodic processing event */ - service->config.periodic_interval = lp_parm_int(global_loadparm, NULL,"wreplsrv","periodic_interval", 15); + service->config.periodic_interval = lp_parm_int(lp_ctx, NULL,"wreplsrv","periodic_interval", 15); return NT_STATUS_OK; } @@ -457,7 +458,7 @@ static void wreplsrv_task_init(struct task_server *task) /* * setup up all partners, and open the winsdb */ - status = wreplsrv_open_winsdb(service); + status = wreplsrv_open_winsdb(service, global_loadparm); if (!NT_STATUS_IS_OK(status)) { task_server_terminate(task, "wreplsrv_task_init: wreplsrv_open_winsdb() failed"); return; -- cgit From f4a1083cf9f64b4d2b65b68942e93861409ea90f Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 2 Dec 2007 17:09:52 +0100 Subject: r26227: Make loadparm_context part of a server task, move loadparm_contexts further up the call stack. (This used to be commit 0721a07aada6a1fae6dcbd610b8783df57d7bbad) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index cec2e6e65e..91f0a4fb05 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -458,7 +458,7 @@ static void wreplsrv_task_init(struct task_server *task) /* * setup up all partners, and open the winsdb */ - status = wreplsrv_open_winsdb(service, global_loadparm); + status = wreplsrv_open_winsdb(service, task->lp_ctx); if (!NT_STATUS_IS_OK(status)) { task_server_terminate(task, "wreplsrv_task_init: wreplsrv_open_winsdb() failed"); return; -- cgit From b5594df87d054d203e9bfb52a49c87bc3ecf46a1 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 2 Dec 2007 19:27:49 +0100 Subject: r26230: Use task-provided loadparm context in a couple more places, avoid loadparm context inside ntlm_auth. (This used to be commit 3a946d1ffd7739e40beab673ecb0100c178c2e28) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 91f0a4fb05..a5c8007285 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -477,7 +477,7 @@ static void wreplsrv_task_init(struct task_server *task) * setup listen sockets, so we can anwser requests from our partners, * which pull from us */ - status = wreplsrv_setup_sockets(service); + status = wreplsrv_setup_sockets(service, task->lp_ctx); if (!NT_STATUS_IS_OK(status)) { task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_sockets() failed"); return; -- cgit From 291ddf433685ee5c25e172885045a4b60d7bb1ee Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 3 Dec 2007 00:28:07 +0100 Subject: r26237: Add loadparm context to the server service interface. (This used to be commit 1386c5c92505a950c65411b8af74d703ce023f95) --- source4/wrepl_server/wrepl_server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index a5c8007285..fbbd8e26d9 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -495,9 +495,9 @@ static void wreplsrv_task_init(struct task_server *task) /* initialise the WREPL server */ -static NTSTATUS wreplsrv_init(struct event_context *event_ctx, const struct model_ops *model_ops) +static NTSTATUS wreplsrv_init(struct event_context *event_ctx, struct loadparm_context *lp_ctx, const struct model_ops *model_ops) { - if (!lp_wins_support(global_loadparm)) { + if (!lp_wins_support(lp_ctx)) { return NT_STATUS_OK; } -- cgit From 43696d2752e2faad34fb3ed2a7dbf01d40ffdc46 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 3 Dec 2007 15:53:28 +0100 Subject: r26252: Specify loadparm_context explicitly when creating sessions. (This used to be commit 7280c1e9415daabb2712db1372e23f9846272ede) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index fbbd8e26d9..7700a6ded7 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -38,7 +38,7 @@ static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx, { return ldb_wrap_connect(mem_ctx, lp_ctx, private_path(mem_ctx, lp_ctx, lp_wins_config_url(lp_ctx)), - system_session(mem_ctx), NULL, 0, NULL); + system_session(mem_ctx, lp_ctx), NULL, 0, NULL); } static uint64_t wins_config_db_get_seqnumber(struct ldb_context *ldb) -- cgit From 2f5ca872a80ad872ab864061f0c6982d8605393f Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 6 Dec 2007 16:54:34 +0100 Subject: r26313: Fix more uses of static loadparm. (This used to be commit 6fd0d9d3b75546d08c24c513e05b1843d5777608) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 7700a6ded7..7455c57d75 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -74,7 +74,7 @@ failed: static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service, struct loadparm_context *lp_ctx) { - service->wins_db = winsdb_connect(service, WINSDB_HANDLE_CALLER_WREPL); + service->wins_db = winsdb_connect(service, lp_ctx, WINSDB_HANDLE_CALLER_WREPL); if (!service->wins_db) { return NT_STATUS_INTERNAL_DB_ERROR; } -- cgit From 6f2252dace1629d7b5c5637b103caa28d2c89b07 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 11 Dec 2007 22:23:14 +0100 Subject: r26401: Don't cache interfaces context in libnetif. (This used to be commit 9f975417cc66bfd4589da38bfd23731dbe0e6153) --- source4/wrepl_server/wrepl_server.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 7455c57d75..c8ad80351e 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -32,6 +32,7 @@ #include "auth/auth.h" #include "ldb_wrap.h" #include "param/param.h" +#include "lib/socket/netif.h" static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx) @@ -74,7 +75,15 @@ failed: static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service, struct loadparm_context *lp_ctx) { - service->wins_db = winsdb_connect(service, lp_ctx, WINSDB_HANDLE_CALLER_WREPL); + const char *owner = lp_parm_string(lp_ctx, NULL, "winsdb", "local_owner"); + + if (owner == NULL) { + struct interface *ifaces; + load_interfaces(lp_interfaces(lp_ctx), &ifaces); + owner = iface_n_ip(ifaces, 0); + } + + service->wins_db = winsdb_connect(service, lp_ctx, owner, WINSDB_HANDLE_CALLER_WREPL); if (!service->wins_db) { return NT_STATUS_INTERNAL_DB_ERROR; } -- cgit From 70f1f33af8e6e82506d0ee9ff6cc7e0923a7d0a1 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 11 Dec 2007 22:23:20 +0100 Subject: r26402: Require a talloc context in libnetif. (This used to be commit a35e51871bbf1ab33fc316fa59e597b722769c50) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index c8ad80351e..7d4be3e1b5 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -79,7 +79,7 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service, if (owner == NULL) { struct interface *ifaces; - load_interfaces(lp_interfaces(lp_ctx), &ifaces); + load_interfaces(service, lp_interfaces(lp_ctx), &ifaces); owner = iface_n_ip(ifaces, 0); } -- cgit From df408d056ec03f2abe08ce0ea487e1875b90e7bf Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 5 Jan 2008 19:03:43 -0600 Subject: r26672: Janitorial: Remove uses of global_loadparm. (This used to be commit 18cd08623eaad7d2cd63b82ea5275d4dfd21cf00) --- source4/wrepl_server/wrepl_server.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 7d4be3e1b5..50ef7e8550 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -510,7 +510,8 @@ static NTSTATUS wreplsrv_init(struct event_context *event_ctx, struct loadparm_c return NT_STATUS_OK; } - return task_server_startup(event_ctx, model_ops, wreplsrv_task_init); + return task_server_startup(event_ctx, lp_ctx, + model_ops, wreplsrv_task_init); } /* -- cgit From 23d681caf9c1186999ac676d70a1eb0e8a43e358 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 4 Feb 2008 17:48:51 +1100 Subject: Rework service init functions to pass down service name. This is needed to change prefork behaviour based on what service is being started. Andrew Bartlett and David Disseldorp (This used to be commit 0d830580e3539c96da3aa6c72fafe6eacd7a74a0) --- source4/wrepl_server/wrepl_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index 50ef7e8550..d13482dd98 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -510,7 +510,7 @@ static NTSTATUS wreplsrv_init(struct event_context *event_ctx, struct loadparm_c return NT_STATUS_OK; } - return task_server_startup(event_ctx, lp_ctx, + return task_server_startup(event_ctx, lp_ctx, "wrepl", model_ops, wreplsrv_task_init); } -- cgit From 0f8eeb81ec109cde681961614fb690f8373fa9c6 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 4 Feb 2008 21:58:29 +1100 Subject: Remove useless layer of indirection, where every service called task_service_init() manually. Now this is called from service.c for all services. Andrew Bartlett (This used to be commit 9c9a4731cafd0dcf6c8523a7b06759cd4f14e4db) --- source4/wrepl_server/wrepl_server.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index d13482dd98..e750d9355a 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -453,6 +453,10 @@ static void wreplsrv_task_init(struct task_server *task) NTSTATUS status; struct wreplsrv_service *service; + if (!lp_wins_support(task->lp_ctx)) { + return; + } + task_server_set_title(task, "task[wreplsrv]"); service = talloc_zero(task, struct wreplsrv_service); @@ -501,23 +505,10 @@ static void wreplsrv_task_init(struct task_server *task) irpc_add_name(task->msg_ctx, "wrepl_server"); } -/* - initialise the WREPL server - */ -static NTSTATUS wreplsrv_init(struct event_context *event_ctx, struct loadparm_context *lp_ctx, const struct model_ops *model_ops) -{ - if (!lp_wins_support(lp_ctx)) { - return NT_STATUS_OK; - } - - return task_server_startup(event_ctx, lp_ctx, "wrepl", - model_ops, wreplsrv_task_init); -} - /* register ourselves as a available server */ NTSTATUS server_service_wrepl_init(void) { - return register_server_service("wrepl", wreplsrv_init); + return register_server_service("wrepl", wreplsrv_task_init); } -- cgit From 21fc7673780aa1d7c0caab7b17ff9171238913ba Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 17 Apr 2008 12:23:44 +0200 Subject: Specify event_context to ldb_wrap_connect explicitly. (This used to be commit b4e1ae07a284c044704322446c94351c2decff91) --- source4/wrepl_server/wrepl_server.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'source4/wrepl_server/wrepl_server.c') diff --git a/source4/wrepl_server/wrepl_server.c b/source4/wrepl_server/wrepl_server.c index e750d9355a..b703066986 100644 --- a/source4/wrepl_server/wrepl_server.c +++ b/source4/wrepl_server/wrepl_server.c @@ -35,9 +35,10 @@ #include "lib/socket/netif.h" static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx, + struct event_context *ev_ctx, struct loadparm_context *lp_ctx) { - return ldb_wrap_connect(mem_ctx, lp_ctx, private_path(mem_ctx, + return ldb_wrap_connect(mem_ctx, ev_ctx, lp_ctx, private_path(mem_ctx, lp_ctx, lp_wins_config_url(lp_ctx)), system_session(mem_ctx, lp_ctx), NULL, 0, NULL); } @@ -83,12 +84,12 @@ static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service, owner = iface_n_ip(ifaces, 0); } - service->wins_db = winsdb_connect(service, lp_ctx, owner, WINSDB_HANDLE_CALLER_WREPL); + service->wins_db = winsdb_connect(service, service->task->event_ctx, lp_ctx, owner, WINSDB_HANDLE_CALLER_WREPL); if (!service->wins_db) { return NT_STATUS_INTERNAL_DB_ERROR; } - service->config.ldb = wins_config_db_connect(service, lp_ctx); + service->config.ldb = wins_config_db_connect(service, service->task->event_ctx, lp_ctx); if (!service->config.ldb) { return NT_STATUS_INTERNAL_DB_ERROR; } -- cgit