blob: 9a0d3c615c9ee9f6dc73af1a62fe6c777ebe7269 (
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
|
#include <sys/types.h>
#include <sys/stat.h>
#include "str.h"
#include "ip4.h"
#include "ip6.h"
#include "byte.h"
#include "okclient.h"
static char fn[3 + IP6_FMT];
int okclient(char ip[16])
{
struct stat st;
int i;
char sep;
fn[0] = 'i';
fn[1] = 'p';
fn[2] = '/';
if (byte_equal(ip,12,V4mappedprefix)) {
fn[3 + ip4_fmt(fn + 3,ip+12)] = 0;
sep='.';
} else {
fn[3 + ip6_fmt(fn + 3,ip)] = 0;
sep=':';
}
for (;;) {
if (!fn[3]) return 0;
if (stat(fn,&st) == 0) return 1;
/* treat temporary error as rejection */
i = str_rchr(fn,sep);
if (!fn[i]) return 0;
fn[i] = 0;
}
}
|