1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
/*
Unix SMB/CIFS implementation.
structures for WINS replication client library
Copyright (C) Andrew Tridgell 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 "librpc/gen_ndr/ndr_nbt.h"
#include "librpc/gen_ndr/ndr_winsrepl.h"
/*
main context structure for the wins replication client library
*/
struct wrepl_socket {
struct socket_context *sock;
struct event_context *event_ctx;
/* a queue of requests pending to be sent */
struct wrepl_request *send_queue;
/* a queue of replies waiting to be received */
struct wrepl_request *recv_queue;
/* the fd event */
struct fd_event *fde;
/* the default timeout for requests, 0 means no timeout */
#define WREPL_SOCKET_REQUEST_TIMEOUT (60)
uint32_t request_timeout;
/* counter for request timeouts, after 2 timeouts the socket is marked as dead */
uint32_t timeout_count;
/* remember is the socket is dead */
BOOL dead;
};
enum wrepl_request_state {
WREPL_REQUEST_SEND = 0,
WREPL_REQUEST_RECV = 1,
WREPL_REQUEST_DONE = 2,
WREPL_REQUEST_ERROR = 3
};
/*
a WINS replication request
*/
struct wrepl_request {
struct wrepl_request *next, *prev;
struct wrepl_socket *wrepl_socket;
enum wrepl_request_state state;
NTSTATUS status;
DATA_BLOB buffer;
size_t num_read;
struct timed_event *te;
struct wrepl_packet *packet;
struct {
void (*fn)(struct wrepl_request *);
void *private;
} async;
};
/*
setup an association
*/
struct wrepl_associate {
struct {
uint32_t assoc_ctx;
} out;
};
/*
pull the partner table
*/
struct wrepl_pull_table {
struct {
uint32_t assoc_ctx;
} in;
struct {
uint32_t num_partners;
struct wrepl_wins_owner *partners;
} out;
};
#define WREPL_NAME_TYPE(flags) (flags & WREPL_FLAGS_RECORD_TYPE)
#define WREPL_NAME_STATE(flags) ((flags & WREPL_FLAGS_RECORD_STATE)>>2)
#define WREPL_NAME_NODE(flags) ((flags & WREPL_FLAGS_NODE_TYPE)>>5)
#define WREPL_NAME_IS_STATIC(flags) ((flags & WREPL_FLAGS_IS_STATIC)?True:False)
#define WREPL_NAME_FLAGS(type, state, node, is_static) \
(type | (state << 2) | (node << 5) | \
(is_static ? WREPL_FLAGS_IS_STATIC : 0))
/*
a full pull replication
*/
struct wrepl_pull_names {
struct {
uint32_t assoc_ctx;
struct wrepl_wins_owner partner;
} in;
struct {
uint32_t num_names;
struct wrepl_name {
struct nbt_name name;
enum wrepl_name_type type;
enum wrepl_name_state state;
enum wrepl_name_node node;
BOOL is_static;
uint32_t raw_flags;
uint64_t version_id;
const char *owner;
uint32_t num_addresses;
struct wrepl_address {
const char *owner;
const char *address;
} *addresses;
} *names;
} out;
};
|