blob: 35cb0e0892c76788e6320163e600064f9538cfcd (
plain)
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
|
/* sockets.c. Rewriten by Andi Kleen. Subject to the GPL. */
/* philb 14/11/98: we now stash the socket file descriptor inside
the `aftype' structure rather than keeping it in a pile of separate
variables. This is necessary so that "ifconfig eth0 broadcast ..."
issues ioctls to the right socket for the address family in use;
picking one at random doesn't always work. */
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include "config.h"
#include "sockets.h"
#include "intl.h"
#include "util.h"
#include "net-support.h"
int skfd = -1; /* generic raw socket desc. */
int sockets_open(int family)
{
struct aftype **aft;
int sfd = -1;
static int force = -1;
if (force < 0) {
force = 0;
if (kernel_version() < KRELEASE(2, 1, 0))
force = 1;
if (access("/proc/net", R_OK))
force = 1;
}
for (aft = aftypes; *aft; aft++) {
struct aftype *af = *aft;
if (af->af == AF_UNSPEC)
continue;
if (family && family != af->af)
continue;
if (af->fd != -1) {
sfd = af->fd;
continue;
}
/* Check some /proc file first to not stress kmod */
if (!force && af->flag_file) {
if (access(af->flag_file, R_OK))
continue;
}
sfd = socket(af->af, SOCK_DGRAM, 0);
af->fd = sfd;
}
if (sfd < 0)
fprintf(stderr, _("No usable address families found.\n"));
return sfd;
}
|