Exemplo n.º 1
0
static bool
testFileExistsAndConsistsOfThisString (const tr_torrent * tor, tr_file_index_t fileIndex, const char * str)
{
  char * path;
  const size_t str_len = strlen (str);
  bool success = false;

  path = tr_torrentFindFile (tor, fileIndex);
  if (path != NULL)
    {
      uint8_t * contents;
      size_t contents_len;

      assert (tr_sys_path_exists (path, NULL));

      contents = tr_loadFile (path, &contents_len, NULL);

      success = contents != NULL
             && (str_len == contents_len)
             && (!memcmp (contents, str, contents_len));

      tr_free (contents);
      tr_free (path);
    }

  return success;
}
Exemplo n.º 2
0
const char*
tr_getDefaultDownloadDir (void)
{
    static char * user_dir = NULL;

    if (user_dir == NULL)
    {
        const char * config_home;
        char * config_file;
        char * content;
        size_t content_len;

        /* figure out where to look for user-dirs.dirs */
        config_home = getenv ("XDG_CONFIG_HOME");
        if (config_home && *config_home)
            config_file = tr_buildPath (config_home, "user-dirs.dirs", NULL);
        else
            config_file = tr_buildPath (getHomeDir (), ".config", "user-dirs.dirs", NULL);

        /* read in user-dirs.dirs and look for the download dir entry */
        content = (char *) tr_loadFile (config_file, &content_len);
        if (content && content_len>0)
        {
            const char * key = "XDG_DOWNLOAD_DIR=\"";
            char * line = strstr (content, key);
            if (line != NULL)
            {
                char * value = line + strlen (key);
                char * end = strchr (value, '"');

                if (end)
                {
                    *end = '\0';

                    if (!memcmp (value, "$HOME/", 6))
                        user_dir = tr_buildPath (getHomeDir (), value+6, NULL);
                    else if (!strcmp (value, "$HOME"))
                        user_dir = tr_strdup (getHomeDir ());
                    else
                        user_dir = tr_strdup (value);
                }
            }
        }

        if (user_dir == NULL)
#ifdef __HAIKU__
            user_dir = tr_buildPath (getHomeDir (), "Desktop", NULL);
#else
            user_dir = tr_buildPath (getHomeDir (), "Downloads", NULL);
#endif

        tr_free (content);
        tr_free (config_file);
    }

    return user_dir;
}
Exemplo n.º 3
0
static uint8_t*
loadResumeFile( const tr_torrent * tor,
                size_t *           len )
{
    uint8_t *    ret = NULL;
    const char * cacheDir = tr_getResumeDir( tor->session );
    const char * hash = tor->info.hashString;

    if( !ret && tor->session->tag )
    {
        char * path = tr_strdup_printf( "%s" TR_PATH_DELIMITER_STR "%s-%s", cacheDir, hash, tor->session->tag );
        ret = tr_loadFile( path, len );
        tr_free( path );
    }
    if( !ret )
    {
        char * path = tr_buildPath( cacheDir, hash, NULL );
        ret = tr_loadFile( path, len );
        tr_free( path );
    }

    return ret;
}
Exemplo n.º 4
0
/* this is for really old versions of T and will probably be removed someday */
void
tr_metainfoMigrate( tr_session * session,
                    tr_info *   inf )
{
    struct stat new_sb;
    char *      name = getTorrentFilename( session, inf );

    if( stat( name, &new_sb ) || ( ( new_sb.st_mode & S_IFMT ) != S_IFREG ) )
    {
        char *    old_name = getOldTorrentFilename( session, inf );
        size_t    contentLen;
        uint8_t * content;

        tr_mkdirp( tr_getTorrentDir( session ), 0777 );
        if( ( content = tr_loadFile( old_name, &contentLen ) ) )
        {
            FILE * out;
            errno = 0;
            out = fopen( name, "wb+" );
            if( !out )
            {
                tr_nerr( inf->name, _( "Couldn't create \"%1$s\": %2$s" ),
                        name, tr_strerror( errno ) );
            }
            else
            {
                if( fwrite( content, sizeof( uint8_t ), contentLen, out )
                    == contentLen )
                {
                    tr_free( inf->torrent );
                    inf->torrent = tr_strdup( name );
                    tr_sessionSetTorrentFile( session, inf->hashString, name );
                    unlink( old_name );
                }
                fclose( out );
            }
        }

        tr_free( content );
        tr_free( old_name );
    }

    tr_free( name );
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
static void
serve_file( struct evhttp_request * req,
            struct tr_rpc_server *  server,
            const char *            filename )
{
    if( req->type != EVHTTP_REQ_GET )
    {
        evhttp_add_header( req->output_headers, "Allow", "GET" );
        send_simple_response( req, 405, NULL );
    }
    else
    {
        size_t content_len;
        uint8_t * content;
        const int error = errno;

        errno = 0;
        content_len = 0;
        content = tr_loadFile( filename, &content_len );

        if( errno )
        {
            send_simple_response( req, HTTP_NOTFOUND, filename );
        }
        else
        {
            struct evbuffer * out;

            errno = error;
            out = tr_getBuffer( );
            evhttp_add_header( req->output_headers, "Content-Type",
                               mimetype_guess( filename ) );
            add_response( req, server, out, content, content_len );
            evhttp_send_reply( req, HTTP_OK, "OK", out );

            tr_releaseBuffer( out );
            tr_free( content );
        }
    }
}
Exemplo n.º 7
0
static bool testFileExistsAndConsistsOfThisString(tr_torrent const* tor, tr_file_index_t fileIndex, char const* str)
{
    char* path;
    size_t const str_len = strlen(str);
    bool success = false;

    path = tr_torrentFindFile(tor, fileIndex);

    if (path != NULL)
    {
        TR_ASSERT(tr_sys_path_exists(path, NULL));

        size_t contents_len;
        uint8_t* contents = tr_loadFile(path, &contents_len, NULL);

        success = contents != NULL && str_len == contents_len && memcmp(contents, str, contents_len) == 0;

        tr_free(contents);
        tr_free(path);
    }

    return success;
}