Removed old attic files. Updated test checks
This commit is contained in:
@@ -1,7 +0,0 @@
|
||||
var http = require('http');
|
||||
var server = http.createServer(function (request, response) {
|
||||
response.writeHead(200, {"Content-Type": "text/plain"});
|
||||
response.end("\n\nWelcome to the machine!\n\n");
|
||||
});
|
||||
server.listen(80);
|
||||
console.log("Server running!");
|
||||
603
attic/ifaddrs.c
603
attic/ifaddrs.c
@@ -1,603 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2013, Kenneth MacKay
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "ifaddrs.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <net/if_arp.h>
|
||||
#include <netinet/in.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
#include "jni_utils.h"
|
||||
|
||||
typedef struct NetlinkList
|
||||
{
|
||||
struct NetlinkList *m_next;
|
||||
struct nlmsghdr *m_data;
|
||||
unsigned int m_size;
|
||||
} NetlinkList;
|
||||
|
||||
static int netlink_socket(void)
|
||||
{
|
||||
int l_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
|
||||
if(l_socket < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct sockaddr_nl l_addr;
|
||||
memset(&l_addr, 0, sizeof(l_addr));
|
||||
l_addr.nl_family = AF_NETLINK;
|
||||
if(bind(l_socket, (struct sockaddr *)&l_addr, sizeof(l_addr)) < 0)
|
||||
{
|
||||
close(l_socket);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return l_socket;
|
||||
}
|
||||
|
||||
static int netlink_send(int p_socket, int p_request)
|
||||
{
|
||||
char l_buffer[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))];
|
||||
memset(l_buffer, 0, sizeof(l_buffer));
|
||||
struct nlmsghdr *l_hdr = (struct nlmsghdr *)l_buffer;
|
||||
struct rtgenmsg *l_msg = (struct rtgenmsg *)NLMSG_DATA(l_hdr);
|
||||
|
||||
l_hdr->nlmsg_len = NLMSG_LENGTH(sizeof(*l_msg));
|
||||
l_hdr->nlmsg_type = p_request;
|
||||
l_hdr->nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
|
||||
l_hdr->nlmsg_pid = 0;
|
||||
l_hdr->nlmsg_seq = p_socket;
|
||||
l_msg->rtgen_family = AF_UNSPEC;
|
||||
|
||||
struct sockaddr_nl l_addr;
|
||||
memset(&l_addr, 0, sizeof(l_addr));
|
||||
l_addr.nl_family = AF_NETLINK;
|
||||
return (sendto(p_socket, l_hdr, l_hdr->nlmsg_len, 0, (struct sockaddr *)&l_addr, sizeof(l_addr)));
|
||||
}
|
||||
|
||||
static int netlink_recv(int p_socket, void *p_buffer, size_t p_len)
|
||||
{
|
||||
struct msghdr l_msg;
|
||||
struct iovec l_iov = { p_buffer, p_len };
|
||||
struct sockaddr_nl l_addr;
|
||||
int l_result;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
l_msg.msg_name = (void *)&l_addr;
|
||||
l_msg.msg_namelen = sizeof(l_addr);
|
||||
l_msg.msg_iov = &l_iov;
|
||||
l_msg.msg_iovlen = 1;
|
||||
l_msg.msg_control = NULL;
|
||||
l_msg.msg_controllen = 0;
|
||||
l_msg.msg_flags = 0;
|
||||
int l_result = recvmsg(p_socket, &l_msg, 0);
|
||||
|
||||
if(l_result < 0)
|
||||
{
|
||||
if(errno == EINTR)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
return -2;
|
||||
}
|
||||
|
||||
if(l_msg.msg_flags & MSG_TRUNC)
|
||||
{ // buffer was too small
|
||||
return -1;
|
||||
}
|
||||
return l_result;
|
||||
}
|
||||
}
|
||||
|
||||
static struct nlmsghdr *getNetlinkResponse(int p_socket, int *p_size, int *p_done)
|
||||
{
|
||||
size_t l_size = 4096;
|
||||
void *l_buffer = NULL;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
free(l_buffer);
|
||||
l_buffer = malloc(l_size);
|
||||
|
||||
int l_read = netlink_recv(p_socket, l_buffer, l_size);
|
||||
*p_size = l_read;
|
||||
if(l_read == -2)
|
||||
{
|
||||
free(l_buffer);
|
||||
return NULL;
|
||||
}
|
||||
if(l_read >= 0)
|
||||
{
|
||||
pid_t l_pid = getpid();
|
||||
struct nlmsghdr *l_hdr;
|
||||
for(l_hdr = (struct nlmsghdr *)l_buffer; NLMSG_OK(l_hdr, (unsigned int)l_read); l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read))
|
||||
{
|
||||
if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(l_hdr->nlmsg_type == NLMSG_DONE)
|
||||
{
|
||||
*p_done = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if(l_hdr->nlmsg_type == NLMSG_ERROR)
|
||||
{
|
||||
free(l_buffer);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return l_buffer;
|
||||
}
|
||||
|
||||
l_size *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
static NetlinkList *newListItem(struct nlmsghdr *p_data, unsigned int p_size)
|
||||
{
|
||||
NetlinkList *l_item = malloc(sizeof(NetlinkList));
|
||||
l_item->m_next = NULL;
|
||||
l_item->m_data = p_data;
|
||||
l_item->m_size = p_size;
|
||||
return l_item;
|
||||
}
|
||||
|
||||
static void freeResultList(NetlinkList *p_list)
|
||||
{
|
||||
NetlinkList *l_cur;
|
||||
while(p_list)
|
||||
{
|
||||
l_cur = p_list;
|
||||
p_list = p_list->m_next;
|
||||
free(l_cur->m_data);
|
||||
free(l_cur);
|
||||
}
|
||||
}
|
||||
|
||||
static NetlinkList *getResultList(int p_socket, int p_request)
|
||||
{
|
||||
if(netlink_send(p_socket, p_request) < 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NetlinkList *l_list = NULL;
|
||||
NetlinkList *l_end = NULL;
|
||||
int l_size;
|
||||
int l_done = 0;
|
||||
while(!l_done)
|
||||
{
|
||||
struct nlmsghdr *l_hdr = getNetlinkResponse(p_socket, &l_size, &l_done);
|
||||
if(!l_hdr)
|
||||
{ // error
|
||||
freeResultList(l_list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NetlinkList *l_item = newListItem(l_hdr, l_size);
|
||||
if(!l_list)
|
||||
{
|
||||
l_list = l_item;
|
||||
}
|
||||
else
|
||||
{
|
||||
l_end->m_next = l_item;
|
||||
}
|
||||
l_end = l_item;
|
||||
}
|
||||
return l_list;
|
||||
}
|
||||
|
||||
static size_t maxSize(size_t a, size_t b)
|
||||
{
|
||||
return (a > b ? a : b);
|
||||
}
|
||||
|
||||
static size_t calcAddrLen(sa_family_t p_family, int p_dataSize)
|
||||
{
|
||||
switch(p_family)
|
||||
{
|
||||
case AF_INET:
|
||||
return sizeof(struct sockaddr_in);
|
||||
case AF_INET6:
|
||||
return sizeof(struct sockaddr_in6);
|
||||
case AF_PACKET:
|
||||
return maxSize(sizeof(struct sockaddr_ll), offsetof(struct sockaddr_ll, sll_addr) + p_dataSize);
|
||||
default:
|
||||
return maxSize(sizeof(struct sockaddr), offsetof(struct sockaddr, sa_data) + p_dataSize);
|
||||
}
|
||||
}
|
||||
|
||||
static void makeSockaddr(sa_family_t p_family, struct sockaddr *p_dest, void *p_data, size_t p_size)
|
||||
{
|
||||
switch(p_family)
|
||||
{
|
||||
case AF_INET:
|
||||
memcpy(&((struct sockaddr_in*)p_dest)->sin_addr, p_data, p_size);
|
||||
break;
|
||||
case AF_INET6:
|
||||
memcpy(&((struct sockaddr_in6*)p_dest)->sin6_addr, p_data, p_size);
|
||||
break;
|
||||
case AF_PACKET:
|
||||
memcpy(((struct sockaddr_ll*)p_dest)->sll_addr, p_data, p_size);
|
||||
((struct sockaddr_ll*)p_dest)->sll_halen = p_size;
|
||||
break;
|
||||
default:
|
||||
memcpy(p_dest->sa_data, p_data, p_size);
|
||||
break;
|
||||
}
|
||||
p_dest->sa_family = p_family;
|
||||
}
|
||||
|
||||
static void addToEnd(struct ifaddrs **p_resultList, struct ifaddrs *p_entry)
|
||||
{
|
||||
if(!*p_resultList)
|
||||
{
|
||||
*p_resultList = p_entry;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct ifaddrs *l_cur = *p_resultList;
|
||||
while(l_cur->ifa_next)
|
||||
{
|
||||
l_cur = l_cur->ifa_next;
|
||||
}
|
||||
l_cur->ifa_next = p_entry;
|
||||
}
|
||||
}
|
||||
|
||||
static void interpretLink(struct nlmsghdr *p_hdr, struct ifaddrs **p_links, struct ifaddrs **p_resultList)
|
||||
{
|
||||
struct ifinfomsg *l_info = (struct ifinfomsg *)NLMSG_DATA(p_hdr);
|
||||
|
||||
size_t l_nameSize = 0;
|
||||
size_t l_addrSize = 0;
|
||||
size_t l_dataSize = 0;
|
||||
|
||||
size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg));
|
||||
struct rtattr *l_rta;
|
||||
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifinfomsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
|
||||
{
|
||||
void *l_rtaData = RTA_DATA(l_rta);
|
||||
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta);
|
||||
switch(l_rta->rta_type)
|
||||
{
|
||||
case IFLA_ADDRESS:
|
||||
case IFLA_BROADCAST:
|
||||
l_addrSize += NLMSG_ALIGN(calcAddrLen(AF_PACKET, l_rtaDataSize));
|
||||
break;
|
||||
case IFLA_IFNAME:
|
||||
l_nameSize += NLMSG_ALIGN(l_rtaSize + 1);
|
||||
break;
|
||||
case IFLA_STATS:
|
||||
l_dataSize += NLMSG_ALIGN(l_rtaSize);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
struct ifaddrs *l_entry = malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize + l_dataSize);
|
||||
memset(l_entry, 0, sizeof(struct ifaddrs));
|
||||
l_entry->ifa_name = "";
|
||||
|
||||
char *l_name = ((char *)l_entry) + sizeof(struct ifaddrs);
|
||||
char *l_addr = l_name + l_nameSize;
|
||||
char *l_data = l_addr + l_addrSize;
|
||||
|
||||
l_entry->ifa_flags = l_info->ifi_flags;
|
||||
|
||||
l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg));
|
||||
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifinfomsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
|
||||
{
|
||||
void *l_rtaData = RTA_DATA(l_rta);
|
||||
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta);
|
||||
switch(l_rta->rta_type)
|
||||
{
|
||||
case IFLA_ADDRESS:
|
||||
case IFLA_BROADCAST:
|
||||
{
|
||||
size_t l_addrLen = calcAddrLen(AF_PACKET, l_rtaDataSize);
|
||||
makeSockaddr(AF_PACKET, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize);
|
||||
((struct sockaddr_ll *)l_addr)->sll_ifindex = l_info->ifi_index;
|
||||
((struct sockaddr_ll *)l_addr)->sll_hatype = l_info->ifi_type;
|
||||
if(l_rta->rta_type == IFLA_ADDRESS)
|
||||
{
|
||||
l_entry->ifa_addr = (struct sockaddr *)l_addr;
|
||||
}
|
||||
else
|
||||
{
|
||||
l_entry->ifa_broadaddr = (struct sockaddr *)l_addr;
|
||||
}
|
||||
l_addr += NLMSG_ALIGN(l_addrLen);
|
||||
break;
|
||||
}
|
||||
case IFLA_IFNAME:
|
||||
strncpy(l_name, l_rtaData, l_rtaDataSize);
|
||||
l_name[l_rtaDataSize] = '\0';
|
||||
l_entry->ifa_name = l_name;
|
||||
break;
|
||||
case IFLA_STATS:
|
||||
memcpy(l_data, l_rtaData, l_rtaDataSize);
|
||||
l_entry->ifa_data = l_data;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
addToEnd(p_resultList, l_entry);
|
||||
p_links[l_info->ifi_index - 1] = l_entry;
|
||||
}
|
||||
|
||||
static void interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_links, struct ifaddrs **p_resultList)
|
||||
{
|
||||
struct ifaddrmsg *l_info = (struct ifaddrmsg *)NLMSG_DATA(p_hdr);
|
||||
|
||||
size_t l_nameSize = 0;
|
||||
size_t l_addrSize = 0;
|
||||
|
||||
int l_addedNetmask = 0;
|
||||
|
||||
size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg));
|
||||
struct rtattr *l_rta;
|
||||
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
|
||||
{
|
||||
void *l_rtaData = RTA_DATA(l_rta);
|
||||
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta);
|
||||
if(l_info->ifa_family == AF_PACKET)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(l_rta->rta_type)
|
||||
{
|
||||
case IFA_ADDRESS:
|
||||
case IFA_LOCAL:
|
||||
if((l_info->ifa_family == AF_INET || l_info->ifa_family == AF_INET6) && !l_addedNetmask)
|
||||
{ // make room for netmask
|
||||
l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize));
|
||||
l_addedNetmask = 1;
|
||||
}
|
||||
case IFA_BROADCAST:
|
||||
l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize));
|
||||
break;
|
||||
case IFA_LABEL:
|
||||
l_nameSize += NLMSG_ALIGN(l_rtaSize + 1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
struct ifaddrs *l_entry = malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize);
|
||||
memset(l_entry, 0, sizeof(struct ifaddrs));
|
||||
l_entry->ifa_name = p_links[l_info->ifa_index - 1]->ifa_name;
|
||||
|
||||
char *l_name = ((char *)l_entry) + sizeof(struct ifaddrs);
|
||||
char *l_addr = l_name + l_nameSize;
|
||||
|
||||
l_entry->ifa_flags = l_info->ifa_flags | p_links[l_info->ifa_index - 1]->ifa_flags;
|
||||
|
||||
l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg));
|
||||
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
|
||||
{
|
||||
void *l_rtaData = RTA_DATA(l_rta);
|
||||
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta);
|
||||
switch(l_rta->rta_type)
|
||||
{
|
||||
case IFA_ADDRESS:
|
||||
case IFA_BROADCAST:
|
||||
case IFA_LOCAL:
|
||||
{
|
||||
size_t l_addrLen = calcAddrLen(l_info->ifa_family, l_rtaDataSize);
|
||||
makeSockaddr(l_info->ifa_family, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize);
|
||||
if(l_info->ifa_family == AF_INET6)
|
||||
{
|
||||
if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)l_rtaData) || IN6_IS_ADDR_MC_LINKLOCAL((struct in6_addr *)l_rtaData))
|
||||
{
|
||||
((struct sockaddr_in6 *)l_addr)->sin6_scope_id = l_info->ifa_index;
|
||||
}
|
||||
}
|
||||
|
||||
if(l_rta->rta_type == IFA_ADDRESS)
|
||||
{ // apparently in a point-to-point network IFA_ADDRESS contains the dest address and IFA_LOCAL contains the local address
|
||||
if(l_entry->ifa_addr)
|
||||
{
|
||||
l_entry->ifa_dstaddr = (struct sockaddr *)l_addr;
|
||||
}
|
||||
else
|
||||
{
|
||||
l_entry->ifa_addr = (struct sockaddr *)l_addr;
|
||||
}
|
||||
}
|
||||
else if(l_rta->rta_type == IFA_LOCAL)
|
||||
{
|
||||
if(l_entry->ifa_addr)
|
||||
{
|
||||
l_entry->ifa_dstaddr = l_entry->ifa_addr;
|
||||
}
|
||||
l_entry->ifa_addr = (struct sockaddr *)l_addr;
|
||||
}
|
||||
else
|
||||
{
|
||||
l_entry->ifa_broadaddr = (struct sockaddr *)l_addr;
|
||||
}
|
||||
l_addr += NLMSG_ALIGN(l_addrLen);
|
||||
break;
|
||||
}
|
||||
case IFA_LABEL:
|
||||
strncpy(l_name, l_rtaData, l_rtaDataSize);
|
||||
l_name[l_rtaDataSize] = '\0';
|
||||
l_entry->ifa_name = l_name;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(l_entry->ifa_addr && (l_entry->ifa_addr->sa_family == AF_INET || l_entry->ifa_addr->sa_family == AF_INET6))
|
||||
{
|
||||
unsigned l_maxPrefix = (l_entry->ifa_addr->sa_family == AF_INET ? 32 : 128);
|
||||
unsigned l_prefix = (l_info->ifa_prefixlen > l_maxPrefix ? l_maxPrefix : l_info->ifa_prefixlen);
|
||||
char l_mask[16] = {0};
|
||||
unsigned i;
|
||||
for(i=0; i<(l_prefix/8); ++i)
|
||||
{
|
||||
l_mask[i] = 0xff;
|
||||
}
|
||||
l_mask[i] = 0xff << (8 - (l_prefix % 8));
|
||||
|
||||
makeSockaddr(l_entry->ifa_addr->sa_family, (struct sockaddr *)l_addr, l_mask, l_maxPrefix / 8);
|
||||
l_entry->ifa_netmask = (struct sockaddr *)l_addr;
|
||||
}
|
||||
|
||||
addToEnd(p_resultList, l_entry);
|
||||
}
|
||||
|
||||
static void interpret(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_links, struct ifaddrs **p_resultList)
|
||||
{
|
||||
pid_t l_pid = getpid();
|
||||
for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next)
|
||||
{
|
||||
unsigned int l_nlsize = p_netlinkList->m_size;
|
||||
struct nlmsghdr *l_hdr;
|
||||
for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize))
|
||||
{
|
||||
if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(l_hdr->nlmsg_type == NLMSG_DONE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if(l_hdr->nlmsg_type == RTM_NEWLINK)
|
||||
{
|
||||
interpretLink(l_hdr, p_links, p_resultList);
|
||||
}
|
||||
else if(l_hdr->nlmsg_type == RTM_NEWADDR)
|
||||
{
|
||||
interpretAddr(l_hdr, p_links, p_resultList);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned countLinks(int p_socket, NetlinkList *p_netlinkList)
|
||||
{
|
||||
unsigned l_links = 0;
|
||||
pid_t l_pid = getpid();
|
||||
for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next)
|
||||
{
|
||||
unsigned int l_nlsize = p_netlinkList->m_size;
|
||||
struct nlmsghdr *l_hdr;
|
||||
for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize))
|
||||
{
|
||||
if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(l_hdr->nlmsg_type == NLMSG_DONE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if(l_hdr->nlmsg_type == RTM_NEWLINK)
|
||||
{
|
||||
++l_links;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return l_links;
|
||||
}
|
||||
|
||||
int getifaddrs(struct ifaddrs **ifap)
|
||||
{
|
||||
LOGV("getifaddrs\n");
|
||||
if(!ifap)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
*ifap = NULL;
|
||||
|
||||
int l_socket = netlink_socket();
|
||||
if(l_socket < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
NetlinkList *l_linkResults = getResultList(l_socket, RTM_GETLINK);
|
||||
if(!l_linkResults)
|
||||
{
|
||||
close(l_socket);
|
||||
return -1;
|
||||
}
|
||||
|
||||
NetlinkList *l_addrResults = getResultList(l_socket, RTM_GETADDR);
|
||||
if(!l_addrResults)
|
||||
{
|
||||
close(l_socket);
|
||||
freeResultList(l_linkResults);
|
||||
return -1;
|
||||
}
|
||||
|
||||
unsigned l_numLinks = countLinks(l_socket, l_linkResults) + countLinks(l_socket, l_addrResults);
|
||||
struct ifaddrs *l_links[l_numLinks];
|
||||
memset(l_links, 0, l_numLinks * sizeof(struct ifaddrs *));
|
||||
|
||||
interpret(l_socket, l_linkResults, l_links, ifap);
|
||||
interpret(l_socket, l_addrResults, l_links, ifap);
|
||||
|
||||
freeResultList(l_linkResults);
|
||||
freeResultList(l_addrResults);
|
||||
close(l_socket);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void freeifaddrs(struct ifaddrs *ifa)
|
||||
{
|
||||
struct ifaddrs *l_cur;
|
||||
while(ifa)
|
||||
{
|
||||
l_cur = ifa;
|
||||
ifa = ifa->ifa_next;
|
||||
free(l_cur);
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1995, 1999
|
||||
* Berkeley Software Design, Inc. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp
|
||||
*/
|
||||
|
||||
#ifndef _IFADDRS_H_
|
||||
#define _IFADDRS_H_
|
||||
|
||||
struct ifaddrs {
|
||||
struct ifaddrs *ifa_next;
|
||||
char *ifa_name;
|
||||
unsigned int ifa_flags;
|
||||
struct sockaddr *ifa_addr;
|
||||
struct sockaddr *ifa_netmask;
|
||||
struct sockaddr *ifa_dstaddr;
|
||||
void *ifa_data;
|
||||
};
|
||||
|
||||
/*
|
||||
* This may have been defined in <net/if.h>. Note that if <net/if.h> is
|
||||
* to be included it must be included before this header file.
|
||||
*/
|
||||
#ifndef ifa_broadaddr
|
||||
#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
|
||||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
extern int getifaddrs(struct ifaddrs **ifap);
|
||||
extern void freeifaddrs(struct ifaddrs *ifa);
|
||||
__END_DECLS
|
||||
|
||||
#endif
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/bin/bash
|
||||
# This script is only needed for debugging purposes
|
||||
|
||||
cp libzerotierintercept.so /lib/libzerotierintercept.so
|
||||
ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept
|
||||
/usr/bin/install -c zerotier-intercept /usr/bin
|
||||
|
||||
# rm -r /lib/libzerotierintercept.so
|
||||
# rm -r /lib/libzerotierintercept
|
||||
# rm -r /usr/bin/zerotier-intercept
|
||||
270
attic/kq.c
270
attic/kq.c
@@ -1,270 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/event.h>
|
||||
#include <sys/time.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <pthread.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
#include "netcon.h"
|
||||
#include "RPC.h"
|
||||
|
||||
void monitor_fds();
|
||||
void test_poll_loop();
|
||||
|
||||
#define MIN_FD 3
|
||||
#define SET_SZ 10
|
||||
|
||||
void die(const char *str) {
|
||||
perror(str);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int make_nonblocking(int fd) {
|
||||
int flags;
|
||||
if (-1 == (flags = fcntl(fd, F_GETFL)))
|
||||
return -1;
|
||||
flags |= O_NONBLOCK;
|
||||
if (-1 == fcntl(fd, F_SETFL, flags))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void changeling()
|
||||
{
|
||||
set_netpath("/root/dev/ztest/nc_e5cd7a9e1c7d408c");
|
||||
pthread_t monitor_thread;
|
||||
pthread_t poll_thread;
|
||||
int i = 7;
|
||||
// Socket monitor and swap thread
|
||||
if(pthread_create(&monitor_thread, NULL, monitor_fds, (void *)i)) {
|
||||
die("unable to start changeling thread\n");
|
||||
}
|
||||
// Test poll loop thread
|
||||
if(pthread_create(&poll_thread, NULL, test_poll_loop, (void *)i)) {
|
||||
die("unable to start test poll loop thread\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void test_poll_loop()
|
||||
{
|
||||
printf("[POLL test thread]\n");
|
||||
fd_set in_set, rfds, wfds, efds;
|
||||
struct timeval tmout;
|
||||
//tmout.tv_usec = 8000000;
|
||||
int ev;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
//printf("polling...\n");
|
||||
FD_ZERO(&in_set);
|
||||
FD_SET(4, &in_set);
|
||||
ev = select(4+1, &rfds, &wfds, &efds, NULL);
|
||||
if(ev == -1)
|
||||
{
|
||||
// perror("select");
|
||||
}
|
||||
if(ev > 0) {
|
||||
printf("ev = %d\n", ev);
|
||||
if(FD_ISSET(4, &rfds)) {
|
||||
printf("[Read] event detected!, ev = %d\n", ev);
|
||||
}
|
||||
if(FD_ISSET(4, &wfds)) {
|
||||
printf("[Write] event detected!, ev = %d\n", ev);
|
||||
}
|
||||
if(FD_ISSET(4, &efds)) {
|
||||
printf("[Exception] event detected!, ev = %d\n", ev);
|
||||
}
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int vnode_events = NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE;
|
||||
|
||||
char *flagstring(int flags)
|
||||
{
|
||||
static char ret[512];
|
||||
char *or = "";
|
||||
|
||||
ret[0]='\0'; // clear the string.
|
||||
if (flags & NOTE_DELETE) {strcat(ret,or);strcat(ret,"NOTE_DELETE");or="|";}
|
||||
if (flags & NOTE_WRITE) {strcat(ret,or);strcat(ret,"NOTE_WRITE");or="|";}
|
||||
if (flags & NOTE_EXTEND) {strcat(ret,or);strcat(ret,"NOTE_EXTEND");or="|";}
|
||||
if (flags & NOTE_ATTRIB) {strcat(ret,or);strcat(ret,"NOTE_ATTRIB");or="|";}
|
||||
if (flags & NOTE_LINK) {strcat(ret,or);strcat(ret,"NOTE_LINK");or="|";}
|
||||
if (flags & NOTE_RENAME) {strcat(ret,or);strcat(ret,"NOTE_RENAME");or="|";}
|
||||
if (flags & NOTE_REVOKE) {strcat(ret,or);strcat(ret,"NOTE_REVOKE");or="|";}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void monitor_fds(){
|
||||
printf("[MONITOR thread]\n");
|
||||
struct timespec tmout = { 0, /* s */ 500000 /* ns */ };
|
||||
struct kevent evSet[SET_SZ];
|
||||
struct kevent evList[32];
|
||||
int fd, kq, nev, i;
|
||||
struct sockaddr_storage addr;
|
||||
socklen_t socklen = sizeof(addr);
|
||||
|
||||
int s = 3;
|
||||
|
||||
// Get new kernel event queue
|
||||
kq = kqueue();
|
||||
|
||||
// For tracking changes in open fds
|
||||
int watch_list_sz = SET_SZ;
|
||||
int registered_sz = 0;
|
||||
int last_registered_sz = 0;
|
||||
|
||||
int swap = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
registered_sz=0;
|
||||
/* Register range of idents */
|
||||
for(int i=MIN_FD; i<SET_SZ; i++)
|
||||
{
|
||||
//printf("EV_SET fd = %d\n", i);
|
||||
//EV_SET(&evSet[i-MIN_FD], i, EVFILT_WRITE, EV_ADD, 0, 0, NULL);
|
||||
EV_SET(&evSet[i-MIN_FD], i, EVFILT_VNODE, EV_ADD | EV_CLEAR, vnode_events, 0, NULL);
|
||||
//if(kevent(kq, &evSet[i-MIN_FD], 1, NULL, 0, NULL) == -1) {
|
||||
//printf("\tunable to register (fd = %d)\n", i);
|
||||
//}
|
||||
//else {
|
||||
// registered_sz++;
|
||||
//}
|
||||
}
|
||||
|
||||
/* Check for events */
|
||||
if (-1 == (nev = kevent(kq, evSet, SET_SZ-MIN_FD, evList, 32, &tmout))) {
|
||||
perror("kevent()");
|
||||
//die("kevent()");
|
||||
}
|
||||
|
||||
int fd_delta = registered_sz > last_registered_sz;
|
||||
if(fd_delta) {
|
||||
printf("NEW fd registered!\n");
|
||||
}
|
||||
last_registered_sz = registered_sz;
|
||||
|
||||
|
||||
|
||||
int s=4;
|
||||
|
||||
// Check on newly created sockets
|
||||
if(!swap && fd_delta && true==false)
|
||||
{
|
||||
swap = 1;
|
||||
printf("new socket detected zt_socket = %p\n", (void*)&zt_socket);
|
||||
|
||||
int opt;
|
||||
socklen_t opt_len;
|
||||
int err;
|
||||
|
||||
int newsock = zt_socket(AF_INET, SOCK_STREAM, 0);
|
||||
printf("newsock = %d\n", newsock);
|
||||
err = dup2(newsock, s);
|
||||
//printf("dup2() = %d\n", err);
|
||||
sleep(5);
|
||||
|
||||
/*
|
||||
if((err = getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&opt, &opt_len)) < 0) {
|
||||
printf("getsockopt(): err = %d\n", err);
|
||||
}
|
||||
if(opt && SOCK_STREAM) {
|
||||
printf("SOCK_STREAM socket detected!\n");
|
||||
sleep(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("opt = %d\n", opt);
|
||||
}*/
|
||||
}
|
||||
//printf("Complete\n");
|
||||
|
||||
// Check on incoming connections
|
||||
if(fd_delta && true == false)
|
||||
{
|
||||
// Peer name check
|
||||
socklen_t len;
|
||||
struct sockaddr_storage addr;
|
||||
char ipstr[INET6_ADDRSTRLEN];
|
||||
int port;
|
||||
|
||||
len = sizeof(addr);
|
||||
getpeername(s, (struct sockaddr *)&addr, &len);
|
||||
|
||||
if (addr.ss_family == AF_INET) {
|
||||
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
|
||||
port = ntohs(s->sin_port);
|
||||
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
|
||||
}
|
||||
/* else { // AF_INET6
|
||||
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
|
||||
port = ntohs(s->sin6_port);
|
||||
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
|
||||
}
|
||||
*/
|
||||
|
||||
printf("Peer IP address: %s\n", ipstr);
|
||||
printf("Peer port : %d\n", port);
|
||||
|
||||
sleep(10);
|
||||
|
||||
printf("calling zt_socket()...\n");
|
||||
int intercepted_fd = zt_socket(AF_INET, SOCK_STREAM, 0);
|
||||
if(-1 == dup2(evList[i].ident, intercepted_fd)) {
|
||||
perror("dup2():");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Process events */
|
||||
if(nev /*&& fd_delta*/)
|
||||
{
|
||||
printf("kevent() = %d\n", nev);
|
||||
for (int i = 0; i < nev; i++) {
|
||||
|
||||
/*
|
||||
if(evList[i].ident == 4)
|
||||
{
|
||||
printf("calling zt_socket()...\n");
|
||||
int intercepted_fd = zt_socket(AF_INET, SOCK_STREAM, 0);
|
||||
if(-1 == dup2(evList[i].ident, intercepted_fd)) {
|
||||
perror("dup2():");
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
printf("\tEVENT on (%d)\n", evList[i].ident);
|
||||
printf("\t\tevent[%d].ident = %d\n", i, evList[i].ident);
|
||||
printf("\t\tevent[%d].filter = %d\n", i, evList[i].filter);
|
||||
printf("\t\tevent[%d].flags = %d\n", i, evList[i].flags);
|
||||
if(evList[i].flags & EVFILT_READ) { printf("\t\t\tEVFILT_READ\n"); }
|
||||
if(evList[i].flags & EVFILT_WRITE) { printf("\t\t\tEVFILT_WRITE\n"); }
|
||||
if(evList[i].flags & EVFILT_AIO) { printf("\t\t\tEVFILT_AIO\n"); }
|
||||
if(evList[i].flags & EVFILT_VNODE) { printf("\t\t\tEVFILT_VNODE\n"); }
|
||||
if(evList[i].flags & EVFILT_PROC) { printf("\t\t\tEVFILT_PROC\n"); }
|
||||
printf("\t\tevent[%d].fflags = %d\n", i, evList[i].fflags);
|
||||
if(evList[i].fflags > 0)
|
||||
printf("\t\t\tfflags = %s\n", flagstring(evList[i].fflags));
|
||||
printf("\t\tevent[%d].data = %d\n", i, evList[i].data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
int changeling();
|
||||
103
attic/kq_old.c
103
attic/kq_old.c
@@ -1,103 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/event.h>
|
||||
#include <sys/time.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <pthread.h>
|
||||
#include <time.h>
|
||||
|
||||
void monitor_fds();
|
||||
|
||||
#define MIN_FD 0
|
||||
#define SET_SZ 10
|
||||
|
||||
void die(const char *str) {
|
||||
perror(str);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int make_nonblocking(int fd) {
|
||||
int flags;
|
||||
if (-1 == (flags = fcntl(fd, F_GETFL)))
|
||||
return -1;
|
||||
flags |= O_NONBLOCK;
|
||||
if (-1 == fcntl(fd, F_SETFL, flags))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void changeling()
|
||||
{
|
||||
pthread_t thread;
|
||||
int i = 7;
|
||||
if(pthread_create(&thread, NULL, monitor_fds, (void *)i)) {
|
||||
die("unable to start changeling thread\n");
|
||||
}
|
||||
}
|
||||
|
||||
struct timespec tmout = { 0, /* s */ 500000 /* ns */ };
|
||||
|
||||
void monitor_fds(){
|
||||
sleep(5);
|
||||
printf("monitor_fds()...\n");
|
||||
/*
|
||||
struct kevent changeList[SET_SZ];
|
||||
struct kevent eventList[SET_SZ];
|
||||
int sockfd, nev, kq;
|
||||
ssize_t nbytes;
|
||||
int error;
|
||||
char buf[BUFSIZ];
|
||||
|
||||
if (-1 == (kq = kqueue()))
|
||||
die("kqueue()");
|
||||
for(int i=MIN_FD;i<SET_SZ; i++)
|
||||
{
|
||||
printf("registering (%d)\n", i);
|
||||
EV_SET(&changeList[i-MIN_FD], i, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0);
|
||||
//if (-1 == kevent(kq, change, 2, NULL, 0, NULL))
|
||||
// printf(" unable to register (%d)\n", i);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
struct kevent evSet;
|
||||
struct kevent evList[32];
|
||||
int nev, i;
|
||||
struct sockaddr_storage addr;
|
||||
socklen_t socklen = sizeof(addr);
|
||||
int fd;
|
||||
|
||||
int local_s = 3;
|
||||
int kq;
|
||||
|
||||
kq = kqueue();
|
||||
|
||||
EV_SET(&evSet, local_s, EVFILT_READ, EV_ADD, 0, 0, NULL);
|
||||
if (kevent(kq, &evSet, 1, NULL, 0, NULL) == -1)
|
||||
err(1, "1kevent");
|
||||
|
||||
|
||||
printf("watching...\n");
|
||||
for (;;)
|
||||
{
|
||||
if (-1 == (nev = kevent(kq, NULL, 0, evList, 32, NULL)))
|
||||
die("2kevent()");
|
||||
if(nev)
|
||||
{
|
||||
printf("kevent() = %d\n", nev);
|
||||
for (int i = 0; i < nev; i++) {
|
||||
printf("\tevent[%d].ident = %d\n", i, evList[i].ident);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "RPC.h"
|
||||
#include "netcon.h"
|
||||
#include "ztproxy.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("hello from proxy\n");
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
CC=cc
|
||||
CXX=c++
|
||||
|
||||
INCLUDES=
|
||||
DEFS=
|
||||
LIBS=
|
||||
|
||||
include objects.mk
|
||||
OBJS+=osdep/BSDEthernetTap.o
|
||||
|
||||
# "make official" is a shortcut for this
|
||||
ifeq ($(ZT_OFFICIAL_RELEASE),1)
|
||||
DEFS+=-DZT_OFFICIAL_RELEASE
|
||||
endif
|
||||
|
||||
# Build with ZT_ENABLE_CLUSTER=1 to build with cluster support
|
||||
ifeq ($(ZT_ENABLE_CLUSTER),1)
|
||||
DEFS+=-DZT_ENABLE_CLUSTER
|
||||
endif
|
||||
|
||||
# "make debug" is a shortcut for this
|
||||
ifeq ($(ZT_DEBUG),1)
|
||||
DEFS+=-DZT_TRACE
|
||||
CFLAGS+=-Wall -g -pthread $(INCLUDES) $(DEFS)
|
||||
LDFLAGS+=
|
||||
STRIP=echo
|
||||
# The following line enables optimization for the crypto code, since
|
||||
# C25519 in particular is almost UNUSABLE in heavy testing without it.
|
||||
ext/lz4/lz4.o node/Salsa20.o node/SHA512.o node/C25519.o node/Poly1305.o: CFLAGS = -Wall -O2 -g -pthread $(INCLUDES) $(DEFS)
|
||||
else
|
||||
CFLAGS?=-O3 -fstack-protector
|
||||
CFLAGS+=-Wall -fPIE -fvisibility=hidden -fstack-protector -pthread $(INCLUDES) -DNDEBUG $(DEFS)
|
||||
LDFLAGS+=-pie -Wl,-z,relro,-z,now
|
||||
STRIP=strip --strip-all
|
||||
endif
|
||||
|
||||
CXXFLAGS+=$(CFLAGS) -fno-rtti
|
||||
|
||||
all: one
|
||||
|
||||
one: $(OBJS) service/OneService.o one.o
|
||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o zerotier-one $(OBJS) service/OneService.o one.o $(LIBS)
|
||||
$(STRIP) zerotier-one
|
||||
ln -sf zerotier-one zerotier-idtool
|
||||
ln -sf zerotier-one zerotier-cli
|
||||
|
||||
selftest: $(OBJS) selftest.o
|
||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o zerotier-selftest selftest.o $(OBJS) $(LIBS)
|
||||
$(STRIP) zerotier-selftest
|
||||
|
||||
# No installer on FreeBSD yet
|
||||
#installer: one FORCE
|
||||
# ./buildinstaller.sh
|
||||
|
||||
clean:
|
||||
rm -rf *.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o build-* zerotier-one zerotier-idtool zerotier-selftest zerotier-cli ZeroTierOneInstaller-*
|
||||
|
||||
debug: FORCE
|
||||
make -j 4 ZT_DEBUG=1
|
||||
|
||||
#official: FORCE
|
||||
# make -j 4 ZT_OFFICIAL_RELEASE=1
|
||||
# ./buildinstaller.sh
|
||||
|
||||
FORCE:
|
||||
@@ -87,18 +87,39 @@ linux_shared_lib: $(OBJS)
|
||||
ln -sf zerotier-sdk-service zerotier-cli
|
||||
ln -sf zerotier-sdk-service zerotier-idtool
|
||||
|
||||
# Check for the presence of built frameworks/bundles/libaries
|
||||
check:
|
||||
./check.sh build/lwip/liblwip.so
|
||||
./check.sh build/linux_shared_lib/libztintercept.so
|
||||
|
||||
./check.sh build/
|
||||
./check.sh build/android_jni_lib/arm64-v8a/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/armeabi/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/armeabi-v7a/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/mips/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/mips64/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/x86/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/x86_64/libZeroTierJNI.so
|
||||
|
||||
|
||||
# Tests
|
||||
TEST_OBJDIR := build/tests
|
||||
TEST_SOURCES := $(wildcard tests/*.c)
|
||||
TEST_TARGETS := $(addprefix build/tests/,$(notdir $(TEST_SOURCES:.c=.out)))
|
||||
|
||||
build/tests/%.out: tests/%.c
|
||||
-$(CC) $(CC_FLAGS) -c -o $@ $<
|
||||
|
||||
$(TEST_OBJDIR):
|
||||
mkdir -p $(TEST_OBJDIR)
|
||||
|
||||
tests: $(TEST_OBJDIR) $(TEST_TARGETS)
|
||||
mkdir -p build/tests;
|
||||
|
||||
clean:
|
||||
rm -rf ${GENERATED_FILES}
|
||||
rm -rf zerotier-cli zerotier-idtool
|
||||
rm -rf build/*
|
||||
find . -type f -name '*.a' -delete
|
||||
find . -type f -name '*.o' -delete
|
||||
find . -type f -name '*.so' -delete
|
||||
find . -type f -name '*.o.d' -delete
|
||||
find . -type f \( -name '*.o' -o -name '*.so' -o -name '*.o.d' -o -name '*.out' \) -delete
|
||||
# Remove junk generated by Android builds
|
||||
cd integrations/Android/proj; ./gradlew clean
|
||||
rm -rf integrations/Android/proj/.gradle
|
||||
|
||||
39
make-mac.mk
39
make-mac.mk
@@ -96,6 +96,7 @@ osx_shared_lib: $(OBJS)
|
||||
prep:
|
||||
cp integrations/android/android_jni_lib/java/libs/* build
|
||||
|
||||
# Check for the presence of built frameworks/bundles/libaries
|
||||
check:
|
||||
./check.sh build/lwip/liblwip.so
|
||||
|
||||
@@ -107,37 +108,39 @@ check:
|
||||
./check.sh build/ios_unity3d_bundle/Debug-iphoneos/ZeroTierSDK_Unity3D_iOS.bundle
|
||||
|
||||
./check.sh build/
|
||||
./check.sh build/android_jni_lib/
|
||||
./check.sh build/android_jni_lib/
|
||||
./check.sh build/android_jni_lib/
|
||||
./check.sh build/android_jni_lib/
|
||||
./check.sh build/android_jni_lib/
|
||||
./check.sh build/android_jni_lib/
|
||||
./check.sh build/android_jni_lib/
|
||||
./check.sh build/android_jni_lib/
|
||||
./check.sh build/android_jni_lib/arm64-v8a/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/armeabi/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/armeabi-v7a/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/mips/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/mips64/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/x86/libZeroTierJNI.so
|
||||
./check.sh build/android_jni_lib/x86_64/libZeroTierJNI.so
|
||||
|
||||
./check.sh build/
|
||||
./check.sh build/
|
||||
|
||||
selftest:
|
||||
# Tests
|
||||
TEST_OBJDIR := build/tests
|
||||
TEST_SOURCES := $(wildcard tests/*.c)
|
||||
TEST_TARGETS := $(addprefix build/tests/,$(notdir $(TEST_SOURCES:.c=.out)))
|
||||
|
||||
build/tests/%.out: tests/%.c
|
||||
-$(CC) $(CC_FLAGS) -c -o $@ $<
|
||||
|
||||
$(TEST_OBJDIR):
|
||||
mkdir -p $(TEST_OBJDIR)
|
||||
|
||||
tests: $(TEST_OBJDIR) $(TEST_TARGETS)
|
||||
mkdir -p build/tests;
|
||||
|
||||
clean:
|
||||
rm -rf zerotier-cli zerotier-idtool
|
||||
|
||||
rm -rf build/*
|
||||
find . -type f -name '*.o' -delete
|
||||
find . -type f -name '*.so' -delete
|
||||
find . -type f -name '*.o.d' -delete
|
||||
|
||||
find . -type f \( -name '*.o' -o -name '*.so' -o -name '*.o.d' -o -name '*.out' \) -delete
|
||||
# android JNI lib project
|
||||
cd integrations/android/android_jni_lib/proj; ./gradlew clean
|
||||
rm -rf integrations/android/android_jni_lib/proj/.gradle
|
||||
rm -rf integrations/android/android_jni_lib/proj/.idea
|
||||
rm -rf integrations/android/android_jni_lib/proj/build
|
||||
|
||||
# example android app project
|
||||
cd integrations/android/example_app; ./gradlew clean
|
||||
rm -rf integrations/android/example_app/.idea
|
||||
rm -rf integrations/android/example_app/.gradle
|
||||
FORCE:
|
||||
|
||||
BIN
tests/udp_client
BIN
tests/udp_client
Binary file not shown.
BIN
tests/udp_server
BIN
tests/udp_server
Binary file not shown.
BIN
udp_client
BIN
udp_client
Binary file not shown.
Reference in New Issue
Block a user