summaryrefslogtreecommitdiff
path: root/source4/libcli/wrepl/winsrepl.h
blob: 2253fe181ebef3b83de0f20d3071433615fe04e0 (plain)
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
/*
   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;
};

/*
  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;
			uint32_t flags;
			uint32_t group_flag;
			uint64_t version_id;
			const char *owner;
			uint32_t num_addresses;
			struct wrepl_address {
				const char *owner;
				const char *address;
			} *addresses;
		} *names;
	} out;
};