1 /*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2  *
3  *  Data Differential YATL (i.e. libtest)  library
4  *
5  *  Copyright (C) 2012 Data Differential, http://datadifferential.com/
6  *
7  *  Redistribution and use in source and binary forms, with or without
8  *  modification, are permitted provided that the following conditions are
9  *  met:
10  *
11  *      * Redistributions of source code must retain the above copyright
12  *  notice, this list of conditions and the following disclaimer.
13  *
14  *      * Redistributions in binary form must reproduce the above
15  *  copyright notice, this list of conditions and the following disclaimer
16  *  in the documentation and/or other materials provided with the
17  *  distribution.
18  *
19  *      * The names of its contributors may not be used to endorse or
20  *  promote products derived from this software without specific prior
21  *  written permission.
22  *
23  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  *
35  */
36 
37 #include "libtest/yatlcon.h"
38 #include <libtest/common.h>
39 
40 #include <sys/types.h>
41 #include <sys/socket.h>
42 #include <netdb.h>
43 
44 namespace libtest {
45 
lookup(const char * host)46 bool lookup(const char* host)
47 {
48   bool success= false;
49   assert(host and host[0]);
50   if (host and host[0])
51   {
52     struct addrinfo *addrinfo= NULL;
53     struct addrinfo hints;
54     memset(&hints, 0, sizeof(hints));
55     hints.ai_socktype= SOCK_STREAM;
56     hints.ai_protocol= IPPROTO_TCP;
57 
58     int limit= 5;
59     while (--limit and success == false)
60     {
61       if (addrinfo)
62       {
63         freeaddrinfo(addrinfo);
64         addrinfo= NULL;
65       }
66 
67       int ret;
68       if ((ret= getaddrinfo(host, "echo", &hints, &addrinfo)) == 0)
69       {
70         success= true;
71         break;
72       }
73 
74       switch (ret)
75       {
76       case EAI_AGAIN:
77         continue;
78 
79       case EAI_NONAME:
80       default:
81         break;
82       }
83 
84       break;
85     }
86 
87     if (addrinfo)
88     {
89       freeaddrinfo(addrinfo);
90     }
91   }
92 
93   return success;
94 }
95 
96 
check_dns()97 bool check_dns()
98 {
99   if (valgrind_is_caller())
100   {
101     return false;
102   }
103 
104   if (lookup("exist.gearman.info") == false)
105   {
106     return false;
107   }
108 
109   if (lookup("does_not_exist.gearman.info")) // This should fail, if it passes,...
110   {
111     fatal_assert("Your service provider sucks and is providing bogus DNS. You might be in an airport.");
112   }
113 
114   return true;
115 }
116 
117 } // namespace libtest
118 
119