ddns

Check-in [66c46f0d2f]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Client: improuved name resolution

- server name resolution and connection are retried until success in loop mode - new option `resolv-interval` to specify a time after which name resolution and connection should be performed again

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 66c46f0d2f30c66c855003e8f2650c6e52ff335a
User & Date: nat 2010-01-03 12:35:29
Context
2010-01-03
12:52
Client: improved resolution and connection error handling

- new option `resolv-retry` to specify a time (in seconds) before retrying a failed resolution - setting this option to 0 makes resolution and connection errors fatal check-in: 444c684cb0 user: nat tags: 1.0, trunk

12:35
Client: improuved name resolution

- server name resolution and connection are retried until success in loop mode - new option `resolv-interval` to specify a time after which name resolution and connection should be performed again check-in: 66c46f0d2f user: nat tags: trunk

2009-12-29
10:53
Setting GID before UID check-in: 3d652d9723 user: nat tags: 1.0-beta2, trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to client.c.

48
49
50
51
52
53
54

55
56
57
58
59
60
61
62
63
64
65
	char		*host;
	char		*port;
	char		*name;
	size_t		 nsize;
	char		*key;
	size_t		 ksize;
	int		 interval;

	struct sexp	 sensor; };

/* DEFAULT_OPT • initializer for struct client_options */
#define DEFAULT_OPT { 0, 0, 0, 0, 0, 0, 0, { 0, 0, 0, 0 } }


/* free_options • releases internal memory from struct client_options */
static void
free_options(struct client_options *opt) {
	if (!opt) return;
	free(opt->host);







>



|







48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
	char		*host;
	char		*port;
	char		*name;
	size_t		 nsize;
	char		*key;
	size_t		 ksize;
	int		 interval;
	int		 resolv_interval;
	struct sexp	 sensor; };

/* DEFAULT_OPT • initializer for struct client_options */
#define DEFAULT_OPT { 0, 0, 0, 0, 0, 0, 0, -1, { 0, 0, 0, 0 } }


