]> granicus.if.org Git - transmission/commitdiff
more hacking on the bencoded resume files
authorCharles Kerr <charles@transmissionbt.com>
Tue, 15 Apr 2008 17:00:44 +0000 (17:00 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Tue, 15 Apr 2008 17:00:44 +0000 (17:00 +0000)
libtransmission/bencode.c
libtransmission/bencode.h
libtransmission/completion.c
libtransmission/resume.c
libtransmission/torrent.c

index 856c02f40f273061a36054fc1cc45898d32b5a14..ba34e448e50e83de92b2d60265833b29bfa0dc1e 100644 (file)
@@ -499,10 +499,20 @@ _tr_bencInitStr( tr_benc * val, char * str, int len, int nofree )
     val->val.s.i = len;
 }
 
+void
+tr_bencInitRaw( tr_benc * val, const void * src, size_t byteCount )
+{
+    tr_bencInit( val, TYPE_STR );
+    val->val.s.i = byteCount;
+    val->val.s.s = tr_new( char, byteCount );
+    val->val.s.nofree = 0;
+    memcpy( val->val.s.s, src, byteCount );
+}
+
 int
-tr_bencInitStrDupLen( tr_benc * val, const char * str, int len )
+tr_bencInitStrDup( tr_benc * val, const char * str )
 {
-    char * newStr = tr_strndup( str, len );
+    char * newStr = tr_strdup( str );
     if( newStr == NULL )
         return 1;
 
@@ -510,12 +520,6 @@ tr_bencInitStrDupLen( tr_benc * val, const char * str, int len )
     return 0;
 }
 
-int
-tr_bencInitStrDup( tr_benc * val, const char * str )
-{
-    return tr_bencInitStrDupLen( val, str, -1 );
-}
-
 void
 tr_bencInitInt( tr_benc * val, int64_t num )
 {
index f542c1c59bff3748dec736bd8469c7cfdaf826cc..6d1a2d0957fa68419f7dfe3f78f3610416fe8bf5 100644 (file)
@@ -91,6 +91,7 @@ static inline void tr_bencInit( tr_benc    * val, int type )
     _tr_bencInitStr( (a), ( char * )(b), (c), (d) )
 void   _tr_bencInitStr( tr_benc * val, char * str, int len, int nofree );
 int    tr_bencInitStrDup( tr_benc * val, const char * str );
+void   tr_bencInitRaw( tr_benc * val, const void * src, size_t byteCount );
 int    tr_bencInitStrDupLen( tr_benc * val, const char * str, int len );
 void   tr_bencInitInt( tr_benc * val, int64_t num );
 int   tr_bencInitDict( tr_benc * val, int reserveCount );
index 68d479724c44e222755381ebc3a332671e5492a6..aa9fc803e68fcd7f71d5555a3db4faf2dae19090 100644 (file)
@@ -230,9 +230,13 @@ tr_cpBlockAdd( tr_completion * cp, tr_block_index_t block )
     assert( cp->doneHave <= cp->completeHave );
 }
 
-const tr_bitfield * tr_cpBlockBitfield( const tr_completion * cp )
+const tr_bitfield *
+tr_cpBlockBitfield( const tr_completion * cp )
 {
-    assert( cp != NULL );
+    assert( cp );
+    assert( cp->blockBitfield );
+    assert( cp->blockBitfield->bits );
+    assert( cp->blockBitfield->len );
 
     return cp->blockBitfield;
 }
@@ -242,6 +246,11 @@ tr_cpBlockBitfieldSet( tr_completion * cp, tr_bitfield * bitfield )
 {
     tr_block_index_t i;
 
+    assert( cp );
+    assert( bitfield );
+    assert( cp->blockBitfield );
+    assert( cp->blockBitfield->len == bitfield->len );
+
     if( !cp || !bitfield || ( bitfield->len != cp->blockBitfield->len ) )
         return TR_ERROR_ASSERT;
 
index 9fa1630c5c7169387560bcc9f9cde7e1b82b23ef..492b7cc67abf8117416a773280d8c3a84c7ee4b8 100644 (file)
@@ -66,8 +66,7 @@ savePeers( tr_benc * dict, const tr_torrent * tor )
     const int count = tr_peerMgrGetPeers( tor->handle->peerMgr,
                                           tor->info.hash, &pex );
     if( count > 0 )
-        tr_bencInitStrDupLen( tr_bencDictAdd( dict, KEY_PEERS ),
-                              (const char*)pex, sizeof(tr_pex)*count );
+        tr_bencInitRaw( tr_bencDictAdd( dict, KEY_PEERS ), pex, sizeof(tr_pex)*count );
     tr_free( pex );
 }
 
@@ -268,7 +267,7 @@ saveProgress( tr_benc * dict, const tr_torrent * tor )
     /* add the bitfield */
     bitfield = tr_cpBlockBitfield( tor->completion );
     b = tr_bencDictAdd( p, KEY_PROGRESS_BITFIELD );
-    tr_bencInitStrDupLen( b, (const char*)bitfield->bits, bitfield->len );
+    tr_bencInitRaw( b, bitfield->bits, bitfield->len );
 
     /* cleanup */
     tr_free( mtimes );
index e086e78689c6c0f2bd650ea1618e15ed768cceed..f0610577b20791803355140402563023321730f8 100644 (file)
@@ -991,9 +991,9 @@ tr_torrentStop( tr_torrent * tor )
 {
     tr_globalLock( tor->handle );
 
+    tor->isRunning = 0;
     if( !tor->isDeleting )
         tr_torrentSaveResume( tor );
-    tor->isRunning = 0;
     tr_runInEventThread( tor->handle, stopTorrent, tor );
 
     tr_globalUnlock( tor->handle );