Fixed multiaddress_get_peer_id to return allocated memory
Returing in place causes problems with continuations i.e. ending slashes. Therefore it is better to return allocated memory.
This commit is contained in:
parent
f0961a247f
commit
603ed1d72f
5 changed files with 61 additions and 16 deletions
|
@ -1,11 +1,3 @@
|
||||||
//
|
|
||||||
// base58.h
|
|
||||||
// libp2p_xcode
|
|
||||||
//
|
|
||||||
// Created by John Jones on 11/7/16.
|
|
||||||
// Copyright © 2016 JMJAtlanta. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef base58_h
|
#ifndef base58_h
|
||||||
#define base58_h
|
#define base58_h
|
||||||
#include "varint.h"
|
#include "varint.h"
|
||||||
|
|
|
@ -83,7 +83,7 @@ int multiaddress_get_ip_port(const struct MultiAddress* in);
|
||||||
/**
|
/**
|
||||||
* Pulls the peer ID out of a multiaddress struct
|
* Pulls the peer ID out of a multiaddress struct
|
||||||
* @param in the MultiAddress
|
* @param in the MultiAddress
|
||||||
* @returns a pointer to the peer id string, or NULL
|
* @returns the peer id string, or NULL NOTE: This allocates memory that needs to be freed
|
||||||
*/
|
*/
|
||||||
char* multiaddress_get_peer_id(const struct MultiAddress* in);
|
char* multiaddress_get_peer_id(const struct MultiAddress* in);
|
||||||
|
|
||||||
|
|
26
multiaddr.c
26
multiaddr.c
|
@ -159,10 +159,28 @@ int multiaddress_get_ip_port(const struct MultiAddress* in) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char* multiaddress_get_peer_id(const struct MultiAddress* in) {
|
char* multiaddress_get_peer_id(const struct MultiAddress* in) {
|
||||||
char* ptr = strstr(in->string, "/ipfs/");
|
char* result = NULL;
|
||||||
if (ptr == NULL)
|
int str_len = 0;
|
||||||
return NULL;
|
char* slash = NULL;
|
||||||
return &ptr[6];
|
char* ptr = NULL;
|
||||||
|
|
||||||
|
ptr = strstr(in->string, "/ipfs/");
|
||||||
|
if (ptr != NULL && ptr[6] != 0) {
|
||||||
|
ptr += 6;
|
||||||
|
str_len = strlen(ptr);
|
||||||
|
slash = strchr(ptr, '/');
|
||||||
|
if (slash != NULL) {
|
||||||
|
str_len = slash - ptr;
|
||||||
|
}
|
||||||
|
if (str_len > 0) {
|
||||||
|
result = malloc(str_len + 1);
|
||||||
|
if (result != NULL) {
|
||||||
|
memset(result, 0, str_len);
|
||||||
|
memcpy(result, ptr, str_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void multiaddress_free(struct MultiAddress* in) {
|
void multiaddress_free(struct MultiAddress* in) {
|
||||||
|
|
|
@ -114,7 +114,7 @@ int test_multiaddr_peer_id() {
|
||||||
char full_string[255];
|
char full_string[255];
|
||||||
char* result = NULL;
|
char* result = NULL;
|
||||||
char* bytes = NULL;
|
char* bytes = NULL;
|
||||||
int retVal = 0;
|
int retVal = 0, port = 0;
|
||||||
struct MultiAddress *addr = NULL, *addr2 = NULL;
|
struct MultiAddress *addr = NULL, *addr2 = NULL;
|
||||||
|
|
||||||
sprintf(full_string, "/ip4/127.0.0.1/tcp/4001/ipfs/%s/", orig_address);
|
sprintf(full_string, "/ip4/127.0.0.1/tcp/4001/ipfs/%s/", orig_address);
|
||||||
|
@ -123,9 +123,10 @@ int test_multiaddr_peer_id() {
|
||||||
|
|
||||||
result = multiaddress_get_peer_id(addr);
|
result = multiaddress_get_peer_id(addr);
|
||||||
|
|
||||||
if (result == NULL || strncmp(result, orig_address, strlen(orig_address)) != 0)
|
if (result == NULL || strcmp(result, orig_address) != 0)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
free(result);
|
||||||
result = NULL;
|
result = NULL;
|
||||||
|
|
||||||
// switch to bytes and back again to verify the peer id follows...
|
// switch to bytes and back again to verify the peer id follows...
|
||||||
|
@ -155,12 +156,20 @@ int test_multiaddr_peer_id() {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
int port = multiaddress_get_ip_port(addr2);
|
port = multiaddress_get_ip_port(addr2);
|
||||||
if (port != 4001) {
|
if (port != 4001) {
|
||||||
fprintf(stderr, "Original string had port 4001, but now reporting %d\n", port);
|
fprintf(stderr, "Original string had port 4001, but now reporting %d\n", port);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = multiaddress_get_peer_id(addr2);
|
||||||
|
if (strcmp(result, orig_address) != 0) {
|
||||||
|
fprintf(stderr, "New peer id %s does not match %s", result, orig_address);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
free(result);
|
||||||
|
result = NULL;
|
||||||
|
|
||||||
retVal = 1;
|
retVal = 1;
|
||||||
exit:
|
exit:
|
||||||
if (addr != NULL)
|
if (addr != NULL)
|
||||||
|
@ -174,6 +183,30 @@ int test_multiaddr_peer_id() {
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int test_multiaddr_get_peer_id() {
|
||||||
|
char* orig_address = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";
|
||||||
|
char full_string[255];
|
||||||
|
char* result = NULL;
|
||||||
|
int retVal = 0;
|
||||||
|
struct MultiAddress *addr = NULL;
|
||||||
|
|
||||||
|
sprintf(full_string, "/ip4/127.0.0.1/tcp/4001/ipfs/%s/", orig_address);
|
||||||
|
|
||||||
|
addr = multiaddress_new_from_string(full_string);
|
||||||
|
|
||||||
|
result = multiaddress_get_peer_id(addr);
|
||||||
|
|
||||||
|
if (result == NULL || strcmp(result, orig_address) != 0)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
retVal = 1;
|
||||||
|
exit:
|
||||||
|
multiaddress_free(addr);
|
||||||
|
free(result);
|
||||||
|
result = NULL;
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
int test_multiaddr_bytes() {
|
int test_multiaddr_bytes() {
|
||||||
int retVal = 0;
|
int retVal = 0;
|
||||||
char* orig_address = "/ip4/127.0.0.1/tcp/4001/";
|
char* orig_address = "/ip4/127.0.0.1/tcp/4001/";
|
||||||
|
|
|
@ -9,6 +9,7 @@ const char* names[] = {
|
||||||
"test_int_to_hex",
|
"test_int_to_hex",
|
||||||
"test_multiaddr_utils",
|
"test_multiaddr_utils",
|
||||||
"test_multiaddr_peer_id",
|
"test_multiaddr_peer_id",
|
||||||
|
"test_multiaddr_get_peer_id",
|
||||||
"test_multiaddr_bytes"
|
"test_multiaddr_bytes"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@ int (*funcs[])(void) = {
|
||||||
test_int_to_hex,
|
test_int_to_hex,
|
||||||
test_multiaddr_utils,
|
test_multiaddr_utils,
|
||||||
test_multiaddr_peer_id,
|
test_multiaddr_peer_id,
|
||||||
|
test_multiaddr_get_peer_id,
|
||||||
test_multiaddr_bytes
|
test_multiaddr_bytes
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue