2 Unix SMB/CIFS implementation.
3 process incoming packets - main loop
4 Copyright (C) Jean François Micouleau 1998-2002.
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.
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.
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.
22 #include "wins_repl.h"
24 /* we can exchange info with 64 partners at any given time */
25 WINS_PARTNER current_partners
[64];
26 int total_current_partners
;
28 /*******************************************************************
29 verify if we know this partner
30 ********************************************************************/
31 BOOL
check_partner(int assoc
)
35 for (i
=0; i
<total_current_partners
; i
++)
36 if (current_partners
[i
].client_assoc
==assoc
)
42 /*******************************************************************
43 add a new entry to the list
44 ********************************************************************/
45 BOOL
add_partner(int client_assoc
, int server_assoc
, BOOL pull
, BOOL push
)
47 if (total_current_partners
==64)
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
;
55 total_current_partners
++;
60 /*******************************************************************
61 remove an entry to the list
62 ********************************************************************/
63 BOOL
remove_partner(int client_assoc
)
67 for (i
=0; current_partners
[i
].client_assoc
!=client_assoc
&& i
<total_current_partners
; i
++)
70 if (i
==total_current_partners
)
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
;
82 total_current_partners
--;
87 /*******************************************************************
88 link the client and server context
89 ********************************************************************/
90 BOOL
update_server_partner(int client_assoc
, int server_assoc
)
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
;
103 /*******************************************************************
104 verify if it's a pull partner
105 ********************************************************************/
106 BOOL
check_pull_partner(int assoc
)
110 for (i
=0; i
<total_current_partners
; i
++)
111 if (current_partners
[i
].client_assoc
==assoc
&&
112 current_partners
[i
].pull_partner
==True
)
118 /*******************************************************************
119 verify if it's a push partner
120 ********************************************************************/
121 BOOL
check_push_partner(int assoc
)
125 for (i
=0; i
<total_current_partners
; i
++)
126 if (current_partners
[i
].client_assoc
==assoc
&&
127 current_partners
[i
].push_partner
==True
)
133 /*******************************************************************
134 return the server ctx linked to the client ctx
135 ********************************************************************/
136 int get_server_assoc(int assoc
)
140 for (i
=0; i
<total_current_partners
; i
++)
141 if (current_partners
[i
].client_assoc
==assoc
)
142 return current_partners
[i
].server_assoc
;
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
)
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
;
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
)
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
;