Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : WINS Replication server
5 :
6 : Copyright (C) Stefan Metzmacher 2005
7 :
8 : This program is free software; you can redistribute it and/or modify
9 : it under the terms of the GNU General Public License as published by
10 : the Free Software Foundation; either version 3 of the License, or
11 : (at your option) any later version.
12 :
13 : This program is distributed in the hope that it will be useful,
14 : but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : GNU General Public License for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with this program. If not, see <http://www.gnu.org/licenses/>.
20 : */
21 :
22 : #include "includes.h"
23 : #include "lib/events/events.h"
24 : #include "samba/service_task.h"
25 : #include "samba/service.h"
26 : #include "librpc/gen_ndr/winsrepl.h"
27 : #include "wrepl_server/wrepl_server.h"
28 :
29 2822 : static NTSTATUS wreplsrv_periodic_run(struct wreplsrv_service *service)
30 : {
31 : NTSTATUS status;
32 :
33 2822 : status = wreplsrv_load_partners(service);
34 2822 : NT_STATUS_NOT_OK_RETURN(status);
35 :
36 2822 : status = wreplsrv_scavenging_run(service);
37 2822 : NT_STATUS_NOT_OK_RETURN(status);
38 :
39 2822 : status = wreplsrv_out_pull_run(service);
40 2822 : NT_STATUS_NOT_OK_RETURN(status);
41 :
42 2822 : status = wreplsrv_out_push_run(service);
43 2822 : NT_STATUS_NOT_OK_RETURN(status);
44 :
45 2822 : return NT_STATUS_OK;
46 : }
47 :
48 2822 : static void wreplsrv_periodic_handler_te(struct tevent_context *ev, struct tevent_timer *te,
49 : struct timeval t, void *ptr)
50 : {
51 2822 : struct wreplsrv_service *service = talloc_get_type(ptr, struct wreplsrv_service);
52 : NTSTATUS status;
53 :
54 2822 : service->periodic.te = NULL;
55 :
56 2822 : status = wreplsrv_periodic_schedule(service, service->config.periodic_interval);
57 2822 : if (!NT_STATUS_IS_OK(status)) {
58 0 : task_server_terminate(service->task, nt_errstr(status), false);
59 0 : return;
60 : }
61 :
62 2822 : status = wreplsrv_periodic_run(service);
63 2822 : if (!NT_STATUS_IS_OK(status)) {
64 0 : DEBUG(0,("wresrv_periodic_run() failed: %s\n", nt_errstr(status)));
65 : }
66 : }
67 :
68 2928 : NTSTATUS wreplsrv_periodic_schedule(struct wreplsrv_service *service, uint32_t next_interval)
69 : {
70 : TALLOC_CTX *tmp_mem;
71 : struct tevent_timer *new_te;
72 : struct timeval next_time;
73 :
74 : /* prevent looping */
75 2928 : if (next_interval == 0) next_interval = 1;
76 :
77 2928 : next_time = timeval_current_ofs(next_interval, 5000);
78 :
79 2928 : if (service->periodic.te) {
80 : /*
81 : * if the timestamp of the new event is higher,
82 : * as current next we don't need to reschedule
83 : */
84 53 : if (timeval_compare(&next_time, &service->periodic.next_event) > 0) {
85 53 : return NT_STATUS_OK;
86 : }
87 : }
88 :
89 : /* reset the next scheduled timestamp */
90 2875 : service->periodic.next_event = next_time;
91 :
92 2875 : new_te = tevent_add_timer(service->task->event_ctx, service,
93 : service->periodic.next_event,
94 : wreplsrv_periodic_handler_te, service);
95 2875 : NT_STATUS_HAVE_NO_MEMORY(new_te);
96 :
97 2875 : tmp_mem = talloc_new(service);
98 2875 : DEBUG(6,("wreplsrv_periodic_schedule(%u) %sscheduled for: %s\n",
99 : next_interval,
100 : (service->periodic.te?"re":""),
101 : nt_time_string(tmp_mem, timeval_to_nttime(&next_time))));
102 2875 : talloc_free(tmp_mem);
103 :
104 2875 : talloc_free(service->periodic.te);
105 2875 : service->periodic.te = new_te;
106 :
107 2875 : return NT_STATUS_OK;
108 : }
109 :
110 53 : NTSTATUS wreplsrv_setup_periodic(struct wreplsrv_service *service)
111 : {
112 : NTSTATUS status;
113 :
114 53 : status = wreplsrv_periodic_schedule(service, 0);
115 53 : NT_STATUS_NOT_OK_RETURN(status);
116 :
117 53 : return NT_STATUS_OK;
118 : }
|