void tr_deepLog( const char * file, int line, const char * name, const char * fmt, ... ) { FILE * fp = tr_getLog( ); if( fp || IsDebuggerPresent( ) ) { va_list args; char timestr[64]; struct evbuffer * buf = evbuffer_new( ); char * base = tr_basename( file ); evbuffer_add_printf( buf, "[%s] ", tr_getLogTimeStr( timestr, sizeof( timestr ) ) ); if( name ) evbuffer_add_printf( buf, "%s ", name ); va_start( args, fmt ); evbuffer_add_vprintf( buf, fmt, args ); va_end( args ); evbuffer_add_printf( buf, " (%s:%d)\n", base, line ); /* FIXME(libevent2) ifdef this out for nonwindows platforms */ OutputDebugString( EVBUFFER_DATA( buf ) ); if(fp) /* FIXME(libevent2) tr_getLog() should return an fd, then use evbuffer_write() here ) */ (void) fwrite( EVBUFFER_DATA( buf ), 1, EVBUFFER_LENGTH( buf ), fp ); tr_free( base ); evbuffer_free( buf ); } }
void tr_deepLog( const char * file, int line, const char * name, const char * fmt, ... ) { FILE * fp = tr_getLog( ); if( fp || IsDebuggerPresent( ) ) { va_list args; char timestr[64]; struct evbuffer * buf = evbuffer_new( ); char * base = tr_basename( file ); evbuffer_add_printf( buf, "[%s] ", tr_getLogTimeStr( timestr, sizeof( timestr ) ) ); if( name ) evbuffer_add_printf( buf, "%s ", name ); va_start( args, fmt ); evbuffer_add_vprintf( buf, fmt, args ); va_end( args ); evbuffer_add_printf( buf, " (%s:%d)\n", base, line ); /* FIXME(libevent2) ifdef this out for nonwindows platforms */ OutputDebugString( evbuffer_pullup( buf, -1 ) ); if( fp ) fputs( (const char*)evbuffer_pullup( buf, -1 ), fp ); tr_free( base ); evbuffer_free( buf ); } }
void tr_logAddDeep (const char * file, int line, const char * name, const char * fmt, ...) { FILE * fp = tr_logGetFile (); if (fp || IsDebuggerPresent ()) { va_list args; char timestr[64]; char * message; struct evbuffer * buf = evbuffer_new (); char * base = tr_basename (file); evbuffer_add_printf (buf, "[%s] ", tr_logGetTimeStr (timestr, sizeof (timestr))); if (name) evbuffer_add_printf (buf, "%s ", name); va_start (args, fmt); evbuffer_add_vprintf (buf, fmt, args); va_end (args); evbuffer_add_printf (buf, " (%s:%d)\n", base, line); /* FIXME (libevent2) ifdef this out for nonwindows platforms */ message = evbuffer_free_to_str (buf); OutputDebugStringA (message); if (fp) fputs (message, fp); tr_free (message); tr_free (base); } }
int tr_ctorSetMetainfoFromFile( tr_ctor * ctor, const char * filename ) { uint8_t * metainfo; size_t len; int err; metainfo = tr_loadFile( filename, &len ); if( metainfo && len ) err = tr_ctorSetMetainfo( ctor, metainfo, len ); else { clearMetainfo( ctor ); err = 1; } setSourceFile( ctor, filename ); /* if no `name' field was set, then set it from the filename */ if( ctor->isSet_metainfo ) { tr_benc * info; if( tr_bencDictFindDict( &ctor->metainfo, "info", &info ) ) { const char * name; if( !tr_bencDictFindStr( info, "name.utf-8", &name ) ) if( !tr_bencDictFindStr( info, "name", &name ) ) name = NULL; if( !name || !*name ) { char * base = tr_basename( filename ); tr_bencDictAddStr( info, "name", base ); tr_free( base ); } } } tr_free( metainfo ); return err; }
static void blocklistLoad( tr_blocklist * b ) { int fd; struct stat st; const char * err_fmt = _( "Couldn't read \"%1$s\": %2$s" ); blocklistClose( b ); if( stat( b->filename, &st ) == -1 ) return; fd = open( b->filename, O_RDONLY ); if( fd == -1 ) { tr_err( err_fmt, b->filename, tr_strerror( errno ) ); return; } #ifndef WIN32 b->rules = mmap( NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0 ); #else b->rules = mmap( NULL, st.st_size, 0, 0, fd, 0 ); #endif if( !b->rules ) { tr_err( err_fmt, b->filename, tr_strerror( errno ) ); close( fd ); return; } b->byteCount = st.st_size; b->ruleCount = st.st_size / sizeof( struct tr_ip_range ); b->fd = fd; { char * base = tr_basename( b->filename ); tr_inf( _( "Blocklist \"%s\" contains %'zu entries" ), base, b->ruleCount ); tr_free( base ); } }
static void blocklistLoad (tr_blocklist * b) { int fd; size_t byteCount; struct stat st; const char * err_fmt = _("Couldn't read \"%1$s\": %2$s"); blocklistClose (b); if (stat (b->filename, &st) == -1) return; fd = open (b->filename, O_RDONLY | O_BINARY); if (fd == -1) { tr_err (err_fmt, b->filename, tr_strerror (errno)); return; } byteCount = (size_t) st.st_size; b->rules = mmap (NULL, byteCount, PROT_READ, MAP_PRIVATE, fd, 0); if (!b->rules) { tr_err (err_fmt, b->filename, tr_strerror (errno)); close (fd); return; } b->fd = fd; b->byteCount = byteCount; b->ruleCount = byteCount / sizeof (struct tr_ipv4_range); { char * base = tr_basename (b->filename); tr_inf (_("Blocklist \"%s\" contains %zu entries"), base, b->ruleCount); tr_free (base); } }
int main (int argc, char * argv[]) { char * out2 = NULL; tr_metainfo_builder * b = NULL; tr_logSetLevel (TR_LOG_ERROR); if (parseCommandLine (argc, (const char**)argv)) return EXIT_FAILURE; if (showVersion) { fprintf (stderr, MY_NAME" "LONG_VERSION_STRING"\n"); return EXIT_SUCCESS; } if (!infile) { fprintf (stderr, "ERROR: No input file or directory specified.\n"); tr_getopt_usage (MY_NAME, getUsage (), options); fprintf (stderr, "\n"); return EXIT_FAILURE; } if (outfile == NULL) { char * base = tr_basename (infile); char * end = tr_strdup_printf ("%s.torrent", base); char * cwd = tr_getcwd (); outfile = out2 = tr_buildPath (cwd, end, NULL); tr_free (cwd); tr_free (end); tr_free (base); } if (!trackerCount) { if (isPrivate) { fprintf (stderr, "ERROR: no trackers specified for a private torrent\n"); return EXIT_FAILURE; } else { printf ("WARNING: no trackers specified\n"); } } printf ("Creating torrent \"%s\" ...", outfile); fflush (stdout); b = tr_metaInfoBuilderCreate (infile); if (piecesize_kib != 0) tr_metaInfoBuilderSetPieceSize (b, piecesize_kib * KiB); tr_makeMetaInfo (b, outfile, trackers, trackerCount, comment, isPrivate); while (!b->isDone) { tr_wait_msec (500); putc ('.', stdout); fflush (stdout); } putc (' ', stdout); switch (b->result) { case TR_MAKEMETA_OK: printf ("done!"); break; case TR_MAKEMETA_URL: printf ("bad announce URL: \"%s\"", b->errfile); break; case TR_MAKEMETA_IO_READ: printf ("error reading \"%s\": %s", b->errfile, tr_strerror (b->my_errno)); break; case TR_MAKEMETA_IO_WRITE: printf ("error writing \"%s\": %s", b->errfile, tr_strerror (b->my_errno)); break; case TR_MAKEMETA_CANCELLED: printf ("cancelled"); break; } putc ('\n', stdout); tr_metaInfoBuilderFree (b); tr_free (out2); return EXIT_SUCCESS; }
int _tr_blocklistSetContent( tr_blocklist * b, const char * filename ) { FILE * in; FILE * out; int inCount = 0; int outCount = 0; char line[2048]; const char * err_fmt = _( "Couldn't read \"%1$s\": %2$s" ); if( !filename ) { blocklistDelete( b ); return 0; } in = fopen( filename, "rb" ); if( !in ) { tr_err( err_fmt, filename, tr_strerror( errno ) ); return 0; } blocklistClose( b ); out = fopen( b->filename, "wb+" ); if( !out ) { tr_err( err_fmt, b->filename, tr_strerror( errno ) ); fclose( in ); return 0; } while( fgets( line, sizeof( line ), in ) != NULL ) { char * walk; struct tr_ip_range range; ++inCount; /* zap the linefeed */ if(( walk = strchr( line, '\r' ))) *walk = '\0'; if(( walk = strchr( line, '\n' ))) *walk = '\0'; if( !parseLine( line, &range ) ) { /* don't try to display the actual lines - it causes issues */ tr_err( _( "blocklist skipped invalid address at line %d" ), inCount ); continue; } if( fwrite( &range, sizeof( struct tr_ip_range ), 1, out ) != 1 ) { tr_err( _( "Couldn't save file \"%1$s\": %2$s" ), b->filename, tr_strerror( errno ) ); break; } ++outCount; } { char * base = tr_basename( b->filename ); tr_inf( _( "Blocklist \"%s\" updated with %d entries" ), base, outCount ); tr_free( base ); } fclose( out ); fclose( in ); blocklistLoad( b ); return outCount; }
int _tr_blocklistSetContent( tr_blocklist * b, const char * filename ) { FILE * in; FILE * out; char * line; int lineCount = 0; const char * err_fmt = _( "Couldn't read \"%1$s\": %2$s" ); if( !filename ) { blocklistDelete( b ); return 0; } in = fopen( filename, "r" ); if( !in ) { tr_err( err_fmt, filename, tr_strerror( errno ) ); return 0; } blocklistClose( b ); out = fopen( b->filename, "wb+" ); if( !out ) { tr_err( err_fmt, b->filename, tr_strerror( errno ) ); fclose( in ); return 0; } while( !fggets( &line, in ) ) { char * rangeBegin; char * rangeEnd; char * crpos; tr_address addr; struct tr_ip_range range; rangeBegin = strrchr( line, ':' ); if( !rangeBegin ) { free( line ); continue; } ++rangeBegin; rangeEnd = strchr( rangeBegin, '-' ); if( !rangeEnd ) { free( line ); continue; } *rangeEnd++ = '\0'; if(( crpos = strchr( rangeEnd, '\r' ))) *crpos = '\0'; if( !tr_pton( rangeBegin, &addr ) ) tr_err( "blocklist skipped invalid address [%s]\n", rangeBegin ); range.begin = ntohl( addr.addr.addr4.s_addr ); if( !tr_pton( rangeEnd, &addr ) ) tr_err( "blocklist skipped invalid address [%s]\n", rangeEnd ); range.end = ntohl( addr.addr.addr4.s_addr ); free( line ); if( fwrite( &range, sizeof( struct tr_ip_range ), 1, out ) != 1 ) { tr_err( _( "Couldn't save file \"%1$s\": %2$s" ), b->filename, tr_strerror( errno ) ); break; } ++lineCount; } { char * base = tr_basename( b->filename ); tr_inf( _( "Blocklist \"%1$s\" updated with %2$'d entries" ), base, lineCount ); tr_free( base ); } fclose( out ); fclose( in ); blocklistLoad( b ); return lineCount; }