]> granicus.if.org Git - transmission/commitdiff
benc cleanup
authorCharles Kerr <charles@transmissionbt.com>
Fri, 18 Apr 2008 16:23:59 +0000 (16:23 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Fri, 18 Apr 2008 16:23:59 +0000 (16:23 +0000)
daemon/torrents.c
libtransmission/bencode.c
libtransmission/bencode.h
libtransmission/ipcparse.c
libtransmission/makemeta.c
libtransmission/resume.c
libtransmission/stats.c

index d3a941f61fe3cbdd39c32a0ded24e58064eade7e..b50b347217d0708e34ebe58f84f70d1f0c2dc6fa 100644 (file)
@@ -660,25 +660,15 @@ loadstate( void )
 {
     const char * str;
     int64_t      tmp;
-    uint8_t   *  buf;
-    size_t       len;
     benc_val_t   top, * list;
     int          ii;
     struct tor * tor;
 
-    buf = readfile( gl_state, &len );
-    if( NULL == buf )
+    if( tr_bencLoadFile( gl_state, &top ) )
     {
-        return -1;
-    }
-
-    if( tr_bencLoad( buf, len, &top, NULL ) )
-    {
-        free( buf );
         errmsg( "failed to load bencoded data from %s", gl_state );
         return -1;
     }
-    free( buf );
 
     if( tr_bencDictFindInt( &top, "autostart", &tmp ) )
         gl_autostart = tmp != 0;
@@ -751,79 +741,41 @@ loadstate( void )
 int
 savestate( void )
 {
-    benc_val_t   top, * list, * tor;
+    benc_val_t   top, * list;
     struct tor * ii;
-    uint8_t    * buf;
-    int          len;
-
-    tr_bencInit( &top, TYPE_DICT );
-    if( tr_bencDictReserve( &top, 9 ) )
-    {
-      nomem:
-        tr_bencFree( &top );
-        errmsg( "failed to save state: failed to allocate memory" );
-        return -1;
-    }
-    tr_bencInitInt( tr_bencDictAdd( &top, "autostart" ),      gl_autostart );
-    tr_bencInitInt( tr_bencDictAdd( &top, "port" ),           gl_port );
-    tr_bencInitInt( tr_bencDictAdd( &top, "default-pex" ),    gl_pex );
-    tr_bencInitInt( tr_bencDictAdd( &top, "port-mapping" ),   gl_mapping );
-    tr_bencInitInt( tr_bencDictAdd( &top, "upload-limit" ),   gl_uplimit );
-    tr_bencInitInt( tr_bencDictAdd( &top, "download-limit" ), gl_downlimit );
-    tr_bencInitStr( tr_bencDictAdd( &top, "default-directory" ),
-                    gl_dir, -1, 1 );
-    if(TR_ENCRYPTION_REQUIRED == gl_crypto)
-        tr_bencInitStr(tr_bencDictAdd(&top, "encryption-mode"), "required", -1, 1);
-    else
-        tr_bencInitStr(tr_bencDictAdd(&top, "encryption-mode"), "preferred", -1, 1);
-    list = tr_bencDictAdd( &top, "torrents" );
-    tr_bencInit( list, TYPE_LIST );
-
-    len = 0;
+    int          torrentCount;
+    torrentCount = 0;
     RB_FOREACH( ii, tortree, &gl_tree )
-    {
-        len++;
-    }
-    if( tr_bencListReserve( list, len ) )
-    {
-        goto nomem;
-    }
+        ++torrentCount;
+
+    tr_bencInitDict( &top, 9 );
+    tr_bencDictAddInt( &top, "autostart",         gl_autostart );
+    tr_bencDictAddInt( &top, "port",              gl_port );
+    tr_bencDictAddInt( &top, "default-pex",       gl_pex );
+    tr_bencDictAddInt( &top, "port-mapping",      gl_mapping );
+    tr_bencDictAddInt( &top, "upload-limit",      gl_uplimit );
+    tr_bencDictAddInt( &top, "download-limit",    gl_downlimit );
+    tr_bencDictAddStr( &top, "default-directory", gl_dir );
+    tr_bencDictAddStr( &top, "encryption-mode",   TR_ENCRYPTION_REQUIRED == gl_crypto
+                                                  ? "required" : "preferred" );
+    list = tr_bencDictAddList( &top, "torrents", torrentCount );
 
     RB_FOREACH( ii, tortree, &gl_tree )
     {
-        const tr_info * inf;
-        const tr_stat * st;
-        tor = tr_bencListAdd( list );
-        assert( NULL != tor );
-        tr_bencInit( tor, TYPE_DICT );
-        inf    = tr_torrentInfo( ii->tor );
-        st     = tr_torrentStat( ii->tor );
-        if( tr_bencDictReserve( tor, 3 ) )
-        {
-            goto nomem;
-        }
-        tr_bencInitStr( tr_bencDictAdd( tor, "hash" ),
-                        inf->hashString, 2 * SHA_DIGEST_LENGTH, 1 );
-        tr_bencInitInt( tr_bencDictAdd( tor, "paused" ),
-                        !TR_STATUS_IS_ACTIVE( st->status ) );
-        tr_bencInitStr( tr_bencDictAdd( tor, "directory" ),
-                        tr_torrentGetFolder( ii->tor ), -1, 1 );
-    }
-
-    buf = ( uint8_t * )tr_bencSave( &top, &len );
-    SAFEBENCFREE( &top );
-    if( NULL == buf )
-    {
-        errnomsg( "failed to save state: bencoding failed" );
-        return -1;
+        const tr_info * inf = tr_torrentInfo( ii->tor );
+        const tr_stat * st  = tr_torrentStat( ii->tor );
+        tr_benc * tor = tr_bencListAddDict( list, 3 );
+        tr_bencDictAddStr( tor, "hash", inf->hashString );
+        tr_bencDictAddInt( tor, "paused", !TR_STATUS_IS_ACTIVE( st->status ) );
+        tr_bencDictAddStr( tor, "directory", tr_torrentGetFolder( ii->tor ) );
     }
 
-    if( 0 > writefile( gl_newstate, buf, len ) )
+    if( tr_bencSaveFile( gl_newstate, &top ) )
     {
-        free( buf );
+        errnomsg( "failed to save state: failed to write to %s", gl_newstate );
         return -1;
     }
-    free( buf );
 
     if( 0 > rename( gl_newstate, gl_state ) )
     {
index ba34e448e50e83de92b2d60265833b29bfa0dc1e..fa53974b65ff20c7195fb55137824cfcf4ad0e3e 100644 (file)
@@ -450,38 +450,6 @@ tr_bencDictFindStr( tr_benc * dict, const char * key, const char ** setme )
     return found;
 }
 
-tr_benc*
-tr_bencDictAddInt( tr_benc * dict, const char * key, int64_t val )
-{
-    tr_benc * child = tr_bencDictAdd( dict, key );
-    tr_bencInitInt( child, val );
-    return child;
-}
-
-tr_benc*
-tr_bencDictAddStr( tr_benc * dict, const char * key, const char * val )
-{
-    tr_benc * child = tr_bencDictAdd( dict, key );
-    tr_bencInitStrDup( child, val );
-    return child;
-}
-
-tr_benc*
-tr_bencDictAddList( tr_benc * dict, const char * key, int reserveCount )
-{
-    tr_benc * child = tr_bencDictAdd( dict, key );
-    tr_bencInitList( child, reserveCount );
-    return child;
-}
-
-tr_benc*
-tr_bencDictAddDict( tr_benc * dict, const char * key, int reserveCount )
-{
-    tr_benc * child = tr_bencDictAdd( dict, key );
-    tr_bencInitDict( child, reserveCount );
-    return child;
-}
-
 /***
 ****
 ***/
@@ -573,14 +541,34 @@ tr_bencListAdd( tr_benc * list )
 
     return item;
 }
-
 tr_benc *
-tr_bencListAddInt( tr_benc * list, int64_t i )
+tr_bencListAddInt( tr_benc * list, int64_t val )
+{
+    tr_benc * node = tr_bencListAdd( list );
+    tr_bencInitInt( node, val );
+    return node;
+}
+tr_benc *
+tr_bencListAddStr( tr_benc * list, const char * val )
 {
     tr_benc * node = tr_bencListAdd( list );
-    tr_bencInitInt( node, i );
+    tr_bencInitStrDup( node, val );
     return node;
 }
+tr_benc*
+tr_bencListAddList( tr_benc * list, int reserveCount )
+{
+    tr_benc * child = tr_bencListAdd( list );
+    tr_bencInitList( child, reserveCount );
+    return child;
+}
+tr_benc*
+tr_bencListAddDict( tr_benc * list, int reserveCount )
+{
+    tr_benc * child = tr_bencListAdd( list );
+    tr_bencInitDict( child, reserveCount );
+    return child;
+}
 
 tr_benc *
 tr_bencDictAdd( tr_benc * dict, const char * key )
@@ -598,6 +586,41 @@ tr_bencDictAdd( tr_benc * dict, const char * key )
 
     return itemval;
 }
+tr_benc*
+tr_bencDictAddInt( tr_benc * dict, const char * key, int64_t val )
+{
+    tr_benc * child = tr_bencDictAdd( dict, key );
+    tr_bencInitInt( child, val );
+    return child;
+}
+tr_benc*
+tr_bencDictAddStr( tr_benc * dict, const char * key, const char * val )
+{
+    tr_benc * child = tr_bencDictAdd( dict, key );
+    tr_bencInitStrDup( child, val );
+    return child;
+}
+tr_benc*
+tr_bencDictAddList( tr_benc * dict, const char * key, int reserveCount )
+{
+    tr_benc * child = tr_bencDictAdd( dict, key );
+    tr_bencInitList( child, reserveCount );
+    return child;
+}
+tr_benc*
+tr_bencDictAddDict( tr_benc * dict, const char * key, int reserveCount )
+{
+    tr_benc * child = tr_bencDictAdd( dict, key );
+    tr_bencInitDict( child, reserveCount );
+    return child;
+}
+tr_benc*
+tr_bencDictAddRaw( tr_benc * dict, const char * key, const void * src, size_t len )
+{
+    tr_benc * child = tr_bencDictAdd( dict, key );
+    tr_bencInitRaw( child, src, len );
+    return child;
+}
 
 /***
 ****  BENC WALKING
index 6d1a2d0957fa68419f7dfe3f78f3610416fe8bf5..38244d20d88ebe934d1a5db4dfdaa14591fb0bc1 100644 (file)
@@ -101,12 +101,16 @@ int   tr_bencListReserve( tr_benc * list, int count );
 int   tr_bencDictReserve( tr_benc * dict, int count );
 tr_benc    * tr_bencListAdd( tr_benc  * list );
 tr_benc    * tr_bencListAddInt( tr_benc  * list, int64_t val );
+tr_benc    * tr_bencListAddStr( tr_benc  * list, const char * val );
+tr_benc    * tr_bencListAddList( tr_benc  * list, int reserveCount );
+tr_benc    * tr_bencListAddDict( tr_benc  * list, int reserveCount );
 /* note: key must not be freed or modified while val is in use */
 tr_benc    * tr_bencDictAdd( tr_benc * dict, const char * key );
 tr_benc    * tr_bencDictAddInt( tr_benc * dict, const char * key, int64_t val );
 tr_benc    * tr_bencDictAddStr( tr_benc * dict, const char * key, const char * val );
 tr_benc    * tr_bencDictAddList( tr_benc * dict, const char * key, int reserveCount );
 tr_benc    * tr_bencDictAddDict( tr_benc * dict, const char * key, int reserveCount );
+tr_benc    * tr_bencDictAddRaw( tr_benc * dict, const char * key, const void *, size_t len );
 
 char*  tr_bencSave( const tr_benc * val, int * len );
 char*  tr_bencSaveAsSerializedPHP( const tr_benc * top, int * len );
index e9a37ea29291da8fae386a8a28c9d76f3a9341fe..a7e711ede47673170d424af720f0d4f3e7782dc1 100644 (file)
@@ -296,10 +296,10 @@ ipc_initval( const struct ipc_info * session,
     else
     {
         tr_bencInitList( pk, 3 );
-        tr_bencInitStr( tr_bencListAdd( pk ), MSGNAME( msg_id ), -1, 1 );
+        tr_bencListAddStr( pk, MSGNAME( msg_id ) );
         ret = tr_bencListAdd( pk );
         if( 0 < tag )
-            tr_bencInitInt( tr_bencListAdd( pk ), tag );
+            tr_bencListAddInt( pk, tag );
     }
 
     tr_bencInit( ret, benc_type );
@@ -409,13 +409,11 @@ ipc_mkvers( size_t * len, const char * label )
     uint8_t  * ret;
   
     tr_bencInitDict( &pk, 1 );
-    dict = tr_bencDictAdd( &pk, MSGNAME( IPC_MSG_VERSION ) );
-
-    tr_bencInitDict( dict, 3 );
-    tr_bencInitInt( tr_bencDictAdd( dict, "min" ), PROTO_VERS_MIN );
-    tr_bencInitInt( tr_bencDictAdd( dict, "max" ), PROTO_VERS_MAX );
+    dict = tr_bencDictAddDict( &pk, MSGNAME( IPC_MSG_VERSION ), 3 );
+    tr_bencDictAddInt( dict, "min", PROTO_VERS_MIN );
+    tr_bencDictAddInt( dict, "max", PROTO_VERS_MAX );
     if( label )
-        tr_bencInitStr( tr_bencDictAdd( dict, "label" ), label, -1, 1 );
+        tr_bencDictAddStr( dict, "label", label );
 
     ret = ipc_serialize( &pk, len );
     SAFEBENCFREE( &pk );
@@ -486,7 +484,7 @@ ipc_createInfoRequest( const struct ipc_info * session,
         for( ii = 0; TORRENT_ID_VALID( ids[ii] ); ii++ ) { }
         tr_bencInitList( idlist, ii );
         for( ii = 0; TORRENT_ID_VALID( ids[ii] ); ii++ )
-            tr_bencInitInt( tr_bencListAdd( idlist ), ids[ii] );
+            tr_bencListAddInt( idlist, ids[ii] );
     }
 
     /* get the type name array */
@@ -533,11 +531,11 @@ static void
 filltracker( tr_benc * val, const tr_tracker_info * tk )
 {
     tr_bencInitDict( val, 4 );
-    tr_bencInitStr( tr_bencDictAdd( val, "address" ),  tk->address,  -1, 1 );
-    tr_bencInitInt( tr_bencDictAdd( val, "port" ),     tk->port );
-    tr_bencInitStr( tr_bencDictAdd( val, "announce" ), tk->announce, -1, 1 );
+    tr_bencDictAddStr( val, "address",  tk->address );
+    tr_bencDictAddInt( val, "port",     tk->port );
+    tr_bencDictAddStr( val, "announce", tk->announce );
     if( tk->scrape )
-        tr_bencInitStr( tr_bencDictAdd( val, "scrape" ), tk->scrape, -1, 1 );
+        tr_bencDictAddStr( val, "scrape", tk->scrape );
 }
 
 /**
index 6f4e900db257f71735876e5ac8b9e73868235423..3b667002e45a10496c08d749f98b311c3d00f4e2 100644 (file)
@@ -274,7 +274,6 @@ getFileInfo( const char                      * topFile,
              tr_benc                         * uninitialized_length,
              tr_benc                         * uninitialized_path )
 {
-    tr_benc *sub;
     const char *pch, *prev;
     const size_t topLen = strlen(topFile) + 1; /* +1 for '/' */
     int n;
@@ -298,8 +297,7 @@ getFileInfo( const char                      * topFile,
         memcpy( buf, prev, pch-prev );
         buf[pch-prev] = '\0';
 
-        sub = tr_bencListAdd( uninitialized_path );
-        tr_bencInitStrDup( sub, buf );
+        tr_bencListAddStr( uninitialized_path, buf );
 
         prev = pch + 1;
         if (!*pch)
@@ -307,114 +305,72 @@ getFileInfo( const char                      * topFile,
     }
 }
 
-static void
-makeFilesList( tr_benc                    * list,
-               const tr_metainfo_builder  * builder )
-{
-    uint32_t i = 0;
-
-    tr_bencListReserve( list, builder->fileCount );
-
-    for( i=0; i<builder->fileCount; ++i )
-    {
-        tr_benc * dict = tr_bencListAdd( list );
-        tr_benc *length, *pathVal;
-
-        tr_bencInitDict( dict, 2 );
-        length = tr_bencDictAdd( dict, "length" );
-        pathVal = tr_bencDictAdd( dict, "path" );
-        getFileInfo( builder->top, &builder->files[i], length, pathVal );
-    }
-}
-
 static void
 makeInfoDict ( tr_benc              * dict,
                tr_metainfo_builder  * builder )
 {
     uint8_t * pch;
-    tr_benc * val;
     char base[MAX_PATH_LENGTH];
 
     tr_bencDictReserve( dict, 5 );
     
     if ( builder->isSingleFile )
-    {
-        val = tr_bencDictAdd( dict, "length" );
-        tr_bencInitInt( val, builder->files[0].size );
-    }
-    else
-    {
-        val = tr_bencDictAdd( dict, "files" );
-        tr_bencInit( val, TYPE_LIST );
-        makeFilesList( val, builder );
+        tr_bencDictAddInt( dict, "length", builder->files[0].size );
+    else {
+        uint32_t i;
+        tr_benc * list = tr_bencDictAddList( dict, "files", builder->fileCount );
+        for( i=0; i<builder->fileCount; ++i ) {
+            tr_benc * dict = tr_bencListAddDict( list, 2 );
+            tr_benc * length = tr_bencDictAdd( dict, "length" );
+            tr_benc * pathVal = tr_bencDictAdd( dict, "path" );
+            getFileInfo( builder->top, &builder->files[i], length, pathVal );
+        }
     }
 
-    val = tr_bencDictAdd( dict, "name" );
     strlcpy( base, builder->top, sizeof( base ) );
-    tr_bencInitStrDup ( val, basename( base ) );
+    tr_bencDictAddStr( dict, "name", basename( base ) );
 
-    val = tr_bencDictAdd( dict, "piece length" );
-    tr_bencInitInt( val, builder->pieceSize );
+    tr_bencDictAddInt( dict, "piece length", builder->pieceSize );
 
-    if( ( pch = getHashInfo( builder ) ) ) {
-        val = tr_bencDictAdd( dict, "pieces" );
-        tr_bencInitStr( val, pch, SHA_DIGEST_LENGTH * builder->pieceCount, 0 );
+    if(( pch = getHashInfo( builder ))) {
+        tr_bencDictAddRaw( dict, "pieces", pch, SHA_DIGEST_LENGTH * builder->pieceCount );
+        tr_free( pch );
     }
 
-    val = tr_bencDictAdd( dict, "private" );
-    tr_bencInitInt( val, builder->isPrivate ? 1 : 0 );
+    tr_bencDictAddInt( dict, "private", builder->isPrivate ? 1 : 0 );
 }
 
 static void
 tr_realMakeMetaInfo ( tr_metainfo_builder * builder )
 {
     int n = 5;
-    tr_benc top, *val;
+    tr_benc top;
 
     if ( builder->comment && *builder->comment ) ++n;
     tr_bencInitDict( &top, n );
 
-    val = tr_bencDictAdd( &top, "announce" );
-    tr_bencInitStrDup( val, builder->announce );
+    tr_bencDictAddStr( &top, "announce", builder->announce );
+
     if( tr_httpParseURL( builder->announce, -1, NULL, NULL, NULL ) )
-    {
         builder->result = TR_MAKEMETA_URL;
-    }
     
     if( !builder->result && !builder->abortFlag )
     {
-        if( builder->comment && *builder->comment ) {
-            val = tr_bencDictAdd( &top, "comment" );
-            tr_bencInitStrDup( val, builder->comment );
-        }
-
-        val = tr_bencDictAdd( &top, "created by" );
-        tr_bencInitStrDup( val, TR_NAME "/" LONG_VERSION_STRING );
-
-        val = tr_bencDictAdd( &top, "creation date" );
-        tr_bencInitInt( val, time(0) );
-
-        val = tr_bencDictAdd( &top, "encoding" );
-        tr_bencInitStrDup( val, "UTF-8" );
-
-        val = tr_bencDictAdd( &top, "info" );
-        tr_bencInitDict( val, 666 );
-        makeInfoDict( val, builder );
+        if( builder->comment && *builder->comment )
+            tr_bencDictAddStr( &top, "comment", builder->comment );
+        tr_bencDictAddStr( &top, "created by", TR_NAME "/" LONG_VERSION_STRING );
+        tr_bencDictAddInt( &top, "creation date", time(0) );
+        tr_bencDictAddStr( &top, "encoding", "UTF-8" );
+        makeInfoDict( tr_bencDictAddDict( &top, "info", 666 ), builder );
     }
 
     /* save the file */
     if ( !builder->result && !builder->abortFlag ) {
-        char * pch = tr_bencSave( &top, &n );
-        FILE * fp = fopen( builder->outputFile, "wb+" );
-        size_t nmemb = n;
-        if( !fp || ( fwrite( pch, 1, nmemb, fp ) != nmemb ) ) {
+        if( tr_bencSaveFile( builder->outputFile, &top ) ) {
             builder->my_errno = errno;
             strlcpy( builder->errfile, builder->outputFile, sizeof( builder->errfile ) );
             builder->result = TR_MAKEMETA_IO_WRITE;
         }
-        if( fp )
-            fclose( fp );
-        tr_free( pch );
     }
 
     /* cleanup */
index 70f40a2024d778f301b123266726288bc416680a..fd98bfdd88a86c9bacc2af0a65851a37eb9dacde 100644 (file)
@@ -109,7 +109,7 @@ saveDND( tr_benc * dict, const tr_torrent * tor )
 
     list = tr_bencDictAddList( dict, KEY_DND, n );
     for( i=0; i<n; ++i )
-        tr_bencInitInt( tr_bencListAdd( list ), inf->files[i].dnd ? 1 : 0 );
+        tr_bencListAddInt( list, inf->files[i].dnd ? 1 : 0 );
 }
 
 static uint64_t
@@ -171,7 +171,7 @@ savePriorities( tr_benc * dict, const tr_torrent * tor )
 
     list = tr_bencDictAddList( dict, KEY_PRIORITY, n );
     for( i=0; i<n; ++i )
-        tr_bencInitInt( tr_bencListAdd( list ), inf->files[i].priority );
+        tr_bencListAddInt( list, inf->files[i].priority );
 }
 
 static uint64_t
index 44ba24ab2d55f87d9bfc5f267e3b5d37a6c58d7f..fa76baf04023a425821f148753eed79ce6bd414b 100644 (file)
@@ -28,14 +28,21 @@ struct tr_stats_handle
     time_t startTime;
 };
 
+static char*
+getFilename( const tr_handle * handle, char * buf, size_t buflen )
+{
+    tr_buildPath( buf, buflen, tr_getConfigDir(handle), "stats.benc", NULL );
+    return buf;
+}
+
 static void
-parseCumulativeStats( tr_session_stats  * setme,
-                      const uint8_t     * content,
-                      size_t              len )
+loadCumulativeStats( const tr_handle * handle, tr_session_stats * setme )
 {
+    char filename[MAX_PATH_LENGTH];
     tr_benc top;
 
-    if( !tr_bencLoad( content, len, &top, NULL ) )
+    getFilename( handle, filename, sizeof(filename) );
+    if( !tr_bencLoadFile( filename, &top ) )
     {
         int64_t i;
 
@@ -58,28 +65,6 @@ parseCumulativeStats( tr_session_stats  * setme,
     }
 }
 
-static char*
-getFilename( const tr_handle * handle, char * buf, size_t buflen )
-{
-    tr_buildPath( buf, buflen, tr_getConfigDir(handle), "stats.benc", NULL );
-    return buf;
-}
-
-static void
-loadCumulativeStats( const tr_handle * handle, tr_session_stats * setme )
-{
-    size_t len;
-    uint8_t * content;
-    char filename[MAX_PATH_LENGTH];
-
-    getFilename( handle, filename, sizeof(filename) );
-    content = tr_loadFile( filename, &len );
-    if( content != NULL )
-        parseCumulativeStats( setme, content, len );
-
-    tr_free( content );
-}
-
 static void
 saveCumulativeStats( const tr_handle * handle, const tr_session_stats * s )
 {
@@ -87,11 +72,11 @@ saveCumulativeStats( const tr_handle * handle, const tr_session_stats * s )
     tr_benc top;
 
     tr_bencInitDict( &top, 5 );
-    tr_bencInitInt( tr_bencDictAdd( &top, "uploaded-bytes" ), s->uploadedBytes );
-    tr_bencInitInt( tr_bencDictAdd( &top, "downloaded-bytes" ), s->downloadedBytes );
-    tr_bencInitInt( tr_bencDictAdd( &top, "files-added" ), s->filesAdded );
-    tr_bencInitInt( tr_bencDictAdd( &top, "session-count" ), s->sessionCount );
-    tr_bencInitInt( tr_bencDictAdd( &top, "seconds-active" ), s->secondsActive );
+    tr_bencDictAddInt( &top, "uploaded-bytes",   s->uploadedBytes );
+    tr_bencDictAddInt( &top, "downloaded-bytes", s->downloadedBytes );
+    tr_bencDictAddInt( &top, "files-added",      s->filesAdded );
+    tr_bencDictAddInt( &top, "session-count",    s->sessionCount );
+    tr_bencDictAddInt( &top, "seconds-active",   s->secondsActive );
 
     getFilename( handle, filename, sizeof(filename) );
     tr_bencSaveFile( filename, &top );