1 #include "first.h" 2 3 #undef NDEBUG 4 #include <assert.h> 5 #include <stdlib.h> 6 #include <stdio.h> 7 8 #include "configfile-glue.c" 9 10 const struct { 11 const char *string; 12 const char *rmtstr; 13 int rmtfamily; 14 int expect; 15 } rmtmask[] = { 16 { "1.0.0.1/1", "1.0.0.1", AF_INET, 1 } 17 ,{ "254.254.254.254/1", "254.0.0.1", AF_INET, 1 } 18 ,{ "254.254.254.252/31", "254.254.254.253", AF_INET, 1 } 19 ,{ "254.254.254.253/31", "254.254.254.254", AF_INET, 0 } 20 ,{ "254.254.254.253/32", "254.254.254.254", AF_INET, 0 } 21 ,{ "254.254.254.254/32", "254.254.254.254", AF_INET, 1 } 22 #ifdef HAVE_IPV6 23 ,{ "2001::/3", "2001::1", AF_INET6, 1 } 24 ,{ "2f01::/5", "2701::1", AF_INET6, 0 } 25 ,{ "2f01::/32", "2f01::1", AF_INET6, 1 } 26 ,{ "2f01::/32", "2f02::1", AF_INET6, 0 } 27 ,{ "2001::1/127", "2001::1", AF_INET6, 1 } 28 ,{ "2001::1/127", "2001::2", AF_INET6, 0 } 29 ,{ "2001::2/128", "2001::2", AF_INET6, 1 } 30 ,{ "2001::2/128", "2001::3", AF_INET6, 0 } 31 ,{ "1.0.0.1/1", "::ffff:1.0.0.1", AF_INET6, 1 } 32 ,{ "254.254.254.254/1", "::ffff:254.0.0.1", AF_INET6, 1 } 33 ,{ "254.254.254.252/31", "::ffff:254.254.254.253", AF_INET6, 1 } 34 ,{ "254.254.254.253/31", "::ffff:254.254.254.254", AF_INET6, 0 } 35 ,{ "254.254.254.253/32", "::ffff:254.254.254.254", AF_INET6, 0 } 36 ,{ "254.254.254.254/32", "::ffff:254.254.254.254", AF_INET6, 1 } 37 ,{ "::ffff:1.0.0.1/97", "1.0.0.1", AF_INET, 1 } 38 ,{ "::ffff:254.254.254.254/97", "254.0.0.1", AF_INET, 1 } 39 ,{ "::ffff:254.254.254.252/127", "254.254.254.253", AF_INET, 1 } 40 ,{ "::ffff:254.254.254.253/127", "254.254.254.254", AF_INET, 0 } 41 ,{ "::ffff:254.254.254.253/128", "254.254.254.254", AF_INET, 0 } 42 ,{ "::ffff:254.254.254.254/128", "254.254.254.254", AF_INET, 1 } 43 #endif 44 }; 45 46 static void test_configfile_addrbuf_eq_remote_ip_mask (void) { 47 request_st r; 48 memset(&r, 0, sizeof(request_st)); 49 r.conf.errh = log_error_st_init(); 50 r.conf.errh->errorlog_fd = -1; /* (disable) */ 51 52 int i, m; 53 buffer * const s = buffer_init(); 54 char *slash; 55 sock_addr rmt; 56 57 for (i = 0; i < (int)(sizeof(rmtmask)/sizeof(rmtmask[0])); ++i) { 58 if (1 != sock_addr_inet_pton(&rmt, rmtmask[i].rmtstr, rmtmask[i].rmtfamily, 0)) exit(-1); /*(bad test)*/ 59 buffer_copy_string(s, rmtmask[i].string); 60 slash = strchr(s->ptr,'/'); assert(slash); 61 m = config_addrbuf_eq_remote_ip_mask(&r, s, slash, &rmt); 62 if (m != rmtmask[i].expect) { 63 fprintf(stderr, "failed assertion: %s %s %s\n", 64 rmtmask[i].string, 65 rmtmask[i].expect ? "==" : "!=", 66 rmtmask[i].rmtstr); 67 exit(-1); 68 } 69 } 70 71 buffer_free(s); 72 log_error_st_free(r.conf.errh); 73 } 74 75 int main (void) { 76 test_configfile_addrbuf_eq_remote_ip_mask(); 77 78 return 0; 79 } 80