Changeset 9644


Ignore:
Timestamp:
Dec 1, 2009, 12:07:18 AM (12 years ago)
Author:
charles
Message:

(trunk) #2119 "daemon should reload settings.json on SIGHUP" -- reload the blocklists, too. Suggested by nano- in irc.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/daemon/daemon.c

    r9439 r9644  
    116116            tr_sessionSet( mySession, &settings );
    117117            tr_bencFree( &settings );
     118            tr_sessionReloadBlocklists( mySession );
    118119            break;
    119120        }
  • trunk/libtransmission/session.c

    r9642 r9644  
    225225****
    226226***/
    227 
    228 static int
    229 tr_stringEndsWith( const char * str, const char * end )
    230 {
    231     const size_t slen = strlen( str );
    232     const size_t elen = strlen( end );
    233 
    234     return slen >= elen && !memcmp( &str[slen - elen], end, elen );
    235 }
    236 
    237 static void
    238 loadBlocklists( tr_session * session )
    239 {
    240     int         binCount = 0;
    241     int         newCount = 0;
    242     struct stat sb;
    243     char      * dirname;
    244     DIR *       odir = NULL;
    245     tr_list *   list = NULL;
    246     const tr_bool   isEnabled = session->isBlocklistEnabled;
    247 
    248     /* walk through the directory and find blocklists */
    249     dirname = tr_buildPath( session->configDir, "blocklists", NULL );
    250     if( !stat( dirname,
    251                &sb ) && S_ISDIR( sb.st_mode )
    252       && ( ( odir = opendir( dirname ) ) ) )
    253     {
    254         struct dirent *d;
    255         for( d = readdir( odir ); d; d = readdir( odir ) )
    256         {
    257             char * filename;
    258 
    259             if( !d->d_name || d->d_name[0] == '.' ) /* skip dotfiles, ., and ..
    260                                                       */
    261                 continue;
    262 
    263             filename = tr_buildPath( dirname, d->d_name, NULL );
    264 
    265             if( tr_stringEndsWith( filename, ".bin" ) )
    266             {
    267                 /* if we don't already have this blocklist, add it */
    268                 if( !tr_list_find( list, filename,
    269                                    (TrListCompareFunc)strcmp ) )
    270                 {
    271                     tr_list_append( &list,
    272                                    _tr_blocklistNew( filename, isEnabled ) );
    273                     ++binCount;
    274                 }
    275             }
    276             else
    277             {
    278                 /* strip out the file suffix, if there is one, and add ".bin"
    279                   instead */
    280                 tr_blocklist * b;
    281                 const char *   dot = strrchr( d->d_name, '.' );
    282                 const int      len = dot ? dot - d->d_name
    283                                          : (int)strlen( d->d_name );
    284                 char         * tmp = tr_strdup_printf(
    285                                         "%s" TR_PATH_DELIMITER_STR "%*.*s.bin",
    286                                         dirname, len, len, d->d_name );
    287                 b = _tr_blocklistNew( tmp, isEnabled );
    288                 _tr_blocklistSetContent( b, filename );
    289                 tr_list_append( &list, b );
    290                 ++newCount;
    291                 tr_free( tmp );
    292             }
    293 
    294             tr_free( filename );
    295         }
    296 
    297         closedir( odir );
    298     }
    299 
    300     session->blocklists = list;
    301 
    302     if( binCount )
    303         tr_dbg( "Found %d blocklists in \"%s\"", binCount, dirname );
    304     if( newCount )
    305         tr_dbg( "Found %d new blocklists in \"%s\"", newCount, dirname );
    306 
    307     tr_free( dirname );
    308 }
    309227
    310228static tr_bool
     
    653571}
    654572
     573static void loadBlocklists( tr_session * session );
     574
    655575static void
    656576tr_sessionInitImpl( void * vdata )
     
    15261446}
    15271447
     1448static void closeBlocklists( tr_session * );
     1449
    15281450static void
    15291451sessionCloseImpl( void * vsession )
     
    15741496    tr_peerMgrFree( session->peerMgr );
    15751497
    1576     tr_list_free( &session->blocklists,
    1577                   (TrListForeachFunc)_tr_blocklistFree );
     1498    closeBlocklists( session );
    15781499    tr_webClose( &session->web );
    15791500
     
    18181739***/
    18191740
     1741static int
     1742tr_stringEndsWith( const char * str, const char * end )
     1743{
     1744    const size_t slen = strlen( str );
     1745    const size_t elen = strlen( end );
     1746
     1747    return slen >= elen && !memcmp( &str[slen - elen], end, elen );
     1748}
     1749
     1750static void
     1751loadBlocklists( tr_session * session )
     1752{
     1753    int         binCount = 0;
     1754    int         newCount = 0;
     1755    struct stat sb;
     1756    char      * dirname;
     1757    DIR *       odir = NULL;
     1758    tr_list *   list = NULL;
     1759    const tr_bool   isEnabled = session->isBlocklistEnabled;
     1760
     1761    /* walk through the directory and find blocklists */
     1762    dirname = tr_buildPath( session->configDir, "blocklists", NULL );
     1763    if( !stat( dirname,
     1764               &sb ) && S_ISDIR( sb.st_mode )
     1765      && ( ( odir = opendir( dirname ) ) ) )
     1766    {
     1767        struct dirent *d;
     1768        for( d = readdir( odir ); d; d = readdir( odir ) )
     1769        {
     1770            char * filename;
     1771
     1772            if( !d->d_name || d->d_name[0] == '.' ) /* skip dotfiles, ., and ..
     1773                                                      */
     1774                continue;
     1775
     1776            filename = tr_buildPath( dirname, d->d_name, NULL );
     1777
     1778            if( tr_stringEndsWith( filename, ".bin" ) )
     1779            {
     1780                /* if we don't already have this blocklist, add it */
     1781                if( !tr_list_find( list, filename,
     1782                                   (TrListCompareFunc)strcmp ) )
     1783                {
     1784                    tr_list_append( &list,
     1785                                   _tr_blocklistNew( filename, isEnabled ) );
     1786                    ++binCount;
     1787                }
     1788            }
     1789            else
     1790            {
     1791                /* strip out the file suffix, if there is one, and add ".bin"
     1792                  instead */
     1793                tr_blocklist * b;
     1794                const char *   dot = strrchr( d->d_name, '.' );
     1795                const int      len = dot ? dot - d->d_name
     1796                                         : (int)strlen( d->d_name );
     1797                char         * tmp = tr_strdup_printf(
     1798                                        "%s" TR_PATH_DELIMITER_STR "%*.*s.bin",
     1799                                        dirname, len, len, d->d_name );
     1800                b = _tr_blocklistNew( tmp, isEnabled );
     1801                _tr_blocklistSetContent( b, filename );
     1802                tr_list_append( &list, b );
     1803                ++newCount;
     1804                tr_free( tmp );
     1805            }
     1806
     1807            tr_free( filename );
     1808        }
     1809
     1810        closedir( odir );
     1811    }
     1812
     1813    session->blocklists = list;
     1814
     1815    if( binCount )
     1816        tr_dbg( "Found %d blocklists in \"%s\"", binCount, dirname );
     1817    if( newCount )
     1818        tr_dbg( "Found %d new blocklists in \"%s\"", newCount, dirname );
     1819
     1820    tr_free( dirname );
     1821}
     1822
     1823static void
     1824closeBlocklists( tr_session * session )
     1825{
     1826    tr_list_free( &session->blocklists,
     1827                  (TrListForeachFunc)_tr_blocklistFree );
     1828}
     1829
     1830void
     1831tr_sessionReloadBlocklists( tr_session * session )
     1832{
     1833    closeBlocklists( session );
     1834    loadBlocklists( session );
     1835}
     1836
    18201837int
    18211838tr_blocklistGetRuleCount( const tr_session * session )
  • trunk/libtransmission/transmission.h

    r9640 r9644  
    307307                    struct tr_benc  * settings );
    308308
     309void tr_sessionReloadBlocklists( tr_session * session );
     310
     311
    309312/** @brief End a libtransmission session
    310313    @see tr_sessionInit() */
Note: See TracChangeset for help on using the changeset viewer.