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
|
#include <sys/types.h>
#include <sys/stat.h>
#include "str.h"
#include "byte.h"
#include "iptostr.h"
#include "okclient.h"
static char fn[4 + IPTOSTR_LEN];
int okclient(unsigned char *ip) {
struct stat st;
long long i;
char sep;
/* allow ::1/128 */
if (byte_isequal("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1", 16, ip)) return 1;
/* allow 127.0.0.0/8 */
if (byte_isequal("\0\0\0\0\0\0\0\0\0\0\377\377\177", 13, ip)) return 1;
if (byte_isequal("\0\0\0\0\0\0\0\0\0\0\377\377", 12, ip)) {
fn[0] = 'i';
fn[1] = 'p';
fn[2] = '4';
fn[3] = '/';
iptostrx(fn + 4, ip);
sep = '.';
}
else {
fn[0] = 'i';
fn[1] = 'p';
fn[2] = '6';
fn[3] = '/';
iptostrx(fn + 4, ip);
sep = ':';
}
for (;;) {
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;
}
return 0;
}
|