1228259Sdumbbell/* $FreeBSD$ */
2228259Sdumbbell
3228259Sdumbbell#include <setjmp.h>
4228259Sdumbbell#include <stdlib.h>
5228259Sdumbbell
6228259Sdumbbell#include "dhcpd.h"
7228259Sdumbbell
8228259Sdumbbelljmp_buf env;
9228259Sdumbbell
10228259Sdumbbellvoid	expand_domain_search(struct packet *packet);
11228259Sdumbbell
12228259Sdumbbellvoid
13228259Sdumbbellno_option_present()
14228259Sdumbbell{
15228259Sdumbbell	int ret;
16228259Sdumbbell	struct option_data option;
17228259Sdumbbell	struct packet p;
18228259Sdumbbell
19228259Sdumbbell	option.data = NULL;
20228259Sdumbbell	option.len  = 0;
21228259Sdumbbell	p.options[DHO_DOMAIN_SEARCH] = option;
22228259Sdumbbell
23228259Sdumbbell	ret = setjmp(env);
24228259Sdumbbell	if (ret == 0)
25228259Sdumbbell		expand_domain_search(&p);
26228259Sdumbbell
27228259Sdumbbell	if (p.options[DHO_DOMAIN_SEARCH].len != 0 ||
28228259Sdumbbell	    p.options[DHO_DOMAIN_SEARCH].data != NULL)
29228259Sdumbbell		abort();
30228259Sdumbbell}
31228259Sdumbbell
32228259Sdumbbellvoid
33228259Sdumbbellone_domain_valid()
34228259Sdumbbell{
35228259Sdumbbell	int ret;
36228259Sdumbbell	struct packet p;
37228259Sdumbbell	struct option_data *option;
38228259Sdumbbell
39228259Sdumbbell	char *data     = "\007example\003org\0";
40228259Sdumbbell	char *expected = "example.org.";
41228259Sdumbbell
42228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
43228259Sdumbbell	option->len  = 13;
44228259Sdumbbell	option->data = malloc(option->len);
45228259Sdumbbell	memcpy(option->data, data, option->len);
46228259Sdumbbell
47228259Sdumbbell	ret = setjmp(env);
48228259Sdumbbell	if (ret == 0)
49228259Sdumbbell		expand_domain_search(&p);
50228259Sdumbbell
51228259Sdumbbell	if (option->len != strlen(expected) ||
52228259Sdumbbell	    strcmp(option->data, expected) != 0)
53228259Sdumbbell		abort();
54228259Sdumbbell
55228259Sdumbbell	free(option->data);
56228259Sdumbbell}
57228259Sdumbbell
58228259Sdumbbellvoid
59228259Sdumbbellone_domain_truncated1()
60228259Sdumbbell{
61228259Sdumbbell	int ret;
62228259Sdumbbell	struct option_data *option;
63228259Sdumbbell	struct packet p;
64228259Sdumbbell
65228259Sdumbbell	char *data = "\007example\003org";
66228259Sdumbbell
67228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
68228259Sdumbbell	option->len  = 12;
69228259Sdumbbell	option->data = malloc(option->len);
70228259Sdumbbell	memcpy(option->data, data, option->len);
71228259Sdumbbell
72228259Sdumbbell	ret = setjmp(env);
73228259Sdumbbell	if (ret == 0)
74228259Sdumbbell		expand_domain_search(&p);
75228259Sdumbbell
76228259Sdumbbell	if (ret != 1)
77228259Sdumbbell		abort();
78228259Sdumbbell
79228259Sdumbbell	free(option->data);
80228259Sdumbbell}
81228259Sdumbbell
82228259Sdumbbellvoid
83228259Sdumbbellone_domain_truncated2()
84228259Sdumbbell{
85228259Sdumbbell	int ret;
86228259Sdumbbell	struct option_data *option;
87228259Sdumbbell	struct packet p;
88228259Sdumbbell
89228259Sdumbbell	char *data = "\007ex";
90228259Sdumbbell
91228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
92228259Sdumbbell	option->len  = 3;
93228259Sdumbbell	option->data = malloc(option->len);
94228259Sdumbbell	memcpy(option->data, data, option->len);
95228259Sdumbbell
96228259Sdumbbell	ret = setjmp(env);
97228259Sdumbbell	if (ret == 0)
98228259Sdumbbell		expand_domain_search(&p);
99228259Sdumbbell
100228259Sdumbbell	if (ret != 1)
101228259Sdumbbell		abort();
102228259Sdumbbell
103228259Sdumbbell	free(option->data);
104228259Sdumbbell}
105228259Sdumbbell
106228259Sdumbbellvoid
107228259Sdumbbelltwo_domains_valid()
108228259Sdumbbell{
109228259Sdumbbell	int ret;
110228259Sdumbbell	struct packet p;
111228259Sdumbbell	struct option_data *option;
112228259Sdumbbell
113228259Sdumbbell	char *data     = "\007example\003org\0\007example\003com\0";
114228259Sdumbbell	char *expected = "example.org. example.com.";
115228259Sdumbbell
116228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
117228259Sdumbbell	option->len  = 26;
118228259Sdumbbell	option->data = malloc(option->len);
119228259Sdumbbell	memcpy(option->data, data, option->len);
120228259Sdumbbell
121228259Sdumbbell	ret = setjmp(env);
122228259Sdumbbell	if (ret == 0)
123228259Sdumbbell		expand_domain_search(&p);
124228259Sdumbbell
125228259Sdumbbell	if (option->len != strlen(expected) ||
126228259Sdumbbell	    strcmp(option->data, expected) != 0)
127228259Sdumbbell		abort();
128228259Sdumbbell
129228259Sdumbbell	free(option->data);
130228259Sdumbbell}
131228259Sdumbbell
132228259Sdumbbellvoid
133228259Sdumbbelltwo_domains_truncated1()
134228259Sdumbbell{
135228259Sdumbbell	int ret;
136228259Sdumbbell	struct option_data *option;
137228259Sdumbbell	struct packet p;
138228259Sdumbbell
139228259Sdumbbell	char *data = "\007example\003org\0\007example\003com";
140228259Sdumbbell
141228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
142228259Sdumbbell	option->len  = 25;
143228259Sdumbbell	option->data = malloc(option->len);
144228259Sdumbbell	memcpy(option->data, data, option->len);
145228259Sdumbbell
146228259Sdumbbell	ret = setjmp(env);
147228259Sdumbbell	if (ret == 0)
148228259Sdumbbell		expand_domain_search(&p);
149228259Sdumbbell
150228259Sdumbbell	if (ret != 1)
151228259Sdumbbell		abort();
152228259Sdumbbell
153228259Sdumbbell	free(option->data);
154228259Sdumbbell}
155228259Sdumbbell
156228259Sdumbbellvoid
157228259Sdumbbelltwo_domains_truncated2()
158228259Sdumbbell{
159228259Sdumbbell	int ret;
160228259Sdumbbell	struct option_data *option;
161228259Sdumbbell	struct packet p;
162228259Sdumbbell
163228259Sdumbbell	char *data = "\007example\003org\0\007ex";
164228259Sdumbbell
165228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
166228259Sdumbbell	option->len  = 16;
167228259Sdumbbell	option->data = malloc(option->len);
168228259Sdumbbell	memcpy(option->data, data, option->len);
169228259Sdumbbell
170228259Sdumbbell	ret = setjmp(env);
171228259Sdumbbell	if (ret == 0)
172228259Sdumbbell		expand_domain_search(&p);
173228259Sdumbbell
174228259Sdumbbell	if (ret != 1)
175228259Sdumbbell		abort();
176228259Sdumbbell
177228259Sdumbbell	free(option->data);
178228259Sdumbbell}
179228259Sdumbbell
180228259Sdumbbellvoid
181228259Sdumbbelltwo_domains_compressed()
182228259Sdumbbell{
183228259Sdumbbell	int ret;
184228259Sdumbbell	struct packet p;
185228259Sdumbbell	struct option_data *option;
186228259Sdumbbell
187228259Sdumbbell	char *data     = "\007example\003org\0\006foobar\xc0\x08";
188228259Sdumbbell	char *expected = "example.org. foobar.org.";
189228259Sdumbbell
190228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
191228259Sdumbbell	option->len  = 22;
192228259Sdumbbell	option->data = malloc(option->len);
193228259Sdumbbell	memcpy(option->data, data, option->len);
194228259Sdumbbell
195228259Sdumbbell	ret = setjmp(env);
196228259Sdumbbell	if (ret == 0)
197228259Sdumbbell		expand_domain_search(&p);
198228259Sdumbbell
199228259Sdumbbell	if (option->len != strlen(expected) ||
200228259Sdumbbell	    strcmp(option->data, expected) != 0)
201228259Sdumbbell		abort();
202228259Sdumbbell
203228259Sdumbbell	free(option->data);
204228259Sdumbbell}
205228259Sdumbbell
206228259Sdumbbellvoid
207228259Sdumbbelltwo_domains_infloop()
208228259Sdumbbell{
209228259Sdumbbell	int ret;
210228259Sdumbbell	struct packet p;
211228259Sdumbbell	struct option_data *option;
212228259Sdumbbell
213228259Sdumbbell	char *data = "\007example\003org\0\006foobar\xc0\x0d";
214228259Sdumbbell
215228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
216228259Sdumbbell	option->len  = 22;
217228259Sdumbbell	option->data = malloc(option->len);
218228259Sdumbbell	memcpy(option->data, data, option->len);
219228259Sdumbbell
220228259Sdumbbell	ret = setjmp(env);
221228259Sdumbbell	if (ret == 0)
222228259Sdumbbell		expand_domain_search(&p);
223228259Sdumbbell
224228259Sdumbbell	if (ret != 1)
225228259Sdumbbell		abort();
226228259Sdumbbell
227228259Sdumbbell	free(option->data);
228228259Sdumbbell}
229228259Sdumbbell
230228259Sdumbbellvoid
231228259Sdumbbelltwo_domains_forwardptr()
232228259Sdumbbell{
233228259Sdumbbell	int ret;
234228259Sdumbbell	struct packet p;
235228259Sdumbbell	struct option_data *option;
236228259Sdumbbell
237228259Sdumbbell	char *data = "\007example\003org\xc0\x0d\006foobar\0";
238228259Sdumbbell
239228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
240228259Sdumbbell	option->len  = 22;
241228259Sdumbbell	option->data = malloc(option->len);
242228259Sdumbbell	memcpy(option->data, data, option->len);
243228259Sdumbbell
244228259Sdumbbell	ret = setjmp(env);
245228259Sdumbbell	if (ret == 0)
246228259Sdumbbell		expand_domain_search(&p);
247228259Sdumbbell
248228259Sdumbbell	if (ret != 1)
249228259Sdumbbell		abort();
250228259Sdumbbell
251228259Sdumbbell	free(option->data);
252228259Sdumbbell}
253228259Sdumbbell
254228259Sdumbbellvoid
255228259Sdumbbelltwo_domains_truncatedptr()
256228259Sdumbbell{
257228259Sdumbbell	int ret;
258228259Sdumbbell	struct packet p;
259228259Sdumbbell	struct option_data *option;
260228259Sdumbbell
261228259Sdumbbell	char *data = "\007example\003org\0\006foobar\xc0";
262228259Sdumbbell
263228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
264228259Sdumbbell	option->len  = 21;
265228259Sdumbbell	option->data = malloc(option->len);
266228259Sdumbbell	memcpy(option->data, data, option->len);
267228259Sdumbbell
268228259Sdumbbell	ret = setjmp(env);
269228259Sdumbbell	if (ret == 0)
270228259Sdumbbell		expand_domain_search(&p);
271228259Sdumbbell
272228259Sdumbbell	if (ret != 1)
273228259Sdumbbell		abort();
274228259Sdumbbell
275228259Sdumbbell	free(option->data);
276228259Sdumbbell}
277228259Sdumbbell
278228259Sdumbbellvoid
279228259Sdumbbellmultiple_domains_valid()
280228259Sdumbbell{
281228259Sdumbbell	int ret;
282228259Sdumbbell	struct packet p;
283228259Sdumbbell	struct option_data *option;
284228259Sdumbbell
285228259Sdumbbell	char *data =
286228259Sdumbbell	    "\007example\003org\0\002cl\006foobar\003com\0\002fr\xc0\x10";
287228259Sdumbbell
288228259Sdumbbell	char *expected = "example.org. cl.foobar.com. fr.foobar.com.";
289228259Sdumbbell
290228259Sdumbbell	option = &p.options[DHO_DOMAIN_SEARCH];
291228259Sdumbbell	option->len  = 33;
292228259Sdumbbell	option->data = malloc(option->len);
293228259Sdumbbell	memcpy(option->data, data, option->len);
294228259Sdumbbell
295228259Sdumbbell	ret = setjmp(env);
296228259Sdumbbell	if (ret == 0)
297228259Sdumbbell		expand_domain_search(&p);
298228259Sdumbbell
299228259Sdumbbell	if (option->len != strlen(expected) ||
300228259Sdumbbell	    strcmp(option->data, expected) != 0)
301228259Sdumbbell		abort();
302228259Sdumbbell
303228259Sdumbbell	free(option->data);
304228259Sdumbbell}
305228259Sdumbbell
306228259Sdumbbellint
307228259Sdumbbellmain(int argc, char *argv[])
308228259Sdumbbell{
309228259Sdumbbell
310228259Sdumbbell	no_option_present();
311228259Sdumbbell
312228259Sdumbbell	one_domain_valid();
313228259Sdumbbell	one_domain_truncated1();
314228259Sdumbbell	one_domain_truncated2();
315228259Sdumbbell
316228259Sdumbbell	two_domains_valid();
317228259Sdumbbell	two_domains_truncated1();
318228259Sdumbbell	two_domains_truncated2();
319228259Sdumbbell
320228259Sdumbbell	two_domains_compressed();
321228259Sdumbbell	two_domains_infloop();
322228259Sdumbbell	two_domains_forwardptr();
323228259Sdumbbell	two_domains_truncatedptr();
324228259Sdumbbell
325228259Sdumbbell	multiple_domains_valid();
326228259Sdumbbell
327228259Sdumbbell	return (0);
328228259Sdumbbell}
329