mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
util.*:
- added logging functions, default off tox.h: - added includes for sockaddr_in/6 network.c: - added logging functions, default off (#define in util.h) - IPv6: activating site-local all-nodes multicast address (i.e. IPv6 equivalent of broadcast)
This commit is contained in:
parent
f267266bf6
commit
3ae7460853
|
@ -965,19 +965,23 @@ void Messenger_save(Messenger *m, uint8_t *data)
|
|||
{
|
||||
save_keys(m->net_crypto, data);
|
||||
data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES;
|
||||
|
||||
uint32_t nospam = get_nospam(&(m->fr));
|
||||
memcpy(data, &nospam, sizeof(nospam));
|
||||
data += sizeof(nospam);
|
||||
|
||||
uint32_t size = DHT_size(m->dht);
|
||||
memcpy(data, &size, sizeof(size));
|
||||
data += sizeof(size);
|
||||
DHT_save(m->dht, data);
|
||||
data += size;
|
||||
|
||||
size = sizeof(Friend) * m->numfriends;
|
||||
memcpy(data, &size, sizeof(size));
|
||||
data += sizeof(size);
|
||||
memcpy(data, m->friendlist, sizeof(Friend) * m->numfriends);
|
||||
data += size;
|
||||
|
||||
uint16_t small_size = m->name_length;
|
||||
memcpy(data, &small_size, sizeof(small_size));
|
||||
data += sizeof(small_size);
|
||||
|
@ -990,59 +994,64 @@ int Messenger_load(Messenger *m, uint8_t *data, uint32_t length)
|
|||
if (length == ~((uint32_t)0))
|
||||
return -1;
|
||||
|
||||
if (length < crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t) * 3)
|
||||
/* BLOCK1: PUBKEY, SECKEY, NOSPAM, SIZE */
|
||||
if (length < crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t) * 2)
|
||||
return -1;
|
||||
|
||||
length -= crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t) * 3;
|
||||
load_keys(m->net_crypto, data);
|
||||
data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES;
|
||||
length -= crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES;
|
||||
|
||||
uint32_t nospam;
|
||||
memcpy(&nospam, data, sizeof(nospam));
|
||||
set_nospam(&(m->fr), nospam);
|
||||
data += sizeof(nospam);
|
||||
length -= sizeof(nospam);
|
||||
|
||||
uint32_t size;
|
||||
memcpy(&size, data, sizeof(size));
|
||||
data += sizeof(size);
|
||||
length -= sizeof(size);
|
||||
|
||||
if (length < size)
|
||||
return -1;
|
||||
|
||||
length -= size;
|
||||
|
||||
if (DHT_load(m->dht, data, size) == -1)
|
||||
return -1;
|
||||
fprintf(stderr, "Data file: Something wicked happened to the stored connections.\n");
|
||||
|
||||
/* go on, friends still might be intact */
|
||||
|
||||
data += size;
|
||||
length -= size;
|
||||
|
||||
memcpy(&size, data, sizeof(size));
|
||||
data += sizeof(size);
|
||||
|
||||
if (length < size || size % sizeof(Friend) != 0)
|
||||
if (length < size)
|
||||
return -1;
|
||||
|
||||
Friend *temp = malloc(size);
|
||||
memcpy(temp, data, size);
|
||||
if (!(size % sizeof(Friend))) {
|
||||
uint16_t num = size / sizeof(Friend);
|
||||
Friend temp[num];
|
||||
memcpy(temp, data, size);
|
||||
|
||||
uint16_t num = size / sizeof(Friend);
|
||||
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < num; ++i) {
|
||||
if (temp[i].status >= 3) {
|
||||
int fnum = m_addfriend_norequest(m, temp[i].client_id);
|
||||
setfriendname(m, fnum, temp[i].name, temp[i].name_length);
|
||||
/* set_friend_statusmessage(fnum, temp[i].statusmessage, temp[i].statusmessage_length); */
|
||||
} else if (temp[i].status != 0) {
|
||||
/* TODO: This is not a good way to do this. */
|
||||
uint8_t address[FRIEND_ADDRESS_SIZE];
|
||||
memcpy(address, temp[i].client_id, crypto_box_PUBLICKEYBYTES);
|
||||
memcpy(address + crypto_box_PUBLICKEYBYTES, &(temp[i].friendrequest_nospam), sizeof(uint32_t));
|
||||
uint16_t checksum = address_checksum(address, FRIEND_ADDRESS_SIZE - sizeof(checksum));
|
||||
memcpy(address + crypto_box_PUBLICKEYBYTES + sizeof(uint32_t), &checksum, sizeof(checksum));
|
||||
m_addfriend(m, address, temp[i].info, temp[i].info_size);
|
||||
uint32_t i;
|
||||
for (i = 0; i < num; ++i) {
|
||||
if (temp[i].status >= 3) {
|
||||
int fnum = m_addfriend_norequest(m, temp[i].client_id);
|
||||
setfriendname(m, fnum, temp[i].name, temp[i].name_length);
|
||||
/* set_friend_statusmessage(fnum, temp[i].statusmessage, temp[i].statusmessage_length); */
|
||||
} else if (temp[i].status != 0) {
|
||||
/* TODO: This is not a good way to do this. */
|
||||
uint8_t address[FRIEND_ADDRESS_SIZE];
|
||||
memcpy(address, temp[i].client_id, crypto_box_PUBLICKEYBYTES);
|
||||
memcpy(address + crypto_box_PUBLICKEYBYTES, &(temp[i].friendrequest_nospam), sizeof(uint32_t));
|
||||
uint16_t checksum = address_checksum(address, FRIEND_ADDRESS_SIZE - sizeof(checksum));
|
||||
memcpy(address + crypto_box_PUBLICKEYBYTES + sizeof(uint32_t), &checksum, sizeof(checksum));
|
||||
m_addfriend(m, address, temp[i].info, temp[i].info_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(temp);
|
||||
data += size;
|
||||
length -= size;
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#endif
|
||||
|
||||
#include "network.h"
|
||||
#include "util.h"
|
||||
|
||||
/* return current UNIX time in microseconds (us). */
|
||||
uint64_t current_time(void)
|
||||
|
@ -61,6 +62,10 @@ uint32_t random_int(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifdef LOGGING
|
||||
static void loglogdata(char *message, uint8_t *buffer, size_t buflen, IP_Port *ip_port, ssize_t res);
|
||||
#endif
|
||||
|
||||
/* Basic network functions:
|
||||
* Function to send packet(data) of length length to ip_port.
|
||||
*/
|
||||
|
@ -122,7 +127,11 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, uint8_t *data, uint32_t le
|
|||
}
|
||||
#endif
|
||||
|
||||
return sendto(net->sock, (char *) data, length, 0, (struct sockaddr *)&addr, addrsize);
|
||||
int res = sendto(net->sock, (char *) data, length, 0, (struct sockaddr *)&addr, addrsize);
|
||||
#ifdef LOGGING
|
||||
loglogdata("O=>", data, length, &ip_port, res);
|
||||
#endif
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Function to receive data
|
||||
|
@ -131,11 +140,7 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, uint8_t *data, uint32_t le
|
|||
* Packet length is put into length.
|
||||
* Dump all empty packets.
|
||||
*/
|
||||
#ifdef WIN32
|
||||
static int receivepacket(unsigned int sock, IP_Port *ip_port, uint8_t *data, uint32_t *length)
|
||||
#else
|
||||
static int receivepacket(int sock, IP_Port *ip_port, uint8_t *data, uint32_t *length)
|
||||
#endif
|
||||
static int receivepacket(sock_t sock, IP_Port *ip_port, uint8_t *data, uint32_t *length)
|
||||
{
|
||||
struct sockaddr_storage addr;
|
||||
#ifdef WIN32
|
||||
|
@ -145,8 +150,13 @@ static int receivepacket(int sock, IP_Port *ip_port, uint8_t *data, uint32_t *le
|
|||
#endif
|
||||
(*(int32_t *)length) = recvfrom(sock, (char *) data, MAX_UDP_PACKET_SIZE, 0, (struct sockaddr *)&addr, &addrlen);
|
||||
|
||||
if (*(int32_t *)length <= 0)
|
||||
if (*(int32_t *)length <= 0) {
|
||||
#ifdef LOGGING
|
||||
if ((length < 0) && (errno != EWOULDBLOCK))
|
||||
sprintf(logbuffer, "Unexpected error reading from socket: %u, %s\n", errno, strerror(errno));
|
||||
#endif
|
||||
return -1; /* Nothing received or empty packet. */
|
||||
}
|
||||
|
||||
#ifdef TOX_ENABLE_IPV6
|
||||
if (addr.ss_family == AF_INET) {
|
||||
|
@ -173,6 +183,10 @@ static int receivepacket(int sock, IP_Port *ip_port, uint8_t *data, uint32_t *le
|
|||
return -1;
|
||||
#endif
|
||||
|
||||
#ifdef LOGGING
|
||||
loglogdata("=>O", data, *length, ip_port, 0);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -307,6 +321,10 @@ Networking_Core *new_networking(IP ip, uint16_t port)
|
|||
fcntl(temp->sock, F_SETFL, O_NONBLOCK, 1);
|
||||
#endif
|
||||
|
||||
#ifdef LOGGING
|
||||
loginit(ntohs(port));
|
||||
#endif
|
||||
|
||||
/* Bind our socket to port PORT and the given IP address (usually 0.0.0.0 or ::) */
|
||||
uint16_t *portptr = NULL;
|
||||
struct sockaddr_storage addr;
|
||||
|
@ -346,9 +364,33 @@ Networking_Core *new_networking(IP ip, uint16_t port)
|
|||
if (ip.family == AF_INET6) {
|
||||
char ipv6only = 0;
|
||||
int res = setsockopt(temp->sock, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&ipv6only, sizeof(ipv6only));
|
||||
#ifdef LOGGING
|
||||
if (res < 0) {
|
||||
/* add log message*/
|
||||
sprintf(logbuffer, "Failed to enable dual-stack on IPv6 socket, won't be able to receive from/send to IPv4 addresses. (%u, %s)\n",
|
||||
errno, strerror(errno));
|
||||
loglog(logbuffer);
|
||||
}
|
||||
else
|
||||
loglog("Embedded IPv4 addresses enabled successfully.\n");
|
||||
#endif
|
||||
|
||||
/* multicast local nodes */
|
||||
struct ipv6_mreq mreq;
|
||||
memset(&mreq, 0, sizeof(mreq));
|
||||
mreq.ipv6mr_multiaddr.s6_addr[ 0] = 0xFF;
|
||||
mreq.ipv6mr_multiaddr.s6_addr[ 1] = 0x02;
|
||||
mreq.ipv6mr_multiaddr.s6_addr[15] = 0x01;
|
||||
mreq.ipv6mr_interface = 0;
|
||||
res = setsockopt(temp->sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
|
||||
#ifdef LOGGING
|
||||
if (res < 0) {
|
||||
sprintf(logbuffer, "Failed to activate local multicast membership. (%u, %s)\n",
|
||||
errno, strerror(errno));
|
||||
loglog(logbuffer);
|
||||
}
|
||||
else
|
||||
loglog("Local multicast group FF02::1 joined successfully.\n");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -363,6 +405,10 @@ Networking_Core *new_networking(IP ip, uint16_t port)
|
|||
if (!res)
|
||||
{
|
||||
temp->port = *portptr;
|
||||
#ifdef LOGGING
|
||||
sprintf(logbuffer, "Bound successfully to %s:%u.\n", ip_ntoa(&ip), ntohs(temp->port));
|
||||
loglog(logbuffer);
|
||||
#endif
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
@ -733,3 +779,17 @@ int addr_resolve_or_parse_ip(const char *address, IP *to)
|
|||
|
||||
return 1;
|
||||
};
|
||||
|
||||
#ifdef LOGGING
|
||||
static void loglogdata(char *message, uint8_t *buffer, size_t buflen, IP_Port *ip_port, ssize_t res)
|
||||
{
|
||||
snprintf(logbuffer, sizeof(logbuffer), "[%2u] %3u%c %s %s:%u (%u: %s) | %04x%04x\n",
|
||||
buffer[0], res < 0 ? (buflen & 0xFF) : res,
|
||||
res < 0 ? '-' : (res == buflen ? '=' : '+'),
|
||||
message, ip_ntoa(&ip_port->ip), ntohs(ip_port->port), res < 0 ? errno : 0,
|
||||
res < 0 ? strerror(errno) : "OK", buflen > 4 ? ntohl(*(uint32_t *)&buffer[1]) : 0,
|
||||
buflen > 7 ? ntohl(*(uint32_t *)(&buffer[5])) : 0);
|
||||
logbuffer[sizeof(logbuffer) - 1] = 0;
|
||||
loglog(logbuffer);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -119,6 +119,7 @@ typedef struct {
|
|||
} IPAny_Port;
|
||||
|
||||
#undef TOX_ENABLE_IPV6
|
||||
/* #define TOX_ENABLE_IPV6 */
|
||||
#ifdef TOX_ENABLE_IPV6
|
||||
#define TOX_ENABLE_IPV6_DEFAULT 1
|
||||
typedef IPAny IP;
|
||||
|
|
|
@ -26,6 +26,22 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#ifndef WINVER
|
||||
//Windows XP
|
||||
#define WINVER 0x0501
|
||||
#endif
|
||||
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#include <ws2tcpip.h>
|
||||
|
||||
#else
|
||||
|
||||
#include <netinet/ip.h>
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
@ -71,6 +87,7 @@ typedef struct {
|
|||
} tox_IPAny_Port;
|
||||
|
||||
#undef TOX_ENABLE_IPV6
|
||||
/* #define TOX_ENABLE_IPV6 */
|
||||
#ifdef TOX_ENABLE_IPV6
|
||||
#define TOX_ENABLE_IPV6_DEFAULT 1
|
||||
typedef tox_IPAny tox_IP;
|
||||
|
|
|
@ -10,11 +10,12 @@
|
|||
#endif
|
||||
|
||||
#include <time.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/* for CLIENT_ID_SIZE */
|
||||
#include "DHT.h"
|
||||
|
||||
#include "util.h"
|
||||
|
||||
uint64_t now()
|
||||
{
|
||||
return time(NULL);
|
||||
|
@ -41,3 +42,30 @@ void id_cpy(uint8_t *dest, uint8_t *src)
|
|||
{
|
||||
memcpy(dest, src, CLIENT_ID_SIZE);
|
||||
}
|
||||
|
||||
#ifdef LOGGING
|
||||
char logbuffer[512];
|
||||
static FILE *logfile = NULL;
|
||||
void loginit(uint16_t port)
|
||||
{
|
||||
if (logfile)
|
||||
fclose(logfile);
|
||||
|
||||
sprintf(logbuffer, "%u-%u.log", ntohs(port), now);
|
||||
logfile = fopen(logbuffer, "w");
|
||||
};
|
||||
void loglog(char *text)
|
||||
{
|
||||
if (logfile) {
|
||||
fprintf(logfile, text);
|
||||
fflush(logfile);
|
||||
}
|
||||
};
|
||||
void logexit()
|
||||
{
|
||||
if (logfile) {
|
||||
fclose(logfile);
|
||||
logfile = NULL;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -5,7 +5,24 @@
|
|||
* Copyright 2013 plutooo
|
||||
*/
|
||||
|
||||
#ifndef __UTIL_H__
|
||||
#define __UTIL_H__
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
uint64_t now();
|
||||
uint64_t random_64b();
|
||||
bool id_eq(uint8_t *dest, uint8_t *src);
|
||||
void id_cpy(uint8_t *dest, uint8_t *src);
|
||||
|
||||
#undef LOGGING
|
||||
// #define LOGGING
|
||||
#ifdef LOGGING
|
||||
extern char logbuffer[512];
|
||||
void loginit(uint16_t port);
|
||||
void loglog(char *text);
|
||||
void logexit();
|
||||
#endif
|
||||
|
||||
#endif /* __UTIL_H__ */
|
||||
|
|
Loading…
Reference in New Issue
Block a user