xref: /freebsd/sbin/dhclient/tests/option-domain-search.c (revision c210cac00f2584f031b56b4cdd2e801dbb9e1348)
1c68de748SJulio Merino /* $FreeBSD$ */
2c68de748SJulio Merino 
3c68de748SJulio Merino #include <setjmp.h>
4c68de748SJulio Merino #include <stdlib.h>
5c68de748SJulio Merino 
6c68de748SJulio Merino #include "dhcpd.h"
7c68de748SJulio Merino 
8c68de748SJulio Merino jmp_buf env;
9c68de748SJulio Merino 
10c68de748SJulio Merino void	expand_domain_search(struct packet *packet);
11c68de748SJulio Merino 
12c68de748SJulio Merino void
13c68de748SJulio Merino no_option_present()
14c68de748SJulio Merino {
15c68de748SJulio Merino 	int ret;
16c68de748SJulio Merino 	struct option_data option;
17c68de748SJulio Merino 	struct packet p;
18c68de748SJulio Merino 
19c68de748SJulio Merino 	option.data = NULL;
20c68de748SJulio Merino 	option.len  = 0;
21c68de748SJulio Merino 	p.options[DHO_DOMAIN_SEARCH] = option;
22c68de748SJulio Merino 
23c68de748SJulio Merino 	ret = setjmp(env);
24c68de748SJulio Merino 	if (ret == 0)
25c68de748SJulio Merino 		expand_domain_search(&p);
26c68de748SJulio Merino 
27c68de748SJulio Merino 	if (p.options[DHO_DOMAIN_SEARCH].len != 0 ||
28c68de748SJulio Merino 	    p.options[DHO_DOMAIN_SEARCH].data != NULL)
29c68de748SJulio Merino 		abort();
30c68de748SJulio Merino }
31c68de748SJulio Merino 
32c68de748SJulio Merino void
33c68de748SJulio Merino one_domain_valid()
34c68de748SJulio Merino {
35c68de748SJulio Merino 	int ret;
36c68de748SJulio Merino 	struct packet p;
37c68de748SJulio Merino 	struct option_data *option;
38c68de748SJulio Merino 
39c68de748SJulio Merino 	char *data     = "\007example\003org\0";
40c68de748SJulio Merino 	char *expected = "example.org.";
41c68de748SJulio Merino 
42c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
43c68de748SJulio Merino 	option->len  = 13;
44c68de748SJulio Merino 	option->data = malloc(option->len);
45c68de748SJulio Merino 	memcpy(option->data, data, option->len);
46c68de748SJulio Merino 
47c68de748SJulio Merino 	ret = setjmp(env);
48c68de748SJulio Merino 	if (ret == 0)
49c68de748SJulio Merino 		expand_domain_search(&p);
50c68de748SJulio Merino 
51c68de748SJulio Merino 	if (option->len != strlen(expected) ||
52c68de748SJulio Merino 	    strcmp(option->data, expected) != 0)
53c68de748SJulio Merino 		abort();
54c68de748SJulio Merino 
55c68de748SJulio Merino 	free(option->data);
56c68de748SJulio Merino }
57c68de748SJulio Merino 
58c68de748SJulio Merino void
59c68de748SJulio Merino one_domain_truncated1()
60c68de748SJulio Merino {
61c68de748SJulio Merino 	int ret;
62c68de748SJulio Merino 	struct option_data *option;
63c68de748SJulio Merino 	struct packet p;
64c68de748SJulio Merino 
65c68de748SJulio Merino 	char *data = "\007example\003org";
66c68de748SJulio Merino 
67c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
68c68de748SJulio Merino 	option->len  = 12;
69c68de748SJulio Merino 	option->data = malloc(option->len);
70c68de748SJulio Merino 	memcpy(option->data, data, option->len);
71c68de748SJulio Merino 
72c68de748SJulio Merino 	ret = setjmp(env);
73c68de748SJulio Merino 	if (ret == 0)
74c68de748SJulio Merino 		expand_domain_search(&p);
75c68de748SJulio Merino 
76c68de748SJulio Merino 	if (ret != 1)
77c68de748SJulio Merino 		abort();
78c68de748SJulio Merino 
79c68de748SJulio Merino 	free(option->data);
80c68de748SJulio Merino }
81c68de748SJulio Merino 
82c68de748SJulio Merino void
83c68de748SJulio Merino one_domain_truncated2()
84c68de748SJulio Merino {
85c68de748SJulio Merino 	int ret;
86c68de748SJulio Merino 	struct option_data *option;
87c68de748SJulio Merino 	struct packet p;
88c68de748SJulio Merino 
89c68de748SJulio Merino 	char *data = "\007ex";
90c68de748SJulio Merino 
91c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
92c68de748SJulio Merino 	option->len  = 3;
93c68de748SJulio Merino 	option->data = malloc(option->len);
94c68de748SJulio Merino 	memcpy(option->data, data, option->len);
95c68de748SJulio Merino 
96c68de748SJulio Merino 	ret = setjmp(env);
97c68de748SJulio Merino 	if (ret == 0)
98c68de748SJulio Merino 		expand_domain_search(&p);
99c68de748SJulio Merino 
100c68de748SJulio Merino 	if (ret != 1)
101c68de748SJulio Merino 		abort();
102c68de748SJulio Merino 
103c68de748SJulio Merino 	free(option->data);
104c68de748SJulio Merino }
105c68de748SJulio Merino 
106c68de748SJulio Merino void
107c68de748SJulio Merino two_domains_valid()
108c68de748SJulio Merino {
109c68de748SJulio Merino 	int ret;
110c68de748SJulio Merino 	struct packet p;
111c68de748SJulio Merino 	struct option_data *option;
112c68de748SJulio Merino 
113c68de748SJulio Merino 	char *data     = "\007example\003org\0\007example\003com\0";
114c68de748SJulio Merino 	char *expected = "example.org. example.com.";
115c68de748SJulio Merino 
116c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
117c68de748SJulio Merino 	option->len  = 26;
118c68de748SJulio Merino 	option->data = malloc(option->len);
119c68de748SJulio Merino 	memcpy(option->data, data, option->len);
120c68de748SJulio Merino 
121c68de748SJulio Merino 	ret = setjmp(env);
122c68de748SJulio Merino 	if (ret == 0)
123c68de748SJulio Merino 		expand_domain_search(&p);
124c68de748SJulio Merino 
125c68de748SJulio Merino 	if (option->len != strlen(expected) ||
126c68de748SJulio Merino 	    strcmp(option->data, expected) != 0)
127c68de748SJulio Merino 		abort();
128c68de748SJulio Merino 
129c68de748SJulio Merino 	free(option->data);
130c68de748SJulio Merino }
131c68de748SJulio Merino 
132c68de748SJulio Merino void
133c68de748SJulio Merino two_domains_truncated1()
134c68de748SJulio Merino {
135c68de748SJulio Merino 	int ret;
136c68de748SJulio Merino 	struct option_data *option;
137c68de748SJulio Merino 	struct packet p;
138c68de748SJulio Merino 
139c68de748SJulio Merino 	char *data = "\007example\003org\0\007example\003com";
140c68de748SJulio Merino 
141c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
142c68de748SJulio Merino 	option->len  = 25;
143c68de748SJulio Merino 	option->data = malloc(option->len);
144c68de748SJulio Merino 	memcpy(option->data, data, option->len);
145c68de748SJulio Merino 
146c68de748SJulio Merino 	ret = setjmp(env);
147c68de748SJulio Merino 	if (ret == 0)
148c68de748SJulio Merino 		expand_domain_search(&p);
149c68de748SJulio Merino 
150c68de748SJulio Merino 	if (ret != 1)
151c68de748SJulio Merino 		abort();
152c68de748SJulio Merino 
153c68de748SJulio Merino 	free(option->data);
154c68de748SJulio Merino }
155c68de748SJulio Merino 
156c68de748SJulio Merino void
157c68de748SJulio Merino two_domains_truncated2()
158c68de748SJulio Merino {
159c68de748SJulio Merino 	int ret;
160c68de748SJulio Merino 	struct option_data *option;
161c68de748SJulio Merino 	struct packet p;
162c68de748SJulio Merino 
163c68de748SJulio Merino 	char *data = "\007example\003org\0\007ex";
164c68de748SJulio Merino 
165c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
166c68de748SJulio Merino 	option->len  = 16;
167c68de748SJulio Merino 	option->data = malloc(option->len);
168c68de748SJulio Merino 	memcpy(option->data, data, option->len);
169c68de748SJulio Merino 
170c68de748SJulio Merino 	ret = setjmp(env);
171c68de748SJulio Merino 	if (ret == 0)
172c68de748SJulio Merino 		expand_domain_search(&p);
173c68de748SJulio Merino 
174c68de748SJulio Merino 	if (ret != 1)
175c68de748SJulio Merino 		abort();
176c68de748SJulio Merino 
177c68de748SJulio Merino 	free(option->data);
178c68de748SJulio Merino }
179c68de748SJulio Merino 
180c68de748SJulio Merino void
181c68de748SJulio Merino two_domains_compressed()
182c68de748SJulio Merino {
183c68de748SJulio Merino 	int ret;
184c68de748SJulio Merino 	struct packet p;
185c68de748SJulio Merino 	struct option_data *option;
186c68de748SJulio Merino 
187c68de748SJulio Merino 	char *data     = "\007example\003org\0\006foobar\xc0\x08";
188c68de748SJulio Merino 	char *expected = "example.org. foobar.org.";
189c68de748SJulio Merino 
190c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
191c68de748SJulio Merino 	option->len  = 22;
192c68de748SJulio Merino 	option->data = malloc(option->len);
193c68de748SJulio Merino 	memcpy(option->data, data, option->len);
194c68de748SJulio Merino 
195c68de748SJulio Merino 	ret = setjmp(env);
196c68de748SJulio Merino 	if (ret == 0)
197c68de748SJulio Merino 		expand_domain_search(&p);
198c68de748SJulio Merino 
199c68de748SJulio Merino 	if (option->len != strlen(expected) ||
200c68de748SJulio Merino 	    strcmp(option->data, expected) != 0)
201c68de748SJulio Merino 		abort();
202c68de748SJulio Merino 
203c68de748SJulio Merino 	free(option->data);
204c68de748SJulio Merino }
205c68de748SJulio Merino 
206c68de748SJulio Merino void
207c68de748SJulio Merino two_domains_infloop()
208c68de748SJulio Merino {
209c68de748SJulio Merino 	int ret;
210c68de748SJulio Merino 	struct packet p;
211c68de748SJulio Merino 	struct option_data *option;
212c68de748SJulio Merino 
213c68de748SJulio Merino 	char *data = "\007example\003org\0\006foobar\xc0\x0d";
214c68de748SJulio Merino 
215c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
216c68de748SJulio Merino 	option->len  = 22;
217c68de748SJulio Merino 	option->data = malloc(option->len);
218c68de748SJulio Merino 	memcpy(option->data, data, option->len);
219c68de748SJulio Merino 
220c68de748SJulio Merino 	ret = setjmp(env);
221c68de748SJulio Merino 	if (ret == 0)
222c68de748SJulio Merino 		expand_domain_search(&p);
223c68de748SJulio Merino 
224c68de748SJulio Merino 	if (ret != 1)
225c68de748SJulio Merino 		abort();
226c68de748SJulio Merino 
227c68de748SJulio Merino 	free(option->data);
228c68de748SJulio Merino }
229c68de748SJulio Merino 
230c68de748SJulio Merino void
231c68de748SJulio Merino two_domains_forwardptr()
232c68de748SJulio Merino {
233c68de748SJulio Merino 	int ret;
234c68de748SJulio Merino 	struct packet p;
235c68de748SJulio Merino 	struct option_data *option;
236c68de748SJulio Merino 
237c68de748SJulio Merino 	char *data = "\007example\003org\xc0\x0d\006foobar\0";
238c68de748SJulio Merino 
239c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
240c68de748SJulio Merino 	option->len  = 22;
241c68de748SJulio Merino 	option->data = malloc(option->len);
242c68de748SJulio Merino 	memcpy(option->data, data, option->len);
243c68de748SJulio Merino 
244c68de748SJulio Merino 	ret = setjmp(env);
245c68de748SJulio Merino 	if (ret == 0)
246c68de748SJulio Merino 		expand_domain_search(&p);
247c68de748SJulio Merino 
248c68de748SJulio Merino 	if (ret != 1)
249c68de748SJulio Merino 		abort();
250c68de748SJulio Merino 
251c68de748SJulio Merino 	free(option->data);
252c68de748SJulio Merino }
253c68de748SJulio Merino 
254c68de748SJulio Merino void
255c68de748SJulio Merino two_domains_truncatedptr()
256c68de748SJulio Merino {
257c68de748SJulio Merino 	int ret;
258c68de748SJulio Merino 	struct packet p;
259c68de748SJulio Merino 	struct option_data *option;
260c68de748SJulio Merino 
261c68de748SJulio Merino 	char *data = "\007example\003org\0\006foobar\xc0";
262c68de748SJulio Merino 
263c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
264c68de748SJulio Merino 	option->len  = 21;
265c68de748SJulio Merino 	option->data = malloc(option->len);
266c68de748SJulio Merino 	memcpy(option->data, data, option->len);
267c68de748SJulio Merino 
268c68de748SJulio Merino 	ret = setjmp(env);
269c68de748SJulio Merino 	if (ret == 0)
270c68de748SJulio Merino 		expand_domain_search(&p);
271c68de748SJulio Merino 
272c68de748SJulio Merino 	if (ret != 1)
273c68de748SJulio Merino 		abort();
274c68de748SJulio Merino 
275c68de748SJulio Merino 	free(option->data);
276c68de748SJulio Merino }
277c68de748SJulio Merino 
278c68de748SJulio Merino void
279c68de748SJulio Merino multiple_domains_valid()
280c68de748SJulio Merino {
281c68de748SJulio Merino 	int ret;
282c68de748SJulio Merino 	struct packet p;
283c68de748SJulio Merino 	struct option_data *option;
284c68de748SJulio Merino 
285c68de748SJulio Merino 	char *data =
286c68de748SJulio Merino 	    "\007example\003org\0\002cl\006foobar\003com\0\002fr\xc0\x10";
287c68de748SJulio Merino 
288c68de748SJulio Merino 	char *expected = "example.org. cl.foobar.com. fr.foobar.com.";
289c68de748SJulio Merino 
290c68de748SJulio Merino 	option = &p.options[DHO_DOMAIN_SEARCH];
291c68de748SJulio Merino 	option->len  = 33;
292c68de748SJulio Merino 	option->data = malloc(option->len);
293c68de748SJulio Merino 	memcpy(option->data, data, option->len);
294c68de748SJulio Merino 
295c68de748SJulio Merino 	ret = setjmp(env);
296c68de748SJulio Merino 	if (ret == 0)
297c68de748SJulio Merino 		expand_domain_search(&p);
298c68de748SJulio Merino 
299c68de748SJulio Merino 	if (option->len != strlen(expected) ||
300c68de748SJulio Merino 	    strcmp(option->data, expected) != 0)
301c68de748SJulio Merino 		abort();
302c68de748SJulio Merino 
303c68de748SJulio Merino 	free(option->data);
304c68de748SJulio Merino }
305c68de748SJulio Merino 
306*c210cac0SAlex Bahm static
307*c210cac0SAlex Bahm void
308*c210cac0SAlex Bahm parse_date_helper(const char *string, time_t timestamp)
309*c210cac0SAlex Bahm {
310*c210cac0SAlex Bahm 	int ret = 0;
311*c210cac0SAlex Bahm 	FILE *file = NULL;
312*c210cac0SAlex Bahm 	time_t ts;
313*c210cac0SAlex Bahm 
314*c210cac0SAlex Bahm 	file = fopen("/tmp/dhclient.test", "w");
315*c210cac0SAlex Bahm 	if (!file)
316*c210cac0SAlex Bahm 		abort();
317*c210cac0SAlex Bahm 
318*c210cac0SAlex Bahm 	ret = fwrite(string, strlen(string), 1, file);
319*c210cac0SAlex Bahm 	if (ret <= 0)
320*c210cac0SAlex Bahm 		abort();
321*c210cac0SAlex Bahm 
322*c210cac0SAlex Bahm 	fclose(file);
323*c210cac0SAlex Bahm 
324*c210cac0SAlex Bahm 	file = fopen("/tmp/dhclient.test", "r");
325*c210cac0SAlex Bahm 	if (!file)
326*c210cac0SAlex Bahm 		abort();
327*c210cac0SAlex Bahm 
328*c210cac0SAlex Bahm 	new_parse("test");
329*c210cac0SAlex Bahm 	ts = parse_date(file);
330*c210cac0SAlex Bahm 	if (ts != timestamp)
331*c210cac0SAlex Bahm 		abort();
332*c210cac0SAlex Bahm 
333*c210cac0SAlex Bahm 	fclose(file);
334*c210cac0SAlex Bahm }
335*c210cac0SAlex Bahm 
336*c210cac0SAlex Bahm void
337*c210cac0SAlex Bahm parse_date_valid(void)
338*c210cac0SAlex Bahm {
339*c210cac0SAlex Bahm 	int ret;
340*c210cac0SAlex Bahm 
341*c210cac0SAlex Bahm 	ret = setjmp(env);
342*c210cac0SAlex Bahm 	if (ret != 0)
343*c210cac0SAlex Bahm 		abort();
344*c210cac0SAlex Bahm 
345*c210cac0SAlex Bahm 	parse_date_helper(" 2 2024/7/2 20:25:50;\n", 1719951950);
346*c210cac0SAlex Bahm 	parse_date_helper(" 1 2091/7/2 20:25:50;\n", 3834246350);
347*c210cac0SAlex Bahm }
348*c210cac0SAlex Bahm 
349c68de748SJulio Merino int
350c68de748SJulio Merino main(int argc, char *argv[])
351c68de748SJulio Merino {
352c68de748SJulio Merino 
353c68de748SJulio Merino 	no_option_present();
354c68de748SJulio Merino 
355c68de748SJulio Merino 	one_domain_valid();
356c68de748SJulio Merino 	one_domain_truncated1();
357c68de748SJulio Merino 	one_domain_truncated2();
358c68de748SJulio Merino 
359c68de748SJulio Merino 	two_domains_valid();
360c68de748SJulio Merino 	two_domains_truncated1();
361c68de748SJulio Merino 	two_domains_truncated2();
362c68de748SJulio Merino 
363c68de748SJulio Merino 	two_domains_compressed();
364c68de748SJulio Merino 	two_domains_infloop();
365c68de748SJulio Merino 	two_domains_forwardptr();
366c68de748SJulio Merino 	two_domains_truncatedptr();
367c68de748SJulio Merino 
368c68de748SJulio Merino 	multiple_domains_valid();
369c68de748SJulio Merino 
370*c210cac0SAlex Bahm 	parse_date_valid();
371*c210cac0SAlex Bahm 
372c68de748SJulio Merino 	return (0);
373c68de748SJulio Merino }
374