Beginnings of the Record protobuf and more changes to dialer
This commit is contained in:
parent
ccc7ca3e8b
commit
c29c5744b8
8 changed files with 72 additions and 12 deletions
|
@ -67,7 +67,7 @@ void libp2p_conn_dialer_free(struct Dialer* in) {
|
||||||
struct Connection* libp2p_conn_dialer_get_connection(struct Dialer* dialer, struct MultiAddress* multiaddress) {
|
struct Connection* libp2p_conn_dialer_get_connection(struct Dialer* dialer, struct MultiAddress* multiaddress) {
|
||||||
struct Connection* conn = libp2p_conn_transport_dialer_get(dialer->transport_dialers, multiaddress);
|
struct Connection* conn = libp2p_conn_transport_dialer_get(dialer->transport_dialers, multiaddress);
|
||||||
if (conn == NULL) {
|
if (conn == NULL) {
|
||||||
conn = libp2p_conn_connection_new(dialer->fallback_dialer, multiaddress);
|
conn = dialer->fallback_dialer->dial(dialer->fallback_dialer, multiaddress);
|
||||||
}
|
}
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,12 +25,12 @@ struct TcpIp* libp2p_conn_parse_ip_multiaddress(struct MultiAddress* addr) {
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
while (tok != NULL) {
|
while (tok != NULL) {
|
||||||
switch (pos) {
|
switch (pos) {
|
||||||
case 2: {
|
case 1: {
|
||||||
out->ip = malloc(strlen(tok) + 1);
|
out->ip = malloc(strlen(tok) + 1);
|
||||||
strcpy(out->ip, tok);
|
strcpy(out->ip, tok);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 4: {
|
case 3: {
|
||||||
out->port = strtol(tok, NULL, 10);
|
out->port = strtol(tok, NULL, 10);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,18 @@ int libp2p_conn_tcp_can_handle(struct MultiAddress* addr) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int libp2p_conn_tcp_read(const struct Connection* connection, char** out, size_t* num_bytes) {
|
||||||
|
int buffer_size = 65535;
|
||||||
|
*out = (char*)malloc(buffer_size);
|
||||||
|
ssize_t bytes = socket_read(connection->socket_handle, *out, buffer_size, 0);
|
||||||
|
*num_bytes = bytes;
|
||||||
|
return bytes > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int libp2p_conn_tcp_write(const struct Connection* connection, const char* in, size_t num_bytes) {
|
||||||
|
ssize_t bytes = socket_write(connection->socket_handle, in, num_bytes, 0);
|
||||||
|
return bytes == num_bytes;
|
||||||
|
}
|
||||||
|
|
||||||
struct Connection* libp2p_conn_tcp_dial(struct TransportDialer* transport_dialer, struct MultiAddress* addr) {
|
struct Connection* libp2p_conn_tcp_dial(struct TransportDialer* transport_dialer, struct MultiAddress* addr) {
|
||||||
struct Connection* conn = (struct Connection*) malloc(sizeof(struct Connection*));
|
struct Connection* conn = (struct Connection*) malloc(sizeof(struct Connection*));
|
||||||
|
@ -55,6 +66,8 @@ struct Connection* libp2p_conn_tcp_dial(struct TransportDialer* transport_dialer
|
||||||
struct hostent* host = gethostbyname(results->ip);
|
struct hostent* host = gethostbyname(results->ip);
|
||||||
struct in_addr** addr_list = (struct in_addr**)host->h_addr_list;
|
struct in_addr** addr_list = (struct in_addr**)host->h_addr_list;
|
||||||
socket_connect4(conn->socket_handle, (*addr_list[0]).s_addr, results->port);
|
socket_connect4(conn->socket_handle, (*addr_list[0]).s_addr, results->port);
|
||||||
|
conn->read = libp2p_conn_tcp_read;
|
||||||
|
conn->write = libp2p_conn_tcp_write;
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ struct Connection {
|
||||||
* @param out_size the number of bytes to write
|
* @param out_size the number of bytes to write
|
||||||
* @returns 0 on success, otherwise an error code
|
* @returns 0 on success, otherwise an error code
|
||||||
*/
|
*/
|
||||||
int (*write)(const struct Connection* conn, char* out, size_t out_size);
|
int (*write)(const struct Connection* conn, const char* out, size_t out_size);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
int socket_connect4(int s, uint32_t ip, uint16_t port);
|
int socket_connect4(int s, uint32_t ip, uint16_t port);
|
||||||
int socket_listen(int s, uint32_t *localip, uint16_t *localport);
|
int socket_listen(int s, uint32_t *localip, uint16_t *localport);
|
||||||
ssize_t socket_read(int s, char *buf, size_t len, int flags);
|
ssize_t socket_read(int s, char *buf, size_t len, int flags);
|
||||||
ssize_t socket_write(int s, char *buf, size_t len, int flags);
|
ssize_t socket_write(int s, const char *buf, size_t len, int flags);
|
||||||
/**
|
/**
|
||||||
* Used to send the size of the next transmission for "framed" transmissions. NOTE: This will send in big endian format
|
* Used to send the size of the next transmission for "framed" transmissions. NOTE: This will send in big endian format
|
||||||
* @param s the socket descriptor
|
* @param s the socket descriptor
|
||||||
|
|
|
@ -1,7 +1,52 @@
|
||||||
#ifndef LIBP2P_RECORD_H
|
#pragma once
|
||||||
#define LIBP2P_RECORD_H
|
|
||||||
|
|
||||||
#define RECORD_BUFSIZE 4096
|
struct Libp2pRecord {
|
||||||
|
// the key that references this record
|
||||||
|
char* key;
|
||||||
|
// the actual value this record is storing
|
||||||
|
unsigned char* value;
|
||||||
|
// hash of the author's public key
|
||||||
|
char* author;
|
||||||
|
// a PKI signature for the key + value + author
|
||||||
|
unsigned char* signature;
|
||||||
|
// time the record was received, set by receiver
|
||||||
|
char* time_received;
|
||||||
|
};
|
||||||
|
|
||||||
int libp2p_record_make_put_record (char** record, size_t *rec_size, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign);
|
/**
|
||||||
#endif // LIBP2P_RECORD_H
|
* Convert a Libp2pRecord into protobuf format
|
||||||
|
* @param in the Libp2pRecord to convert
|
||||||
|
* @param buffer where to store the protobuf
|
||||||
|
* @param max_buffer_size the size of the allocated buffer
|
||||||
|
* @param bytes_written the size written into buffer
|
||||||
|
* @returns true(1) on success, otherwise false(0)
|
||||||
|
*/
|
||||||
|
int libp2p_record_protobuf_encode(const struct Libp2pRecord* in, unsigned char* buffer, size_t max_buffer_size, size_t* bytes_written);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates an estimate of the buffer size needed to encode the struct
|
||||||
|
* @param in the Libp2pRecord that you want to encode
|
||||||
|
* @returns the approximate number of bytes required
|
||||||
|
*/
|
||||||
|
size_t libp2p_record_protobuf_encode_size(const struct Libp2pRecord* in);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a protobuf byte array into a Libp2pRecord
|
||||||
|
* @param in the byte array
|
||||||
|
* @param in_size the size of the byte array
|
||||||
|
* @param out a pointer to the new Libp2pRecord
|
||||||
|
* @returns true(1) on success, otherwise false(0)
|
||||||
|
*/
|
||||||
|
int libp2p_record_protobuf_decode(const unsigned char* in, size_t in_size, struct Libp2pRecord** out);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method does all the hard stuff in one step. It fills a Libp2pRecord struct, and converts it into a protobuf
|
||||||
|
* @param record a pointer to the protobuf results
|
||||||
|
* @param rec_size the number of bytes used in the area pointed to by record
|
||||||
|
* @param sk the private key used to sign
|
||||||
|
* @param key the key in the Libp2pRecord
|
||||||
|
* @param value the value in the Libp2pRecord
|
||||||
|
* @param vlen the length of value
|
||||||
|
* @param sign ??
|
||||||
|
*/
|
||||||
|
int libp2p_record_make_put_record (char** record, size_t *rec_size, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign);
|
||||||
|
|
|
@ -116,7 +116,7 @@ ssize_t socket_read(int s, char *buf, size_t len, int flags)
|
||||||
|
|
||||||
/* Same reason as socket_read, but to send data instead of receive.
|
/* Same reason as socket_read, but to send data instead of receive.
|
||||||
*/
|
*/
|
||||||
ssize_t socket_write(int s, char *buf, size_t len, int flags)
|
ssize_t socket_write(int s, const char *buf, size_t len, int flags)
|
||||||
{
|
{
|
||||||
return send(s, buf, len, flags);
|
return send(s, buf, len, flags);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#include "mh/hashes.h"
|
#include "mh/hashes.h"
|
||||||
#include "mh/multihash.h"
|
#include "mh/multihash.h"
|
||||||
|
|
||||||
|
#define RECORD_BUFSIZE 6048
|
||||||
|
|
||||||
// libp2p_record_make_put_record creates and signs a dht record for the given key/value pair
|
// libp2p_record_make_put_record creates and signs a dht record for the given key/value pair
|
||||||
int libp2p_record_make_put_record (char** record, size_t *rec_size, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign)
|
int libp2p_record_make_put_record (char** record, size_t *rec_size, struct RsaPrivateKey* sk, char* key, char* value, size_t vlen, int sign)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include "libp2p/secio/secio.h"
|
#include "libp2p/secio/secio.h"
|
||||||
#include "libp2p/net/multistream.h"
|
#include "libp2p/net/multistream.h"
|
||||||
|
#include "libp2p/net/p2pnet.h"
|
||||||
|
|
||||||
int test_secio_handshake() {
|
int test_secio_handshake() {
|
||||||
int retVal = 0;
|
int retVal = 0;
|
||||||
|
|
Loading…
Reference in a new issue