chiark / gitweb /
Additional testing for addr.c and a consequent bug fix.
authorRichard Kettlewell <rjk@greenend.org.uk>
Sat, 26 Apr 2008 14:30:58 +0000 (15:30 +0100)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sat, 26 Apr 2008 14:30:58 +0000 (15:30 +0100)
lib/addr.c
lib/t-addr.c

index dd12a0774f055904035b9212050559d00bb29bbf..c0bc19098e4fd22437d1831016fdb04a1adbe41c 100644 (file)
@@ -105,7 +105,7 @@ int addrinfocmp(const struct addrinfo *a,
   if(a->ai_family != b->ai_family) return a->ai_family - b->ai_family;
   if(a->ai_socktype != b->ai_socktype) return a->ai_socktype - b->ai_socktype;
   if(a->ai_protocol != b->ai_protocol) return a->ai_protocol - b->ai_protocol;
-  switch(a->ai_protocol) {
+  switch(a->ai_family) {
   case PF_INET:
     ina = (const struct sockaddr_in *)a->ai_addr;
     inb = (const struct sockaddr_in *)b->ai_addr;
index 7d00f5e6aab2c6a5aba7773a7434147e6fe4b338..8b7314d091642e87eaa2e32f9a907c4e5ffffdee 100644 (file)
@@ -21,7 +21,7 @@
 
 void test_addr(void) {
   struct stringlist a;
-  const char *s[2];
+  const char *s[3];
   struct addrinfo *ai;
   char *name;
   const struct sockaddr_in *sin4;
@@ -39,8 +39,34 @@ void test_addr(void) {
     0
   };
 
+  struct sockaddr_in a1 = {
+    .sin_port = ntohs(25),
+    .sin_addr = { .s_addr = 0}
+  };
+  struct addrinfo p1 = {
+    .ai_family = PF_INET,
+    .ai_socktype = SOCK_STREAM,
+    .ai_protocol = IPPROTO_TCP,
+    .ai_addrlen = sizeof a1,
+    .ai_addr = (struct sockaddr *)&a1,
+  };
+
+  struct sockaddr_in a2 = {
+    .sin_port = ntohs(119),
+    .sin_addr = { .s_addr = htonl(0x7F000001) }
+  };
+  struct addrinfo p2 = {
+    .ai_family = PF_INET,
+    .ai_socktype = SOCK_STREAM,
+    .ai_protocol = IPPROTO_TCP,
+    .ai_addrlen = sizeof a2,
+    .ai_addr = (struct sockaddr *)&a2,
+  };
+
   printf("test_addr\n");
 
+  insist(addrinfocmp(&p1, &p2) < 0);
+
   a.n = 1;
   a.s = (char **)s;
   s[0] = "smtp";
@@ -55,6 +81,8 @@ void test_addr(void) {
   check_integer(sin4->sin_addr.s_addr, 0);
   check_integer(ntohs(sin4->sin_port), 25);
   check_string(name, "host * service smtp");
+  insist(addrinfocmp(ai, &p1) == 0);
+  insist(addrinfocmp(ai, &p2) < 0);
 
   a.n = 2;
   s[0] = "localhost";
@@ -70,6 +98,19 @@ void test_addr(void) {
   check_integer(ntohl(sin4->sin_addr.s_addr), 0x7F000001);
   check_integer(ntohs(sin4->sin_port), 119);
   check_string(name, "host localhost service nntp");
+  insist(addrinfocmp(ai, &p2) == 0);
+  insist(addrinfocmp(ai, &p1) > 0);
+
+  a.n = 2;
+  s[0] = "no.such.domain.really.i.mean.it.greenend.org.uk";
+  s[1] = "nntp";
+  insist(get_address(&a, &pref, &name) == 0);
+
+  a.n = 3;
+  s[0] = 0;
+  s[1] = 0;
+  s[2] = 0;
+  insist(get_address(&a, &pref, &name) == 0);
 
   memset(&s4, 0, sizeof s4);
   s4.sin_family = AF_INET;