mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-28 07:18:30 +00:00
Add maxmind to redbean
This commit is contained in:
parent
af645fcbec
commit
c371db6663
11 changed files with 2457 additions and 2 deletions
182
third_party/maxmind/maxminddb.h
vendored
Normal file
182
third_party/maxmind/maxminddb.h
vendored
Normal file
|
@ -0,0 +1,182 @@
|
|||
#ifndef COSMOPOLITAN_THIRD_PARTY_MAXMIND_MAXMINDDB_H_
|
||||
#define COSMOPOLITAN_THIRD_PARTY_MAXMIND_MAXMINDDB_H_
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
|
||||
#define MMDB_MODE_MMAP 1
|
||||
#define MMDB_MODE_MASK 7
|
||||
|
||||
#define MMDB_DATA_TYPE_EXTENDED 0
|
||||
#define MMDB_DATA_TYPE_POINTER 1
|
||||
#define MMDB_DATA_TYPE_UTF8_STRING 2
|
||||
#define MMDB_DATA_TYPE_DOUBLE 3
|
||||
#define MMDB_DATA_TYPE_BYTES 4
|
||||
#define MMDB_DATA_TYPE_UINT16 5
|
||||
#define MMDB_DATA_TYPE_UINT32 6
|
||||
#define MMDB_DATA_TYPE_MAP 7
|
||||
#define MMDB_DATA_TYPE_INT32 8
|
||||
#define MMDB_DATA_TYPE_UINT64 9
|
||||
#define MMDB_DATA_TYPE_UINT128 10
|
||||
#define MMDB_DATA_TYPE_ARRAY 11
|
||||
#define MMDB_DATA_TYPE_CONTAINER 12
|
||||
#define MMDB_DATA_TYPE_END_MARKER 13
|
||||
#define MMDB_DATA_TYPE_BOOLEAN 14
|
||||
#define MMDB_DATA_TYPE_FLOAT 15
|
||||
|
||||
#define MMDB_RECORD_TYPE_SEARCH_NODE 0
|
||||
#define MMDB_RECORD_TYPE_EMPTY 1
|
||||
#define MMDB_RECORD_TYPE_DATA 2
|
||||
#define MMDB_RECORD_TYPE_INVALID 3
|
||||
|
||||
#define MMDB_SUCCESS 0
|
||||
#define MMDB_FILE_OPEN_ERROR 1
|
||||
#define MMDB_CORRUPT_SEARCH_TREE_ERROR 2
|
||||
#define MMDB_INVALID_METADATA_ERROR 3
|
||||
#define MMDB_IO_ERROR 4
|
||||
#define MMDB_OUT_OF_MEMORY_ERROR 5
|
||||
#define MMDB_UNKNOWN_DATABASE_FORMAT_ERROR 6
|
||||
#define MMDB_INVALID_DATA_ERROR 7
|
||||
#define MMDB_INVALID_LOOKUP_PATH_ERROR 8
|
||||
#define MMDB_LOOKUP_PATH_DOES_NOT_MATCH_DATA_ERROR 9
|
||||
#define MMDB_INVALID_NODE_NUMBER_ERROR 10
|
||||
#define MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR 11
|
||||
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
/* This is a pointer into the data section for a given IP address lookup */
|
||||
typedef struct MMDB_entry_s {
|
||||
const struct MMDB_s *mmdb;
|
||||
uint32_t offset;
|
||||
} MMDB_entry_s;
|
||||
|
||||
typedef struct MMDB_lookup_result_s {
|
||||
bool found_entry;
|
||||
MMDB_entry_s entry;
|
||||
uint16_t netmask;
|
||||
} MMDB_lookup_result_s;
|
||||
|
||||
typedef struct MMDB_entry_data_s {
|
||||
bool has_data;
|
||||
union {
|
||||
uint32_t pointer;
|
||||
const char *utf8_string;
|
||||
double double_value;
|
||||
const uint8_t *bytes;
|
||||
uint16_t uint16;
|
||||
uint32_t uint32;
|
||||
int32_t int32;
|
||||
uint64_t uint64;
|
||||
uint128_t uint128;
|
||||
bool boolean;
|
||||
float float_value;
|
||||
};
|
||||
/* This is a 0 if a given entry cannot be found. This can only happen
|
||||
* when a call to MMDB_(v)get_value() asks for hash keys or array
|
||||
* indices that don't exist. */
|
||||
uint32_t offset;
|
||||
/* This is the next entry in the data section, but it's really only
|
||||
* relevant for entries that part of a larger map or array
|
||||
* struct. There's no good reason for an end user to look at this
|
||||
* directly. */
|
||||
uint32_t offset_to_next;
|
||||
/* This is only valid for strings, utf8_strings or binary data */
|
||||
uint32_t data_size;
|
||||
/* This is an MMDB_DATA_TYPE_* constant */
|
||||
uint32_t type;
|
||||
} MMDB_entry_data_s;
|
||||
|
||||
/* This is the return type when someone asks for all the entry data in a map or
|
||||
* array */
|
||||
typedef struct MMDB_entry_data_list_s {
|
||||
MMDB_entry_data_s entry_data;
|
||||
struct MMDB_entry_data_list_s *next;
|
||||
void *pool;
|
||||
} MMDB_entry_data_list_s;
|
||||
|
||||
typedef struct MMDB_description_s {
|
||||
const char *language;
|
||||
const char *description;
|
||||
} MMDB_description_s;
|
||||
|
||||
/* WARNING: do not add new fields to this struct without bumping the SONAME.
|
||||
* The struct is allocated by the users of this library and increasing the
|
||||
* size will cause existing users to allocate too little space when the shared
|
||||
* library is upgraded */
|
||||
typedef struct MMDB_metadata_s {
|
||||
uint32_t node_count;
|
||||
uint16_t record_size;
|
||||
uint16_t ip_version;
|
||||
const char *database_type;
|
||||
struct {
|
||||
size_t count;
|
||||
const char **names;
|
||||
} languages;
|
||||
uint16_t binary_format_major_version;
|
||||
uint16_t binary_format_minor_version;
|
||||
uint64_t build_epoch;
|
||||
struct {
|
||||
size_t count;
|
||||
MMDB_description_s **descriptions;
|
||||
} description;
|
||||
/* See above warning before adding fields */
|
||||
} MMDB_metadata_s;
|
||||
|
||||
/* WARNING: do not add new fields to this struct without bumping the SONAME.
|
||||
* The struct is allocated by the users of this library and increasing the
|
||||
* size will cause existing users to allocate too little space when the shared
|
||||
* library is upgraded */
|
||||
typedef struct MMDB_ipv4_start_node_s {
|
||||
uint16_t netmask;
|
||||
uint32_t node_value;
|
||||
/* See above warning before adding fields */
|
||||
} MMDB_ipv4_start_node_s;
|
||||
|
||||
/* WARNING: do not add new fields to this struct without bumping the SONAME.
|
||||
* The struct is allocated by the users of this library and increasing the
|
||||
* size will cause existing users to allocate too little space when the shared
|
||||
* library is upgraded */
|
||||
typedef struct MMDB_s {
|
||||
uint32_t flags;
|
||||
const char *filename;
|
||||
ssize_t file_size;
|
||||
const uint8_t *file_content;
|
||||
const uint8_t *data_section;
|
||||
uint32_t data_section_size;
|
||||
const uint8_t *metadata_section;
|
||||
uint32_t metadata_section_size;
|
||||
uint16_t full_record_byte_size;
|
||||
uint16_t depth;
|
||||
MMDB_ipv4_start_node_s ipv4_start_node;
|
||||
MMDB_metadata_s metadata;
|
||||
/* See above warning before adding fields */
|
||||
} MMDB_s;
|
||||
|
||||
typedef struct MMDB_search_node_s {
|
||||
uint64_t left_record;
|
||||
uint64_t right_record;
|
||||
uint8_t left_record_type;
|
||||
uint8_t right_record_type;
|
||||
MMDB_entry_s left_record_entry;
|
||||
MMDB_entry_s right_record_entry;
|
||||
} MMDB_search_node_s;
|
||||
|
||||
void MMDB_close(MMDB_s *);
|
||||
int MMDB_open(const char *, uint32_t, MMDB_s *);
|
||||
MMDB_lookup_result_s MMDB_lookup(const MMDB_s *, uint32_t, int *);
|
||||
int MMDB_read_node(const MMDB_s *, uint32_t, MMDB_search_node_s *);
|
||||
int MMDB_get_value(MMDB_entry_s *, MMDB_entry_data_s *, ...);
|
||||
int MMDB_vget_value(MMDB_entry_s *, MMDB_entry_data_s *, va_list);
|
||||
int MMDB_aget_value(MMDB_entry_s *, MMDB_entry_data_s *, const char *const *);
|
||||
int MMDB_get_metadata_as_entry_data_list(const MMDB_s *,
|
||||
MMDB_entry_data_list_s **);
|
||||
int MMDB_get_entry_data_list(MMDB_entry_s *, MMDB_entry_data_list_s **);
|
||||
void MMDB_free_entry_data_list(MMDB_entry_data_list_s *);
|
||||
int MMDB_dump_entry_data_list(FILE *, MMDB_entry_data_list_s *, int);
|
||||
const char *MMDB_lib_version(void);
|
||||
const char *MMDB_strerror(int);
|
||||
const char *GetMetroName(int);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_THIRD_PARTY_MAXMIND_MAXMINDDB_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue