r23792: convert Samba4 to GPLv3
[kai/samba.git] / source4 / dsdb / repl / drepl_service.h
1 /* 
2    Unix SMB/CIFS mplementation.
3    DSDB replication service
4    
5    Copyright (C) Stefan Metzmacher 2007
6     
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19    
20 */
21
22 #ifndef _DSDB_REPL_DREPL_SERVICE_H_
23 #define _DSDB_REPL_DREPL_SERVICE_H_
24
25 #include "librpc/gen_ndr/ndr_drsuapi_c.h"
26
27 struct dreplsrv_service;
28 struct dreplsrv_partition;
29
30 struct dreplsrv_drsuapi_connection {
31         /*
32          * this pipe pointer is also the indicator
33          * for a valid connection
34          */
35         struct dcerpc_pipe *pipe;
36
37         DATA_BLOB gensec_skey;
38         struct drsuapi_DsBindInfo28 remote_info28;
39         struct policy_handle bind_handle;
40 };
41
42 struct dreplsrv_out_connection {
43         struct dreplsrv_out_connection *prev, *next;
44
45         struct dreplsrv_service *service;
46
47         /*
48          * the binding for the outgoing connection
49          */
50         struct dcerpc_binding *binding;
51
52         /* the out going connection to the source dsa */
53         struct dreplsrv_drsuapi_connection *drsuapi;
54 };
55
56 struct dreplsrv_partition_source_dsa {
57         struct dreplsrv_partition_source_dsa *prev, *next;
58
59         struct dreplsrv_partition *partition;
60
61         /*
62          * the cached repsFrom value for this source dsa
63          *
64          * it needs to be updated after each DsGetNCChanges() call
65          * to the source dsa
66          *
67          * repsFrom1 == &_repsFromBlob.ctr.ctr1
68          */
69         struct repsFromToBlob _repsFromBlob;
70         struct repsFromTo1 *repsFrom1;
71
72         /* the reference to the source_dsa and its outgoing connection */
73         struct dreplsrv_out_connection *conn;
74 };
75
76 struct dreplsrv_partition {
77         struct dreplsrv_partition *prev, *next;
78
79         struct dreplsrv_service *service;
80
81         /* the dn of the partition */
82         struct ldb_dn *dn;
83         struct drsuapi_DsReplicaObjectIdentifier nc;
84
85         /* 
86          * uptodate vector needs to be updated before and after each DsGetNCChanges() call
87          *
88          * - before: we need to use our own invocationId together with our highestCommitedUsn
89          * - after: we need to merge in the remote uptodatevector, to avoid reading it again
90          */
91         struct replUpToDateVectorCtr2 uptodatevector;
92         struct drsuapi_DsReplicaCursorCtrEx uptodatevector_ex;
93
94         /*
95          * a linked list of all source dsa's we replicate from
96          */
97         struct dreplsrv_partition_source_dsa *sources;
98 };
99
100 struct dreplsrv_out_operation {
101         struct dreplsrv_out_operation *prev, *next;
102
103         struct dreplsrv_service *service;
104
105         struct dreplsrv_partition_source_dsa *source_dsa;
106
107         struct composite_context *creq;
108 };
109
110 struct dreplsrv_service {
111         /* the whole drepl service is in one task */
112         struct task_server *task;
113
114         /* the time the service was started */
115         struct timeval startup_time;
116
117         /* 
118          * system session info
119          * with machine account credentials
120          */
121         struct auth_session_info *system_session_info;
122
123         /*
124          * a connection to the local samdb
125          */
126         struct ldb_context *samdb;
127
128         /* the guid of our NTDS Settings object, which never changes! */
129         struct GUID ntds_guid;
130         /*
131          * the struct holds the values used for outgoing DsBind() calls,
132          * so that we need to set them up only once
133          */
134         struct drsuapi_DsBindInfo28 bind_info28;
135
136         /* some stuff for periodic processing */
137         struct {
138                 /*
139                  * the interval between to periodic runs
140                  */
141                 uint32_t interval;
142
143                 /*
144                  * the timestamp for the next event,
145                  * this is the timstamp passed to event_add_timed()
146                  */
147                 struct timeval next_event;
148
149                 /* here we have a reference to the timed event the schedules the periodic stuff */
150                 struct timed_event *te;
151         } periodic;
152
153         /*
154          * the list of partitions we need to replicate
155          */
156         struct dreplsrv_partition *partitions;
157
158         /*
159          * the list of cached connections
160          */
161         struct dreplsrv_out_connection *connections;
162
163         struct {        
164                 /* the pointer to the current active operation */
165                 struct dreplsrv_out_operation *current;
166
167                 /* the list of pending operations */
168                 struct dreplsrv_out_operation *pending;
169         } ops;
170 };
171
172 #include "dsdb/repl/drepl_out_helpers.h"
173 #include "dsdb/repl/drepl_service_proto.h"
174
175 #endif /* _DSDB_REPL_DREPL_SERVICE_H_ */