static void translate_keyfile_to_json( const char * old_file, const char * new_file ) { tr_benc dict; GKeyFile * keyfile; gchar ** keys; gsize i; gsize length; static struct pref_entry { const char* oldkey; const char* newkey; } renamed[] = { { "default-download-directory", "download-dir" }, { "encrypted-connections-only", "encryption" }, { "listening-port", "peer-port" }, { "nat-traversal-enabled", "port-forwarding-enabled" }, { "open-dialog-folder", "open-dialog-dir" }, { "watch-folder", "watch-dir" }, { "watch-folder-enabled", "watch-dir-enabled" } }; keyfile = g_key_file_new( ); g_key_file_load_from_file( keyfile, old_file, 0, NULL ); length = 0; keys = g_key_file_get_keys( keyfile, "general", &length, NULL ); tr_bencInitDict( &dict, length ); for( i = 0; i < length; ++i ) { guint j; const char * key = keys[i]; gchar * val = g_key_file_get_value( keyfile, "general", key, NULL ); for( j = 0; j < G_N_ELEMENTS( renamed ); ++j ) if( !strcmp( renamed[j].oldkey, key ) ) key = renamed[j].newkey; if( !strcmp( val, "true" ) || !strcmp( val, "false" ) ) tr_bencDictAddInt( &dict, key, !strcmp( val, "true" ) ); else { char * end; long l; errno = 0; l = strtol( val, &end, 10 ); if( !errno && end && !*end ) tr_bencDictAddInt( &dict, key, l ); else tr_bencDictAddStr( &dict, key, val ); } g_free( val ); } g_key_file_free( keyfile ); tr_bencToFile( &dict, TR_FMT_JSON, new_file ); tr_bencFree( &dict ); }
static void saveCumulativeStats( const tr_session * session, const tr_session_stats * s ) { char * filename; char * path=NULL; tr_benc top; tr_bencInitDict( &top, 5 ); tr_bencDictAddInt( &top, "downloaded-bytes", s->downloadedBytes ); tr_bencDictAddInt( &top, "files-added", s->filesAdded ); tr_bencDictAddInt( &top, "seconds-active", s->secondsActive ); tr_bencDictAddInt( &top, "session-count", s->sessionCount ); tr_bencDictAddInt( &top, "uploaded-bytes", s->uploadedBytes ); path = filename = getFilename( session ); #ifdef WIN32 path = ConvertUtf8ToTChar(filename); #endif tr_deepLog( __FILE__, __LINE__, NULL, "Saving stats to \"%s\"", path ); tr_bencToFile( &top, TR_FMT_JSON, path ); #ifdef WIN32 tr_free(path); #endif tr_free( filename ); tr_bencFree( &top ); }
void tr_dhtUninit(tr_session *ss) { if(session != ss) return; tr_ndbg( "DHT", "Uninitializing DHT" ); if( dht_timer != NULL ) { event_free( dht_timer ); dht_timer = NULL; } /* Since we only save known good nodes, avoid erasing older data if we don't know enough nodes. */ if(tr_dhtStatus(ss, AF_INET, NULL) < TR_DHT_FIREWALLED) tr_ninf( "DHT", "Not saving nodes, DHT not ready" ); else { tr_benc benc; struct sockaddr_in sins[300]; struct sockaddr_in6 sins6[300]; char compact[300 * 6], compact6[300 * 18]; char *dat_file; int i, j, num = 300, num6 = 300; int n = dht_get_nodes(sins, &num, sins6, &num6); tr_ninf( "DHT", "Saving %d (%d + %d) nodes", n, num, num6 ); j = 0; for( i=0; i<num; ++i ) { memcpy( compact + j, &sins[i].sin_addr, 4 ); memcpy( compact + j + 4, &sins[i].sin_port, 2 ); j += 6; } j = 0; for( i=0; i<num6; ++i ) { memcpy( compact6 + j, &sins6[i].sin6_addr, 16 ); memcpy( compact6 + j + 16, &sins6[i].sin6_port, 2 ); j += 18; } tr_bencInitDict( &benc, 3 ); tr_bencDictAddRaw( &benc, "id", myid, 20 ); if(num > 0) tr_bencDictAddRaw( &benc, "nodes", compact, num * 6 ); if(num6 > 0) tr_bencDictAddRaw( &benc, "nodes6", compact6, num6 * 18 ); dat_file = tr_buildPath( ss->configDir, "dht.dat", NULL ); tr_bencToFile( &benc, TR_FMT_BENC, dat_file ); tr_bencFree( &benc ); tr_free( dat_file ); } dht_uninit(); tr_ndbg("DHT", "Done uninitializing DHT"); session = NULL; }
void tr_torrentSaveResume( tr_torrent * tor ) { int err; tr_benc top; char * filename; if( !tr_isTorrent( tor ) ) return; tr_bencInitDict( &top, 50 ); /* arbitrary "big enough" number */ tr_bencDictAddInt( &top, KEY_TIME_SEEDING, tor->secondsSeeding ); tr_bencDictAddInt( &top, KEY_TIME_DOWNLOADING, tor->secondsDownloading ); tr_bencDictAddInt( &top, KEY_ACTIVITY_DATE, tor->activityDate ); tr_bencDictAddInt( &top, KEY_ADDED_DATE, tor->addedDate ); tr_bencDictAddInt( &top, KEY_CORRUPT, tor->corruptPrev + tor->corruptCur ); tr_bencDictAddInt( &top, KEY_DONE_DATE, tor->doneDate ); tr_bencDictAddStr( &top, KEY_DOWNLOAD_DIR, tor->downloadDir ); if( tor->incompleteDir != NULL ) tr_bencDictAddStr( &top, KEY_INCOMPLETE_DIR, tor->incompleteDir ); tr_bencDictAddInt( &top, KEY_DOWNLOADED, tor->downloadedPrev + tor->downloadedCur ); tr_bencDictAddInt( &top, KEY_UPLOADED, tor->uploadedPrev + tor->uploadedCur ); tr_bencDictAddInt( &top, KEY_MAX_PEERS, tor->maxConnectedPeers ); tr_bencDictAddInt( &top, KEY_BANDWIDTH_PRIORITY, tr_torrentGetPriority( tor ) ); tr_bencDictAddBool( &top, KEY_PAUSED, !tor->isRunning ); savePeers( &top, tor ); if( tr_torrentHasMetadata( tor ) ) { saveFilePriorities( &top, tor ); saveDND( &top, tor ); saveProgress( &top, tor ); } saveSpeedLimits( &top, tor ); saveRatioLimits( &top, tor ); saveIdleLimits( &top, tor ); filename = getResumeFilename( tor ); if(( err = tr_bencToFile( &top, TR_FMT_BENC, filename ))) tr_torrentSetLocalError( tor, "Unable to save resume file: %s", tr_strerror( err ) ); tr_free( filename ); tr_bencFree( &top ); }
int main (int argc, char * argv[]) { int i; int changedCount = 0; files = tr_new0 (const char*, argc); tr_setMessageLevel (TR_MSG_ERR); if (parseCommandLine (argc, (const char**)argv)) return EXIT_FAILURE; if (showVersion) { fprintf (stderr, MY_NAME" "LONG_VERSION_STRING"\n"); return EXIT_SUCCESS; } if (fileCount < 1) { fprintf (stderr, "ERROR: No torrent files specified.\n"); tr_getopt_usage (MY_NAME, getUsage (), options); fprintf (stderr, "\n"); return EXIT_FAILURE; } if (!add && !deleteme && !replace[0]) { fprintf (stderr, "ERROR: Must specify -a, -d or -r\n"); tr_getopt_usage (MY_NAME, getUsage (), options); fprintf (stderr, "\n"); return EXIT_FAILURE; } for (i=0; i<fileCount; ++i) { tr_benc top; bool changed = false; const char * filename = files[i]; printf ("%s\n", filename); if (tr_bencLoadFile (&top, TR_FMT_BENC, filename)) { printf ("\tError reading file\n"); continue; } if (deleteme != NULL) changed |= removeURL (&top, deleteme); if (add != NULL) changed = addURL (&top, add); if (replace[0] && replace[1]) changed |= replaceURL (&top, replace[0], replace[1]); if (changed) { ++changedCount; tr_bencToFile (&top, TR_FMT_BENC, filename); } tr_bencFree (&top); } printf ("Changed %d files\n", changedCount); tr_free (files); return EXIT_SUCCESS; }