Removed version number from file header.
[samba.git] / source3 / wrepld / partners.c
1 /* 
2    Unix SMB/CIFS implementation.
3    process incoming packets - main loop
4    Copyright (C) Jean François Micouleau      1998-2002.
5    
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #include "includes.h"
22 #include "wins_repl.h"
23
24 /* we can exchange info with 64 partners at any given time */
25 WINS_PARTNER current_partners[64];
26 int total_current_partners;
27
28 /*******************************************************************
29 verify if we know this partner
30 ********************************************************************/
31 BOOL check_partner(int assoc)
32 {
33         int i;
34         
35         for (i=0; i<total_current_partners; i++)
36                 if (current_partners[i].client_assoc==assoc)
37                         return True;
38
39         return False;
40 }
41
42 /*******************************************************************
43 add a new entry to the list
44 ********************************************************************/
45 BOOL add_partner(int client_assoc, int server_assoc, BOOL pull, BOOL push)
46 {
47         if (total_current_partners==64)
48                 return False;
49
50         current_partners[total_current_partners].client_assoc=client_assoc;
51         current_partners[total_current_partners].server_assoc=server_assoc;
52         current_partners[total_current_partners].pull_partner=pull;
53         current_partners[total_current_partners].push_partner=push;
54
55         total_current_partners++;
56
57         return True;
58 }
59
60 /*******************************************************************
61 remove an entry to the list
62 ********************************************************************/
63 BOOL remove_partner(int client_assoc)
64 {
65         int i,j;
66
67         for (i=0; current_partners[i].client_assoc!=client_assoc && i<total_current_partners; i++)
68                 ;
69         
70         if (i==total_current_partners)
71                 return False;
72
73         for (j=i+1; j<total_current_partners; j++) {
74                 current_partners[j-1].client_assoc=current_partners[j].client_assoc;
75                 current_partners[j-1].server_assoc=current_partners[j].server_assoc;
76                 current_partners[j-1].pull_partner=current_partners[j].pull_partner;
77                 current_partners[j-1].push_partner=current_partners[j].push_partner;
78                 current_partners[j-1].partner_server.s_addr=current_partners[j].partner_server.s_addr;
79                 current_partners[j-1].other_server.s_addr=current_partners[j].other_server.s_addr;
80         }
81
82         total_current_partners--;
83
84         return True;
85 }
86
87 /*******************************************************************
88 link the client and server context
89 ********************************************************************/
90 BOOL update_server_partner(int client_assoc, int server_assoc)
91 {
92         int i;
93         
94         for (i=0; i<total_current_partners; i++)
95                 if (current_partners[i].client_assoc==client_assoc) {
96                         current_partners[i].server_assoc=server_assoc;
97                         return True;
98                 }
99
100         return False;
101 }
102
103 /*******************************************************************
104 verify if it's a pull partner
105 ********************************************************************/
106 BOOL check_pull_partner(int assoc)
107 {
108         int i;
109         
110         for (i=0; i<total_current_partners; i++)
111                 if (current_partners[i].client_assoc==assoc &&
112                     current_partners[i].pull_partner==True)
113                         return True;
114
115         return False;
116 }
117
118 /*******************************************************************
119 verify if it's a push partner
120 ********************************************************************/
121 BOOL check_push_partner(int assoc)
122 {
123         int i;
124         
125         for (i=0; i<total_current_partners; i++)
126                 if (current_partners[i].client_assoc==assoc &&
127                     current_partners[i].push_partner==True)
128                         return True;
129
130         return False;
131 }
132
133 /*******************************************************************
134 return the server ctx linked to the client ctx
135 ********************************************************************/
136 int get_server_assoc(int assoc)
137 {
138         int i;
139         
140         for (i=0; i<total_current_partners; i++)
141                 if (current_partners[i].client_assoc==assoc)
142                         return current_partners[i].server_assoc;
143
144         return 0;
145 }
146
147
148 /*******************************************************************
149 link the client and server context
150 ********************************************************************/
151 BOOL write_server_assoc_table(int client_assoc, struct in_addr partner, struct in_addr server)
152 {
153         int i;
154         
155         for (i=0; i<total_current_partners; i++)
156                 if (current_partners[i].client_assoc==client_assoc) {
157                         current_partners[i].partner_server=partner;
158                         current_partners[i].other_server=server;
159                         return True;
160                 }
161
162         return False;
163 }
164
165 /*******************************************************************
166 link the client and server context
167 ********************************************************************/
168 BOOL get_server_assoc_table(int client_assoc, struct in_addr *partner, struct in_addr *server)
169 {
170         int i;
171         
172         for (i=0; i<total_current_partners; i++)
173                 if (current_partners[i].client_assoc==client_assoc) {
174                         partner->s_addr=current_partners[i].partner_server.s_addr;
175                         server->s_addr=current_partners[i].other_server.s_addr;
176                         return True;
177                 }
178
179         return False;
180 }
181
182