/* free_options • releases internal memory from struct client_options */
static void
free_options(struct client_options *opt) {
	if (!opt) return;
	free(opt->host);
111
112
113
114
115
116
117





118
119
120
121
122
123
124
			if (!neo) continue;
			nopt.key = neo;
			nopt.ksize = arg->size;
			memcpy(nopt.key, arg->data, arg->size); }
		else if (!strcmp(cmd, "interval")) {
			if (SX_IS_ATOM(arg) && arg->size)
				nopt.interval = atoi(arg->data); }





		else if (!strcmp(cmd, "sensor")) {
			sx_release(&nopt.sensor);
			sx_dup(&nopt.sensor, arg); }
		else log_c_bad_cmd(cmd);

	/* conformity checks */
	if (!nopt.host







>
>
>
>
>







112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
			if (!neo) continue;
			nopt.key = neo;
			nopt.ksize = arg->size;
			memcpy(nopt.key, arg->data, arg->size); }
		else if (!strcmp(cmd, "interval")) {
			if (SX_IS_ATOM(arg) && arg->size)
				nopt.interval = atoi(arg->data); }
		else if (!strcmp(cmd, "resolv")
		|| !strcmp(cmd, "resolv-interval")
		|| !strcmp(cmd, "resolv_interval")) {
			if (SX_IS_ATOM(arg) && arg->size)
				nopt.resolv_interval = atoi(arg->data); }
		else if (!strcmp(cmd, "sensor")) {
			sx_release(&nopt.sensor);
			sx_dup(&nopt.sensor, arg); }
		else log_c_bad_cmd(cmd);

	/* conformity checks */
	if (!nopt.host
142
143
144
145
146
147
148

149
150
151
152
153
154
155
/* connect_socket • connects the given socket to the parametered server */
/*	returns 0 on success, -1 on failure */
static int
connect_socket(int socket, struct client_options *opt) {
	struct addrinfo hints, *res;
	int ret;


	/* address lookup */
	memset(&hints, 0, sizeof hints);
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_protocol = IPPROTO_UDP;
	ret = getaddrinfo(opt->host, opt->port, &hints, &res);
	if (ret) {







>







148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/* connect_socket • connects the given socket to the parametered server */
/*	returns 0 on success, -1 on failure */
static int
connect_socket(int socket, struct client_options *opt) {
	struct addrinfo hints, *res;
	int ret;

fprintf(stderr, "Connecting socket %d\n", socket);
	/* address lookup */
	memset(&hints, 0, sizeof hints);
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_protocol = IPPROTO_UDP;
	ret = getaddrinfo(opt->host, opt->port, &hints, &res);
	if (ret) {
199
200
201
202
203
204
205

206
207
208
209
210
211
212
213
214
215
216
217
218


219
220


221



222

223
224
225
226
227
228
229
230
231

/* client_loop • main message sending loop */
/*	returns 0 on success, -1 on faileure */
static int
client_loop(struct client_options *opt) {
	int fd;
	struct ddns_message msg;


	fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (!fd) {
		log_c_socket();
		return -1; }

	if (connect_socket(fd, opt) < 0) return -1;

	msg.time = time(0);
	msg.name = opt->name;
	msg.namelen = opt->nsize;
	msg.addr[0] = msg.addr[1] = msg.addr[2] = msg.addr[3] = 0;



	if (opt->interval <= 0) {
		get_own_addr(msg.addr, opt->sensor.nodes);


		return send_message(fd, &msg, opt->key,  opt->ksize); }





	while (!terminated) {
		msg.time = time(0);
		get_own_addr(msg.addr, opt->sensor.nodes);
		send_message(fd, &msg, opt->key, opt->ksize);
		sleep(opt->interval); }

	return 0; }









>






<
<
<




>
>
|
|
>
>
|
>
>
>

>
|
<







206
207
208
209
210
211
212
213
214
215
216
217
218
219



220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236

237
238
239
240
241
242
243

/* client_loop • main message sending loop */
/*	returns 0 on success, -1 on faileure */
static int
client_loop(struct client_options *opt) {
	int fd;
	struct ddns_message msg;
	time_t last_resolv = 0;

	fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (!fd) {
		log_c_socket();
		return -1; }




	msg.name = opt->name;
	msg.namelen = opt->nsize;
	msg.addr[0] = msg.addr[1] = msg.addr[2] = msg.addr[3] = 0;

	while (!terminated) {
		msg.time = time(0);
		if (opt->interval <= 0) terminated = 1;

		/* resolving server name if needed */
		if (!last_resolv
		|| (opt->resolv_interval >= 0
		&& msg.time - last_resolv > opt->resolv_interval)) {
			if (connect_socket(fd, opt) >= 0)
				last_resolv = msg.time; }

		/* sending the message (if possible) */
		if (!last_resolv) continue;

		get_own_addr(msg.addr, opt->sensor.nodes);
		send_message(fd, &msg, opt->key, opt->ksize);
		sleep(opt->interval); }

	return 0; }


Changes to examples/client.dat.

1
2

3
4
5
6
7
8
9
10
(server localhost 54321)
(interval 5)

(sensor
	(system "echo 127.0.0.1"))
(name tester)
(key #	DC2DCC8BB3D31412 C82BE020D33D1A89
	1A747D51398924D3 BAC55A115AC2ACA5
	46A295C824C21AE3 0882995972553123
	1C969EEC23E64B4D EF522F1BEF556028 #)



>








1
2
3
4
5
6
7
8
9
10
11
(server localhost 54321)
(interval 5)
(resolv-interval 0)
(sensor
	(system "echo 127.0.0.1"))
(name tester)
(key #	DC2DCC8BB3D31412 C82BE020D33D1A89
	1A747D51398924D3 BAC55A115AC2ACA5
	46A295C824C21AE3 0882995972553123
	1C969EEC23E64B4D EF522F1BEF556028 #)