File: network.c

package info (click to toggle)
openafs 1.8.14-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 42,972 kB
  • sloc: ansic: 455,934; xml: 66,858; perl: 11,967; makefile: 10,038; sh: 7,955; objc: 6,354; java: 5,638; cpp: 2,268; asm: 1,214; yacc: 441; tcl: 249; lex: 201; csh: 85
file content (104 lines) | stat: -rw-r--r-- 2,369 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <afsconfig.h>
#include <afs/param.h>

#include <roken.h>

#include <afs/cellconfig.h>
#include <rx/rx.h>

#include <tests/tap/basic.h>
#include "common.h"

/*!
 * Check if the current machine's hostname resolves to the loopback
 * network.
 */
int
afstest_IsLoopbackNetworkDefault(void)
{
    char hostname[MAXHOSTCHARS];
    afs_uint32 addr;
    struct hostent *host;

    gethostname(hostname, sizeof(hostname));
    host = gethostbyname(hostname);
    if (!host) {
	skip_all("Can't resolve hostname %s\n", hostname);
    }
    memcpy(&addr, host->h_addr, sizeof(addr));

    return(rx_IsLoopbackAddr(ntohl(addr)));
}

/*!
 * Skips all TAP tests if the current machine's hostname resolves to the
 * loopback network.
 */
int
afstest_SkipTestsIfLoopbackNetIsDefault(void)
{
    int retval;

    retval = afstest_IsLoopbackNetworkDefault();
    if (retval == 1) {
	skip_all("Default IP address is on the loopback network!\n");
    }
    return retval;
}

/*!
 * Skips all TAP tests if the current machine's hostname can't be resolved
 * to any IP address.
 */
void
afstest_SkipTestsIfBadHostname(void)
{
    char hostname[MAXHOSTCHARS];
    struct hostent *host;

    gethostname(hostname, sizeof(hostname));
    host = gethostbyname(hostname);
    if (!host)
	skip_all("Can't resolve hostname %s\n", hostname);
}

/*!
 * Skips all TAP tests if a server is already running on this system.
 *
 * \param name[in]  IANA service name, e.g. "afs3-vlserver"
 */
void
afstest_SkipTestsIfServerRunning(char *name)
{
    afs_int32 code;
    osi_socket sock;
    struct sockaddr_in addr;
    afs_int32 service;

    service = afsconf_FindService(name);
    if (service == -1) {
	fprintf(stderr, "Unknown service name: %s\n", name);
	exit(1);
    }
    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock == OSI_NULLSOCKET) {
	fprintf(stderr, "Failed to get socket file descriptor.\n");
	exit(1);
    }
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = service; /* Already in network byte order. */
#ifdef STRUCT_SOCKADDR_HAS_SA_LEN
    addr.sin_len = sizeof(addr);
#endif
    code = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
    if (code < 0) {
	if (errno == EADDRINUSE) {
	    skip_all("Service %s is already running.\n", name);
	} else {
	    perror("bind");
	    exit(1);
	}
    }
    close(sock);
}