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