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