****
***/
-void
+tr_announce_list_err
tr_torrentSetAnnounceList( tr_torrent * tor,
const tr_tracker_info * trackers,
int trackerCount )
{
+ int i, j;
tr_benc metainfo;
assert( tr_isTorrent( tor ) );
+ /* look for bad URLs */
+ for( i=0; i<trackerCount; ++i )
+ if( !tr_httpIsValidURL( trackers[i].announce ) )
+ return TR_ANNOUNCE_LIST_HAS_BAD;
+
+ /* look for duplicates */
+ for( i=0; i<trackerCount; ++i )
+ for( j=0; j<trackerCount; ++j )
+ if( ( i != j )
+ && ( trackers[i].tier == trackers[j].tier)
+ && ( !strcmp( trackers[i].announce, trackers[j].announce ) ) )
+ return TR_ANNOUNCE_LIST_HAS_DUPLICATES;
+
/* save to the .torrent file */
if( !tr_bencLoadFile( &metainfo, TR_FMT_BENC, tor->info.torrent ) )
{
/* tell the announcer to reload this torrent's tracker list */
tr_announcerResetTorrent( tor->session->announcer, tor );
}
+
+ return TR_ANNOUNCE_LIST_OK;
}
/**
}
tr_tracker_info;
+
+typedef enum
+{
+ TR_ANNOUNCE_LIST_OK,
+ TR_ANNOUNCE_LIST_HAS_DUPLICATES,
+ TR_ANNOUNCE_LIST_HAS_BAD
+}
+tr_announce_list_err;
+
/**
* @brief Modify a torrent's tracker list.
*
* libtransmission derives `scrape' from `announce'.
* @param trackerCount size of the `trackers' array
*/
-void tr_torrentSetAnnounceList( tr_torrent * torrent,
- const tr_tracker_info * trackers,
- int trackerCount );
+tr_announce_list_err
+tr_torrentSetAnnounceList( tr_torrent * torrent,
+ const tr_tracker_info * trackers,
+ int trackerCount );
/**