BEN *ben_dec_i(RAW * raw) { BEN *node = ben_init(BEN_INT); LONG i = 0; UCHAR *start = NULL; char buf[BUF_SIZE]; int run = 1; LONG prefix = 1; LONG result = 0; start = ++raw->p; if (*raw->p == '-') { prefix = -1; start = ++raw->p; } while (run) { switch (*raw->p) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': i++; raw->p++; break; case 'e': memcpy(buf, start, i); buf[i] = '\0'; result = strtol(buf, NULL, 10); raw->p++; run = 0; break; } } result = prefix * result; ben_int(node, result); return node; }
void cjdnsadmin_fetch_peers(cjdnsadmin_t *adm) { struct bencode *b = ben_dict(); struct bencode *args = ben_dict(); // TODO: fix memory leak ben_dict_set(b, ben_str("q"), ben_str("NodeStore_dumpTable")); ben_dict_set(b, ben_str("args"), args); ben_dict_set(args, ben_str("page"), ben_int(adm->fetch_peers_page)); uv_buf_t buf; static char msg[256]; buf.base = msg; buf.len = ben_encode2(msg, sizeof msg, b); AMNEW(uv_udp_send_t,writer); writer->data = b; uv_udp_send(writer, &adm->handle, &buf,1, adm->theaddr, on_written); }