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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
/*
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "librpc/gen_ndr/nbt.h"
#include "librpc/gen_ndr/winsrepl.h"
/*
main context structure for the wins replication client library
*/
struct wrepl_socket {
struct socket_context *sock;
struct packet_context *packet;
struct {
struct tevent_context *ctx;
struct tevent_fd *fde;
} event;
/* a queue of replies waiting to be received */
struct wrepl_request *recv_queue;
/* 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;
/* remember if we need to free the wrepl_socket at the end of wrepl_socket_dead() */
bool free_skipped;
struct smb_iconv_convenience *iconv_convenience;
};
struct wrepl_send_ctrl {
bool send_only;
bool disconnect_after_send;
};
enum wrepl_request_state {
WREPL_REQUEST_INIT = 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;
bool trigger;
NTSTATUS status;
struct tevent_timer *te;
struct wrepl_packet *packet;
struct {
void (*fn)(struct wrepl_request *);
void *private_data;
} async;
};
/*
setup an association
*/
struct wrepl_associate {
struct {
uint32_t assoc_ctx;
uint16_t major_version;
} out;
};
/*
setup an association
*/
struct wrepl_associate_stop {
struct {
uint32_t assoc_ctx;
uint32_t reason;
} in;
};
/*
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))
struct wrepl_address {
const char *owner;
const char *address;
};
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 *addresses;
};
/*
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 *names;
} out;
};
struct resolve_context;
#include "libcli/wrepl/winsrepl_proto.h"
|