|
|
|
|
@ -85,6 +85,7 @@ int bencode_buffer_init(bencode_buffer_t *buf) {
|
|
|
|
|
if (!buf->pieces)
|
|
|
|
|
return -1;
|
|
|
|
|
buf->free_list = NULL;
|
|
|
|
|
buf->error = 0;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -92,14 +93,19 @@ static void *__bencode_alloc(bencode_buffer_t *buf, unsigned int size) {
|
|
|
|
|
struct __bencode_buffer_piece *piece;
|
|
|
|
|
void *ret;
|
|
|
|
|
|
|
|
|
|
if (buf->error)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
piece = buf->pieces;
|
|
|
|
|
|
|
|
|
|
if (size <= piece->left)
|
|
|
|
|
goto alloc;
|
|
|
|
|
|
|
|
|
|
piece = __bencode_piece_new(size);
|
|
|
|
|
if (!piece)
|
|
|
|
|
if (!piece) {
|
|
|
|
|
buf->error = 1;
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
piece->next = buf->pieces;
|
|
|
|
|
buf->pieces = piece;
|
|
|
|
|
|
|
|
|
|
@ -157,6 +163,11 @@ bencode_item_t *bencode_list(bencode_buffer_t *buf) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void __bencode_container_add(bencode_item_t *parent, bencode_item_t *child) {
|
|
|
|
|
if (!parent)
|
|
|
|
|
return;
|
|
|
|
|
if (!child)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
assert(child->parent == NULL);
|
|
|
|
|
assert(child->sibling == NULL);
|
|
|
|
|
|
|
|
|
|
@ -221,9 +232,9 @@ bencode_item_t *bencode_integer(bencode_buffer_t *buf, long long int i) {
|
|
|
|
|
bencode_item_t *bencode_dictionary_add_len(bencode_item_t *dict, const char *key, int keylen, bencode_item_t *val) {
|
|
|
|
|
bencode_item_t *str;
|
|
|
|
|
|
|
|
|
|
assert(dict->type == BENCODE_DICTIONARY);
|
|
|
|
|
if (!val)
|
|
|
|
|
if (!dict || !val)
|
|
|
|
|
return NULL;
|
|
|
|
|
assert(dict->type == BENCODE_DICTIONARY);
|
|
|
|
|
|
|
|
|
|
str = bencode_string_len(dict->buffer, key, keylen);
|
|
|
|
|
if (!str)
|
|
|
|
|
@ -234,6 +245,8 @@ bencode_item_t *bencode_dictionary_add_len(bencode_item_t *dict, const char *key
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bencode_item_t *bencode_list_add(bencode_item_t *list, bencode_item_t *item) {
|
|
|
|
|
if (!list || !item)
|
|
|
|
|
return NULL;
|
|
|
|
|
assert(list->type == BENCODE_LIST);
|
|
|
|
|
__bencode_container_add(list, item);
|
|
|
|
|
return item;
|
|
|
|
|
@ -309,7 +322,8 @@ static int __bencode_str_dump(char *out, bencode_item_t *item) {
|
|
|
|
|
struct iovec *bencode_iovec(bencode_item_t *root, int *cnt, unsigned int head, unsigned int tail) {
|
|
|
|
|
struct iovec *ret;
|
|
|
|
|
|
|
|
|
|
assert(root != NULL);
|
|
|
|
|
if (!root)
|
|
|
|
|
return NULL;
|
|
|
|
|
assert(cnt != NULL);
|
|
|
|
|
assert(root->iov_cnt > 0);
|
|
|
|
|
|
|
|
|
|
@ -324,7 +338,8 @@ char *bencode_collapse(bencode_item_t *root, int *len) {
|
|
|
|
|
char *ret;
|
|
|
|
|
int l;
|
|
|
|
|
|
|
|
|
|
assert(root != NULL);
|
|
|
|
|
if (!root)
|
|
|
|
|
return NULL;
|
|
|
|
|
assert(root->str_len > 0);
|
|
|
|
|
|
|
|
|
|
ret = __bencode_alloc(root->buffer, root->str_len + 1);
|
|
|
|
|
@ -340,7 +355,8 @@ char *bencode_collapse_dup(bencode_item_t *root, int *len) {
|
|
|
|
|
char *ret;
|
|
|
|
|
int l;
|
|
|
|
|
|
|
|
|
|
assert(root != NULL);
|
|
|
|
|
if (!root)
|
|
|
|
|
return NULL;
|
|
|
|
|
assert(root->str_len > 0);
|
|
|
|
|
|
|
|
|
|
ret = BENCODE_MALLOC(root->str_len + 1);
|
|
|
|
|
|