File: okclient.c

package info (click to toggle)
dq 20230101-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,020 kB
  • sloc: ansic: 8,269; makefile: 363; sh: 176; python: 82
file content (50 lines) | stat: -rw-r--r-- 1,018 bytes parent folder | download | duplicates (5)
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;
}