afs.h: fix out of tree build failures
[openafs.git] / tests / common / network.c
1 #include <afsconfig.h>
2 #include <afs/param.h>
3
4 #include <roken.h>
5
6 #include <afs/cellconfig.h>
7 #include <rx/rx.h>
8
9 #include <tests/tap/basic.h>
10 #include "common.h"
11
12 static afs_uint32
13 gethostaddr(void)
14 {
15     char hostname[256];
16     struct hostent *host;
17     static afs_uint32 addr = 0;
18
19     if (addr != 0) {
20         return addr;
21     }
22
23     memset(hostname, 0, sizeof(hostname));
24
25     gethostname(hostname, sizeof(hostname));
26     host = gethostbyname(hostname);
27     if (host == NULL) {
28         diag("gethostbyname(%s) error: %d", hostname, h_errno);
29         return 0;
30     }
31
32     memcpy(&addr, host->h_addr, sizeof(addr));
33     return addr;
34 }
35
36 /*!
37  * Check if the current machine's hostname resolves to the loopback
38  * network.
39  */
40 int
41 afstest_IsLoopbackNetworkDefault(void)
42 {
43     afs_uint32 addr = gethostaddr();
44     if (addr == 0) {
45         skip_all("Can't resolve hostname");
46     }
47
48     return(rx_IsLoopbackAddr(ntohl(addr)));
49 }
50
51 /*!
52  * Skips all TAP tests if the current machine's hostname resolves to the
53  * loopback network.
54  */
55 int
56 afstest_SkipTestsIfLoopbackNetIsDefault(void)
57 {
58     int retval;
59
60     retval = afstest_IsLoopbackNetworkDefault();
61     if (retval == 1) {
62         skip_all("Default IP address is on the loopback network!\n");
63     }
64     return retval;
65 }
66
67 /*!
68  * Skips all TAP tests if the current machine's hostname can't be resolved
69  * to any IP address.
70  */
71 void
72 afstest_SkipTestsIfBadHostname(void)
73 {
74     if (gethostaddr() == 0)
75         skip_all("Can't resolve hostname");
76 }
77
78 /*!
79  * Skips all TAP tests if a server is already running on this system.
80  *
81  * \param name[in]  IANA service name, e.g. "afs3-vlserver"
82  */
83 void
84 afstest_SkipTestsIfServerRunning(char *name)
85 {
86     afs_int32 code;
87     osi_socket sock;
88     struct sockaddr_in addr;
89     afs_int32 service;
90
91     service = afsconf_FindService(name);
92     if (service == -1) {
93         fprintf(stderr, "Unknown service name: %s\n", name);
94         exit(1);
95     }
96     sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
97     if (sock == OSI_NULLSOCKET) {
98         fprintf(stderr, "Failed to get socket file descriptor.\n");
99         exit(1);
100     }
101     addr.sin_family = AF_INET;
102     addr.sin_addr.s_addr = htonl(INADDR_ANY);
103     addr.sin_port = service; /* Already in network byte order. */
104 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
105     addr.sin_len = sizeof(addr);
106 #endif
107     code = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
108     if (code < 0) {
109         if (errno == EADDRINUSE) {
110             skip_all("Service %s is already running.\n", name);
111         } else {
112             perror("bind");
113             exit(1);
114         }
115     }
116     close(sock);
117 }
118
119 /*!
120  * Get the IP address of the local machine, for use with mock CellServDBs, etc.
121  *
122  * @return ipv4 address in net-byte order
123  */
124 afs_uint32
125 afstest_MyHostAddr(void)
126 {
127     afs_uint32 addr = gethostaddr();
128     if (addr == 0) {
129         bail("cannot resolve hostname");
130     }
131     return addr;
132 }