source: trunk/gtk/blocklist.c @ 7787

Last change on this file since 7787 was 7787, checked in by charles, 13 years ago

(trunk) same as r7786, but in daemon & gtk too

File size: 4.1 KB
Line 
1#include <stdarg.h>
2#include <stdlib.h> /* getenv() */
3#include <unistd.h> /* write() */
4#include <glib.h>
5#include <glib/gprintf.h>
6#include <glib/gi18n.h>
7
8#define CURL_DISABLE_TYPECHECK /* otherwise -Wunreachable-code goes insane */
9#include <curl/curl.h>
10
11#include <libtransmission/transmission.h>
12#include <libtransmission/utils.h>
13#include <libtransmission/version.h>
14
15#include "blocklist.h"
16#include "tr-core.h"
17#include "tr-prefs.h"
18#include "util.h"
19
20#define BLOCKLIST_DATE "blocklist-date"
21
22/***
23****
24***/
25
26struct idle_data
27{
28    TrCore *    core;
29    gboolean    isDone;
30    char *      str;
31};
32static gboolean
33emitProgressIdle( gpointer gdata )
34{
35    struct idle_data * data = gdata;
36
37    tr_core_blocksig( data->core, data->isDone, data->str );
38
39    g_free( data->str );
40    g_free( data );
41    return FALSE;
42}
43
44static void
45emitProgress( TrCore *     core,
46              gboolean     isDone,
47              const char * fmt,
48              ... )
49{
50    struct idle_data * data = tr_new0( struct idle_data, 1 );
51    va_list            args;
52
53    data->core = core;
54    data->isDone = isDone;
55    va_start( args, fmt );
56    g_vasprintf( &data->str, fmt, args );
57    va_end( args );
58
59    tr_inf( "%s", data->str );
60    g_idle_add( emitProgressIdle, data );
61}
62
63/***
64****
65***/
66
67static size_t
68writeFunc( void * ptr,
69           size_t size,
70           size_t nmemb,
71           void * fd )
72{
73    const size_t byteCount = size * nmemb;
74
75    return write( *(int*)fd, ptr, byteCount );
76}
77
78static gpointer
79blocklistThreadFunc( gpointer gcore )
80{
81    TrCore *     core = TR_CORE( gcore );
82    const char * url =
83        "http://download.m0k.org/transmission/files/level1.gz";
84    gboolean     ok = TRUE;
85    char *       filename = NULL;
86    char *       filename2 = NULL;
87    int          fd;
88    int          rules;
89
90    emitProgress( core, FALSE, _( "Retrieving blocklist..." ) );
91
92    if( ok )
93    {
94        GError * err = NULL;
95        fd = g_file_open_tmp( "transmission-blockfile-XXXXXX", &filename,
96                              &err );
97        if( err )
98        {
99            emitProgress( core, TRUE, _(
100                              "Unable to get blocklist: %s" ), err->message );
101            g_clear_error( &err );
102            ok = FALSE;
103        }
104    }
105
106    if( ok )
107    {
108        long verbose = getenv( "TR_CURL_VERBOSE" ) == NULL ? 0L : 1L;
109
110        CURL * curl = curl_easy_init( );
111        curl_easy_setopt( curl, CURLOPT_URL, url );
112        curl_easy_setopt( curl, CURLOPT_ENCODING, "deflate" );
113        curl_easy_setopt( curl, CURLOPT_USERAGENT, "Transmission/"
114                                                   LONG_VERSION_STRING );
115        curl_easy_setopt( curl, CURLOPT_VERBOSE, verbose );
116        curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, writeFunc );
117        curl_easy_setopt( curl, CURLOPT_WRITEDATA, &fd );
118        curl_easy_setopt( curl, CURLOPT_NOPROGRESS, 1 );
119        ok = !curl_easy_perform( curl );
120        curl_easy_cleanup( curl );
121        close( fd );
122    }
123
124    if( !ok )
125    {
126        emitProgress( core, TRUE, _( "Unable to get blocklist." ) );
127    }
128
129    if( ok )
130    {
131        char * cmd;
132        emitProgress( core, FALSE, _( "Uncompressing blocklist..." ) );
133        filename2 = g_strdup_printf( "%s.txt", filename );
134        cmd = g_strdup_printf( "zcat %s > %s ", filename, filename2 );
135        tr_dbg( "%s", cmd );
136        (void) system( cmd );
137        g_free( cmd );
138    }
139
140    if( ok )
141    {
142        emitProgress( core, FALSE, _( "Parsing blocklist..." ) );
143        rules = tr_blocklistSetContent( tr_core_session( core ), filename2 );
144    }
145
146    if( ok )
147    {
148        emitProgress( core, TRUE, _(
149                          "Blocklist updated with %'d entries" ), rules );
150        pref_int_set( BLOCKLIST_DATE, time( NULL ) );
151    }
152
153    g_free( filename2 );
154    g_free( filename );
155    return NULL;
156}
157
158/***
159****
160***/
161
162void
163gtr_blocklist_update( TrCore * core )
164{
165    g_thread_create( blocklistThreadFunc, core, TRUE, NULL );
166}
167
168void
169gtr_blocklist_maybe_autoupdate( TrCore * core )
170{
171    if( pref_flag_get( PREF_KEY_BLOCKLIST_UPDATES_ENABLED )
172      && ( time( NULL ) - pref_int_get( BLOCKLIST_DATE ) >
173          ( 60 * 60 * 24 * 7 ) ) )
174        gtr_blocklist_update( core );
175}
176
Note: See TracBrowser for help on using the repository browser.