git: 9front

Download patch

ref: 34ea50cb12ee99910d3e541042b32e65db9fcc81
parent: db95a8068be42a8887d33d062980f326262e5007
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Apr 24 19:50:08 EDT 2012

ip/torrent: alphabetically order dictionary keys when producing torrent

--- a/sys/src/cmd/ip/torrent.c
+++ b/sys/src/cmd/ip/torrent.c
@@ -850,8 +850,11 @@
 		if(npieces <= 8*1024 || blocksize >= 2*1024*1024)
 			break;
 	}
-	print("d");
-	print("8:announce%ld:%s", strlen(alist->str), alist->str);
+
+	/*
+	 * keys in dictionaries have to be ordered alphabetically
+	 */
+	print("d8:announce%ld:%s", strlen(alist->str), alist->str);
 	if(alist->next){
 		print("13:announce-listl");
 		print("l%ld:%se", strlen(alist->str), alist->str);
@@ -859,19 +862,10 @@
 			print("l%ld:%se", strlen(alist->str), alist->str);
 		print("e");
 	}
-	if(wlist){
-		if(wlist->next){
-			print("8:url-listl");
-			for(; wlist; wlist = wlist->next)
-				print("%ld:%s", strlen(wlist->str), wlist->str);
-			print("e");
-		} else
-			print("8:url-list%ld:%s", strlen(wlist->str), wlist->str);
-	}
-	print("4:info");
-	print("d");
-	print("4:name%ld:%s", strlen(d->name), d->name);
+
+	print("4:infod");
 	print("6:lengthi%llde", d->length);
+	print("4:name%ld:%s", strlen(d->name), d->name);
 	print("12:piece lengthi%de", blocksize);
 	print("6:pieces%d:", npieces*sizeof(h));
 	free(d);
@@ -884,13 +878,24 @@
 		}
 		npieces--;
 	}
-	free(b);
 	if(npieces){
 		werrstr("read failed: %r");
 		return -1;
 	}
+	free(b);
 	print("e");
+
+	if(wlist){
+		if(wlist->next){
+			print("8:url-listl");
+			for(; wlist; wlist = wlist->next)
+				print("%ld:%s", strlen(wlist->str), wlist->str);
+			print("e");
+		} else
+			print("8:url-list%ld:%s", strlen(wlist->str), wlist->str);
+	}
 	print("e");
+
 	return 0;
 }
 
--