|
|
|
@ -41,15 +41,17 @@
|
|
|
|
|
<tbody valign="top">
|
|
|
|
|
<tr><th class="docinfo-name">Author:</th>
|
|
|
|
|
<td>Arvid Norberg, <a class="last reference external" href="mailto:arvid@rasterbar.com">arvid@rasterbar.com</a></td></tr>
|
|
|
|
|
<tr><th class="docinfo-name">Version:</th>
|
|
|
|
|
<td>1.0.2</td></tr>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
<div class="contents topic" id="table-of-contents">
|
|
|
|
|
<p class="topic-title first">Table of contents</p>
|
|
|
|
|
<ul class="simple">
|
|
|
|
|
<li><a class="reference internal" href="#examples" id="id2">examples</a><ul>
|
|
|
|
|
<li><a class="reference internal" href="#dump-torrent" id="id3">dump_torrent</a></li>
|
|
|
|
|
<li><a class="reference internal" href="#simple-client" id="id4">simple client</a></li>
|
|
|
|
|
<li><a class="reference internal" href="#make-torrent" id="id5">make_torrent</a></li>
|
|
|
|
|
<li><a class="reference internal" href="#simple-client" id="id3">simple client</a></li>
|
|
|
|
|
<li><a class="reference internal" href="#make-torrent" id="id4">make_torrent</a></li>
|
|
|
|
|
<li><a class="reference internal" href="#dump-torrent" id="id5">dump_torrent</a></li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
@ -60,244 +62,613 @@
|
|
|
|
|
of a (little bit) more complete client, <tt class="docutils literal">client_test</tt>. There are separate
|
|
|
|
|
instructions for how to use it <a class="reference external" href="client_test.html">here</a> if you'd like to try it. Note that building
|
|
|
|
|
<tt class="docutils literal">client_test</tt> also requires boost.regex and boost.program_options library.</p>
|
|
|
|
|
<div class="section" id="dump-torrent">
|
|
|
|
|
<h2>dump_torrent</h2>
|
|
|
|
|
<p>This is an example of a program that will take a torrent-file as a parameter and
|
|
|
|
|
print information about it to std out:</p>
|
|
|
|
|
<pre class="literal-block">
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <fstream>
|
|
|
|
|
#include <iterator>
|
|
|
|
|
#include <iomanip>
|
|
|
|
|
|
|
|
|
|
#include "libtorrent/entry.hpp"
|
|
|
|
|
#include "libtorrent/bencode.hpp"
|
|
|
|
|
#include "libtorrent/torrent_info.hpp"
|
|
|
|
|
#include "libtorrent/lazy_entry.hpp"
|
|
|
|
|
#include <boost/filesystem/operations.hpp>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char* argv[])
|
|
|
|
|
{
|
|
|
|
|
using namespace libtorrent;
|
|
|
|
|
using namespace boost::filesystem;
|
|
|
|
|
|
|
|
|
|
if (argc != 2)
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "usage: dump_torrent torrent-file\n";
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
#if BOOST_VERSION < 103400
|
|
|
|
|
boost::filesystem::path::default_name_check(boost::filesystem::no_check);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef BOOST_NO_EXCEPTIONS
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
int size = file_size(argv[1]);
|
|
|
|
|
if (size > 10 * 1000000)
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "file too big (" << size << "), aborting\n";
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
std::vector<char> buf(size);
|
|
|
|
|
std::ifstream(argv[1], std::ios_base::binary).read(&buf[0], size);
|
|
|
|
|
lazy_entry e;
|
|
|
|
|
int ret = lazy_bdecode(&buf[0], &buf[0] + buf.size(), e);
|
|
|
|
|
|
|
|
|
|
if (ret != 0)
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "invalid bencoding: " << ret << std::endl;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::cout << "\n\n----- raw info -----\n\n";
|
|
|
|
|
std::cout << e << std::endl;
|
|
|
|
|
|
|
|
|
|
torrent_info t(e);
|
|
|
|
|
|
|
|
|
|
// print info about torrent
|
|
|
|
|
std::cout << "\n\n----- torrent file info -----\n\n";
|
|
|
|
|
std::cout << "nodes:\n";
|
|
|
|
|
typedef std::vector<std::pair<std::string, int> > node_vec;
|
|
|
|
|
node_vec const& nodes = t.nodes();
|
|
|
|
|
for (node_vec::const_iterator i = nodes.begin(), end(nodes.end());
|
|
|
|
|
i != end; ++i)
|
|
|
|
|
{
|
|
|
|
|
std::cout << i->first << ":" << i->second << "\n";
|
|
|
|
|
}
|
|
|
|
|
std::cout << "trackers:\n";
|
|
|
|
|
for (std::vector<announce_entry>::const_iterator i = t.trackers().begin();
|
|
|
|
|
i != t.trackers().end(); ++i)
|
|
|
|
|
{
|
|
|
|
|
std::cout << i->tier << ": " << i->url << "\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::cout << "number of pieces: " << t.num_pieces() << "\n";
|
|
|
|
|
std::cout << "piece length: " << t.piece_length() << "\n";
|
|
|
|
|
std::cout << "info hash: " << t.info_hash() << "\n";
|
|
|
|
|
std::cout << "comment: " << t.comment() << "\n";
|
|
|
|
|
std::cout << "created by: " << t.creator() << "\n";
|
|
|
|
|
std::cout << "files:\n";
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (torrent_info::file_iterator i = t.begin_files();
|
|
|
|
|
i != t.end_files(); ++i, ++index)
|
|
|
|
|
{
|
|
|
|
|
int first = t.map_file(index, 0, 1).piece;
|
|
|
|
|
int last = t.map_file(index, i->size - 1, 1).piece;
|
|
|
|
|
std::cout << " " << std::setw(11) << i->size
|
|
|
|
|
<< " " << i->path.string() << "[ " << first << ", "
|
|
|
|
|
<< last << " ]\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef BOOST_NO_EXCEPTIONS
|
|
|
|
|
}
|
|
|
|
|
catch (std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
std::cout << e.what() << "\n";
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
</pre>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="section" id="simple-client">
|
|
|
|
|
<h2>simple client</h2>
|
|
|
|
|
<p>This is a simple client. It doesn't have much output to keep it simple:</p>
|
|
|
|
|
<pre class="literal-block">
|
|
|
|
|
int main(int argc, char* argv[])
|
|
|
|
|
{
|
|
|
|
|
using namespace libtorrent;
|
|
|
|
|
<pre class="code c++ literal-block">
|
|
|
|
|
<span class="comment preproc">#include <stdlib.h>
|
|
|
|
|
#include <boost/make_shared.hpp>
|
|
|
|
|
#include "libtorrent/entry.hpp"
|
|
|
|
|
#include "libtorrent/bencode.hpp"
|
|
|
|
|
#include "libtorrent/session.hpp"
|
|
|
|
|
</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name function">main</span><span class="punctuation">(</span><span class="keyword type">int</span> <span class="name">argc</span><span class="punctuation">,</span> <span class="keyword type">char</span><span class="operator">*</span> <span class="name">argv</span><span class="punctuation">[])</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="name">libtorrent</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">namespace</span> <span class="name">lt</span> <span class="operator">=</span> <span class="name">libtorrent</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
if (argc != 2)
|
|
|
|
|
{
|
|
|
|
|
fputs("usage: ./simple_client torrent-file\n"
|
|
|
|
|
"to stop the client, press return.\n", stderr);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">argc</span> <span class="operator">!=</span> <span class="literal number integer">2</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fputs</span><span class="punctuation">(</span><span class="literal string">"usage: ./simple_client torrent-file</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"to stop the client, press return.</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">stderr</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
session s;
|
|
|
|
|
error_code ec;
|
|
|
|
|
s.listen_on(std::make_pair(6881, 6889), ec);
|
|
|
|
|
if (ec)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, "failed to open listen socket: %s\n", ec.message().c_str());
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
add_torrent_params p;
|
|
|
|
|
p.save_path = "./";
|
|
|
|
|
p.ti = boost::make_shared<torrent_info>(argv[1], ec);
|
|
|
|
|
if (ec)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, "%s\n", ec.message().c_str());
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
s.add_torrent(p, ec);
|
|
|
|
|
if (ec)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, "%s\n", ec.message().c_str());
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
<span class="name">settings_pack</span> <span class="name">sett</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">sett</span><span class="punctuation">.</span><span class="name">set_str</span><span class="punctuation">(</span><span class="name">settings_pack</span><span class="operator">::</span><span class="name">listen_interfaces</span><span class="punctuation">,</span> <span class="literal string">"0.0.0.0:6881"</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="name">lt</span><span class="operator">::</span><span class="name">session</span> <span class="name">s</span><span class="punctuation">(</span><span class="name">sett</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="name">error_code</span> <span class="name">ec</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ec</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"failed to open listen socket: %s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">.</span><span class="name">message</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="name">add_torrent_params</span> <span class="name">p</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">p</span><span class="punctuation">.</span><span class="name">save_path</span> <span class="operator">=</span> <span class="literal string">"./"</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">p</span><span class="punctuation">.</span><span class="name">ti</span> <span class="operator">=</span> <span class="name">boost</span><span class="operator">::</span><span class="name">make_shared</span><span class="operator"><</span><span class="name">torrent_info</span><span class="operator">></span><span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">]),</span> <span class="name">boost</span><span class="operator">::</span><span class="name">ref</span><span class="punctuation">(</span><span class="name">ec</span><span class="punctuation">),</span> <span class="literal number integer">0</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ec</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"%s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">.</span><span class="name">message</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="name">s</span><span class="punctuation">.</span><span class="name">add_torrent</span><span class="punctuation">(</span><span class="name">p</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ec</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"%s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">.</span><span class="name">message</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
// wait for the user to end
|
|
|
|
|
char a;
|
|
|
|
|
scanf("%c\n", &a);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
<span class="comment single">// wait for the user to end
|
|
|
|
|
</span> <span class="keyword type">char</span> <span class="name">a</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">scanf</span><span class="punctuation">(</span><span class="literal string">"%c</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="operator">&</span><span class="name">a</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="section" id="make-torrent">
|
|
|
|
|
<h2>make_torrent</h2>
|
|
|
|
|
<p>Shows how to create a torrent from a directory tree:</p>
|
|
|
|
|
<pre class="literal-block">
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <fstream>
|
|
|
|
|
#include <iterator>
|
|
|
|
|
#include <iomanip>
|
|
|
|
|
|
|
|
|
|
#include "libtorrent/entry.hpp"
|
|
|
|
|
<pre class="code c++ literal-block">
|
|
|
|
|
<span class="comment preproc">#include "libtorrent/entry.hpp"
|
|
|
|
|
#include "libtorrent/bencode.hpp"
|
|
|
|
|
#include "libtorrent/torrent_info.hpp"
|
|
|
|
|
#include "libtorrent/file.hpp"
|
|
|
|
|
#include "libtorrent/storage.hpp"
|
|
|
|
|
#include "libtorrent/hasher.hpp"
|
|
|
|
|
#include "libtorrent/create_torrent.hpp"
|
|
|
|
|
#include "libtorrent/file.hpp"
|
|
|
|
|
#include "libtorrent/file_pool.hpp"
|
|
|
|
|
</span>
|
|
|
|
|
<span class="comment preproc">#include <boost/bind.hpp>
|
|
|
|
|
</span>
|
|
|
|
|
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="name">libtorrent</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
#include <boost/filesystem/operations.hpp>
|
|
|
|
|
#include <boost/filesystem/path.hpp>
|
|
|
|
|
#include <boost/filesystem/fstream.hpp>
|
|
|
|
|
#include <boost/bind.hpp>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name function">load_file</span><span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span> <span class="keyword">const</span><span class="operator">&</span> <span class="name">filename</span><span class="punctuation">,</span> <span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="keyword type">char</span><span class="operator">>&</span> <span class="name">v</span><span class="punctuation">,</span> <span class="name">libtorrent</span><span class="operator">::</span><span class="name">error_code</span><span class="operator">&</span> <span class="name">ec</span><span class="punctuation">,</span> <span class="keyword type">int</span> <span class="name">limit</span> <span class="operator">=</span> <span class="literal number integer">8000000</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">clear</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword type">FILE</span><span class="operator">*</span> <span class="name">f</span> <span class="operator">=</span> <span class="name">fopen</span><span class="punctuation">(</span><span class="name">filename</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">(),</span> <span class="literal string">"rb"</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">f</span> <span class="operator">==</span> <span class="name builtin">NULL</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
using namespace boost::filesystem;
|
|
|
|
|
using namespace libtorrent;
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">r</span> <span class="operator">=</span> <span class="name">fseek</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">,</span> <span class="literal number integer">0</span><span class="punctuation">,</span> <span class="name">SEEK_END</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">r</span> <span class="operator">!=</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="keyword type">long</span> <span class="name">s</span> <span class="operator">=</span> <span class="name">ftell</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">s</span> <span class="operator"><</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
// do not include files and folders whose
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">s</span> <span class="operator">></span> <span class="name">limit</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">2</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">r</span> <span class="operator">=</span> <span class="name">fseek</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">,</span> <span class="literal number integer">0</span><span class="punctuation">,</span> <span class="name">SEEK_SET</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">r</span> <span class="operator">!=</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">v</span><span class="punctuation">.</span><span class="name">resize</span><span class="punctuation">(</span><span class="name">s</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">s</span> <span class="operator">==</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">r</span> <span class="operator">=</span> <span class="name">fread</span><span class="punctuation">(</span><span class="operator">&</span><span class="name">v</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">],</span> <span class="literal number integer">1</span><span class="punctuation">,</span> <span class="name">v</span><span class="punctuation">.</span><span class="name">size</span><span class="punctuation">(),</span> <span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">r</span> <span class="operator"><</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">r</span> <span class="operator">!=</span> <span class="name">s</span><span class="punctuation">)</span> <span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">3</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="comment single">// do not include files and folders whose
|
|
|
|
|
// name starts with a .
|
|
|
|
|
bool file_filter(boost::filesystem::path const& filename)
|
|
|
|
|
{
|
|
|
|
|
if (filename.leaf()[0] == '.') return false;
|
|
|
|
|
std::cerr << filename << std::endl;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
</span><span class="keyword type">bool</span> <span class="name function">file_filter</span><span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span> <span class="keyword">const</span><span class="operator">&</span> <span class="name">f</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">filename</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">)[</span><span class="literal number integer">0</span><span class="punctuation">]</span> <span class="operator">==</span> <span class="literal string char">'.'</span><span class="punctuation">)</span> <span class="keyword">return</span> <span class="name builtin">false</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"%s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">f</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="name builtin">true</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
void print_progress(int i, int num)
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "\r" << (i+1) << "/" << num;
|
|
|
|
|
}
|
|
|
|
|
<span class="keyword type">void</span> <span class="name function">print_progress</span><span class="punctuation">(</span><span class="keyword type">int</span> <span class="name">i</span><span class="punctuation">,</span> <span class="keyword type">int</span> <span class="name">num</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"</span><span class="literal string escape">\r</span><span class="literal string">%d/%d"</span><span class="punctuation">,</span> <span class="name">i</span><span class="operator">+</span><span class="literal number integer">1</span><span class="punctuation">,</span> <span class="name">num</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
int main(int argc, char* argv[])
|
|
|
|
|
{
|
|
|
|
|
using namespace libtorrent;
|
|
|
|
|
using namespace boost::filesystem;
|
|
|
|
|
<span class="keyword type">void</span> <span class="name function">print_usage</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fputs</span><span class="punctuation">(</span><span class="literal string">"usage: make_torrent FILE [OPTIONS]</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"Generates a torrent file from the specified file</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"or directory and writes it to standard out</span><span class="literal string escape">\n\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"OPTIONS:</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-m file generate a merkle hash tree torrent.</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" merkle torrents require client support</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" the resulting full merkle tree is written to</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" the specified file</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-f include sha-1 file hashes in the torrent</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" this helps supporting mixing sources from</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" other networks</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-w url adds a web seed to the torrent with</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" the specified url</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-t url adds the specified tracker to the</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" torrent. For multiple trackers, specify more</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" -t options</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-c comment sets the comment to the specified string</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-C creator sets the created-by field to the specified string</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-p bytes enables padding files. Files larger</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" than bytes will be piece-aligned</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-s bytes specifies a piece size for the torrent</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" This has to be a multiple of 16 kiB</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-l Don't follow symlinks, instead encode them as</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" links in the torrent file</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-o file specifies the output filename of the torrent file</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" If this is not specified, the torrent file is</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" printed to the standard out, except on windows</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" where the filename defaults to a.torrent</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"-r file add root certificate to the torrent, to verify</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">" the HTTPS tracker</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">stderr</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
int piece_size = 256 * 1024;
|
|
|
|
|
char const* creator_str = "libtorrent";
|
|
|
|
|
<span class="keyword type">int</span> <span class="name function">main</span><span class="punctuation">(</span><span class="keyword type">int</span> <span class="name">argc</span><span class="punctuation">,</span> <span class="keyword type">char</span><span class="operator">*</span> <span class="name">argv</span><span class="punctuation">[])</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="name">libtorrent</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
path::default_name_check(no_check);
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">string</span> <span class="name">creator_str</span> <span class="operator">=</span> <span class="literal string">"libtorrent"</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">string</span> <span class="name">comment_str</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
if (argc != 4 && argc != 5)
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "usage: make_torrent <output torrent-file> "
|
|
|
|
|
"<announce url> <file or directory to create torrent from> "
|
|
|
|
|
"[url-seed]\n";
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">argc</span> <span class="operator"><</span> <span class="literal number integer">2</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">print_usage</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
#ifndef BOOST_NO_EXCEPTIONS
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
#endif
|
|
|
|
|
file_storage fs;
|
|
|
|
|
file_pool fp;
|
|
|
|
|
path full_path = complete(path(argv[3]));
|
|
|
|
|
<span class="comment preproc">#ifndef BOOST_NO_EXCEPTIONS
|
|
|
|
|
</span> <span class="name">try</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="comment preproc">#endif
|
|
|
|
|
</span> <span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="operator">></span> <span class="name">web_seeds</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="operator">></span> <span class="name">trackers</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">pad_file_limit</span> <span class="operator">=</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">piece_size</span> <span class="operator">=</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">flags</span> <span class="operator">=</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">string</span> <span class="name">root_cert</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
add_files(fs, full_path, file_filter);
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">string</span> <span class="name">outfile</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">string</span> <span class="name">merklefile</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="comment preproc">#ifdef TORRENT_WINDOWS
|
|
|
|
|
</span> <span class="comment single">// don't ever write binary data to the console on windows
|
|
|
|
|
</span> <span class="comment single">// it will just be interpreted as text and corrupted
|
|
|
|
|
</span> <span class="name">outfile</span> <span class="operator">=</span> <span class="literal string">"a.torrent"</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="comment preproc">#endif
|
|
|
|
|
</span>
|
|
|
|
|
<span class="keyword">for</span> <span class="punctuation">(</span><span class="keyword type">int</span> <span class="name">i</span> <span class="operator">=</span> <span class="literal number integer">2</span><span class="punctuation">;</span> <span class="name">i</span> <span class="operator"><</span> <span class="name">argc</span><span class="punctuation">;</span> <span class="operator">++</span><span class="name">i</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">][</span><span class="literal number integer">0</span><span class="punctuation">]</span> <span class="operator">!=</span> <span class="literal string char">'-'</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">print_usage</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
create_torrent t(fs, piece_size);
|
|
|
|
|
t.add_tracker(argv[2]);
|
|
|
|
|
set_piece_hashes(t, full_path.branch_path()
|
|
|
|
|
, boost::bind(&print_progress, _1, t.num_pieces()));
|
|
|
|
|
std::cerr << std::endl;
|
|
|
|
|
t.set_creator(creator_str);
|
|
|
|
|
<span class="keyword">switch</span> <span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">][</span><span class="literal number integer">1</span><span class="punctuation">])</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'w'</span>:
|
|
|
|
|
<span class="operator">++</span><span class="name">i</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">web_seeds</span><span class="punctuation">.</span><span class="name">push_back</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">]);</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'t'</span>:
|
|
|
|
|
<span class="operator">++</span><span class="name">i</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">trackers</span><span class="punctuation">.</span><span class="name">push_back</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">]);</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'p'</span>:
|
|
|
|
|
<span class="operator">++</span><span class="name">i</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">pad_file_limit</span> <span class="operator">=</span> <span class="name">atoi</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">]);</span>
|
|
|
|
|
<span class="name">flags</span> <span class="operator">|=</span> <span class="name">create_torrent</span><span class="operator">::</span><span class="name">optimize</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'s'</span>:
|
|
|
|
|
<span class="operator">++</span><span class="name">i</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">piece_size</span> <span class="operator">=</span> <span class="name">atoi</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">]);</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'m'</span>:
|
|
|
|
|
<span class="operator">++</span><span class="name">i</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">merklefile</span> <span class="operator">=</span> <span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">];</span>
|
|
|
|
|
<span class="name">flags</span> <span class="operator">|=</span> <span class="name">create_torrent</span><span class="operator">::</span><span class="name">merkle</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'o'</span>:
|
|
|
|
|
<span class="operator">++</span><span class="name">i</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">outfile</span> <span class="operator">=</span> <span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">];</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'f'</span>:
|
|
|
|
|
<span class="name">flags</span> <span class="operator">|=</span> <span class="name">create_torrent</span><span class="operator">::</span><span class="name">calculate_file_hashes</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'l'</span>:
|
|
|
|
|
<span class="name">flags</span> <span class="operator">|=</span> <span class="name">create_torrent</span><span class="operator">::</span><span class="name">symlinks</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'C'</span>:
|
|
|
|
|
<span class="operator">++</span><span class="name">i</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">creator_str</span> <span class="operator">=</span> <span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">];</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'c'</span>:
|
|
|
|
|
<span class="operator">++</span><span class="name">i</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">comment_str</span> <span class="operator">=</span> <span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">];</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="literal string char">'r'</span>:
|
|
|
|
|
<span class="operator">++</span><span class="name">i</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">root_cert</span> <span class="operator">=</span> <span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">];</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name label">default:</span>
|
|
|
|
|
<span class="name">print_usage</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
if (argc == 5) t.add_url_seed(argv[4]);
|
|
|
|
|
<span class="name">file_storage</span> <span class="name">fs</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">string</span> <span class="name">full_path</span> <span class="operator">=</span> <span class="name">libtorrent</span><span class="operator">::</span><span class="name">complete</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">]);</span>
|
|
|
|
|
|
|
|
|
|
// create the torrent and print it to out
|
|
|
|
|
ofstream out(complete(path(argv[1])), std::ios_base::binary);
|
|
|
|
|
bencode(std::ostream_iterator<char>(out), t.generate());
|
|
|
|
|
#ifndef BOOST_NO_EXCEPTIONS
|
|
|
|
|
}
|
|
|
|
|
catch (std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
std::cerr << e.what() << "\n";
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
<span class="name">add_files</span><span class="punctuation">(</span><span class="name">fs</span><span class="punctuation">,</span> <span class="name">full_path</span><span class="punctuation">,</span> <span class="name">file_filter</span><span class="punctuation">,</span> <span class="name">flags</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">fs</span><span class="punctuation">.</span><span class="name">num_files</span><span class="punctuation">()</span> <span class="operator">==</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fputs</span><span class="punctuation">(</span><span class="literal string">"no files specified.</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">stderr</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
<span class="name">create_torrent</span> <span class="name">t</span><span class="punctuation">(</span><span class="name">fs</span><span class="punctuation">,</span> <span class="name">piece_size</span><span class="punctuation">,</span> <span class="name">pad_file_limit</span><span class="punctuation">,</span> <span class="name">flags</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">tier</span> <span class="operator">=</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">for</span> <span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="operator">>::</span><span class="name">iterator</span> <span class="name">i</span> <span class="operator">=</span> <span class="name">trackers</span><span class="punctuation">.</span><span class="name">begin</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">end</span><span class="punctuation">(</span><span class="name">trackers</span><span class="punctuation">.</span><span class="name">end</span><span class="punctuation">());</span> <span class="name">i</span> <span class="operator">!=</span> <span class="name">end</span><span class="punctuation">;</span> <span class="operator">++</span><span class="name">i</span><span class="punctuation">,</span> <span class="operator">++</span><span class="name">tier</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="name">t</span><span class="punctuation">.</span><span class="name">add_tracker</span><span class="punctuation">(</span><span class="operator">*</span><span class="name">i</span><span class="punctuation">,</span> <span class="name">tier</span><span class="punctuation">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">for</span> <span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="operator">>::</span><span class="name">iterator</span> <span class="name">i</span> <span class="operator">=</span> <span class="name">web_seeds</span><span class="punctuation">.</span><span class="name">begin</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">end</span><span class="punctuation">(</span><span class="name">web_seeds</span><span class="punctuation">.</span><span class="name">end</span><span class="punctuation">());</span> <span class="name">i</span> <span class="operator">!=</span> <span class="name">end</span><span class="punctuation">;</span> <span class="operator">++</span><span class="name">i</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="name">t</span><span class="punctuation">.</span><span class="name">add_url_seed</span><span class="punctuation">(</span><span class="operator">*</span><span class="name">i</span><span class="punctuation">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">error_code</span> <span class="name">ec</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">set_piece_hashes</span><span class="punctuation">(</span><span class="name">t</span><span class="punctuation">,</span> <span class="name">parent_path</span><span class="punctuation">(</span><span class="name">full_path</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">bind</span><span class="punctuation">(</span><span class="operator">&</span><span class="name">print_progress</span><span class="punctuation">,</span> <span class="name">_1</span><span class="punctuation">,</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">num_pieces</span><span class="punctuation">()),</span> <span class="name">ec</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ec</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"%s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">.</span><span class="name">message</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="name">t</span><span class="punctuation">.</span><span class="name">set_creator</span><span class="punctuation">(</span><span class="name">creator_str</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="operator">!</span><span class="name">comment_str</span><span class="punctuation">.</span><span class="name">empty</span><span class="punctuation">())</span>
|
|
|
|
|
<span class="name">t</span><span class="punctuation">.</span><span class="name">set_comment</span><span class="punctuation">(</span><span class="name">comment_str</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="operator">!</span><span class="name">root_cert</span><span class="punctuation">.</span><span class="name">empty</span><span class="punctuation">())</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="keyword type">char</span><span class="operator">></span> <span class="name">pem</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">load_file</span><span class="punctuation">(</span><span class="name">root_cert</span><span class="punctuation">,</span> <span class="name">pem</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">,</span> <span class="literal number integer">10000</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ec</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"failed to load root certificate for tracker: %s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">.</span><span class="name">message</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="keyword">else</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">t</span><span class="punctuation">.</span><span class="name">set_root_cert</span><span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="punctuation">(</span><span class="operator">&</span><span class="name">pem</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">],</span> <span class="name">pem</span><span class="punctuation">.</span><span class="name">size</span><span class="punctuation">()));</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="comment single">// create the torrent and print it to stdout
|
|
|
|
|
</span> <span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="keyword type">char</span><span class="operator">></span> <span class="name">torrent</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">bencode</span><span class="punctuation">(</span><span class="name">back_inserter</span><span class="punctuation">(</span><span class="name">torrent</span><span class="punctuation">),</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">generate</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword type">FILE</span><span class="operator">*</span> <span class="name">output</span> <span class="operator">=</span> <span class="name">stdout</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="operator">!</span><span class="name">outfile</span><span class="punctuation">.</span><span class="name">empty</span><span class="punctuation">())</span>
|
|
|
|
|
<span class="name">output</span> <span class="operator">=</span> <span class="name">fopen</span><span class="punctuation">(</span><span class="name">outfile</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">(),</span> <span class="literal string">"wb+"</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">output</span> <span class="operator">==</span> <span class="name builtin">NULL</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"failed to open file </span><span class="literal string escape">\"</span><span class="literal string">%s</span><span class="literal string escape">\"</span><span class="literal string">: (%d) %s</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">outfile</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">(),</span> <span class="name">errno</span><span class="punctuation">,</span> <span class="name">strerror</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">));</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="name">fwrite</span><span class="punctuation">(</span><span class="operator">&</span><span class="name">torrent</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">],</span> <span class="literal number integer">1</span><span class="punctuation">,</span> <span class="name">torrent</span><span class="punctuation">.</span><span class="name">size</span><span class="punctuation">(),</span> <span class="name">output</span><span class="punctuation">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">output</span> <span class="operator">!=</span> <span class="name">stdout</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">output</span><span class="punctuation">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="operator">!</span><span class="name">merklefile</span><span class="punctuation">.</span><span class="name">empty</span><span class="punctuation">())</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">output</span> <span class="operator">=</span> <span class="name">fopen</span><span class="punctuation">(</span><span class="name">merklefile</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">(),</span> <span class="literal string">"wb+"</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">output</span> <span class="operator">==</span> <span class="name builtin">NULL</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"failed to open file </span><span class="literal string escape">\"</span><span class="literal string">%s</span><span class="literal string escape">\"</span><span class="literal string">: (%d) %s</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">merklefile</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">(),</span> <span class="name">errno</span><span class="punctuation">,</span> <span class="name">strerror</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">));</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">ret</span> <span class="operator">=</span> <span class="name">fwrite</span><span class="punctuation">(</span><span class="operator">&</span><span class="name">t</span><span class="punctuation">.</span><span class="name">merkle_tree</span><span class="punctuation">()[</span><span class="literal number integer">0</span><span class="punctuation">],</span> <span class="literal number integer">20</span><span class="punctuation">,</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">merkle_tree</span><span class="punctuation">().</span><span class="name">size</span><span class="punctuation">(),</span> <span class="name">output</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ret</span> <span class="operator">!=</span> <span class="keyword type">int</span><span class="punctuation">(</span><span class="name">t</span><span class="punctuation">.</span><span class="name">merkle_tree</span><span class="punctuation">().</span><span class="name">size</span><span class="punctuation">()))</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"failed to write %s: (%d) %s</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">merklefile</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">(),</span> <span class="name">errno</span><span class="punctuation">,</span> <span class="name">strerror</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">));</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">output</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="comment preproc">#ifndef BOOST_NO_EXCEPTIONS
|
|
|
|
|
</span> <span class="punctuation">}</span>
|
|
|
|
|
<span class="keyword">catch</span> <span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">exception</span><span class="operator">&</span> <span class="name">e</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"%s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">e</span><span class="punctuation">.</span><span class="name">what</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="comment preproc">#endif
|
|
|
|
|
</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="section" id="dump-torrent">
|
|
|
|
|
<h2>dump_torrent</h2>
|
|
|
|
|
<p>This is an example of a program that will take a torrent-file as a parameter and
|
|
|
|
|
print information about it to std out:</p>
|
|
|
|
|
<pre class="code c++ literal-block">
|
|
|
|
|
<span class="comment preproc">#include "libtorrent/entry.hpp"
|
|
|
|
|
#include "libtorrent/bencode.hpp"
|
|
|
|
|
#include "libtorrent/torrent_info.hpp"
|
|
|
|
|
#include "libtorrent/lazy_entry.hpp"
|
|
|
|
|
#include "libtorrent/magnet_uri.hpp"
|
|
|
|
|
</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name function">load_file</span><span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span> <span class="keyword">const</span><span class="operator">&</span> <span class="name">filename</span><span class="punctuation">,</span> <span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="keyword type">char</span><span class="operator">>&</span> <span class="name">v</span><span class="punctuation">,</span> <span class="name">libtorrent</span><span class="operator">::</span><span class="name">error_code</span><span class="operator">&</span> <span class="name">ec</span><span class="punctuation">,</span> <span class="keyword type">int</span> <span class="name">limit</span> <span class="operator">=</span> <span class="literal number integer">8000000</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">clear</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword type">FILE</span><span class="operator">*</span> <span class="name">f</span> <span class="operator">=</span> <span class="name">fopen</span><span class="punctuation">(</span><span class="name">filename</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">(),</span> <span class="literal string">"rb"</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">f</span> <span class="operator">==</span> <span class="name builtin">NULL</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">r</span> <span class="operator">=</span> <span class="name">fseek</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">,</span> <span class="literal number integer">0</span><span class="punctuation">,</span> <span class="name">SEEK_END</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">r</span> <span class="operator">!=</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="keyword type">long</span> <span class="name">s</span> <span class="operator">=</span> <span class="name">ftell</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">s</span> <span class="operator"><</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">s</span> <span class="operator">></span> <span class="name">limit</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">2</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">r</span> <span class="operator">=</span> <span class="name">fseek</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">,</span> <span class="literal number integer">0</span><span class="punctuation">,</span> <span class="name">SEEK_SET</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">r</span> <span class="operator">!=</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">v</span><span class="punctuation">.</span><span class="name">resize</span><span class="punctuation">(</span><span class="name">s</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">s</span> <span class="operator">==</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">r</span> <span class="operator">=</span> <span class="name">fread</span><span class="punctuation">(</span><span class="operator">&</span><span class="name">v</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">],</span> <span class="literal number integer">1</span><span class="punctuation">,</span> <span class="name">v</span><span class="punctuation">.</span><span class="name">size</span><span class="punctuation">(),</span> <span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">r</span> <span class="operator"><</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">ec</span><span class="punctuation">.</span><span class="name">assign</span><span class="punctuation">(</span><span class="name">errno</span><span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="name">system</span><span class="operator">::</span><span class="name">generic_category</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">fclose</span><span class="punctuation">(</span><span class="name">f</span><span class="punctuation">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">r</span> <span class="operator">!=</span> <span class="name">s</span><span class="punctuation">)</span> <span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">3</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword type">int</span> <span class="name function">line_longer_than</span><span class="punctuation">(</span><span class="name">libtorrent</span><span class="operator">::</span><span class="name">lazy_entry</span> <span class="keyword">const</span><span class="operator">&</span> <span class="name">e</span><span class="punctuation">,</span> <span class="keyword type">int</span> <span class="name">limit</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="name">libtorrent</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">line_len</span> <span class="operator">=</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">switch</span> <span class="punctuation">(</span><span class="name">e</span><span class="punctuation">.</span><span class="name">type</span><span class="punctuation">())</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="name">lazy_entry</span>:<span class="operator">:</span><span class="keyword type">list_t</span><span class="operator">:</span>
|
|
|
|
|
<span class="name">line_len</span> <span class="operator">+=</span> <span class="literal number integer">4</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">line_len</span> <span class="operator">></span> <span class="name">limit</span><span class="punctuation">)</span> <span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">for</span> <span class="punctuation">(</span><span class="keyword type">int</span> <span class="name">i</span> <span class="operator">=</span> <span class="literal number integer">0</span><span class="punctuation">;</span> <span class="name">i</span> <span class="operator"><</span> <span class="name">e</span><span class="punctuation">.</span><span class="name">list_size</span><span class="punctuation">();</span> <span class="operator">++</span><span class="name">i</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">ret</span> <span class="operator">=</span> <span class="name">line_longer_than</span><span class="punctuation">(</span><span class="operator">*</span><span class="name">e</span><span class="punctuation">.</span><span class="name">list_at</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">),</span> <span class="name">limit</span> <span class="operator">-</span> <span class="name">line_len</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ret</span> <span class="operator">==</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">)</span> <span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">line_len</span> <span class="operator">+=</span> <span class="name">ret</span> <span class="operator">+</span> <span class="literal number integer">2</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="name">lazy_entry</span>:<span class="operator">:</span><span class="keyword type">dict_t</span><span class="operator">:</span>
|
|
|
|
|
<span class="name">line_len</span> <span class="operator">+=</span> <span class="literal number integer">4</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">line_len</span> <span class="operator">></span> <span class="name">limit</span><span class="punctuation">)</span> <span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">for</span> <span class="punctuation">(</span><span class="keyword type">int</span> <span class="name">i</span> <span class="operator">=</span> <span class="literal number integer">0</span><span class="punctuation">;</span> <span class="name">i</span> <span class="operator"><</span> <span class="name">e</span><span class="punctuation">.</span><span class="name">dict_size</span><span class="punctuation">();</span> <span class="operator">++</span><span class="name">i</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">line_len</span> <span class="operator">+=</span> <span class="literal number integer">4</span> <span class="operator">+</span> <span class="name">e</span><span class="punctuation">.</span><span class="name">dict_at</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">).</span><span class="name">first</span><span class="punctuation">.</span><span class="name">size</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">line_len</span> <span class="operator">></span> <span class="name">limit</span><span class="punctuation">)</span> <span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">ret</span> <span class="operator">=</span> <span class="name">line_longer_than</span><span class="punctuation">(</span><span class="operator">*</span><span class="name">e</span><span class="punctuation">.</span><span class="name">dict_at</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">).</span><span class="name">second</span><span class="punctuation">,</span> <span class="name">limit</span> <span class="operator">-</span> <span class="name">line_len</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ret</span> <span class="operator">==</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">)</span> <span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">line_len</span> <span class="operator">+=</span> <span class="name">ret</span> <span class="operator">+</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="name">lazy_entry</span>:<span class="operator">:</span><span class="keyword type">string_t</span><span class="operator">:</span>
|
|
|
|
|
<span class="name">line_len</span> <span class="operator">+=</span> <span class="literal number integer">3</span> <span class="operator">+</span> <span class="name">e</span><span class="punctuation">.</span><span class="name">string_length</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="name">lazy_entry</span>:<span class="operator">:</span><span class="keyword type">int_t</span><span class="operator">:</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">size_type</span> <span class="name">val</span> <span class="operator">=</span> <span class="name">e</span><span class="punctuation">.</span><span class="name">int_value</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword">while</span> <span class="punctuation">(</span><span class="name">val</span> <span class="operator">></span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="operator">++</span><span class="name">line_len</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">val</span> <span class="operator">/=</span> <span class="literal number integer">10</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="name">line_len</span> <span class="operator">+=</span> <span class="literal number integer">2</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">case</span> <span class="name">lazy_entry</span>:<span class="operator">:</span><span class="keyword type">none_t</span><span class="operator">:</span>
|
|
|
|
|
<span class="name">line_len</span> <span class="operator">+=</span> <span class="literal number integer">4</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">break</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">line_len</span> <span class="operator">></span> <span class="name">limit</span><span class="punctuation">)</span> <span class="keyword">return</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="name">line_len</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword type">int</span> <span class="name function">main</span><span class="punctuation">(</span><span class="keyword type">int</span> <span class="name">argc</span><span class="punctuation">,</span> <span class="keyword type">char</span><span class="operator">*</span> <span class="name">argv</span><span class="punctuation">[])</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="name">libtorrent</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">argc</span> <span class="operator"><</span> <span class="literal number integer">2</span> <span class="operator">||</span> <span class="name">argc</span> <span class="operator">></span> <span class="literal number integer">4</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fputs</span><span class="punctuation">(</span><span class="literal string">"usage: dump_torrent torrent-file [total-items-limit] [recursion-limit]</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">stderr</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">item_limit</span> <span class="operator">=</span> <span class="literal number integer">1000000</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">depth_limit</span> <span class="operator">=</span> <span class="literal number integer">1000</span><span class="punctuation">;</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">argc</span> <span class="operator">></span> <span class="literal number integer">2</span><span class="punctuation">)</span> <span class="name">item_limit</span> <span class="operator">=</span> <span class="name">atoi</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="literal number integer">2</span><span class="punctuation">]);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">argc</span> <span class="operator">></span> <span class="literal number integer">3</span><span class="punctuation">)</span> <span class="name">depth_limit</span> <span class="operator">=</span> <span class="name">atoi</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="literal number integer">3</span><span class="punctuation">]);</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="keyword type">char</span><span class="operator">></span> <span class="name">buf</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">error_code</span> <span class="name">ec</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">ret</span> <span class="operator">=</span> <span class="name">load_file</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">],</span> <span class="name">buf</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">,</span> <span class="literal number integer">40</span> <span class="operator">*</span> <span class="literal number integer">1000000</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ret</span> <span class="operator">==</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"file too big, aborting</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ret</span> <span class="operator">!=</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"failed to load file: %s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">.</span><span class="name">message</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="name">lazy_entry</span> <span class="name">e</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">pos</span> <span class="operator">=</span> <span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"decoding. recursion limit: %d total item count limit: %d</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">depth_limit</span><span class="punctuation">,</span> <span class="name">item_limit</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="name">ret</span> <span class="operator">=</span> <span class="name">lazy_bdecode</span><span class="punctuation">(</span><span class="operator">&</span><span class="name">buf</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">],</span> <span class="operator">&</span><span class="name">buf</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">]</span> <span class="operator">+</span> <span class="name">buf</span><span class="punctuation">.</span><span class="name">size</span><span class="punctuation">(),</span> <span class="name">e</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">,</span> <span class="operator">&</span><span class="name">pos</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">depth_limit</span><span class="punctuation">,</span> <span class="name">item_limit</span><span class="punctuation">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"</span><span class="literal string escape">\n\n</span><span class="literal string">----- raw info -----</span><span class="literal string escape">\n\n</span><span class="literal string">%s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">print_entry</span><span class="punctuation">(</span><span class="name">e</span><span class="punctuation">).</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ret</span> <span class="operator">!=</span> <span class="literal number integer">0</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"failed to decode: '%s' at character: %d</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">.</span><span class="name">message</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">(),</span> <span class="name">pos</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="name">torrent_info</span> <span class="name">t</span><span class="punctuation">(</span><span class="name">e</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">if</span> <span class="punctuation">(</span><span class="name">ec</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span> <span class="literal string">"%s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">ec</span><span class="punctuation">.</span><span class="name">message</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">1</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="name">e</span><span class="punctuation">.</span><span class="name">clear</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="keyword type">char</span><span class="operator">></span><span class="punctuation">().</span><span class="name">swap</span><span class="punctuation">(</span><span class="name">buf</span><span class="punctuation">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="comment single">// print info about torrent
|
|
|
|
|
</span> <span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"</span><span class="literal string escape">\n\n</span><span class="literal string">----- torrent file info -----</span><span class="literal string escape">\n\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"nodes:</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">typedef</span> <span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="name">std</span><span class="operator">::</span><span class="name">pair</span><span class="operator"><</span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="punctuation">,</span> <span class="keyword type">int</span><span class="operator">></span> <span class="operator">></span> <span class="name">node_vec</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="name">node_vec</span> <span class="keyword">const</span><span class="operator">&</span> <span class="name">nodes</span> <span class="operator">=</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">nodes</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword">for</span> <span class="punctuation">(</span><span class="name">node_vec</span><span class="operator">::</span><span class="name">const_iterator</span> <span class="name">i</span> <span class="operator">=</span> <span class="name">nodes</span><span class="punctuation">.</span><span class="name">begin</span><span class="punctuation">(),</span> <span class="name">end</span><span class="punctuation">(</span><span class="name">nodes</span><span class="punctuation">.</span><span class="name">end</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">i</span> <span class="operator">!=</span> <span class="name">end</span><span class="punctuation">;</span> <span class="operator">++</span><span class="name">i</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"%s: %d</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">i</span><span class="operator">-></span><span class="name">first</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">(),</span> <span class="name">i</span><span class="operator">-></span><span class="name">second</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
<span class="name">puts</span><span class="punctuation">(</span><span class="literal string">"trackers:</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="keyword">for</span> <span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="name">announce_entry</span><span class="operator">>::</span><span class="name">const_iterator</span> <span class="name">i</span> <span class="operator">=</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">trackers</span><span class="punctuation">().</span><span class="name">begin</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="name">i</span> <span class="operator">!=</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">trackers</span><span class="punctuation">().</span><span class="name">end</span><span class="punctuation">();</span> <span class="operator">++</span><span class="name">i</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"%2d: %s</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span> <span class="name">i</span><span class="operator">-></span><span class="name">tier</span><span class="punctuation">,</span> <span class="name">i</span><span class="operator">-></span><span class="name">url</span><span class="punctuation">.</span><span class="name">c_str</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword type">char</span> <span class="name">ih</span><span class="punctuation">[</span><span class="literal number integer">41</span><span class="punctuation">];</span>
|
|
|
|
|
<span class="name">to_hex</span><span class="punctuation">((</span><span class="keyword type">char</span> <span class="keyword">const</span><span class="operator">*</span><span class="punctuation">)</span><span class="operator">&</span><span class="name">t</span><span class="punctuation">.</span><span class="name">info_hash</span><span class="punctuation">()[</span><span class="literal number integer">0</span><span class="punctuation">],</span> <span class="literal number integer">20</span><span class="punctuation">,</span> <span class="name">ih</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"number of pieces: %d</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"piece length: %d</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"info hash: %s</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"comment: %s</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"created by: %s</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"magnet link: %s</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"name: %s</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"number of files: %d</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="literal string">"files:</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">num_pieces</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">piece_length</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">ih</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">comment</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">creator</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">make_magnet_uri</span><span class="punctuation">(</span><span class="name">t</span><span class="punctuation">).</span><span class="name">c_str</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">name</span><span class="punctuation">().</span><span class="name">c_str</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">num_files</span><span class="punctuation">());</span>
|
|
|
|
|
<span class="name">file_storage</span> <span class="keyword">const</span><span class="operator">&</span> <span class="name">st</span> <span class="operator">=</span> <span class="name">t</span><span class="punctuation">.</span><span class="name">files</span><span class="punctuation">();</span>
|
|
|
|
|
<span class="keyword">for</span> <span class="punctuation">(</span><span class="keyword type">int</span> <span class="name">i</span> <span class="operator">=</span> <span class="literal number integer">0</span><span class="punctuation">;</span> <span class="name">i</span> <span class="operator"><</span> <span class="name">st</span><span class="punctuation">.</span><span class="name">num_files</span><span class="punctuation">();</span> <span class="operator">++</span><span class="name">i</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">{</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">first</span> <span class="operator">=</span> <span class="name">st</span><span class="punctuation">.</span><span class="name">map_file</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">,</span> <span class="literal number integer">0</span><span class="punctuation">,</span> <span class="literal number integer">0</span><span class="punctuation">).</span><span class="name">piece</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">last</span> <span class="operator">=</span> <span class="name">st</span><span class="punctuation">.</span><span class="name">map_file</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">,</span> <span class="punctuation">(</span><span class="name">std</span><span class="operator">::</span><span class="name">max</span><span class="punctuation">)(</span><span class="name">size_type</span><span class="punctuation">(</span><span class="name">st</span><span class="punctuation">.</span><span class="name">file_size</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">))</span><span class="operator">-</span><span class="literal number integer">1</span><span class="punctuation">,</span> <span class="name">size_type</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">)),</span> <span class="literal number integer">0</span><span class="punctuation">).</span><span class="name">piece</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="keyword type">int</span> <span class="name">flags</span> <span class="operator">=</span> <span class="name">st</span><span class="punctuation">.</span><span class="name">file_flags</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="name">printf</span><span class="punctuation">(</span><span class="literal string">" %8"</span> <span class="name">PRIx64</span> <span class="literal string">" %11"</span> <span class="name">PRId64</span> <span class="literal string">" %c%c%c%c [ %5d, %5d ] %7u %s %s %s%s</span><span class="literal string escape">\n</span><span class="literal string">"</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">st</span><span class="punctuation">.</span><span class="name">file_offset</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">st</span><span class="punctuation">.</span><span class="name">file_size</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="punctuation">((</span><span class="name">flags</span> <span class="operator">&</span> <span class="name">file_storage</span><span class="operator">::</span><span class="name">flag_pad_file</span><span class="punctuation">)</span><span class="operator">?</span><span class="literal string char">'p'</span><span class="operator">:</span><span class="literal string char">'-'</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="punctuation">((</span><span class="name">flags</span> <span class="operator">&</span> <span class="name">file_storage</span><span class="operator">::</span><span class="name">flag_executable</span><span class="punctuation">)</span><span class="operator">?</span><span class="literal string char">'x'</span><span class="operator">:</span><span class="literal string char">'-'</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="punctuation">((</span><span class="name">flags</span> <span class="operator">&</span> <span class="name">file_storage</span><span class="operator">::</span><span class="name">flag_hidden</span><span class="punctuation">)</span><span class="operator">?</span><span class="literal string char">'h'</span><span class="operator">:</span><span class="literal string char">'-'</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="punctuation">((</span><span class="name">flags</span> <span class="operator">&</span> <span class="name">file_storage</span><span class="operator">::</span><span class="name">flag_symlink</span><span class="punctuation">)</span><span class="operator">?</span><span class="literal string char">'l'</span><span class="operator">:</span><span class="literal string char">'-'</span><span class="punctuation">)</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">first</span><span class="punctuation">,</span> <span class="name">last</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">boost</span><span class="operator">::</span><span class="keyword type">uint32_t</span><span class="punctuation">(</span><span class="name">st</span><span class="punctuation">.</span><span class="name">mtime</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">))</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">st</span><span class="punctuation">.</span><span class="name">hash</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">)</span> <span class="operator">!=</span> <span class="name">sha1_hash</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">)</span> <span class="operator">?</span> <span class="name">to_hex</span><span class="punctuation">(</span><span class="name">st</span><span class="punctuation">.</span><span class="name">hash</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">).</span><span class="name">to_string</span><span class="punctuation">()).</span><span class="name">c_str</span><span class="punctuation">()</span> <span class="operator">:</span> <span class="literal string">""</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="name">st</span><span class="punctuation">.</span><span class="name">file_path</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">).</span><span class="name">c_str</span><span class="punctuation">()</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="punctuation">(</span><span class="name">flags</span> <span class="operator">&</span> <span class="name">file_storage</span><span class="operator">::</span><span class="name">flag_symlink</span><span class="punctuation">)</span> <span class="operator">?</span> <span class="literal string">"-> "</span> <span class="operator">:</span> <span class="literal string">""</span>
|
|
|
|
|
<span class="punctuation">,</span> <span class="punctuation">(</span><span class="name">flags</span> <span class="operator">&</span> <span class="name">file_storage</span><span class="operator">::</span><span class="name">flag_symlink</span><span class="punctuation">)</span> <span class="operator">?</span> <span class="name">st</span><span class="punctuation">.</span><span class="name">symlink</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">).</span><span class="name">c_str</span><span class="punctuation">()</span> <span class="operator">:</span> <span class="literal string">""</span><span class="punctuation">);</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="keyword">return</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
|
|
|
|
|
<span class="punctuation">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|