/* * DAT format: "000.000.000.000 - 000.255.255.255 , 000 , invalid ip" * http://wiki.phoenixlabs.org/wiki/DAT_Format */ static bool parseLine2 (const char * line, struct tr_ipv4_range * range) { int unk; int a[4]; int b[4]; char str[32]; tr_address addr; if (sscanf (line, "%3d.%3d.%3d.%3d - %3d.%3d.%3d.%3d , %3d , ", &a[0], &a[1], &a[2], &a[3], &b[0], &b[1], &b[2], &b[3], &unk) != 9) return false; tr_snprintf (str, sizeof (str), "%d.%d.%d.%d", a[0], a[1], a[2], a[3]); if (!tr_address_from_string (&addr, str)) return false; range->begin = ntohl (addr.addr.addr4.s_addr); tr_snprintf (str, sizeof (str), "%d.%d.%d.%d", b[0], b[1], b[2], b[3]); if (!tr_address_from_string (&addr, str)) return false; range->end = ntohl (addr.addr.addr4.s_addr); return true; }
/* * P2P plaintext format: "comment:x.x.x.x-y.y.y.y" * http://wiki.phoenixlabs.org/wiki/P2P_Format * http://en.wikipedia.org/wiki/PeerGuardian#P2P_plaintext_format */ static bool parseLine1 (const char * line, struct tr_ipv4_range * range) { char * walk; int b[4]; int e[4]; char str[64]; tr_address addr; walk = strrchr (line, ':'); if (!walk) return false; ++walk; /* walk past the colon */ if (sscanf (walk, "%d.%d.%d.%d-%d.%d.%d.%d", &b[0], &b[1], &b[2], &b[3], &e[0], &e[1], &e[2], &e[3]) != 8) return false; tr_snprintf (str, sizeof (str), "%d.%d.%d.%d", b[0], b[1], b[2], b[3]); if (!tr_address_from_string (&addr, str)) return false; range->begin = ntohl (addr.addr.addr4.s_addr); tr_snprintf (str, sizeof (str), "%d.%d.%d.%d", e[0], e[1], e[2], e[3]); if (!tr_address_from_string (&addr, str)) return false; range->end = ntohl (addr.addr.addr4.s_addr); return true; }
int main (void) { #if 0 uint32_t i; uint8_t infohash[SHA_DIGEST_LENGTH]; struct tr_address addr; tr_piece_index_t pieceCount = 1313; size_t numwant; size_t numgot; tr_piece_index_t pieces[] = { 1059, 431, 808, 1217, 287, 376, 1188, 353, 508 }; tr_piece_index_t buf[16]; for (i = 0; i < SHA_DIGEST_LENGTH; ++i) infohash[i] = 0xaa; tr_address_from_string (&addr, "80.4.4.200"); numwant = 7; numgot = tr_generateAllowedSet (buf, numwant, pieceCount, infohash, &addr); check (numgot == numwant); for (i=0; i<numgot; ++i) check (buf[i] == pieces[i]); numwant = 9; numgot = tr_generateAllowedSet (buf, numwant, pieceCount, infohash, &addr); check (numgot == numwant); for (i=0; i<numgot; ++i) check (buf[i] == pieces[i]); #endif return 0; }
static bool address_is_blocked (tr_session * session, const char * address_str) { struct tr_address addr; tr_address_from_string (&addr, address_str); return tr_sessionIsAddressBlocked (session, &addr); }
static tr_pex* listToPex (tr_variant * peerList, size_t * setme_len) { size_t i; size_t n; const size_t len = tr_variantListSize (peerList); tr_pex * pex = tr_new0 (tr_pex, len); for (i=n=0; i<len; ++i) { int64_t port; const char * ip; tr_address addr; tr_variant * peer = tr_variantListChild (peerList, i); if (peer == NULL) continue; if (!tr_variantDictFindStr (peer, TR_KEY_ip, &ip, NULL)) continue; if (!tr_address_from_string (&addr, ip)) continue; if (!tr_variantDictFindInt (peer, TR_KEY_port, &port)) continue; if ((port < 0) || (port > USHRT_MAX)) continue; if (!tr_address_is_valid_for_peers (&addr, port)) continue; pex[n].addr = addr; pex[n].port = htons ((uint16_t)port); ++n; } *setme_len = n; return pex; }
static int testBlockList (void) { const char * tmpfile_txt = TEMPFILE_TXT; const char * tmpfile_bin = TEMPFILE_BIN; struct tr_address addr; tr_blocklist * b; remove (tmpfile_txt); remove (tmpfile_bin); b = _tr_blocklistNew (tmpfile_bin, true); createTestBlocklist (tmpfile_txt); _tr_blocklistSetContent (b, tmpfile_txt); /* now run some tests */ check (tr_address_from_string (&addr, "216.16.1.143")); check (!_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.144")); check (_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.145")); check (_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.146")); check (_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.147")); check (_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.148")); check (_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.149")); check (_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.150")); check (_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.151")); check (_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.152")); check (!_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "216.16.1.153")); check (!_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "217.0.0.1")); check (!_tr_blocklistHasAddress (b, &addr)); check (tr_address_from_string (&addr, "255.0.0.1")); /* cleanup */ _tr_blocklistFree (b); remove (tmpfile_txt); remove (tmpfile_bin); return 0; }
int main( void ) { #ifndef WIN32 const char * tmpfile_txt = "/tmp/transmission-blocklist-test.txt"; const char * tmpfile_bin = "/tmp/transmission-blocklist-test.bin"; #else const char * tmpfile_txt = "transmission-blocklist-test.txt"; const char * tmpfile_bin = "transmission-blocklist-test.bin"; #endif struct tr_address addr; int test = 0; tr_blocklist * b; remove( tmpfile_txt ); remove( tmpfile_bin ); b = _tr_blocklistNew( tmpfile_bin, true ); createTestBlocklist( tmpfile_txt ); _tr_blocklistSetContent( b, tmpfile_txt ); /* now run some tests */ check( tr_address_from_string( &addr, "216.16.1.143" ) ); check( !_tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.144" ) ); check( _tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.145" ) ); check( _tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.146" ) ); check( _tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.147" ) ); check( _tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.148" ) ); check( _tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.149" ) ); check( _tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.150" ) ); check( _tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.151" ) ); check( _tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.152" ) ); check( !_tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "216.16.1.153" ) ); check( !_tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "217.0.0.1" ) ); check( !_tr_blocklistHasAddress( b, &addr ) ); check( tr_address_from_string( &addr, "255.0.0.1" ) ); /* cleanup */ _tr_blocklistFree( b ); remove( tmpfile_txt ); remove( tmpfile_bin ); return 0; }