Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cellframe/cellframe-sdk
  • MIKA83/cellframe-sdk
2 results
Show changes
Commits on Source (6)
......@@ -5,11 +5,24 @@ project(maxminddb C)
add_definitions ("-D_GNU_SOURCE")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
file(GLOB maxminddb_src ${CMAKE_CURRENT_SOURCE_DIR} *.c)
file(GLOB maxminddb_h ${CMAKE_CURRENT_SOURCE_DIR} *.h)
file(GLOB maxminddb_src ${CMAKE_CURRENT_SOURCE_DIR}/*.c)
file(GLOB maxminddb_h ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
add_library(${PROJECT_NAME} STATIC ${maxminddb_src} ${maxminddb_h})
set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C)
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILER_LANGUAGE C)
target_include_directories(${PROJECT_NAME} INTERFACE .)
target_compile_options(${PROJECT_NAME} PRIVATE -Wno-sign-compare)
if (INSTALL_SDK)
set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${maxminddb_h}")
INSTALL(TARGETS ${PROJECT_NAME}
LIBRARY DESTINATION lib/modules/net/
ARCHIVE DESTINATION lib/modules/net/
PUBLIC_HEADER DESTINATION include/modules/net/maxminddb/
)
endif()
......@@ -220,6 +220,97 @@ LOCAL char *bytes_to_hex(uint8_t *bytes, uint32_t size);
#define FREE_AND_SET_NULL(p) { free((void *)(p)); (p) = NULL; }
int MMDB_open_memory(const char *const mem, ssize_t size, MMDB_s *const mmdb)
{
if (NULL == mem || size <= 0) {
return MMDB_OUT_OF_MEMORY_ERROR;
}
int status = MMDB_SUCCESS;
mmdb->file_content = NULL;
mmdb->data_section = NULL;
mmdb->metadata.database_type = NULL;
mmdb->metadata.languages.count = 0;
mmdb->metadata.languages.names = NULL;
mmdb->metadata.description.count = 0;
mmdb->filename = NULL;
mmdb->file_size = size;
mmdb->file_content = mem;
#ifdef _WIN32
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
#endif
uint32_t metadata_size = 0;
const uint8_t *metadata = find_metadata(mmdb->file_content, mmdb->file_size,
&metadata_size);
if (NULL == metadata) {
status = MMDB_INVALID_METADATA_ERROR;
goto cleanup;
}
mmdb->metadata_section = metadata;
mmdb->metadata_section_size = metadata_size;
status = read_metadata(mmdb);
if (MMDB_SUCCESS != status) {
goto cleanup;
}
if (mmdb->metadata.binary_format_major_version != 2) {
status = MMDB_UNKNOWN_DATABASE_FORMAT_ERROR;
goto cleanup;
}
uint32_t search_tree_size = mmdb->metadata.node_count *
mmdb->full_record_byte_size;
mmdb->data_section = mmdb->file_content + search_tree_size
+ MMDB_DATA_SECTION_SEPARATOR;
if (search_tree_size + MMDB_DATA_SECTION_SEPARATOR >
(uint32_t)mmdb->file_size) {
status = MMDB_INVALID_METADATA_ERROR;
goto cleanup;
}
mmdb->data_section_size = (uint32_t)mmdb->file_size - search_tree_size -
MMDB_DATA_SECTION_SEPARATOR;
// Although it is likely not possible to construct a database with valid
// valid metadata, as parsed above, and a data_section_size less than 3,
// we do this check as later we assume it is at least three when doing
// bound checks.
if (mmdb->data_section_size < 3) {
status = MMDB_INVALID_DATA_ERROR;
goto cleanup;
}
mmdb->metadata_section = metadata;
mmdb->ipv4_start_node.node_value = 0;
mmdb->ipv4_start_node.netmask = 0;
// We do this immediately as otherwise there is a race to set
// ipv4_start_node.node_value and ipv4_start_node.netmask.
if (mmdb->metadata.ip_version == 6) {
status = find_ipv4_start_node(mmdb);
if (status != MMDB_SUCCESS) {
goto cleanup;
}
}
cleanup:
if (MMDB_SUCCESS != status) {
int saved_errno = errno;
free_mmdb_struct(mmdb);
errno = saved_errno;
}
return status;
}
int MMDB_open(const char *const filename, uint32_t flags, MMDB_s *const mmdb)
{
int status = MMDB_SUCCESS;
......
......@@ -215,6 +215,9 @@ typedef struct MMDB_search_node_s {
extern int MMDB_open(const char *const filename, uint32_t flags,
MMDB_s *const mmdb);
extern int MMDB_open_memory(const char *const mem, ssize_t size, MMDB_s *const mmdb);
extern MMDB_lookup_result_s MMDB_lookup_string(const MMDB_s *const mmdb,
const char *const ipstr,
int *const gai_error,
......
Subproject commit 9c9e649fba12fe053f390a5d00ecf86b4b39fc29
Subproject commit 75d58d14098ac8730c35bb6b8a449568a505c5c1