Package: mktorrent
Version: 1.0-4
Tags: patch
Contemporary BitTorrent protocol evolved considerably from its
earliest, tracker-based (and “single point of failure”-friendly)
variants. Therefore, modern BitTorrent agents (such as, e. g.,
Aria2) do not require trackers to operate, and do not require
that the .torrent file contains either of the ‘announce’ or
‘announce-list’ fields, either.
Unfortunately, mktorrent(1) still demands that at least one
“announce URI” is specified, forcing one to use a dummy URI as
such as a work-around, like:
$ mktorrent -o example.torrent --announce=http://nowhere.invalid:8080/ \
-- example.ogv
Please thus consider the patch MIME'd.
For debian/changelog, I'd suggest the following bit:
* Allow creating .torrent files without an "announce list" (Closes: #XXX).
TIA.
--
FSF associate member #7257
--- debian/mktorrent.1.~1~ 2012-06-17 12:15:09.000000000 +0000
+++ debian/mktorrent.1 2013-01-31 19:16:17.000000000 +0000
@@ -10,7 +10,12 @@
.SH OPTIONS
\fB\-a\fR <url>[,<url>]*
.IP
-specify the full tracker announce URLs. At least one is required and additional \fB\-a\fR add backup trackers
+specify the full tracker announce URLs.
+Unless at least one is given, the resulting \fB.torrent\fR file will
+imply the use of alternative peer discovery mechanisms, such as those
+based on a Distributed Hash Table (DHT; see BEP 5), Local Peer Discovery
+(LPD), etc.
+Additional \fB\-a\fR add backup trackers
.PP
\fB\-c\fR <comment>
.IP
Author: Ivan Shmakov <[email protected]>
Description: Allow creating .torrent files without "announce URI's"
Index: mktorrent-1.0/init.c
===================================================================
--- mktorrent-1.0.orig/init.c 2013-01-31 19:22:01.776671829 +0000
+++ mktorrent-1.0/init.c 2013-01-31 21:35:39.818858245 +0000
@@ -277,7 +277,6 @@
"Options:\n"
#ifdef USE_LONG_OPTIONS
"-a, --announce=<url>[,<url>]* : specify the full announce URLs\n"
- " at least one is required\n"
" additional -a adds backup trackers\n"
"-c, --comment=<comment> : add a comment to the metainfo\n"
"-d, --no-date : don't write the creation date\n"
@@ -298,7 +297,6 @@
" additional -w adds more URLs\n"
#else
"-a <url>[,<url>]* : specify the full announce URLs\n"
- " at least one is required\n"
" additional -a adds backup trackers\n"
"-c <comment> : add a comment to the metainfo\n"
"-d : don't write the creation date\n"
@@ -327,6 +325,12 @@
*/
static void print_announce_list(llist_t *list)
{
+ if (list == 0) {
+ /* an empty list passed; return early */
+ puts(" (no announce URI's given)");
+ return;
+ }
+
unsigned int n;
for (n = 1; list; list = list->next, n++) {
@@ -503,14 +507,20 @@
}
m->piece_length = 1 << m->piece_length;
- /* user must specify at least one announce URL as it wouldn't make
- * any sense to have a default for this */
+ /* warn the user that the resulting .torrent implies reliance on
+ an alternative peer discovery mechanism (DHT, as in BEP 5, or
+ other Kademlia implementation; LPD; etc.) */
if (m->announce_list == NULL) {
- fprintf(stderr, "Must specify an announce URL. "
- "Use -h for help.\n");
- exit(EXIT_FAILURE);
- }
- announce_last->next = NULL;
+ fputs(("Warning: No announce URI's given.\n\n"
+ "Please note that the resulting .torrent"
+ " implies the use of alternative\n"
+ "peer discovery mechanisms, such as those"
+ " based on a Distributed Hash\n"
+ "Table (DHT), LPD, etc.\n\n"),
+ stderr);
+ } else {
+ announce_last->next = NULL;
+ }
/* ..and a file or directory from which to create the torrent */
if (optind >= argc) {
Index: mktorrent-1.0/output.c
===================================================================
--- mktorrent-1.0.orig/output.c 2013-01-31 19:22:01.776671829 +0000
+++ mktorrent-1.0/output.c 2013-01-31 19:37:14.662969267 +0000
@@ -38,6 +38,11 @@
*/
static void write_announce_list(FILE *f, llist_t *list)
{
+ if (list == 0) {
+ /* an empty list passed; return early */
+ return;
+ }
+
/* the announce list is a list of lists of urls */
fprintf(f, "13:announce-listl");
/* go through them all.. */
@@ -121,13 +126,17 @@
/* every metainfo file is one big dictonary
and the first entry is the announce URL */
- fprintf(f, "d8:announce%lu:%s",
- (unsigned long)strlen(m->announce_list->l->s),
- m->announce_list->l->s);
- /* write the announce-list entry if we have
- more than one announce URL */
- if (m->announce_list->next || m->announce_list->l->next)
- write_announce_list(f, m->announce_list);
+ /* ... Unless we're using DHT, LPD, etc., that is */
+ putc('d', f);
+ if (m->announce_list != 0) {
+ fprintf(f, "8:announce%lu:%s",
+ (unsigned long)strlen(m->announce_list->l->s),
+ m->announce_list->l->s);
+ /* write the announce-list entry if we have
+ more than one announce URL */
+ if (m->announce_list->next || m->announce_list->l->next)
+ write_announce_list(f, m->announce_list);
+ }
/* add the comment if one is specified */
if (m->comment != NULL)
fprintf(f, "7:comment%lu:%s",