unbreak shared library build

pull/7/head
Jeff Becker 6 years ago
parent 07b99e8ac4
commit b1eddbc70f

@ -211,6 +211,7 @@ set(LIB_SRC
llarp/crypto_async.cpp
llarp/crypto_libsodium.cpp
llarp/dht.cpp
llarp/dns.cpp
llarp/dnsc.cpp
llarp/dnsd.cpp
llarp/encode.cpp
@ -288,9 +289,9 @@ set(CLIENT_SRC
client/main.cpp
)
#set(LIB llarp)
#set(SHARED_LIB ${LIB})
#set(STATIC_LIB ${LIB}-static)
set(LIB lokinet)
set(SHARED_LIB ${LIB})
set(STATIC_LIB ${LIB}-static)
# TODO: exclude this from includes and expose stuff properly for rcutil
include_directories(llarp)
@ -305,7 +306,6 @@ if(SHADOW)
target_link_libraries(shadow-plugin-${SHARED_LIB} ${LIBS})
install(TARGETS shadow-plugin-${SHARED_LIB} DESTINATION plugins)
else()
add_executable(rcutil daemon/rcutil.cpp)
add_executable(${EXE} ${EXE_SRC})
add_executable(${CLIENT_EXE} ${CLIENT_SRC})
@ -370,37 +370,18 @@ else()
endif(WITH_STATIC)
if(WITH_SHARED)
add_library(${SHARED_LIB} SHARED ${LIB_SRC})
if(COMPILER_SUPPORTS_CXX11 AND NOT COMPILER_SUPPORTS_CXX17 OR ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" OR NOT HAVE_STD_FS)
add_library(backport SHARED ${CPP_BACKPORT_SRC})
endif(COMPILER_SUPPORTS_CXX11 AND NOT COMPILER_SUPPORTS_CXX17 OR ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" OR NOT HAVE_STD_FS)
add_library(llarpplatform SHARED ${LIB_PLATFORM_SRC})
if(COMPILER_SUPPORTS_CXX11 AND NOT COMPILER_SUPPORTS_CXX17 OR ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" OR NOT HAVE_STD_FS)
target_link_libraries(${SHARED_LIB} ${LIBS} backport llarpplatform)
if (MINGW)
target_link_libraries(${SHARED_LIB} ${LIBS} backport llarpplatform ws2_32 stdc++fs)
elseif(WIN32)
target_link_libraries(${SHARED_LIB} ${LIBS} backport llarpplatform ws2_32)
endif(MINGW)
else()
target_link_libraries(${SHARED_LIB} ${LIBS} llarpplatform)
if (MINGW)
target_link_libraries(${SHARED_LIB} ${LIBS} llarpplatform ws2_32 stdc++fs)
elseif(WIN32)
target_link_libraries(${SHARED_LIB} ${LIBS} llarpplatform ws2_32)
endif(MINGW)
set(LIB_SRC ${LIB_SRC} ${CPP_BACKPORT_SRC})
endif(COMPILER_SUPPORTS_CXX11 AND NOT COMPILER_SUPPORTS_CXX17 OR ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" OR NOT HAVE_STD_FS)
if(NOT WITH_STATIC)
if(COMPILER_SUPPORTS_CXX11 AND NOT COMPILER_SUPPORTS_CXX17 OR ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" OR NOT HAVE_STD_FS)
target_link_libraries(${EXE} ${SHARED_LIB} backport llarpplatform)
target_link_libraries(${CLIENT_EXE} ${SHARED_LIB} backport llarpplatform)
target_link_libraries(rcutil ${SHARED_LIB} backport llarpplatform)
else()
target_link_libraries(${EXE} ${SHARED_LIB} llarpplatform)
target_link_libraries(${CLIENT_EXE} ${SHARED_LIB} llarpplatform)
target_link_libraries(rcutil ${SHARED_LIB} llarpplatform)
endif(COMPILER_SUPPORTS_CXX11 AND NOT COMPILER_SUPPORTS_CXX17 OR ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" OR NOT HAVE_STD_FS)
target_link_libraries(dns ${SHARED_LIB} llarpplatform ${THREAD_LIB})
endif(NOT WITH_STATIC)
add_library(${SHARED_LIB} SHARED ${LIB_SRC} ${LIB_PLATFORM_SRC})
if (MINGW)
set(${LIBS} ${LIBS} ws2_32 stdc++fs)
elseif(WIN32)
set(${LIBS} ${LIBS} ws2_32)
endif(MINGW)
target_link_libraries(${SHARED_LIB} ${LIBS} ${THREAD_LIB})
target_link_libraries(${EXE} ${SHARED_LIB})
target_link_libraries(rcutil ${SHARED_LIB})
target_link_libraries(dns ${SHARED_LIB} ${THREAD_LIB})
endif(WITH_SHARED)
endif(SHADOW)

@ -86,6 +86,12 @@ testnet-build: testnet-configure
$(TESTNET_EXE): testnet-build
cp -f $(REPO)/llarpd $(TESTNET_EXE)
shared-configure: clean
cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DWITH_TESTS=ON -DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX) -DWITH_SHARED=ON
shared: shared-configure
ninja
testnet: $(TESTNET_EXE)
mkdir -p $(TESTNET_ROOT)
python3 contrib/testnet/genconf.py --bin=$(TESTNET_EXE) --svc=$(TESTNET_SERVERS) --clients=$(TESTNET_CLIENTS) --dir=$(TESTNET_ROOT) --out $(TESTNET_CONF)

@ -32,15 +32,7 @@ extern "C"
// bottom line is we can't use udp->user
// so we'll need to track all incoming and outgoing requests
struct dns_tracker
{
// uint c_responses;
uint c_requests;
std::map< uint, dnsc_answer_request * > client_request;
// FIXME: support multiple dns server contexts
dnsd_context *dnsd;
// std::map< uint, dnsd_question_request * > daemon_request;
};
struct dns_tracker;
// should we pass by llarp::Addr
// not as long as we're supporting raw

@ -22,9 +22,11 @@ namespace llarp
Tag(const std::string& str) : Tag()
{
#ifndef MIN
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
memcpy(data(), str.c_str(), MIN(16UL, str.size()));
#undef MIN
#endif
}
llarp::dht::Key_t

@ -2,187 +2,190 @@
#include "dnsd.hpp" // for llarp_handle_dnsd_recvfrom, dnsc
#include "logger.hpp"
uint16_t
get16bits(const char *&buffer) throw()
extern "C"
{
uint16_t value = static_cast< unsigned char >(buffer[0]);
value = value << 8;
value += static_cast< unsigned char >(buffer[1]);
buffer += 2;
return value;
}
// uint32_t
uint32_t
get32bits(const char *&buffer) throw()
{
uint32_t value = uint32_t(
(unsigned char)(buffer[0]) << 24 | (unsigned char)(buffer[1]) << 16
| (unsigned char)(buffer[2]) << 8 | (unsigned char)(buffer[3]));
buffer += 4;
return value;
}
dns_msg_header *
decode_hdr(const char *buffer)
{
dns_msg_header *hdr = new dns_msg_header;
hdr->id = get16bits(buffer);
uint fields = get16bits(buffer);
uint8_t lFields = (fields & 0x00FF) >> 0;
uint8_t hFields = (fields & 0xFF00) >> 8;
// hdr->qr = fields & 0x8000;
hdr->qr = (hFields >> 7) & 0x1;
hdr->opcode = fields & 0x7800;
hdr->aa = fields & 0x0400;
hdr->tc = fields & 0x0200;
hdr->rd = fields & 0x0100;
hdr->ra = (lFields >> 7) & 0x1;
// hdr->z = (lFields >> 6) & 0x1;
// hdr->ad = (lFields >> 5) & 0x1;
// hdr->cd = (lFields >> 4) & 0x1;
hdr->rcode = lFields & 0xf;
hdr->qdCount = get16bits(buffer);
hdr->anCount = get16bits(buffer);
hdr->nsCount = get16bits(buffer);
hdr->arCount = get16bits(buffer);
return hdr;
}
dns_msg_question *
decode_question(const char *buffer)
{
dns_msg_question *question = new dns_msg_question;
std::string m_qName = "";
int length = *buffer++;
// llarp::LogInfo("qNamLen", length);
while(length != 0)
uint16_t
get16bits(const char *&buffer) throw()
{
for(int i = 0; i < length; i++)
{
char c = *buffer++;
m_qName.append(1, c);
}
length = *buffer++;
if(length != 0)
m_qName.append(1, '.');
uint16_t value = static_cast< unsigned char >(buffer[0]);
value = value << 8;
value += static_cast< unsigned char >(buffer[1]);
buffer += 2;
return value;
}
question->name = m_qName;
question->type = get16bits(buffer);
question->qClass = get16bits(buffer);
return question;
}
dns_msg_answer *
decode_answer(const char *buffer)
{
dns_msg_answer *answer = new dns_msg_answer;
answer->type = get16bits(buffer);
// assert(answer->type < 259);
if(answer->type > 259)
// uint32_t
uint32_t
get32bits(const char *&buffer) throw()
{
llarp::LogWarn("Answer type is off the charts");
uint32_t value = uint32_t(
(unsigned char)(buffer[0]) << 24 | (unsigned char)(buffer[1]) << 16
| (unsigned char)(buffer[2]) << 8 | (unsigned char)(buffer[3]));
buffer += 4;
return value;
}
answer->aClass = get16bits(buffer);
answer->ttl = get32bits(buffer);
answer->rdLen = get16bits(buffer);
if(answer->rdLen == 4)
dns_msg_header *
decode_hdr(const char *buffer)
{
answer->rData = new uint8_t[answer->rdLen];
memcpy(answer->rData, buffer, answer->rdLen);
dns_msg_header *hdr = new dns_msg_header;
hdr->id = get16bits(buffer);
uint fields = get16bits(buffer);
uint8_t lFields = (fields & 0x00FF) >> 0;
uint8_t hFields = (fields & 0xFF00) >> 8;
// hdr->qr = fields & 0x8000;
hdr->qr = (hFields >> 7) & 0x1;
hdr->opcode = fields & 0x7800;
hdr->aa = fields & 0x0400;
hdr->tc = fields & 0x0200;
hdr->rd = fields & 0x0100;
hdr->ra = (lFields >> 7) & 0x1;
// hdr->z = (lFields >> 6) & 0x1;
// hdr->ad = (lFields >> 5) & 0x1;
// hdr->cd = (lFields >> 4) & 0x1;
hdr->rcode = lFields & 0xf;
hdr->qdCount = get16bits(buffer);
hdr->anCount = get16bits(buffer);
hdr->nsCount = get16bits(buffer);
hdr->arCount = get16bits(buffer);
return hdr;
}
else
dns_msg_question *
decode_question(const char *buffer)
{
llarp::LogWarn("Unknown Type ", answer->type);
dns_msg_question *question = new dns_msg_question;
std::string m_qName = "";
int length = *buffer++;
// llarp::LogInfo("qNamLen", length);
while(length != 0)
{
for(int i = 0; i < length; i++)
{
char c = *buffer++;
m_qName.append(1, c);
}
length = *buffer++;
if(length != 0)
m_qName.append(1, '.');
}
question->name = m_qName;
question->type = get16bits(buffer);
question->qClass = get16bits(buffer);
return question;
}
return answer;
}
void
put16bits(char *&buffer, uint16_t value) throw()
{
buffer[0] = (value & 0xFF00) >> 8;
buffer[1] = value & 0xFF;
buffer += 2;
}
void
put32bits(char *&buffer, uint32_t value) throw()
{
buffer[0] = (value & 0xFF000000) >> 24;
buffer[1] = (value & 0x00FF0000) >> 16;
buffer[2] = (value & 0x0000FF00) >> 8;
buffer[3] = (value & 0x000000FF) >> 0;
buffer += 4;
}
void
code_domain(char *&buffer, const std::string &domain) throw()
{
int start(0), end; // indexes
// llarp::LogInfo("domain [", domain, "]");
while((end = domain.find('.', start)) != std::string::npos)
dns_msg_answer *
decode_answer(const char *buffer)
{
*buffer++ = end - start; // label length octet
for(int i = start; i < end; i++)
dns_msg_answer *answer = new dns_msg_answer;
answer->type = get16bits(buffer);
// assert(answer->type < 259);
if(answer->type > 259)
{
*buffer++ = domain[i]; // label octets
// llarp::LogInfo("Writing ", domain[i], " at ", i);
llarp::LogWarn("Answer type is off the charts");
}
answer->aClass = get16bits(buffer);
answer->ttl = get32bits(buffer);
answer->rdLen = get16bits(buffer);
if(answer->rdLen == 4)
{
answer->rData = new uint8_t[answer->rdLen];
memcpy(answer->rData, buffer, answer->rdLen);
}
start = end + 1; // Skip '.'
else
{
llarp::LogWarn("Unknown Type ", answer->type);
}
return answer;
}
// llarp::LogInfo("start ", start, " domain size ", domain.size());
*buffer++ = domain.size() - start; // last label length octet
for(uint i = start; i < domain.size(); i++)
void
put16bits(char *&buffer, uint16_t value) throw()
{
*buffer++ = domain[i]; // last label octets
// llarp::LogInfo("Writing ", domain[i], " at ", i);
buffer[0] = (value & 0xFF00) >> 8;
buffer[1] = value & 0xFF;
buffer += 2;
}
*buffer++ = 0;
}
void
put32bits(char *&buffer, uint32_t value) throw()
{
buffer[0] = (value & 0xFF000000) >> 24;
buffer[1] = (value & 0x00FF0000) >> 16;
buffer[2] = (value & 0x0000FF00) >> 8;
buffer[3] = (value & 0x000000FF) >> 0;
buffer += 4;
}
void
llarp_handle_dns_recvfrom(struct llarp_udp_io *udp,
const struct sockaddr *saddr, const void *buf,
ssize_t sz)
{
unsigned char *castBuf = (unsigned char *)buf;
// auto buffer = llarp::StackBuffer< decltype(castBuf) >(castBuf);
dns_msg_header *hdr = decode_hdr((const char *)castBuf);
// castBuf += 12;
llarp::LogDebug("msg id ", hdr->id);
llarp::LogDebug("msg qr ", (uint8_t)hdr->qr);
if(hdr->qr)
void
code_domain(char *&buffer, const std::string &domain) throw()
{
llarp::LogDebug("handling as dnsc answer");
llarp_handle_dnsc_recvfrom(udp, saddr, buf, sz);
int start(0), end; // indexes
// llarp::LogInfo("domain [", domain, "]");
while((end = domain.find('.', start)) != std::string::npos)
{
*buffer++ = end - start; // label length octet
for(int i = start; i < end; i++)
{
*buffer++ = domain[i]; // label octets
// llarp::LogInfo("Writing ", domain[i], " at ", i);
}
start = end + 1; // Skip '.'
}
// llarp::LogInfo("start ", start, " domain size ", domain.size());
*buffer++ = domain.size() - start; // last label length octet
for(uint i = start; i < domain.size(); i++)
{
*buffer++ = domain[i]; // last label octets
// llarp::LogInfo("Writing ", domain[i], " at ", i);
}
*buffer++ = 0;
}
else
void
llarp_handle_dns_recvfrom(struct llarp_udp_io *udp,
const struct sockaddr *saddr, const void *buf,
ssize_t sz)
{
llarp::LogDebug("handling as dnsd question");
llarp_handle_dnsd_recvfrom(udp, saddr, buf, sz);
unsigned char *castBuf = (unsigned char *)buf;
// auto buffer = llarp::StackBuffer< decltype(castBuf) >(castBuf);
dns_msg_header *hdr = decode_hdr((const char *)castBuf);
// castBuf += 12;
llarp::LogDebug("msg id ", hdr->id);
llarp::LogDebug("msg qr ", (uint8_t)hdr->qr);
if(hdr->qr)
{
llarp::LogDebug("handling as dnsc answer");
llarp_handle_dnsc_recvfrom(udp, saddr, buf, sz);
}
else
{
llarp::LogDebug("handling as dnsd question");
llarp_handle_dnsd_recvfrom(udp, saddr, buf, sz);
}
/*
llarp::LogInfo("msg op ", hdr->opcode);
llarp::LogInfo("msg rc ", hdr->rcode);
for(uint i = 0; i < hdr->qdCount; i++)
{
dns_msg_question *question = decode_question((const char*)castBuf);
llarp::LogInfo("Read a question");
castBuf += question->name.length() + 8;
}
for(uint i = 0; i < hdr->anCount; i++)
{
dns_msg_answer *answer = decode_answer((const char*)castBuf);
llarp::LogInfo("Read an answer");
castBuf += answer->name.length() + 4 + 4 + 4 + answer->rdLen;
}
*/
}
/*
llarp::LogInfo("msg op ", hdr->opcode);
llarp::LogInfo("msg rc ", hdr->rcode);
for(uint i = 0; i < hdr->qdCount; i++)
{
dns_msg_question *question = decode_question((const char*)castBuf);
llarp::LogInfo("Read a question");
castBuf += question->name.length() + 8;
}
for(uint i = 0; i < hdr->anCount; i++)
{
dns_msg_answer *answer = decode_answer((const char*)castBuf);
llarp::LogInfo("Read an answer");
castBuf += answer->name.length() + 4 + 4 + 4 + answer->rdLen;
}
*/
}
}

@ -1,9 +1,21 @@
#ifndef LIBLLARP_DNS_HPP
#define LIBLLARP_DNS_HPP
#include <llarp/dns.h>
#include <sys/types.h> // for uint & ssize_t
#include <map>
#include <string>
struct dns_tracker
{
// uint c_responses;
uint c_requests;
std::map< uint, dnsc_answer_request * > client_request;
// FIXME: support multiple dns server contexts
dnsd_context *dnsd;
// std::map< uint, dnsd_question_request * > daemon_request;
};
// protocol parsing/writing structures & functions
struct dns_msg_header
{
@ -43,33 +55,35 @@ struct dns_msg_answer
uint8_t *rData;
};
uint16_t
get16bits(const char *&buffer) throw();
uint32_t
get32bits(const char *&buffer) throw();
extern "C"
{
uint16_t
get16bits(const char *&buffer) throw();
dns_msg_header *
decode_hdr(const char *buffer);
uint32_t
get32bits(const char *&buffer) throw();
dns_msg_question *
decode_question(const char *buffer);
dns_msg_header *
decode_hdr(const char *buffer);
dns_msg_answer *
decode_answer(const char *buffer);
dns_msg_question *
decode_question(const char *buffer);
void
put16bits(char *&buffer, uint16_t value) throw();
dns_msg_answer *
decode_answer(const char *buffer);
void
put32bits(char *&buffer, uint32_t value) throw();
void
put16bits(char *&buffer, uint16_t value) throw();
void
code_domain(char *&buffer, const std::string &domain) throw();
void
put32bits(char *&buffer, uint32_t value) throw();
void
llarp_handle_dns_recvfrom(struct llarp_udp_io *udp,
const struct sockaddr *saddr, const void *buf,
ssize_t sz);
void
code_domain(char *&buffer, const std::string &domain) throw();
void
llarp_handle_dns_recvfrom(struct llarp_udp_io *udp,
const struct sockaddr *saddr, const void *buf,
ssize_t sz);
}
#endif

Loading…
Cancel
Save