aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlioux <lioux@FreeBSD.org>2007-02-10 16:59:24 +0800
committerlioux <lioux@FreeBSD.org>2007-02-10 16:59:24 +0800
commit8be5902b7fe4d355f6ec286bd83a633bda54734c (patch)
tree0d7aefa84360fe5ec2d77240ce88f8629846ab19
parent976d674e59ad3d54724873726d607b17b03e134b (diff)
downloadfreebsd-ports-gnome-8be5902b7fe4d355f6ec286bd83a633bda54734c.tar.gz
freebsd-ports-gnome-8be5902b7fe4d355f6ec286bd83a633bda54734c.tar.zst
freebsd-ports-gnome-8be5902b7fe4d355f6ec286bd83a633bda54734c.zip
o Update to 2.8.2 cvs release as of date 2007021000
o Bump PORTREVISION
-rw-r--r--net-p2p/mldonkey-devel/Makefile1
-rw-r--r--net-p2p/mldonkey-devel/files/patch-cvs-2007021000 (renamed from net-p2p/mldonkey-devel/files/patch-cvs-2006122500)5218
2 files changed, 4794 insertions, 425 deletions
diff --git a/net-p2p/mldonkey-devel/Makefile b/net-p2p/mldonkey-devel/Makefile
index 3ee991f06a35..28198b9ff535 100644
--- a/net-p2p/mldonkey-devel/Makefile
+++ b/net-p2p/mldonkey-devel/Makefile
@@ -7,6 +7,7 @@
PORTNAME= mldonkey
PORTVERSION= 2.8.2
+PORTREVISION= 1
CATEGORIES+= net-p2p
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE_EXTENDED} \
${MASTER_SITE_SAVANNAH}
diff --git a/net-p2p/mldonkey-devel/files/patch-cvs-2006122500 b/net-p2p/mldonkey-devel/files/patch-cvs-2007021000
index 6a80f449e25e..4e406feb06d5 100644
--- a/net-p2p/mldonkey-devel/files/patch-cvs-2006122500
+++ b/net-p2p/mldonkey-devel/files/patch-cvs-2007021000
@@ -2,10 +2,10 @@ Index: config/Makefile.in
===================================================================
RCS file: /sources/mldonkey/mldonkey/config/Makefile.in,v
retrieving revision 1.173
-retrieving revision 1.174
-diff -u -r1.173 -r1.174
+retrieving revision 1.175
+diff -u -r1.173 -r1.175
--- config/Makefile.in 21 Nov 2006 22:29:58 -0000 1.173
-+++ config/Makefile.in 28 Nov 2006 23:58:01 -0000 1.174
++++ config/Makefile.in 15 Jan 2007 18:27:21 -0000 1.175
@@ -148,7 +148,7 @@
$(CDK)/filepath.ml $(CDK)/string2.ml \
$(CDK)/filename2.ml $(CDK)/list2.ml $(CDK)/hashtbl2.ml \
@@ -15,18 +15,141 @@ diff -u -r1.173 -r1.174
ifneq ("$(PTHREAD_CFLAGS)" , "")
CFLAGS += $(PTHREAD_CFLAGS)
+@@ -1245,7 +1245,7 @@
+ $(PROGRESS_SRCS) $(MAIN_SRCS)
+
+ TARGETS += mlgui$(EXE) mlguistarter$(EXE)
+-ifeq ("$(GUI)", "newgui")
++ifeq ("$(GUI)", "newgui1")
+ TARGETS += mlprogress$(EXE)
+ endif
+
+Index: config/configure.in
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/config/configure.in,v
+retrieving revision 1.289
+retrieving revision 1.290
+diff -u -r1.289 -r1.290
+--- config/configure.in 28 Nov 2006 23:17:31 -0000 1.289
++++ config/configure.in 11 Jan 2007 12:15:37 -0000 1.290
+@@ -1257,7 +1257,7 @@
+ else
+ echo "Do you want this script to try to download and install $LABLGTK_NAME"
+ echo "LOCALLY in mldonkey directory ?"
+- if test "$BATCH" = "no"; then read i; else i=yes; fi
++ if test "$BATCH" = "no"; then read i <&1; else i=yes; fi
+ case "$i" in
+ y* | Y*)
+
Index: distrib/ChangeLog
===================================================================
RCS file: /sources/mldonkey/mldonkey/distrib/ChangeLog,v
retrieving revision 1.1118
-retrieving revision 1.1133
-diff -u -r1.1118 -r1.1133
+retrieving revision 1.1174
+diff -u -r1.1118 -r1.1174
--- distrib/ChangeLog 28 Nov 2006 23:17:31 -0000 1.1118
-+++ distrib/ChangeLog 8 Dec 2006 12:26:24 -0000 1.1133
-@@ -14,6 +14,45 @@
++++ distrib/ChangeLog 6 Feb 2007 22:26:58 -0000 1.1174
+@@ -14,6 +14,142 @@
ChangeLog
=========
++2007/02/06
++5719: Unix2: Fix copying files > 1GB (1073741823 bytes),
++ bug was introduced by patch 5589 after release of 2.8.2
++
++2007/02/04
++5724: http_client: Retry GET request if HEAD request returns http error 400
++5723: HTML: print tracker errors in html table at 'vd <num>' (Schlumpf)
++5722: HTML: use Printf2.html_mods_cntr () for table row classes (Schlumpf)
++5720: Swarmer: block choice algorithm 2 from patch 5141 is new default
++- remove swarming_block_selection_algorithm = 1
++ because it finishes chunks too slowly
++- remove swarming_block_selection_algorithm = 3 from TripleM
++ because it uses too much CPU power.
++- remove option swarming_block_selection_algorithm, hard-coded default is now 2
++- remove option block_switching, hard-coded default is now true
++
++2007/01/30
++5717: Optimize function print_command_result
++
++2007/01/28
++5715: Improve porttest (Schlumpf)
++- use 'porttest' command to start the network porttest the first time,
++ after this to see the results
++- new command 'force_porttest' to force an new porttest
++- improve html porttest output and make it also available in telnet
++5716: EDK: Do not send share list to servers with state Connecting
++5713: HTML: show messages link in vd clickable (Schlumpf)
++
++2007/01/25
++5712: Multiuser: New verbosity "com" to log commands by non-admin users
++5711: Multiuser: Block commands preferred, bs, bp, port for non-admin users
++5642: Swarmer: swarming_block_selection_algorithm = 3 (TripleM)
++- this new algorithm select always the rarest choice, if average availability
++ is below 5, or one choice_availability is below average availability
++- added a hashtable to store blockmaps of uploaders for a given swarmer
++- long term memory usage has to be observed
++5710: Swarmer: Fix chunk propagation (pango)
++
++2007/01/21
++5693: "voo changed" prints changed options only, useful for support (Schlumpf)
++5698: EDK: fix display of porttest result images (Schlumpf)
++5699: Multiuser: Fix wrong file path (user_commit_dir) in notification mail
++5695: Command "set": better error text if option does not exist
++5694: Fix small typo in buildinfo
++
++2007/01/17
++5673: New core start parameter: -useradd "user pass", needed for Debian package
++5678: New options for command force_web_infos: kind/URL (thx to Schlumpf)
++
++2007/01/15
++5691: EDK: Recognize compatibleclient 60: IMPmule (imp-project.net)
++5689: EDK: Log downloading file name when client disconnects
++5684: GUI: Fix build of mlprogress (Alt linux)
++5677: Options: New concept of option types, fix non-admin Sancho http preview
++
++2007/01/11
++5665: EDK: Support compressed upload, implement file read cache (TripleM)
++new options:
++- ED2K_upload_compression to enable compressed upload, default true
++- ED2K_upload_compression_threshold, default 2000 bytes
++ Size difference in bytes between one zone (180 kBytes) and its compressed
++ counterpart, which has to occure, to send compressed parts instead of plain.
++- ED2K_upload_compression_level, Zlib compression level, default 9
++- ED2K_upload_compression_table_size, default 20
++5669: HTML: Add HTML headers to prohibit browser-side caching (Schlumpf)
++5671: Configure: Fix question whether to compile lablgtk, same as patch 5401
++5675: Updated Mozilla protocol handler to version 1.10
++
++2007/01/08
++5666: New option upload_complete_chunks (TripleM)
++- default false, if true, each client is allowed to complete only one chunk,
++ independent, if it is empty or partial. this setting overrides
++ upload_full_chunks and dynamic_upload_lifetime, but is, as a failsafe,
++ limited by upload_lifetime (should be set reasonable high)
++5664: EDK: Avoid uploading data more than due
++ to eMules rotating block requests (pango)
++5596: EDK: New option upload_full_chunks (thx to TripleM)
++- If the new option upload_full_chunks is set to true, each client is
++ allowed to receive one chunk, this setting overrides upload_lifetime.
++ Well, not exactly one chunk. eMule has this code in opcode.h:
++ #define SESSIONMAXTRANS (PARTSIZE+20*1024) //
++ "Try to send complete chunks" always sends this amount of data
++ MLdonkey now does the same, if upload_full_chunks is true and client A got
++ 9728000+20*1024 bytes during the current session its upload slot will be
++ revoked unless pending slots are empty.
++5619: EDK: Print network specific infos in command "vc <num>",
++ remove unneeded fields from client structures
++5627: commonHasher: fix wrong arg types from several functions (Schlumpf)
++5626: MinGW: fix missing declarations and wrong pointer
++ initialization in stubs_c.c (Schlumpf)
++
++2007/01/06
++5599: EDK: Support for files >4GB (TripleM, pango)
++- this patch does not include >4GB support for Kademlia
++5660: Swarming: Enable wrongly disabled select block memoization (pango)
++5659: GD: Fix wrong months display (skeeve)
++
+2006/12/08
+5617: New option share_scan_interval
+- how often (in minutes) should MLDonkey scan all shared directories
@@ -69,15 +192,108 @@ diff -u -r1.1118 -r1.1133
2006/11/29 version 2.8.2 = tag release-2-8-2
5597: GD: New option html_mods_vd_gfx_h_intervall
(compute values for hourly graph every x minutes) (skeeve)
+Index: distrib/ed2k_mozilla/README
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/distrib/ed2k_mozilla/README,v
+retrieving revision 1.8
+retrieving revision 1.9
+diff -u -r1.8 -r1.9
+--- distrib/ed2k_mozilla/README 23 Oct 2006 12:58:35 -0000 1.8
++++ distrib/ed2k_mozilla/README 11 Jan 2007 12:14:48 -0000 1.9
+@@ -1,4 +1,4 @@
+-Firefox MLdonkey/eMule Protocol Handler 1.8
++Firefox MLdonkey/eMule Protocol Handler 1.10
+ Copyright (C) 2003 - 2006 Simon Peter <dn.tlp@gmx.net>
+
+ Description:
+@@ -88,9 +88,16 @@
+
+ News:
+ -----
++Changes for version 1.10:
++- Fixed another problem with the port GUI configuration option (thanks
++ to Toni Cunat).
++
++Changes for version 1.9:
++- Fixed port GUI configuration option (thanks to Dennis Plöger).
++
+ Changes for version 1.8:
+ - Support for GUI configuration through Firefox' extensions menu
+- (thanks to David Ciecierski <dawid.ciecierski@googlemail.com>).
++ (thanks to David Ciecierski).
+
+ ATTENTION upgraders: If you manually set configuration options
+ through the about:config dialog for a previous version of this
+@@ -119,7 +126,7 @@
+
+ Changes for version 1.4:
+ - Added compatibility for the new component system of Firefox 0.9
+- (thanks to Len Walter <len@unsw.edu.au>).
++ (thanks to Len Walter).
+ - Username is now empty by default.
+
+ Changes for version 1.3:
+@@ -161,9 +168,10 @@
+
+ Contributor(s):
+ Sven Koch
+-Len Walter <len@unsw.edu.au>
+-Dan Fritz <templar_of_ni@yahoo.se>
+-David Ciecierski <dawid.ciecierski@gmail.com>
++Len Walter
++Dan Fritz
++David Ciecierski
++Dennis Plöger
+
+ Alternatively, the contents of this file may be used under the terms of
+ either the GNU General Public License Version 2 or later (the "GPL"), or
Index: src/daemon/common/commonClient.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonClient.ml,v
retrieving revision 1.33
-retrieving revision 1.34
-diff -u -r1.33 -r1.34
+retrieving revision 1.35
+diff -u -r1.33 -r1.35
--- src/daemon/common/commonClient.ml 5 Nov 2006 14:09:38 -0000 1.33
-+++ src/daemon/common/commonClient.ml 2 Dec 2006 12:35:45 -0000 1.34
-@@ -467,16 +467,15 @@
++++ src/daemon/common/commonClient.ml 8 Jan 2007 11:06:42 -0000 1.35
+@@ -76,6 +76,9 @@
+ mutable op_client_dprint_html : ('a -> CommonTypes.ui_conn ->
+ CommonTypes.file -> string -> bool);
+
++(* used to print network specific client infos *)
++ mutable op_client_print_info : ('a -> CommonTypes.ui_conn -> unit);
++
+ mutable op_client_debug : ('a -> bool -> unit);
+
+ mutable op_client_can_upload : ('a -> int -> unit);
+@@ -159,6 +162,10 @@
+ let client = as_client_impl client in
+ client.impl_client_ops.op_client_dprint_html client.impl_client_val o file str
+
++let client_print_info (client: client) o =
++ let c = as_client_impl client in
++ c.impl_client_ops.op_client_print_info c.impl_client_val o
++
+ let client_connect client=
+ let client = as_client_impl client in
+ client.impl_client_ops.op_client_connect client.impl_client_val
+@@ -188,7 +195,7 @@
+ s
+
+ let fni n m = failwith (ni n m)
+- let ni_ok n m = ignore (ni n m)
++let ni_ok n m = ignore (ni n m)
+
+ let clients_ops = ref []
+
+@@ -207,6 +214,7 @@
+ op_client_bprint = (fun _ _ -> ni_ok network "client_bprint");
+ op_client_dprint = (fun _ _ _ -> ni_ok network "client_dprint");
+ op_client_dprint_html = (fun _ _ _ _ -> fni network "client_dprint_html");
++ op_client_print_info = (fun _ _ -> fni network "client_print_info");
+ op_client_can_upload = (fun _ _ -> ni_ok network "client_can_upload");
+ op_client_enter_upload_queue = (fun _ -> ni_ok network "client_enter_upload_queue");
+ } in
+@@ -467,16 +475,15 @@
try
let i = client_info c in
let ctime = ((BasicSocket.last_time ()) - i.GuiTypes.client_connect_time) / 60 in
@@ -97,7 +313,15 @@ diff -u -r1.33 -r1.34
end
with _ -> ()
) !uploaders
-@@ -500,8 +499,10 @@
+@@ -491,7 +498,6 @@
+ T.client_tags = [];
+ T.client_name = "";
+ T.client_network = 0;
+- T.client_files = None;
+ T.client_rating = 0;
+ T.client_chat_port = 0;
+ T.client_connect_time = BasicSocket.last_time ();
+@@ -500,8 +506,11 @@
T.client_os = None;
T.client_release = "";
T.client_emulemod = "";
@@ -109,7 +333,75 @@ diff -u -r1.33 -r1.34
+ T.client_session_uploaded = 0L;
T.client_upload = None;
T.client_sui_verified = None;
++ T.client_file_queue = [];
}
+Index: src/daemon/common/commonClient.mli
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonClient.mli,v
+retrieving revision 1.13
+retrieving revision 1.14
+diff -u -r1.13 -r1.14
+--- src/daemon/common/commonClient.mli 25 Oct 2006 11:12:38 -0000 1.13
++++ src/daemon/common/commonClient.mli 8 Jan 2007 11:06:42 -0000 1.14
+@@ -24,12 +24,14 @@
+ 'a -> CommonTypes.ui_conn -> CommonTypes.file -> unit;
+ mutable op_client_dprint_html :
+ 'a -> CommonTypes.ui_conn -> CommonTypes.file -> string -> bool;
++ mutable op_client_print_info : 'a -> CommonTypes.ui_conn -> unit;
+ mutable op_client_debug : 'a -> bool -> unit;
+ mutable op_client_can_upload : 'a -> int -> unit;
+ mutable op_client_enter_upload_queue : 'a -> unit;
+ }
+ val client_print_html : CommonTypes.client -> CommonTypes.ui_conn -> unit
+ val client_print : CommonTypes.client -> CommonTypes.ui_conn -> unit
++val client_print_info : CommonTypes.client -> CommonTypes.ui_conn -> unit
+ val client_must_update : CommonTypes.client -> unit
+ val client_info : CommonTypes.client -> GuiTypes.client_info
+ val client_say : CommonTypes.client -> string -> unit
+Index: src/daemon/common/commonComplexOptions.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonComplexOptions.ml,v
+retrieving revision 1.69
+retrieving revision 1.70
+diff -u -r1.69 -r1.70
+--- src/daemon/common/commonComplexOptions.ml 21 Nov 2006 22:34:33 -0000 1.69
++++ src/daemon/common/commonComplexOptions.ml 6 Feb 2007 22:26:58 -0000 1.70
+@@ -962,8 +962,6 @@
+ [default_incoming_directories]
+ | l -> l
+
+-exception Incoming_full
+-
+ let incoming_dir usedir ?user ?needed_space ?network () =
+
+ let directories =
+@@ -994,12 +992,13 @@
+ in
+
+ let checkdir =
++ let module U = Unix.LargeFile in
+ try
+ List.find (fun d ->
+ let dirname = compute_dir_name d.shdir_dirname in
+ (* check if temp_directory and incoming are on different partitions *)
+ try
+- if (Unix.stat dirname).Unix.st_dev <> (Unix.stat !!temp_directory).Unix.st_dev then
++ if (U.stat dirname).U.st_dev <> (U.stat !!temp_directory).U.st_dev then
+ begin
+ match needed_space with
+ | None -> true
+@@ -1100,8 +1099,9 @@
+ Unix2.tryopen_write_zip archive (fun oc ->
+ List.iter (fun file ->
+ try
+- let s = Unix.stat file in
+- Zip.copy_file_to_entry file oc ~level:9 ~mtime:s.Unix.st_mtime file
++ let module U = Unix.LargeFile in
++ let s = U.stat file in
++ Zip.copy_file_to_entry file oc ~level:9 ~mtime:s.U.st_mtime file
+ with e ->
+ failwith (Printf.sprintf "Zip: error %s in %s" (Printexc2.to_string e) file)
+ ) files)
Index: src/daemon/common/commonFile.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonFile.ml,v
@@ -149,11 +441,27 @@ Index: src/daemon/common/commonGlobals.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonGlobals.ml,v
retrieving revision 1.77
-retrieving revision 1.78
-diff -u -r1.77 -r1.78
+retrieving revision 1.81
+diff -u -r1.77 -r1.81
--- src/daemon/common/commonGlobals.ml 28 Nov 2006 23:15:21 -0000 1.77
-+++ src/daemon/common/commonGlobals.ml 3 Dec 2006 20:49:42 -0000 1.78
-@@ -405,6 +405,7 @@
++++ src/daemon/common/commonGlobals.ml 6 Feb 2007 22:26:58 -0000 1.81
+@@ -263,6 +263,7 @@
+ let user_socks = ref ([] : TcpBufferedSocket.t list)
+ let dialog_history = ref ([] : (int * string * string) list )
+
++exception Incoming_full
+
+ let want_and_not andnot f none value =
+ (* lprintf "want_and_not [%s]\n" value; *)
+@@ -398,6 +399,7 @@
+ | Field_Completesources -> "completesources"
+ | Field_Filename -> "filename"
+ | Field_Size -> "size"
++ | Field_Size_Hi -> "size_hi"
+ | Field_Uid -> "uid"
+ | Field_Bitrate -> "bitrate"
+ | Field_Codec -> "codec"
+@@ -405,6 +407,7 @@
| Field_Lastseencomplete -> "lastcompl"
| Field_Medialength -> "mlen"
| Field_Mediacodec -> "mediacodec"
@@ -161,7 +469,15 @@ diff -u -r1.77 -r1.78
| Field_UNKNOWN s -> s
let field_of_string t =
-@@ -426,10 +427,11 @@
+@@ -419,6 +422,7 @@
+ | "completesources" -> Field_Completesources
+ | "filename" -> Field_Filename
+ | "size" -> Field_Size
++ | "size_hi" -> Field_Size_Hi
+ | "uid" -> Field_Uid
+ | "bitrate" -> Field_Bitrate
+ | "codec" -> Field_Codec
+@@ -426,10 +430,11 @@
| "lastcompl" -> Field_Lastseencomplete
| "mlen" -> Field_Medialength
| "mediacodec" -> Field_Mediacodec
@@ -174,7 +490,7 @@ diff -u -r1.77 -r1.78
| Field_UNKNOWN s -> String.escaped s
| t -> string_of_field t
-@@ -438,6 +440,10 @@
+@@ -438,6 +443,10 @@
Printf.sprintf " \"%s\" = %s" (escaped_string_of_field tag)
(string_of_tag_value tag.tag_value)
@@ -185,15 +501,122 @@ diff -u -r1.77 -r1.78
let rec print_tags tags =
match tags with
[] -> ()
+@@ -916,12 +925,12 @@
+ let intern_table = StringIntern.create 1000
+ let intern s = StringIntern.merge intern_table s
+
+-let print_command_result o buf result =
++let print_command_result o result =
+ if use_html_mods o then
+- html_mods_table_one_row buf "serversTable" "servers" [
++ html_mods_table_one_row o.conn_buf "serversTable" "servers" [
+ ("", "srh", result); ]
+ else
+- Printf.bprintf buf "%s" result
++ Printf.bprintf o.conn_buf "%s" result
+
+ let _ =
+ Heap.add_memstat "CommonGlobals" (fun level buf ->
+Index: src/daemon/common/commonHasher.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonHasher.ml,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- src/daemon/common/commonHasher.ml 18 Mar 2006 18:35:54 -0000 1.9
++++ src/daemon/common/commonHasher.ml 15 Jan 2007 18:28:03 -0000 1.10
+@@ -20,6 +20,14 @@
+ open Printf2
+ open CommonOptions
+
++let log_prefix = "[cHa]"
++
++let lprintf_nl fmt =
++ lprintf_nl2 log_prefix fmt
++
++let lprintf_n fmt =
++ lprintf2 log_prefix fmt
++
+ type hash_method = MD4 | MD5 | SHA1 | TIGER
+
+ type 'a job = {
+@@ -46,14 +54,14 @@
+ | None -> raise Not_found
+ | Some (job, fd) ->
+ if job_done job then begin
+- if !verbose_md4 then lprintf_nl "[cHa] Finished %s job %s %Ld %Ld"
++ if !verbose_md4 then lprintf_nl "Finished %s job %s %Ld %Ld"
+ (match job.job_method with
+ MD5 -> "MD5" | TIGER -> "TIGER" | SHA1 -> "SHA1" | MD4 -> "MD4")
+ job.job_name job.job_begin job.job_len;
+ current_job := None;
+ Unix.close fd;
+ (try job.job_handler job with e ->
+- lprintf_nl "[cHa] exception %s in job_handler"
++ lprintf_nl "exception %s in job_handler"
+ (Printexc2.to_string e);
+ );
+ raise Not_found
+@@ -72,7 +80,7 @@
+ current_job := Some (job, fd);
+ job_start job fd;
+ with e ->
+- lprintf_nl "[cHa] Exception %s in starting job"
++ lprintf_nl "Exception %s in starting job"
+ (Printexc2.to_string e);
+ )
+
+Index: src/daemon/common/commonHasher_c.c
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonHasher_c.c,v
+retrieving revision 1.11
+retrieving revision 1.12
+diff -u -r1.11 -r1.12
+--- src/daemon/common/commonHasher_c.c 9 Jan 2006 00:25:58 -0000 1.11
++++ src/daemon/common/commonHasher_c.c 8 Jan 2007 11:03:09 -0000 1.12
+@@ -335,20 +335,20 @@
+ long bsize;
+ switch(job_method) {
+ case METHOD_MD4:
+- md4_unsafe64_fd_direct(job_fd, job_begin_pos, job_len, job_result);
++ md4_unsafe64_fd_direct(job_fd, job_begin_pos, job_len, p_job_result);
+ break;
+
+ case METHOD_MD5:
+- md5_unsafe64_fd_direct(job_fd, job_begin_pos, job_len, job_result);
++ md5_unsafe64_fd_direct(job_fd, job_begin_pos, job_len, p_job_result);
+ break;
+
+ case METHOD_SHA1:
+- sha1_unsafe64_fd_direct(job_fd, job_begin_pos, job_len, job_result);
++ sha1_unsafe64_fd_direct(job_fd, job_begin_pos, job_len, p_job_result);
+ break;
+
+ case METHOD_TIGER:
+ bsize = tiger_block_size(job_len);
+- tiger_tree_fd(job_fd, job_len, 0, bsize, job_result);
++ tiger_tree_fd(job_fd, job_len, 0, bsize, p_job_result);
+ break;
+
+ default:
Index: src/daemon/common/commonInteractive.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonInteractive.ml,v
retrieving revision 1.85
-retrieving revision 1.87
-diff -u -r1.85 -r1.87
+retrieving revision 1.90
+diff -u -r1.85 -r1.90
--- src/daemon/common/commonInteractive.ml 26 Nov 2006 13:54:09 -0000 1.85
-+++ src/daemon/common/commonInteractive.ml 3 Dec 2006 20:49:42 -0000 1.87
-@@ -222,7 +222,7 @@
++++ src/daemon/common/commonInteractive.ml 6 Feb 2007 22:26:58 -0000 1.90
+@@ -200,8 +200,6 @@
+ name.
+ *)
+
+-exception Incoming_full
+-
+ let file_commit file =
+ let impl = as_file_impl file in
+ if impl.impl_file_state = FileDownloaded then
+@@ -222,7 +220,7 @@
let new_name = file_commited_name incoming.shdir_dirname file in
if Unix2.is_directory file_name then begin
Unix2.safe_mkdir new_name;
@@ -202,7 +625,21 @@ diff -u -r1.85 -r1.87
end;
(* the next line really moves the file *)
-@@ -714,7 +714,7 @@
+@@ -331,7 +329,12 @@
+ let incoming = incoming_dir (Unix2.is_directory (file_disk_name file)) () in
+
+ let line4 = if !!url_in_mail = "" then "" else
+- Printf.sprintf "\r\n<%s/%s/%s>\r\n" !!url_in_mail incoming.shdir_dirname (Url.encode (file_best_name file))
++ Printf.sprintf "\r\n<%s/%s%s/%s>\r\n"
++ !!url_in_mail
++ incoming.shdir_dirname
++ (if (file_owner file).user_commit_dir = "" then ""
++ else Printf.sprintf "/%s" (file_owner file).user_commit_dir)
++ (Url.encode (file_best_name file))
+ in
+
+ let line5 = if !!auto_commit then "" else
+@@ -714,7 +717,7 @@
| Q_MP3_BITRATE _ ->
let bitrate = get_arg "bitrate" in
if bitrate = "" then raise Not_found;
@@ -211,7 +648,31 @@ diff -u -r1.85 -r1.87
in
try
-@@ -874,14 +874,14 @@
+@@ -752,12 +755,11 @@
+
+ let opfile_args r opfile =
+ let prefix = r.network_shortname ^ "-" in
+- let args = simple_options prefix opfile in
+- args
++ simple_options prefix opfile true
+
+ let all_simple_options () =
+ let options = ref (sort_options
+- (simple_options "" downloads_ini)
++ (simple_options "" downloads_ini true)
+ )
+ in
+ networks_iter_all (fun r ->
+@@ -807,7 +809,7 @@
+ let apply_on_fully_qualified_options name f =
+ if !verbose then lprintf_nl "Change option %s" name;
+ let rec iter prefix opfile =
+- let args = simple_options prefix opfile in
++ let args = simple_options prefix opfile true in
+ List.iter (fun o ->
+ (* lprintf "Compare [%s] [%s]\n" o.option_name name; *)
+ if o.option_name = name then
+@@ -874,14 +876,14 @@
| QHasMinVal (field, value) ->
begin
match field with
@@ -228,21 +689,169 @@ diff -u -r1.85 -r1.87
| Field_Size
| _ -> ()
end
+Index: src/daemon/common/commonMessages.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonMessages.ml,v
+retrieving revision 1.60
+retrieving revision 1.62
+diff -u -r1.60 -r1.62
+--- src/daemon/common/commonMessages.ml 5 Nov 2006 14:11:29 -0000 1.60
++++ src/daemon/common/commonMessages.ml 28 Jan 2007 20:39:59 -0000 1.62
+@@ -661,6 +661,8 @@
+ <title>MLdonkey: Web Interface</title>
+ <meta name=\"generator\" content=\"MLDonkey\" />
+ <meta name=\"robots\" content=\"noindex,nofollow\" />
++<meta http-equiv=\"Expires\" content=\"-1\" />
++<meta http-equiv=\"Pragma\" content=\"no-cache\" />
+ <link rel=\"shortcut icon\" href=\"favicon.ico\" type=\"image/x-icon\" />
+ <link href=\"h.css\" rel=\"stylesheet\" type=\"text/css\" />
+ <script type=\"text/javascript\" src=\"i.js\">
+@@ -1117,6 +1119,9 @@
+ <TD class=\"bu bbig\" title=\"Sysinfo\"
+ onMouseOver=\"mOvr(this,'mOvr1');\" onMouseOut=\"mOut(this);\"
+ onClick=\"mSub('output','sysinfo')\">Sysinfo</TD>
++<TD class=\"bu bbig\" title=\"Porttest\"
++onMouseOver=\"mOvr(this,'mOvr1');\" onMouseOut=\"mOut(this);\"
++onClick=\"mSub('output','porttest')\">Porttest</TD>
+ <TD class=\"bu bbig\" title=\"View ChangeLog\"
+ onMouseOver=\"mOvr(this,'mOvr1');\" onMouseOut=\"mOut(this);\"
+ onClick=\"top.output.location.href='http://savannah.nongnu.org/cgi-bin/viewcvs/mldonkey/mldonkey/distrib/ChangeLog?rev=HEAD&amp;content-type=text/vnd.viewcvs-markup'\">ChangeLog</TD>
Index: src/daemon/common/commonOptions.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonOptions.ml,v
retrieving revision 1.190
-retrieving revision 1.193
-diff -u -r1.190 -r1.193
+retrieving revision 1.197
+diff -u -r1.190 -r1.197
--- src/daemon/common/commonOptions.ml 28 Nov 2006 23:15:21 -0000 1.190
-+++ src/daemon/common/commonOptions.ml 8 Dec 2006 12:26:24 -0000 1.193
-@@ -1267,8 +1267,16 @@
++++ src/daemon/common/commonOptions.ml 4 Feb 2007 17:19:50 -0000 1.197
+@@ -273,14 +273,15 @@
+ end
+ end
+
+-let define_option a b ?desc c d e =
++let define_option a b ?desc ?restart ?public ?internal c d e =
+ match desc with
+- None -> define_option a b (_s c) d e
+- | Some desc -> define_option a b ~desc: (_s desc) (_s c) d e
+-let define_expert_option a b ?desc c d e =
++ None -> define_option a b (_s c) d e ?restart ?public ?internal
++ | Some desc -> define_option a b ~desc: (_s desc) (_s c) d e ?restart ?public ?internal
++
++let define_expert_option a b ?desc ?restart ?public ?internal c d e =
+ match desc with
+- None -> define_expert_option a b (_s c) d e
+- | Some desc -> define_expert_option a b ~desc: (_s desc) (_s c) d e
++ None -> define_expert_option a b (_s c) d e ?restart ?public ?internal
++ | Some desc -> define_expert_option a b ~desc: (_s desc) (_s c) d e ?restart ?public ?internal
+
+ let string_list_option = define_option_class "String"
+ (fun v ->
+@@ -478,34 +479,42 @@
+
+ let gui_port = define_option current_section ["gui_port"]
+ ~desc: "The port to connect the GUI"
++ ~restart: true
+ "port for Graphical Interfaces"
+ int_option 4001
+
+ let gift_port = define_option current_section ["gift_port"]
+ ~desc: "The port to connect for GiFT GUIs."
++ ~restart: true
+ "port for GiFT Graphical Interfaces interaction. It was 1213, but the default is
+ now 0 for disabled, because it does not check for a password."
+ int_option 0
+
+ let http_port = define_option current_section ["http_port"]
+ ~desc: "The port to connect via HTTP"
++ ~public: true
++ ~restart: true
+ "The port used to connect to your client with a WEB browser"
+ int_option 4080
+
+ let telnet_port = define_option current_section ["telnet_port"]
+ ~desc: "The port to connect via telnet"
++ ~restart: true
+ "port for user interaction"
+ int_option 4000
+
+ let http_bind_addr = define_expert_option current_section ["http_bind_addr"]
++ ~restart: true
+ "The IP address used to bind the http server"
+ Ip.option (Ip.any)
+
+ let gui_bind_addr = define_expert_option current_section ["gui_bind_addr"]
++ ~restart: true
+ "The IP address used to bind the gui server"
+ Ip.option (Ip.of_inet_addr Unix.inet_addr_any)
+
+ let telnet_bind_addr = define_expert_option current_section ["telnet_bind_addr"]
++ ~restart: true
+ "The IP address used to bind the telnet server"
+ Ip.option (Ip.of_inet_addr Unix.inet_addr_any)
+
+@@ -552,6 +561,7 @@
+ swarming : debug swarming
+ hc : http_client messages
+ hs : http_server messages
++ com : commands by non-admin users
+ act : debug activity
+ bw : debug bandwidth
+ unexp : debug unexpected messages"
+@@ -807,6 +817,7 @@
+ int_option 200
+
+ let html_mods_vd_gfx_h_intervall = define_expert_option current_section ["html_mods_vd_gfx_h_intervall"]
++ ~restart: true
+ "compute values for hourly graph every 1,2,3,4,5,10,15,20,30,60 min
+ Changes to this option require a core restart."
+ int_option 60
+@@ -1176,15 +1187,6 @@
+ "How many sources to use to download each chunk"
+ int_option 3
+
+-let swarming_block_selection_algorithm = define_expert_option current_section ["swarming_block_selection_algorithm"]
+- "What algorithm to use to select blocks (currently 1 or 2)"
+- int_option 1
+-
+-let block_switching = define_expert_option current_section ["block_switching"]
+- "Allows swarmer to switch a source to another block if current block is already
+- totally selected by other sources"
+- bool_option true
+-
+ let max_recover_gap = define_option current_section ["max_recover_zeroes_gap"]
+ "The maximal length of zero bytes between non-zero bytes in a file that
+ should be interpreted as downloaded during a recovery"
+@@ -1225,12 +1227,14 @@
+ let current_section = startup_section
+
+ let run_as_user = define_option current_section ["run_as_user"]
++ ~restart: true
+ "The login of the user you want mldonkey to run as, after the ports
+ have been bound (can be use not to run with root priviledges when
+ a port < 1024 is needed)"
+ string_option ""
+
+ let run_as_useruid = define_option current_section ["run_as_useruid"]
++ ~restart: true
+ "The UID of the user (0=disabled) you want mldonkey to run as, after the ports
+ have been bound (can be use not to run with root priviledges when
+ a port < 1024 is needed)"
+@@ -1249,6 +1253,7 @@
+ bool_option true
+
+ let config_files_security_space = define_expert_option current_section ["config_files_security_space"]
++ ~restart: true
+ "How many megabytes should MLdonkey keep for saving configuration files."
+ int_option 10
+
+@@ -1267,8 +1272,17 @@
"The directory where temporary files should be put"
string_option "temp"
-let create_dir_mask = define_option current_section ["create_dir_mask"]
- "New directories in incoming_directories are created with these rights"
+let share_scan_interval = define_option current_section ["share_scan_interval"]
++ ~restart: true
+ "How often (in minutes) should MLDonkey scan all shared directories for new/removed files"
+ int_option 1
+
@@ -255,7 +864,23 @@ diff -u -r1.190 -r1.193
string_option "755"
let create_file_sparse = define_option current_section ["create_file_sparse"]
-@@ -1497,9 +1505,12 @@
+@@ -1374,6 +1388,7 @@
+ bool_option false
+
+ let buffer_writes_delay = define_expert_option current_section ["buffer_writes_delay"]
++ ~restart: true
+ "Buffer writes and flush after buffer_writes_delay seconds (experimental)"
+ float_option 30.
+
+@@ -1484,6 +1499,7 @@
+ int_option 120
+
+ let client_bind_addr = define_option current_section ["client_bind_addr"]
++ ~restart: true
+ "The IP address used to bind the p2p clients"
+ Ip.option (Ip.of_inet_addr Unix.inet_addr_any)
+
+@@ -1497,9 +1513,12 @@
TcpBufferedSocket.copy_read_buffer := !!copy_read_buffer
)
@@ -271,7 +896,23 @@ diff -u -r1.190 -r1.193
)
let create_mlsubmit = define_expert_option current_section ["create_mlsubmit"]
-@@ -1558,7 +1569,7 @@
+@@ -1531,6 +1550,7 @@
+ int_option 500000
+
+ let save_options_delay = define_expert_option current_section ["save_options_delay"]
++ ~restart: true
+ "The delay between two saves of the 'downloads.ini' file (default is 15 minutes).
+ Changes to this option require a core restart."
+ float_option 900.0
+@@ -1540,6 +1560,7 @@
+ float_option 30.
+
+ let download_sample_rate = define_expert_option current_section ["download_sample_rate"]
++ ~restart: true
+ "The delay between one glance at a file and another"
+ float_option 1.
+
+@@ -1558,7 +1579,7 @@
let compaction_overhead = define_expert_option current_section ["compaction_overhead"]
"The percentage of free memory before a compaction is triggered"
@@ -280,7 +921,15 @@ diff -u -r1.190 -r1.193
let space_overhead = define_expert_option current_section ["space_overhead"]
"The major GC speed is computed from this parameter. This is the memory
-@@ -1708,6 +1719,9 @@
+@@ -1573,6 +1594,7 @@
+ int_option 1000
+
+ let options_version = define_expert_option current_section ["options_version"]
++ ~internal: true
+ "(internal option)"
+ int_option 14
+
+@@ -1708,6 +1730,9 @@
option_hook min_reask_delay (fun _ ->
if !!min_reask_delay < 600 then min_reask_delay =:= 600
);
@@ -290,6 +939,42 @@ diff -u -r1.190 -r1.193
option_hook global_login (fun _ ->
let len = String.length !!global_login in
let prefix = "mldonkey_" in
+@@ -1742,11 +1767,6 @@
+ close_log ()
+ end
+ );
+- option_hook swarming_block_selection_algorithm (fun _ ->
+- match !!swarming_block_selection_algorithm with
+- | 1 | 2 -> ()
+- | _ -> swarming_block_selection_algorithm =:= 1;
+- );
+ option_hook max_upload_slots (fun _ ->
+ if !!max_upload_slots < 3 then
+ max_upload_slots =:= 3);
+@@ -1830,6 +1850,7 @@
+ let verbose_supernode = ref false
+ let verbose_swarming = ref false
+ let verbose_activity = ref false
++let verbose_user_commands = ref false
+ let verbose_unexpected_messages = ref false
+
+ let set_all v =
+@@ -1858,6 +1879,7 @@
+ Http_client.verbose := v;
+ Http_server.verbose := v;
+ verbose_activity := v;
++ verbose_user_commands := v;
+ verbose_unexpected_messages := v
+
+ let _ =
+@@ -1893,6 +1915,7 @@
+ | "act" -> verbose_activity := true
+ | "bw" -> incr BasicSocket.verbose_bandwidth
+ | "unexp" -> verbose_unexpected_messages := true
++ | "com" -> verbose_user_commands := true
+
+ | "all" ->
+
Index: src/daemon/common/commonSearch.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonSearch.ml,v
@@ -339,10 +1024,10 @@ Index: src/daemon/common/commonShared.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonShared.ml,v
retrieving revision 1.37
-retrieving revision 1.38
-diff -u -r1.37 -r1.38
+retrieving revision 1.39
+diff -u -r1.37 -r1.39
--- src/daemon/common/commonShared.ml 29 Oct 2006 18:58:59 -0000 1.37
-+++ src/daemon/common/commonShared.ml 3 Dec 2006 20:57:56 -0000 1.38
++++ src/daemon/common/commonShared.ml 6 Feb 2007 22:26:58 -0000 1.39
@@ -43,13 +43,14 @@
mutable impl_shared_size : int64;
mutable impl_shared_id : Md4.t;
@@ -397,7 +1082,26 @@ diff -u -r1.37 -r1.38
impl_shared_servers = []
}
-@@ -354,7 +365,10 @@
+@@ -236,14 +247,15 @@
+ waiting_directories := (shared_dir, local_dir) :: !waiting_directories
+
+ let shared_scan_directory shared_dir local_dir =
++ let module U = Unix.LargeFile in
+ let incoming_files_inode =
+- ((Unix.stat ((CommonComplexOptions.incoming_dir false ()).shdir_dirname)).Unix.st_ino)
++ ((U.stat ((CommonComplexOptions.incoming_dir false ()).shdir_dirname)).U.st_ino)
+ in
+ let incoming_directories_inode =
+- ((Unix.stat ((CommonComplexOptions.incoming_dir true ()).shdir_dirname)).Unix.st_ino)
++ ((U.stat ((CommonComplexOptions.incoming_dir true ()).shdir_dirname)).U.st_ino)
+ in
+ let temp_directory_inode =
+- ((Unix.stat !!temp_directory).Unix.st_ino)
++ ((U.stat !!temp_directory).U.st_ino)
+ in
+ let dirname = shared_dir.shdir_dirname in
+ let strategy =
+@@ -354,7 +366,10 @@
T.shared_requests = impl.impl_shared_requests;
T.shared_uids = [];
T.shared_sub_files = [];
@@ -3920,10 +4624,10 @@ Index: src/daemon/common/commonSources.mli
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonSources.mli,v
retrieving revision 1.10
-retrieving revision 1.11
-diff -u -r1.10 -r1.11
+retrieving revision 1.12
+diff -u -r1.10 -r1.12
--- src/daemon/common/commonSources.mli 8 Apr 2006 02:16:21 -0000 1.10
-+++ src/daemon/common/commonSources.mli 3 Dec 2006 20:47:12 -0000 1.11
++++ src/daemon/common/commonSources.mli 8 Jan 2007 11:06:42 -0000 1.12
@@ -16,18 +16,7 @@
along with mldonkey; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@@ -4050,7 +4754,7 @@ diff -u -r1.10 -r1.11
+ request_file : file_sources_manager;
+ mutable request_queue : int;
+ mutable request_time : int;
-+ mutable request_score : int;
++ mutable request_score : int;
+ }
+
+ and file_sources_manager = {
@@ -4188,15 +4892,232 @@ diff -u -r1.10 -r1.11
+ val set_source_brand : source -> M.source_brand -> unit
+ end)
+
+Index: src/daemon/common/commonSwarming.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonSwarming.ml,v
+retrieving revision 1.54
+retrieving revision 1.58
+diff -u -r1.54 -r1.58
+--- src/daemon/common/commonSwarming.ml 14 Sep 2006 17:34:34 -0000 1.54
++++ src/daemon/common/commonSwarming.ml 4 Feb 2007 17:19:50 -0000 1.58
+@@ -2080,7 +2080,7 @@
+ (* memoize some results *)
+ let memoization_calls = ref 0 in
+ let memoization_hits = ref 0 in
+- let debug_memoization = true in
++ let debug_memoization = false in
+ let memoize h f p =
+ incr memoization_calls;
+ try
+@@ -2126,10 +2126,8 @@
+ let data_per_source = 9728000L // (Int64.of_int !!sources_per_chunk) in
+
+ let need_to_complete_some_blocks_quickly =
+- match !!swarming_block_selection_algorithm with
+- | 1 -> true
+- | 2 -> verification_available && t.t_nverified_chunks < 2
+- | _ -> assert false in
++ verification_available && t.t_nverified_chunks < 2
++ in
+
+ let create_choice n b =
+ let block_begin = compute_block_begin s b in
+@@ -2201,66 +2199,7 @@
+ (choice_availability c)
+ (choice_preallocated c) in
+
+- (** > 0 == c1 is best, < 0 = c2 is best, 0 == they're equivalent *)
+- let compare_choices1 c1 c2 =
+-
+- (* avoid overly unbalanced situations *)
+- let cmp =
+- if choice_remaining_per_uploader c1 < data_per_source ||
+- choice_remaining_per_uploader c2 < data_per_source then
+- compare (choice_remaining_per_uploader c1)
+- (choice_remaining_per_uploader c2) else 0 in
+- if cmp <> 0 then cmp else
+-
+- (* Do what Master asked for *)
+- let cmp = compare (choice_user_priority c1)
+- (choice_user_priority c2) in
+- if cmp <> 0 then cmp else
+-
+- (* Pick really rare gems: if average availability of all
+- blocks is higher than 5 connected sources, pick in
+- priority blocks present in at most 3 connected sources;
+- is that too restrictive ? *)
+- let cmp =
+- if not need_to_complete_some_blocks_quickly &&
+- mean_availability > 5 &&
+- (choice_availability c1 <= 3 || choice_availability c2 <= 3) then
+- compare (choice_availability c2) (choice_availability c1)
+- else 0 in
+- if cmp <> 0 then cmp else
+-
+- (* try to quickly complete (and validate) chunks;
+- if there's only one frontend, each chunk has only one
+- block, and looking at siblings make no sense *)
+- let cmp =
+- if verification_available && several_frontends then
+- compare (choice_other_remaining c2)
+- (choice_other_remaining c1)
+- else 0 in
+- if cmp <> 0 then cmp else
+-
+- (* try to quickly complete blocks *)
+- let cmp =
+- match choice_unselected_remaining c1,
+- choice_unselected_remaining c2 with
+- | 0L, 0L -> 0
+- | 0L, _ -> -1
+- | _, 0L -> 1
+- | ur1, ur2 -> compare ur2 ur1 in
+- if cmp <> 0 then cmp else
+-
+- (* pick blocks that won't require allocating more disk space *)
+- let cmp =
+- match choice_preallocated c1, choice_preallocated c2 with
+- | true, false -> 1
+- | false, true -> -1
+- | _ -> 0 in
+- if cmp <> 0 then cmp else
+-
+- (* Can't tell *)
+- 0 in
+-
+- let compare_choices2 c1 c2 =
++ let compare_choices c1 c2 =
+ (* "RULES" *)
+ (* Avoid stepping on each other's feet *)
+ let cmp =
+@@ -2330,12 +2269,6 @@
+ (* Can't tell *)
+ 0 in
+
+- let compare_choices =
+- match !!swarming_block_selection_algorithm with
+- | 1 -> compare_choices1
+- | 2 -> compare_choices2
+- | _ -> assert false in
+-
+ (* compare a new chunk against a list of best choices numbers (and a
+ specimen of best choice) *)
+ let keep_best_chunks chunk_blocks_indexes best_choices specimen =
+@@ -2382,9 +2315,7 @@
+ currently they're taken care of by linear_select_block
+ fallback below *)
+
+- if debug_all then begin
+- print_choice specimen
+- end;
++ if debug_all then print_choice specimen;
+
+ try
+ let blocks =
+@@ -2690,7 +2621,6 @@
+ iter dummy_ranges_cluster b.up_block.block_ranges b more_blocks in
+ if not (is_dummy_cluster best_cluster) &&
+ best_cluster.cluster_nuploading > 0 &&
+- !!block_switching &&
+ (file_downloaded t.t_file < file_size t.t_file ** 98L // 100L) then begin
+ (* it seems they're only sucky choices left on that block, is
+ there really nothing else better elsewhere ? *)
+@@ -2935,18 +2865,14 @@
+ mutable occurrence_missing : chunk_occurrence list;
+ }
+
+-let propagate_chunk t1 pos1 size destinations copy_data =
++let propagate_chunk t1 pos1 size destinations =
+ List.iter (fun (t2, j2, pos2) ->
+ if t1.t_num <> t2.t_num || pos1 <> pos2 then begin
+ if !verbose then lprintf_nl "Should propagate chunk from %s %Ld to %s %Ld [%Ld]"
+ (file_best_name t1.t_file) pos1
+ (file_best_name t2.t_file) pos2 size;
+- (* small catch here: if we don't really copy the data *and*
+- chunk content is not the expected value, the chunk will be
+- verified each time *)
+- if copy_data then
+- Unix32.copy_chunk (file_fd t1.t_file) (file_fd t2.t_file)
+- pos1 pos2 (Int64.to_int size);
++ Unix32.copy_chunk (file_fd t1.t_file) (file_fd t2.t_file)
++ pos1 pos2 (Int64.to_int size);
+ set_frontend_state_complete t2 j2
+ end
+ ) destinations
+@@ -2954,10 +2880,6 @@
+ let dummy_chunk_occurrences () =
+ { occurrence_present = []; occurrence_missing = [] }
+
+-(* Compute the digest of zeroed chunks to avoid copying them *)
+-let known_chunks_sizes : (int64, unit) Hashtbl.t = Hashtbl.create 5
+-let zeroed_chunks_hashes : (uid_type, unit) Hashtbl.t = Hashtbl.create 5
+-
+ let duplicate_chunks () =
+ let chunks = Hashtbl.create 100 in
+ HS.iter (fun s ->
+@@ -2971,25 +2893,6 @@
+ chunk_uid = uids.(j);
+ chunk_size = min (s.s_size -- pos) t.t_chunk_size;
+ } in
+- (try
+- ignore (Hashtbl.find known_chunks_sizes c.chunk_size)
+- with Not_found ->
+- (* new chunk size, compute hashes for zeroed chunk of
+- that size.
+- No chunk size is bigger than 16MB I hope *)
+- if c.chunk_size < Int64.of_int (16 * 1024 * 1024) then begin
+- let chunk_size = Int64.to_int c.chunk_size in
+- let zeroed_buffer = String.make chunk_size '\000' in
+-
+- Hashtbl.add zeroed_chunks_hashes
+- (Ed2k (Md4.Md4.string zeroed_buffer)) ();
+- Hashtbl.add zeroed_chunks_hashes
+- (Sha1 (Md4.Sha1.string zeroed_buffer)) ();
+- Hashtbl.add zeroed_chunks_hashes
+- (TigerTree (Md4.TigerTree.string zeroed_buffer)) ()
+- end;
+- Hashtbl.add known_chunks_sizes c.chunk_size ();
+- );
+ let occurrences =
+ try
+ Hashtbl.find chunks c
+@@ -3012,19 +2915,14 @@
+ ) s.s_networks
+ ) swarmers_by_name;
+ Hashtbl.iter (fun c occurrences ->
++ (* we need a verified chunk to copy over the others *)
+ match occurrences.occurrence_present, occurrences.occurrence_missing with
+ | _ , []
+ | [], _ -> ()
+ | (t, _, pos) :: _, missing ->
+- let is_zeroed_chunk =
+- try
+- ignore(Hashtbl.find zeroed_chunks_hashes c.chunk_uid);
+- false
+- with Not_found -> true in
+- propagate_chunk t pos c.chunk_size missing (not is_zeroed_chunk)
++ propagate_chunk t pos c.chunk_size missing
+ ) chunks
+
+-
+ let set_verifier t f =
+ t.t_verifier <- f;
+ (* TODO: check that false as t_primary is a good value to start with *)
Index: src/daemon/common/commonTypes.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonTypes.ml,v
retrieving revision 1.64
-retrieving revision 1.65
-diff -u -r1.64 -r1.65
+retrieving revision 1.66
+diff -u -r1.64 -r1.66
--- src/daemon/common/commonTypes.ml 26 Nov 2006 16:36:29 -0000 1.64
-+++ src/daemon/common/commonTypes.ml 3 Dec 2006 20:49:42 -0000 1.65
-@@ -265,6 +265,7 @@
++++ src/daemon/common/commonTypes.ml 6 Jan 2007 18:15:17 -0000 1.66
+@@ -260,11 +260,13 @@
+ | Field_Completesources (* "completesources" *)
+ | Field_Filename (* "filename" *)
+ | Field_Size
++| Field_Size_Hi
+ | Field_Uid
+ | Field_Filerating
| Field_Lastseencomplete
| Field_Mediacodec
| Field_Medialength
@@ -4221,15 +5142,38 @@ diff -u -r1.52 -r1.53
impl_shared_servers = [];
}
and sh = {
+Index: src/daemon/common/commonWeb.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/common/commonWeb.ml,v
+retrieving revision 1.37
+retrieving revision 1.38
+diff -u -r1.37 -r1.38
+--- src/daemon/common/commonWeb.ml 26 Nov 2006 13:54:09 -0000 1.37
++++ src/daemon/common/commonWeb.ml 17 Jan 2007 18:51:41 -0000 1.38
+@@ -150,7 +150,7 @@
+ with e -> failwith (Printf.sprintf "Unknown kind [%s]" kind)
+ in
+ try
+- lprintf_nl (_b "saving %s (%s)") kind url;
++ lprintf_nl (_b "request %s (%s)") kind url;
+ mldonkey_wget url f
+ with e ->
+ if can_fail then
Index: src/daemon/common/guiDecoding.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/guiDecoding.ml,v
retrieving revision 1.66
-retrieving revision 1.67
-diff -u -r1.66 -r1.67
+retrieving revision 1.69
+diff -u -r1.66 -r1.69
--- src/daemon/common/guiDecoding.ml 26 Nov 2006 13:54:09 -0000 1.66
-+++ src/daemon/common/guiDecoding.ml 2 Dec 2006 12:35:45 -0000 1.67
-@@ -816,8 +816,10 @@
++++ src/daemon/common/guiDecoding.ml 15 Jan 2007 18:26:27 -0000 1.69
+@@ -810,17 +810,18 @@
+ client_name = name;
+ client_rating = rating;
+ client_chat_port = chat_port;
+- client_files = None;
+ client_connect_time = 0;
+ client_software = "";
client_os = None;
client_release = "";
client_emulemod = "";
@@ -4241,8 +5185,18 @@ diff -u -r1.66 -r1.67
+ client_session_uploaded = zero;
client_upload = None;
client_sui_verified = None;
- (* client_sock_addr = ""; *)
-@@ -875,8 +877,10 @@
+-(* client_sock_addr = ""; *)
++ client_file_queue = [];
+ }, pos+8
+ else
+ let num = get_int s pos in
+@@ -869,17 +870,18 @@
+ client_name = name;
+ client_rating = rating;
+ client_chat_port = 0;
+- client_files = None;
+ client_connect_time = connect_time;
+ client_software = software;
client_os = None;
client_release = release;
client_emulemod = emulemod;
@@ -4254,7 +5208,41 @@ diff -u -r1.66 -r1.67
+ client_session_uploaded = 0L;
client_upload = upload;
client_sui_verified = verified;
- (* client_sock_addr = sock_addr; *)
+-(* client_sock_addr = sock_addr; *)
++ client_file_queue = [];
+ }, pos
+
+ let default_flags = [
+@@ -1349,6 +1351,9 @@
+ M.option_help = "";
+ M.option_type = "";
+ M.option_advanced = false;
++ M.option_restart = false;
++ M.option_public = false;
++ M.option_internal = false;
+ }
+
+ let to_gui (proto : int array) opcode s =
+@@ -1567,6 +1572,9 @@
+ M.option_value = value;
+ M.option_default = default;
+ M.option_advanced = advanced;
++ M.option_restart = false;
++ M.option_public = false;
++ M.option_internal = false;
+ }
+ else
+ let optype =
+@@ -1628,6 +1636,9 @@
+ M.option_value = value;
+ M.option_default = default;
+ M.option_advanced = advanced;
++ M.option_restart = false;
++ M.option_public = false;
++ M.option_internal = false;
+ }
+ else
+ let optype =
Index: src/daemon/common/guiEncoding.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/guiEncoding.ml,v
@@ -4278,11 +5266,19 @@ Index: src/daemon/common/guiTypes.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/common/guiTypes.ml,v
retrieving revision 1.34
-retrieving revision 1.35
-diff -u -r1.34 -r1.35
+retrieving revision 1.36
+diff -u -r1.34 -r1.36
--- src/daemon/common/guiTypes.ml 14 Nov 2006 18:42:59 -0000 1.34
-+++ src/daemon/common/guiTypes.ml 2 Dec 2006 12:35:45 -0000 1.35
-@@ -219,8 +219,10 @@
++++ src/daemon/common/guiTypes.ml 8 Jan 2007 11:06:42 -0000 1.36
+@@ -211,7 +211,6 @@
+ mutable client_type : client_type;
+ mutable client_tags: CommonTypes.tag list;
+ mutable client_name : string;
+- mutable client_files: file_tree option;
+ mutable client_rating : int;
+ mutable client_chat_port : int;
+ mutable client_connect_time : int;
+@@ -219,11 +218,13 @@
mutable client_os : string option;
mutable client_release : string;
mutable client_emulemod : string;
@@ -4294,16 +5290,146 @@ diff -u -r1.34 -r1.35
+ mutable client_session_uploaded : int64;
mutable client_upload : string option;
mutable client_sui_verified : bool option;
- (* mutable client_sock_addr : string; *)
+-(* mutable client_sock_addr : string; *)
++ mutable client_file_queue : CommonTypes.file list;
+ }
+
+ type client_stats = {
Index: src/daemon/driver/driverCommands.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/driver/driverCommands.ml,v
retrieving revision 1.202
-retrieving revision 1.209
-diff -u -r1.202 -r1.209
+retrieving revision 1.220
+diff -u -r1.202 -r1.220
--- src/daemon/driver/driverCommands.ml 28 Nov 2006 23:15:21 -0000 1.202
-+++ src/daemon/driver/driverCommands.ml 8 Dec 2006 12:26:24 -0000 1.209
-@@ -343,7 +343,7 @@
++++ src/daemon/driver/driverCommands.ml 6 Feb 2007 22:26:58 -0000 1.220
+@@ -78,7 +78,12 @@
+ [] ->
+ Gettext.buftext buf no_such_command cmd
+ | (command, _, arg_kind, help) :: tail ->
+- if command = cmd then
++ if command = cmd then begin
++ if !verbose_user_commands && not (user2_is_admin output.conn_user.ui_user) then
++ lprintf_nl "user %s issued command %s%s"
++ output.conn_user.ui_user.user_name
++ cmd
++ (if args = [] then "" else ", args " ^ String.concat " " args);
+ Buffer.add_string buf (
+ match arg_kind, args with
+ Arg_none f, [] -> f output
+@@ -88,6 +93,7 @@
+ | Arg_three f, [a1;a2;a3] -> f a1 a2 a3 output
+ | _ -> bad_number_of_args command help
+ )
++ end
+ else
+ iter tail
+ in
+@@ -100,20 +106,21 @@
+ html_mods_table_header buf "upstatsTable" "upstats" [
+ ( "0", "srh", "Option name", "Name (Help=mouseOver)" ) ;
+ ( "0", "srh", "Option value", "Value (press ENTER to save)" ) ;
+- ( "0", "srh", "Option default", "Default" ) ]
++ ( "0", "srh", "Option default", "Default" );
++ ( "0", "srh", "Option type", "Type" );
++ ]
+ else
+ html_mods_table_header buf "voTable" "vo" [
+ ( "0", "srh", "Option name", "Name" ) ;
+ ( "0", "srh", "Option value", "Value (press ENTER to save)" ) ;
+ ( "0", "srh", "Option default", "Default" ) ;
++ ( "0", "srh", "Option type", "Type" );
+ ( "0", "srh", "Option description", "Help" ) ];
+
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+
+ List.iter (fun o ->
+- incr counter;
+- if (!counter mod 2 == 0) then Printf.bprintf buf "\\<tr class=\\\"dl-1\\\""
+- else Printf.bprintf buf "\\<tr class=\\\"dl-2\\\"";
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"" (html_mods_cntr ());
+
+ if !!html_mods_use_js_helptext then
+ Printf.bprintf buf " onMouseOver=\\\"mOvr(this);setTimeout('popLayer(\\\\\'%s\\\\\')',%d);setTimeout('hideLayer()',%d);return true;\\\" onMouseOut=\\\"mOut(this);hideLayer();setTimeout('hideLayer()',%d)\\\"\\>"
+@@ -121,27 +128,20 @@
+ else
+ Printf.bprintf buf "\\>";
+
+- if String.contains o.option_value '\n' then begin
++ if String.contains o.option_value '\n' then
+ Printf.bprintf buf "\\<td class=\\\"sr\\\"\\>
+- \\<a href=\\\"http://mldonkey.sourceforge.net/%s\\\"\\>%s\\</a\\>
+- \\<form action=\\\"submit\\\" target=\\\"$S\\\" onsubmit=\\\"javascript: {setTimeout('window.location.replace(window.location.href)',500);}\\\"\\>
+- \\<input type=hidden name=setoption value=q\\>\\<input type=hidden name=option value=%s\\>\\</td\\>
+- \\<td\\>\\<textarea name=value rows=5 cols=20 wrap=virtual\\>%s\\</textarea\\>
+- \\<input type=submit value=Modify\\>\\</td\\>\\</form\\>
+- \\<td class=\\\"sr\\\"\\>%s\\</td\\>"
+- (String2.upp_initial o.option_name) o.option_name o.option_name o.option_value o.option_default;
+-
+- if not !!html_mods_use_js_helptext then
+- Printf.bprintf buf "\\<td class=\\\"sr\\\"\\>%s\\</td\\>" (Str.global_replace (Str.regexp "\n") "\\<br\\>" o.option_help);
+-
+- Printf.bprintf buf "\\</tr\\>"
+- end
+-
+- else begin
++\\<a href=\\\"http://mldonkey.sourceforge.net/%s\\\"\\>%s\\</a\\>
++\\<form action=\\\"submit\\\" target=\\\"$S\\\" onsubmit=\\\"javascript: {setTimeout('window.location.replace(window.location.href)',500);}\\\"\\>
++\\<input type=hidden name=setoption value=q\\>\\<input type=hidden name=option value=%s\\>\\</td\\>
++\\<td\\>\\<textarea name=value rows=5 cols=20 wrap=virtual\\>%s\\</textarea\\>
++\\<input type=submit value=Modify\\>"
++ (String2.upp_initial o.option_name) o.option_name o.option_name o.option_value
++ else
++ begin
+ Printf.bprintf buf "\\<td class=\\\"sr\\\"\\>
+- \\<a href=\\\"http://mldonkey.sourceforge.net/%s\\\"\\>%s\\</a\\>\\</td\\>
+- \\<td class=\\\"sr\\\"\\>\\<form action=\\\"submit\\\" target=\\\"$S\\\" onsubmit=\\\"javascript: {setTimeout('window.location.replace(window.location.href)',500);}\\\"\\>
+- \\<input type=hidden name=setoption value=q\\>\\<input type=hidden name=option value=%s\\>"
++\\<a href=\\\"http://mldonkey.sourceforge.net/%s\\\"\\>%s\\</a\\>\\</td\\>
++\\<td class=\\\"sr\\\"\\>\\<form action=\\\"submit\\\" target=\\\"$S\\\" onsubmit=\\\"javascript: {setTimeout('window.location.replace(window.location.href)',500);}\\\"\\>
++\\<input type=hidden name=setoption value=q\\>\\<input type=hidden name=option value=%s\\>"
+ (String2.upp_initial o.option_name) o.option_name o.option_name;
+
+ if o.option_value = "true" || o.option_value = "false" then
+@@ -153,14 +153,15 @@
+ Printf.bprintf buf "\\<input style=\\\"font-family: verdana; font-size: 10px;\\\"
+ type=text name=value size=20 value=\\\"%s\\\"\\>"
+ o.option_value;
+-
+- Printf.bprintf buf "\\</td\\>\\</form\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>" (shorten o.option_default 40);
+-
+- if not !!html_mods_use_js_helptext then
+- Printf.bprintf buf "\\<td class=\\\"sr\\\"\\>%s\\</td\\>" (Str.global_replace (Str.regexp "\n") "\\<br\\>" o.option_help);
+-
+- Printf.bprintf buf "\\</tr\\>"
+ end;
++ Printf.bprintf buf "\\</td\\>\\</form\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>" (shorten o.option_default 40);
++ Printf.bprintf buf "\\<td class=\\\"sr\\\"\\>%s\\</td\\>"
++ ((if o.option_restart then Printf.sprintf "restart " else "") ^
++ (if o.option_internal then Printf.sprintf "internal " else "") ^
++ (if o.option_public then Printf.sprintf "public " else ""));
++ if not !!html_mods_use_js_helptext then
++ Printf.bprintf buf "\\<td class=\\\"sr\\\"\\>%s\\</td\\>" (Str.global_replace (Str.regexp "\n") "\\<br\\>" o.option_help);
++ Printf.bprintf buf "\\</tr\\>"
+
+ )list;
+ Printf.bprintf buf "\\</table\\>\\</div\\>"
+@@ -208,11 +209,9 @@
+ ( "0", "srh", "Weekdays", "Weekdays" ) ;
+ ( "0", "srh", "Hours", "Hours" ) ;
+ ( "0", "srh", "Command", "Command" ) ] ;
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+ List.iter (fun (wdays, hours, command) ->
+- incr counter;
+- if (!counter mod 2 == 0) then Printf.bprintf buf "\\<tr class=\\\"dl-1\\\"\\>"
+- else Printf.bprintf buf "\\<tr class=\\\"dl-2\\\"\\>";
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>" (html_mods_cntr ());
+ let wdays_string = ref "" in
+ let hours_string = ref "" in
+ List.iter (fun day ->
+@@ -343,7 +342,7 @@
web_infos_add kind period url;
CommonWeb.load_url true kind url;
"url added to web_infos. downloading now"
@@ -4312,44 +5438,162 @@ diff -u -r1.202 -r1.209
^"\t\t\t\t\tkind is either server.met (if the downloaded file is a server.met)\n"
^"\t\t\t\t\tperiod is the period between updates (in hours, default 0 = only loaded at startup)";
-@@ -390,7 +390,12 @@
+@@ -357,10 +356,23 @@
+ "URL does not exists in web_infos"
+ ), "<url> :\t\t\tremove URL from web_infos";
+
+- "force_web_infos", Arg_none (fun o ->
+- CommonWeb.load_web_infos false true;
+- "downloading all web_infos URLs"
+- ), ":\t\t\tforce downloading all web_infos URLs";
++ "force_web_infos", Arg_multiple (fun args o ->
++ (match args with
++ | [] -> CommonWeb.load_web_infos false true;
++ "requesting all web_infos files"
++ | args -> let list = ref [] in
++ List.iter (fun arg ->
++ List.iter (fun (kind, _, url) ->
++ if kind = arg || url = arg then begin
++ CommonWeb.load_url false kind url;
++ list := arg :: !list
++ end
++ ) !!web_infos) args;
++ if !list = [] then
++ Printf.sprintf "found no web_infos entries for %s" (String.concat " " args)
++ else
++ Printf.sprintf "requesting web_infos %s" (String.concat " " !list))
++ ), "[<list of kind|URL>] :\tre-download web_infos, leave empty to re-download all";
+
+ "recover_temp", Arg_none (fun o ->
+ networks_iter (fun r ->
+@@ -378,9 +390,8 @@
+ ), ":\t\t\t\trecover lost files from temp directory";
+
+ "vc", Arg_multiple (fun args o ->
++ let buf = o.conn_buf in
+ if args = ["all"] then begin
+- let buf = o.conn_buf in
+-
+ if use_html_mods o then html_mods_table_header buf "vcTable" "vc" ([
+ ( "1", "srh ac", "Client number", "Num" ) ;
+ ( "0", "srh", "Network", "Network" ) ;
+@@ -390,29 +401,40 @@
( "0", "srh", "Client brand", "CB" ) ;
( "0", "srh", "Client release", "CR" ) ;
] @
- (if !!emule_mods_count then [( "0", "srh", "eMule MOD", "EM" )] else []));
+ (if !!emule_mods_count then [( "0", "srh", "eMule MOD", "EM" )] else [])
+ @ [
++ ( "0", "srh", "Client file queue", "Q" ) ;
+ ( "1", "srh ar", "Total UL bytes to this client for all files", "tUL" ) ;
+ ( "1", "srh ar br", "Total DL bytes from this client for all files", "tDL" ) ;
+ ( "1", "srh ar", "Session UL bytes to this client for all files", "sUL" ) ;
+ ( "1", "srh ar", "Session DL bytes from this client for all files", "sDL" )]);
- let counter = ref 0 in
+- let counter = ref 0 in
++ html_mods_cntr_init ();
let all_clients_list = clients_get_all () in
-@@ -409,7 +414,12 @@
+ List.iter (fun num ->
+ let c = client_find num in
+ let i = client_info c in
+- if use_html_mods o then Printf.bprintf buf "\\<tr class=\\\"%s\\\"
++ if use_html_mods o then Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"
+ title=\\\"Add as friend\\\"
+ onClick=\\\"parent.fstatus.location.href='submit?q=friend_add+%d'\\\"
+ onMouseOver=\\\"mOvr(this);\\\"
+ onMouseOut=\\\"mOut(this);\\\"\\>"
+- (if (!counter mod 2 == 0) then "dl-1" else "dl-2") num;
++ (html_mods_cntr ()) num;
+ client_print c o;
+ if use_html_mods o then
+ html_mods_td buf ([
(client_software i.client_software i.client_os, "sr", client_software_short i.client_software i.client_os);
("", "sr", i.client_release);
] @
- (if !!emule_mods_count then [("", "sr", i.client_emulemod)] else []));
+ (if !!emule_mods_count then [("", "sr", i.client_emulemod)] else [])
+ @ [
++ ("", "sr", Printf.sprintf "%d" (List.length i.client_file_queue));
+ ("", "sr ar", (size_of_int64 i.client_total_uploaded));
+ ("", "sr ar br", (size_of_int64 i.client_total_downloaded));
+ ("", "sr ar", (size_of_int64 i.client_session_uploaded));
+ ("", "sr ar", (size_of_int64 i.client_session_downloaded))]);
if use_html_mods o then Printf.bprintf buf "\\</tr\\>"
else Printf.bprintf buf "\n";
- incr counter;
-@@ -423,7 +433,7 @@
- client_print c o;
+- incr counter;
+ ) all_clients_list;
+ if use_html_mods o then Printf.bprintf buf "\\</table\\>\\</div\\>";
+ end
+@@ -420,18 +442,18 @@
+ List.iter (fun num ->
+ let num = int_of_string num in
+ let c = client_find num in
+- client_print c o;
++ try client_print_info c o with e -> print_command_result o (Printexc2.to_string e);
) args;
""
- ), "<num> :\t\t\t\tview client (use arg 'all' for all clients)";
+ ), "<num|all> :\t\t\t\tview client (use arg 'all' for all clients)";
"version", Arg_none (fun o ->
- print_command_result o o.conn_buf (CommonGlobals.version ());
-@@ -848,7 +858,7 @@
+- print_command_result o o.conn_buf (CommonGlobals.version ());
++ print_command_result o (CommonGlobals.version ());
+ ""
+ ), ":\t\t\t\tprint mldonkey version";
+
+ "uptime", Arg_none (fun o ->
+- print_command_result o o.conn_buf (log_time () ^ "- up " ^
++ print_command_result o (log_time () ^ "- up " ^
+ Date.time_to_string (last_time () - start_time) "verbose");
+ ""
+ ), ":\t\t\t\tcore uptime";
+@@ -497,7 +519,7 @@
+
+ "message_log", Arg_multiple (fun args o ->
+ let buf = o.conn_buf in
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+
+ (match args with
+ [arg] ->
+@@ -531,8 +553,8 @@
+
+ Fifo.iter (fun (t,i,num,n,s) ->
+ if use_html_mods o then begin
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"\\>"
+- (if (!counter mod 2 == 0) then "dl-1" else "dl-2");
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>"
++ (html_mods_cntr ());
+ html_mods_td buf [
+ ("", "sr", Date.simple (BasicSocket.date_of_int t));
+ ("", "sr", i);
+@@ -544,7 +566,6 @@
+ else
+ Printf.bprintf buf "\n%s [client #%d] %s(%s): %s\n"
+ (Date.simple (BasicSocket.date_of_int t)) num n i s;
+- incr counter;
+ ) chat_message_fifo;
+ if use_html_mods o then Printf.bprintf buf
+ "\\</table\\>\\</div\\>\\</div\\>";
+@@ -783,7 +804,7 @@
+ print_upstats o !list (Some s)
+ | _ -> ()
+ )
+- else print_command_result o o.conn_buf "You are not allowed to use this command";
++ else print_command_result o "You are not allowed to use this command";
+ _s ""
+ ), "<num> :\t\t\tshow list of files published on server <num>";
+
+@@ -824,7 +845,7 @@
+ | _ -> false
+ in
+ let print_result v =
+- print_command_result o o.conn_buf
++ print_command_result o
+ (Printf.sprintf (_b "Disconnected %d server%s") !counter (Printf2.print_plural_s !counter))
+ in
+ match args with
+@@ -848,7 +869,7 @@
) args;
print_result !counter;
""
@@ -4358,7 +5602,7 @@ diff -u -r1.202 -r1.209
]
-@@ -896,7 +906,7 @@
+@@ -896,7 +917,7 @@
) args;
Printf.sprintf (_b "%d friends removed") (List.length args)
end
@@ -4367,7 +5611,155 @@ diff -u -r1.202 -r1.209
"friends", Arg_none (fun o ->
let buf = o.conn_buf in
-@@ -1362,7 +1372,7 @@
+@@ -930,19 +951,18 @@
+ ( "0", "srh", "Name", "Name" ) ;
+ ( "0", "srh", "State", "State" ) ] ;
+ end;
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+ List.iter (fun c ->
+ let i = client_info c in
+ let n = network_find_by_num i.client_network in
+ if use_html_mods o then
+ begin
+
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"
+ onMouseOver=\\\"mOvr(this);\\\"
+ onMouseOut=\\\"mOut(this);\\\"\\>"
+- (if (!counter mod 2 == 0) then "dl-1" else "dl-2");
++ (html_mods_cntr ());
+
+- incr counter;
+ Printf.bprintf buf "
+ \\<td title=\\\"Client number\\\"
+ onClick=\\\"location.href='submit?q=files+%d'\\\"
+@@ -1082,7 +1102,6 @@
+ ), ":\t\t\t\tprint current bandwidth stats";
+
+ "bw_toggle", Arg_none (fun o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user then begin
+ let ul_bkp = !!max_hard_upload_rate_2 in
+ let dl_bkp = !!max_hard_download_rate_2 in
+@@ -1090,12 +1109,12 @@
+ max_hard_download_rate_2 =:= !!max_hard_download_rate;
+ max_hard_upload_rate =:= ul_bkp;
+ max_hard_download_rate =:= dl_bkp;
+- print_command_result o buf (Printf.sprintf
++ print_command_result o (Printf.sprintf
+ "new upload rate: %d | new download rate: %d"
+ !!max_hard_upload_rate !!max_hard_download_rate)
+ end
+ else
+- print_command_result o buf "You are not allowed to toggle bandwidth";
++ print_command_result o "You are not allowed to toggle bandwidth";
+ ""
+ ), ":\t\t\t\ttoggle between the two rate sets";
+
+@@ -1205,43 +1224,87 @@
+ ) , ":\t\t\t\tprint all networks";
+
+ "enable", Arg_one (fun num o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user then
+ begin
+ let n = network_find_by_num (int_of_string num) in
+ network_enable n;
+- print_command_result o buf "network enabled"
++ print_command_result o "network enabled"
+ end
+ else
+- print_command_result o buf "You are not allowed to enable networks";
++ print_command_result o "You are not allowed to enable networks";
+ _s ""
+ ) , "<num> :\t\t\t\tenable a particular network";
+
+ "disable", Arg_one (fun num o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user then
+ begin
+ let n = network_find_by_num (int_of_string num) in
+ network_disable n;
+- print_command_result o buf "network disabled"
++ print_command_result o "network disabled"
+ end
+ else
+- print_command_result o buf "You are not allowed to disable networks";
++ print_command_result o "You are not allowed to disable networks";
+ _s ""
+ ) , "<num> :\t\t\t\tdisable a particular network";
++
++ "force_porttest", Arg_none (fun o ->
++ networks_iter (fun n ->
++ match network_porttest_result n with
++ | PorttestNotAvailable -> ()
++ | _ -> network_porttest_start n;
++ );
++ if use_html_mods o then
++ print_command_result o "porttest started, use command
++ \\<u\\>\\<a onclick=\\\"javascript:window.location.href='submit?q=porttest'\\\"\\>porttest\\</a\\>\\</u\\> to see results"
++ else
++ print_command_result o "porttest started, use command 'porttest' to see results";
++ ""
++ ) , ":\t\t\tforce start network porttest";
+
+ "porttest", Arg_none (fun o ->
+ let buf = o.conn_buf in
++ let age time = Date.time_to_string (BasicSocket.last_time () - time) "verbose" in
++ let list = ref [] in
++ let put_list e = list := e :: !list in
+ networks_iter (fun n ->
+- match network_porttest_result n with
+- PorttestNotAvailable -> ()
+- | _ -> network_porttest_start n);
+- if o.conn_output = HTML then
+- Printf.bprintf buf "Click this \\<a href=\\\"porttest\\\"\\>link\\</a\\> to see results"
+- else
+- Printf.bprintf buf "Test started, you need a HTML browser to display results";
++ match network_porttest_result n with
++ | PorttestNotAvailable ->
++ put_list (n.network_name , "Porttest not available")
++ | PorttestNotStarted ->
++ put_list (n.network_name , "Porttest started");
++ network_porttest_start n
++ | PorttestInProgress time ->
++ put_list (n.network_name , Printf.sprintf "Porttest in progress, started %s ago" (age time))
++ | PorttestResult (time, s) ->
++ put_list (n.network_name , Printf.sprintf "Porttest finished %s ago \n%s" (age time) s)
++ );
++ if use_html_mods o then begin
++ Printf.bprintf buf "\\<div class=\\\"shares\\\"\\>\\<table class=main cellspacing=0 cellpadding=0\\>
++ \\<tr\\>\\<td\\>\\<table cellspacing=0 cellpadding=0 width=100%%\\>
++ \\<tr\\>\\<td class=downloaded width=100%%\\>\\</td\\>
++ \\<td nowrap class=\\\"fbig\\\"\\>
++ \\<a onclick=\\\"javascript:window.location.href='submit?q=force_porttest'\\\"\\>Restart porttest\\</a\\>\\</td\\>
++ \\<td nowrap class=\\\"fbig pr\\\"\\>
++ \\<a onclick=\\\"javascript:window.location.reload()\\\"\\>Refresh results\\</a\\>\\</td\\>
++ \\</tr\\>\\</table\\>\\</td\\>\\</tr\\>\\<tr\\>\\<td\\>";
++ html_mods_table_header buf "sharesTable" "shares" [
++ ( "0", "srh", "Network", "Network" ) ;
++ ( "0", "srh", "Result", "Result" ) ]
++ end;
++ html_mods_cntr_init ();
++ List.iter (fun (net, result) ->
++ if use_html_mods o then
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\</tr\\>"
++ (html_mods_cntr ()) net (Str.global_replace (Str.regexp "\n") "\\<br\\>" result)
++ else
++ Printf.bprintf buf "----- %s: -----\n%s\n\n" net result;
++ ) !list;
++ if use_html_mods o then
++ Printf.bprintf buf "\\</table\\>\\</div\\>\\</td\\>\\</tr\\>\\</table\\>"
++ else
++ Printf.bprintf buf "\n\nuse command 'porttest' again to refresh the results \nuse command 'force_porttest' to force a new porttest";
+ ""
+- ) , ":\t\t\t\tstart network porttest";
++ ) , ":\t\t\t\tprint network porttest results";
+
+ ]
+
+@@ -1362,7 +1425,7 @@
(if s.search_waiting = 0 then _s "done" else
string_of_int s.search_waiting)
s.search_nresults
@@ -4376,7 +5768,54 @@ diff -u -r1.202 -r1.209
user.ui_user_searches)
end;
""
-@@ -1767,6 +1777,7 @@
+@@ -1475,8 +1538,9 @@
+ with _ ->
+ Options.set_simple_option downloads_ini name value;
+ Printf.sprintf "option %s value changed" name
+- with e ->
+- Printf.sprintf "Error %s" (Printexc2.to_string e)
++ with
++ | Not_found -> Printf.sprintf "Option %s does not exist" name
++ | e -> Printf.sprintf "Error %s" (Printexc2.to_string e)
+ end
+ else
+ _s "You are not allowed to change options"
+@@ -1569,6 +1633,9 @@
+
+ "voo", Arg_multiple (fun args o ->
+ let buf = o.conn_buf in
++ let changed_list = List.sort (fun d1 d2 -> compare d1 d2) (List.filter (fun o ->
++ o.option_value <> o.option_default && not (String2.starts_with o.option_name "enable_")
++ ) (CommonInteractive.all_simple_options ())) in
+ if use_html_mods o then begin
+
+ Printf.bprintf buf "\\<script type=\\\"text/javascript\\\"\\>
+@@ -1612,7 +1679,8 @@
+ ("Files", "File related options") ;
+ ("Mail", "eMail information options") ;
+ ("Net", "activate/deaktivate Networks, some TCP/IP & IP blocking options") ;
+- ("Misc", "miscellaneous") ];
++ ("Misc", "miscellaneous") ;
++ ("changed", "Show changed options") ];
+
+ Printf.bprintf buf "
+ \\<td nowrap title=\\\"Show all options\\\" class=\\\"fbig\\\"\\>\\<a onclick=\\\"javascript:window.location.href='submit?q=voo'\\\"\\>All\\</a\\>\\</td\\>
+@@ -1650,9 +1718,11 @@
+
+ list_options_html o (
+ match args with
+- [] | _ :: _ :: _ ->
+- let v= CommonInteractive.all_simple_options () in
+- v
++ | [] | _ :: _ :: _ ->
++ CommonInteractive.all_simple_options ()
++
++ | ["changed"] ->
++ changed_list
+
+ | [arg] ->
+ try
+@@ -1767,6 +1837,7 @@
[
strings_of_option previewer;
strings_of_option temp_directory;
@@ -4384,7 +5823,7 @@ diff -u -r1.202 -r1.209
strings_of_option hdd_temp_minfree;
strings_of_option hdd_temp_stop_core;
strings_of_option hdd_coredir_minfree;
-@@ -1777,7 +1788,8 @@
+@@ -1777,7 +1848,8 @@
strings_of_option allow_browse_share;
strings_of_option auto_commit;
strings_of_option pause_new_downloads;
@@ -4394,7 +5833,164 @@ diff -u -r1.202 -r1.209
strings_of_option create_file_sparse;
strings_of_option log_file;
strings_of_option log_file_size;
-@@ -2415,8 +2427,10 @@
+@@ -1854,6 +1926,8 @@
+ strings_of_option backup_options_generations;
+ strings_of_option small_files_slot_limit;
+ ]
++ | 9 ->
++ changed_list
+
+ | _ ->
+ let v = CommonInteractive.some_simple_options (tab - !mtabs) in
+@@ -1908,10 +1982,13 @@
+ end
+
+ else begin
+- list_options o (CommonInteractive.parse_simple_options args)
++ match args with
++ | [] | _ :: _ :: _ -> list_options o (CommonInteractive.all_simple_options ())
++ | ["9"] | ["changed"] -> list_options o changed_list
++ | [_] -> list_options o (CommonInteractive.parse_simple_options args);
+ end;
+ ""
+- ), ":\t\t\t\t\tprint all options";
++ ), "[<option>|changed]:\t\t\tprint options (use * as wildcard), 'changed' prints all changed options, leave empty to print all options";
+
+ "vwi", Arg_none (fun o ->
+ let buf = o.conn_buf in
+@@ -1920,6 +1997,8 @@
+ \\<tr\\>\\<td\\>
+ \\<table cellspacing=0 cellpadding=0 width=100%%\\>\\<tr\\>
+ \\<td class=downloaded width=100%%\\>\\</td\\>
++\\<td nowrap title=\\\"force downloading all web_infos files\\\" class=\\\"fbig\\\"\\>
++\\<a onclick=\\\"javascript: {parent.fstatus.location.href='submit?q=force_web_infos';}\\\"\\>Re-download all\\</a\\>
+ \\<td nowrap class=\\\"fbig pr\\\"\\>\\<a onclick=\\\"javascript: {
+ var getdir = prompt('Input: <kind> <URL> [<period>]','server.met URL')
+ parent.fstatus.location.href='submit?q=urladd+' + encodeURIComponent(getdir);
+@@ -1937,16 +2016,14 @@
+
+ html_mods_table_header buf "web_infoTable" "vo" [
+ ( "0", "srh ac", "Click to remove URL", "Remove" ) ;
++ ( "0", "srh", "Download now", "DL" ) ;
+ ( "0", "srh", "Option type", "Type" ) ;
+ ( "0", "srh", "Option delay", "Delay" ) ;
+ ( "0", "srh", "Option value", "Value" ) ] ;
+
+- let counter = ref 0 in
+-
++ html_mods_cntr_init ();
+ List.iter (fun (kind, period, url) ->
+- incr counter;
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"\\>"
+- (if !counter mod 2 == 0 then "dl-1" else "dl-2");
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>" (html_mods_cntr ());
+ Printf.bprintf buf "
+ \\<td title=\\\"Click to remove URL\\\"
+ onMouseOver=\\\"mOvr(this);\\\"
+@@ -1955,6 +2032,13 @@
+ parent.fstatus.location.href=\\\"submit?q=urlremove+\\\\\\\"%s\\\\\\\"\\\"
+ setTimeout(\\\"window.location.reload()\\\",1000);}'
+ class=\\\"srb\\\"\\>Remove\\</td\\>" (Url.encode url);
++ Printf.bprintf buf "
++ \\<td title=\\\"Download now\\\"
++ onMouseOver=\\\"mOvr(this);\\\"
++ onMouseOut=\\\"mOut(this);\\\"
++ onClick=\\\'javascript:{
++ parent.fstatus.location.href=\\\"submit?q=force_web_infos+\\\\\\\"%s\\\\\\\"\\\";}'
++ class=\\\"srb\\\"\\>DL\\</td\\>" (Url.encode url);
+ Printf.bprintf buf "
+ \\<td title=\\\"%s\\\" class=\\\"sr\\\"\\>%s\\</td\\>
+ \\<td class=\\\"sr\\\"\\>%d\\</td\\>" url kind period;
+@@ -1969,11 +2053,9 @@
+ ( "0", "srh", "Web kind", "Kind" );
+ ( "0", "srh", "Description", "Type" ) ];
+
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+ List.iter (fun (kind, data) ->
+- incr counter;
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"\\>"
+- (if !counter mod 2 == 0 then "dl-1" else "dl-2");
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>" (html_mods_cntr ());
+ Printf.bprintf buf "
+ \\<td class=\\\"sr\\\"\\>%s\\</td\\>
+ \\<td class=\\\"sr\\\"\\>%s\\</td\\>" kind data.description
+@@ -2094,9 +2176,9 @@
+ | Some p -> Printf.sprintf "%d%%" p in
+ Printf.bprintf buf "percentused %s\n" (print_percento (Unix32.percentused arg));
+ Printf.bprintf buf "percentfree %s\n" (print_percento (Unix32.percentfree arg));
+- let stat = Unix.stat arg in
+- Printf.bprintf buf "\nstat_device %d\n" stat.Unix.st_dev;
+- Printf.bprintf buf "stat_inode %d\n" stat.Unix.st_ino;
++ let stat = Unix.LargeFile.stat arg in
++ Printf.bprintf buf "\nstat_device %d\n" stat.Unix.LargeFile.st_dev;
++ Printf.bprintf buf "stat_inode %d\n" stat.Unix.LargeFile.st_ino;
+
+ _s ""
+ ), "debug command (example: disk .)";
+@@ -2121,15 +2203,16 @@
+ "debug_fileinfo", Arg_one (fun arg o ->
+ let buf = o.conn_buf in
+ (try
+- let s = Unix.stat arg in
+- Printf.bprintf buf "st_dev %d\n" s.Unix.st_dev;
+- Printf.bprintf buf "st_ino %d\n" s.Unix.st_ino;
+- Printf.bprintf buf "st_uid %d\n" s.Unix.st_uid;
+- Printf.bprintf buf "st_gid %d\n" s.Unix.st_gid;
+- Printf.bprintf buf "st_size %d\n" s.Unix.st_size;
+- Printf.bprintf buf "st_atime %s\n" (Date.to_full_string s.Unix.st_atime);
+- Printf.bprintf buf "st_mtime %s\n" (Date.to_full_string s.Unix.st_mtime);
+- Printf.bprintf buf "st_ctime %s\n" (Date.to_full_string s.Unix.st_ctime);
++ let module U = Unix.LargeFile in
++ let s = U.stat arg in
++ Printf.bprintf buf "st_dev %d\n" s.U.st_dev;
++ Printf.bprintf buf "st_ino %d\n" s.U.st_ino;
++ Printf.bprintf buf "st_uid %d\n" s.U.st_uid;
++ Printf.bprintf buf "st_gid %d\n" s.U.st_gid;
++ Printf.bprintf buf "st_size %Ld\n" s.U.st_size;
++ Printf.bprintf buf "st_atime %s\n" (Date.to_full_string s.U.st_atime);
++ Printf.bprintf buf "st_mtime %s\n" (Date.to_full_string s.U.st_mtime);
++ Printf.bprintf buf "st_ctime %s\n" (Date.to_full_string s.U.st_ctime);
+ let user,group = Unix32.owner arg in
+ Printf.bprintf buf "username %s\n" user;
+ Printf.bprintf buf "groupname %s\n" group;
+@@ -2337,9 +2420,8 @@
+ ), "<dir> :\t\t\t\tunshare directory <dir>";
+
+ "upstats", Arg_none (fun o ->
+- let buf = o.conn_buf in
+ if not (user2_can_view_uploads o.conn_user.ui_user) then
+- print_command_result o buf "You are not allowed to see upload statistics"
++ print_command_result o "You are not allowed to see upload statistics"
+ else
+ begin
+ let list = ref [] in
+@@ -2355,7 +2437,7 @@
+ "links", Arg_none (fun o ->
+ let buf = o.conn_buf in
+ if not (user2_can_view_uploads o.conn_user.ui_user) then
+- print_command_result o o.conn_buf "You are not allowed to see shared files list"
++ print_command_result o "You are not allowed to see shared files list"
+ else begin
+
+ let list = ref [] in
+@@ -2385,13 +2467,13 @@
+ let buf = o.conn_buf in
+
+ if not (user2_can_view_uploads o.conn_user.ui_user) then
+- print_command_result o buf "You are not allowed to see uploaders list"
++ print_command_result o "You are not allowed to see uploaders list"
+ else begin
+
+ let nuploaders = Intmap.length !uploaders in
+ if use_html_mods o then
+ begin
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+ Printf.bprintf buf "\\<div class=\\\"uploaders\\\"\\>";
+ html_mods_table_one_row buf "uploadersTable" "uploaders" [
+ ("", "srh", Printf.sprintf "Total upload slots: %d (%d) | Pending slots: %d\n" nuploaders
+@@ -2415,8 +2497,10 @@
] @
(if !!emule_mods_count then [( "0", "srh", "eMule MOD", "EM" )] else [])
@ [
@@ -4407,16 +6003,26 @@ diff -u -r1.202 -r1.209
( "0", "srh ar", "Slot kind", "Slot" ) ;
( "0", "srh", "Filename", "Filename" ) ]);
-@@ -2432,7 +2446,7 @@
+@@ -2424,15 +2508,14 @@
+ try
+ let i = client_info c in
+ if is_connected i.client_state then begin
+- incr counter;
+
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"
+ title=\\\"[%d] Add as friend (avg: %.1f KB/s)\\\"
+ onMouseOver=\\\"mOvr(this);\\\"
onMouseOut=\\\"mOut(this);\\\"
onClick=\\\"parent.fstatus.location.href='submit?q=friend_add+%d'\\\"\\>"
- ( if (!counter mod 2 == 0) then "dl-1" else "dl-2";) (client_num c)
+- ( if (!counter mod 2 == 0) then "dl-1" else "dl-2";) (client_num c)
- ( float_of_int (Int64.to_int i.client_uploaded / 1024) /.
++ (html_mods_cntr ()) (client_num c)
+ ( float_of_int (Int64.to_int i.client_session_uploaded / 1024) /.
float_of_int (max 1 ((last_time ()) - i.client_connect_time)) )
(client_num c);
-@@ -2455,8 +2469,10 @@
+@@ -2455,8 +2538,10 @@
] @
(if !!emule_mods_count then [("", "sr", i.client_emulemod)] else [])
@ [
@@ -4429,7 +6035,7 @@ diff -u -r1.202 -r1.209
(let text1, text2 =
match client_slot c with
| FriendSlot -> "Friend", "F"
-@@ -2494,8 +2510,10 @@
+@@ -2494,8 +2579,10 @@
] @
(if !!emule_mods_count then [( "0", "srh", "eMule MOD", "EM" )] else [])
@ [
@@ -4442,7 +6048,22 @@ diff -u -r1.202 -r1.209
( "0", "srh", "Filename", "Filename" ) ]);
Intmap.iter (fun cnum c ->
-@@ -2527,8 +2545,10 @@
+@@ -2503,12 +2590,11 @@
+ try
+ let i = client_info c in
+ let ips,cc,cn = string_of_kind_geo i.client_kind in
+- incr counter;
+
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"
+ title=\\\"Add as Friend\\\" onMouseOver=\\\"mOvr(this);\\\" onMouseOut=\\\"mOut(this);\\\"
+ onClick=\\\"parent.fstatus.location.href='submit?q=friend_add+%d'\\\"\\>"
+- ( if (!counter mod 2 == 0) then "dl-1" else "dl-2";) cnum;
++ (html_mods_cntr ()) cnum;
+
+ html_mods_td buf [
+ ("", "sr", Printf.sprintf "%d" (client_num c)); ];
+@@ -2527,8 +2613,10 @@
] @
(if !!emule_mods_count then [("", "sr", i.client_emulemod )] else [])
@ [
@@ -4455,7 +6076,7 @@ diff -u -r1.202 -r1.209
("", "sr", (match i.client_upload with
Some f -> shorten f !!max_name_len
| None -> "") ) ]);
-@@ -2547,7 +2567,7 @@
+@@ -2547,7 +2635,7 @@
try
let i = client_info c in
client_print c o;
@@ -4464,7 +6085,7 @@ diff -u -r1.202 -r1.209
match i.client_upload with
Some cu ->
Printf.bprintf buf " filename: %s\n" cu
-@@ -2658,7 +2678,7 @@
+@@ -2658,7 +2746,7 @@
end
) !!files) args;
files_to_cancel o
@@ -4473,7 +6094,7 @@ diff -u -r1.202 -r1.209
"downloaders", Arg_none (fun o ->
let buf = o.conn_buf in
-@@ -2679,8 +2699,10 @@
+@@ -2679,8 +2767,10 @@
( "0", "srh", "Secure User Identification [N]one, [P]assed, [F]ailed", "S" ) ;
( "0", "srh", "IP address", "IP address" ) ;
] @ (if !Geoip.active then [( "0", "srh", "Country Code/Name", "CC" )] else []) @ [
@@ -4486,7 +6107,7 @@ diff -u -r1.202 -r1.209
( "0", "srh", "Filename", "Filename" ) ]);
let counter = ref 0 in
-@@ -2725,7 +2747,7 @@
+@@ -2725,7 +2815,7 @@
if (as_file_impl file).impl_file_num = num then
file_pause file o.conn_user.ui_user
) !!files) args; ""
@@ -4495,7 +6116,7 @@ diff -u -r1.202 -r1.209
"resume", Arg_multiple (fun args o ->
if args = ["all"] && user2_is_admin o.conn_user.ui_user then
-@@ -2739,7 +2761,7 @@
+@@ -2739,7 +2829,7 @@
if (as_file_impl file).impl_file_num = num then
file_resume file o.conn_user.ui_user
) !!files) args; ""
@@ -4504,43 +6125,369 @@ diff -u -r1.202 -r1.209
"release", Arg_one (fun arg o ->
let num = int_of_string arg in
-@@ -3080,7 +3102,7 @@
+@@ -2792,10 +2882,10 @@
+ Printf.bprintf buf "\\<div class=\\\"sourcesTable al\\\"\\>\\<table cellspacing=0 cellpadding=0\\>
+ \\<tr\\>\\<td\\>
+ \\<table cellspacing=0 cellpadding=0 width=100%%\\>\\<tr\\>
+- \\<td nowrap class=\\\"fbig\\\"\\>\\<a href=\\\"files\\\"\\>Display all files\\</a\\>\\</td\\>
+- \\<td nowrap class=\\\"fbig\\\"\\>\\<a href=\\\"submit?q=verify_chunks+%d\\\"\\>Verify chunks\\</a\\>\\</td\\>
+- \\<td nowrap class=\\\"fbig\\\"\\>\\<a href=\\\"preview_download?q=%d\\\"\\>Preview\\</a\\>\\</td\\>
+- \\<td nowrap class=\\\"fbig pr\\\"\\>\\<a href=\\\"javascript:window.location.reload()\\\"\\>Reload\\</a\\>\\</td\\>
++ \\<td nowrap class=\\\"fbig\\\"\\>\\<a onclick=\\\"javascript:window.location.href='files'\\\"\\>Display all files\\</a\\>\\</td\\>
++ \\<td nowrap class=\\\"fbig\\\"\\>\\<a onClick=\\\"javascript:parent.fstatus.location.href='submit?q=verify_chunks+%d'\\\"\\>Verify chunks\\</a\\>\\</td\\>
++ \\<td nowrap class=\\\"fbig\\\"\\>\\<a onClick=\\\"javascript:parent.fstatus.location.href='preview_download?q=%d'\\\"\\>Preview\\</a\\>\\</td\\>
++ \\<td nowrap class=\\\"fbig pr\\\"\\>\\<a onclick=\\\"javascript:window.location.reload()\\\"\\>Reload\\</a\\>\\</td\\>
+ \\<td class=downloaded width=100%%\\>\\</td\\>
+ \\</tr\\>\\</table\\>
+ \\</td\\>\\</tr\\>
+@@ -2872,50 +2962,47 @@
+ register_commands "Driver/Users" [
+
+ "useradd", Arg_two (fun user pass o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user
+ || o.conn_user.ui_user.user_name = user then
+ if user2_user_exists user then
+ begin
+ user2_user_set_password (user2_user_find user) pass;
+- print_command_result o buf (Printf.sprintf "Password of user %s changed" user)
++ print_command_result o (Printf.sprintf "Password of user %s changed" user)
+ end
+ else
+ begin
+ user2_user_add user (Md4.string pass) ();
+- print_command_result o buf (Printf.sprintf "User %s added" user)
++ print_command_result o (Printf.sprintf "User %s added" user)
+ end
+ else
+- print_command_result o buf "You are not allowed to add users";
++ print_command_result o "You are not allowed to add users";
+ _s ""
+ ), "<user> <passwd> :\t\tadd new mldonkey user/change user password";
+
+ "userdel", Arg_one (fun user o ->
+- let buf = o.conn_buf in
+ if user <> o.conn_user.ui_user.user_name then
+ if user2_is_admin o.conn_user.ui_user then
+ if user = admin_user.user_name then
+- print_command_result o buf "User 'admin' can not be removed"
++ print_command_result o "User 'admin' can not be removed"
+ else
+ try
+ let u = user2_user_find user in
+ let n = user2_num_user_dls u in
+- if n <> 0 then print_command_result o buf
++ if n <> 0 then print_command_result o
+ (Printf.sprintf "User %s has %d downloads, can not delete" user n)
+ else
+ user2_user_remove user;
+- print_command_result o buf (Printf.sprintf "User %s removed" user)
++ print_command_result o (Printf.sprintf "User %s removed" user)
+ with
+- Not_found -> print_command_result o buf (Printf.sprintf "User %s does not exist" user)
++ Not_found -> print_command_result o (Printf.sprintf "User %s does not exist" user)
+ else
+- print_command_result o buf "You are not allowed to remove users"
++ print_command_result o "You are not allowed to remove users"
else
- print_command_result o buf "You are not allowed to add a group";
+- print_command_result o buf "You can not remove yourself";
++ print_command_result o "You can not remove yourself";
+ _s ""
+ ), "<user> :\t\t\tremove a mldonkey user";
+
+ "usergroupadd", Arg_two (fun user group o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user then
+ begin
+ try
+@@ -2924,18 +3011,17 @@
+ try
+ let g = user2_group_find group in
+ user2_user_add_group u g;
+- print_command_result o buf (Printf.sprintf "Added group %s to user %s" g.group_name u.user_name)
+- with Not_found -> print_command_result o buf (Printf.sprintf "Group %s does not exist" group)
++ print_command_result o (Printf.sprintf "Added group %s to user %s" g.group_name u.user_name)
++ with Not_found -> print_command_result o (Printf.sprintf "Group %s does not exist" group)
+ end
+- with Not_found -> print_command_result o buf (Printf.sprintf "User %s does not exist" user)
++ with Not_found -> print_command_result o (Printf.sprintf "User %s does not exist" user)
+ end
+ else
+- print_command_result o buf "You are not allowed to add groups to a user";
++ print_command_result o "You are not allowed to add groups to a user";
+ _s ""
+ ), "<user> <group> :\t\tadd a group to a mldonkey user";
+
+ "usergroupdel", Arg_two (fun user group o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user
+ || o.conn_user.ui_user.user_name = user then
+ begin
+@@ -2945,10 +3031,10 @@
+ try
+ let g = user2_group_find group in
+ if not (List.mem g u.user_groups) then
+- print_command_result o buf (Printf.sprintf "User %s is not member of group %s" user group)
++ print_command_result o (Printf.sprintf "User %s is not member of group %s" user group)
+ else
+ if Some g = u.user_default_group then
+- print_command_result o buf (Printf.sprintf "Group %s is default group of user %s, can not remove. Use command userdgroup to change default_group." group user)
++ print_command_result o (Printf.sprintf "Group %s is default group of user %s, can not remove. Use command userdgroup to change default_group." group user)
+ else
+ begin
+ let counter = ref 0 in
+@@ -2960,23 +3046,22 @@
+ end
+ ) !!files;
+ user2_user_remove_group (user2_user_find user) (user2_group_find group);
+- print_command_result o buf (Printf.sprintf "Removed group %s from user %s%s"
++ print_command_result o (Printf.sprintf "Removed group %s from user %s%s"
+ group user
+ (if !counter = 0 then "" else Printf.sprintf ", changed file_group of %d file%s to default_group %s"
+ !counter (Printf2.print_plural_s !counter) (user2_print_group u.user_default_group)))
+ end
+- with Not_found -> print_command_result o buf (Printf.sprintf "Group %s does not exist" group)
++ with Not_found -> print_command_result o (Printf.sprintf "Group %s does not exist" group)
+ end
+- with Not_found -> print_command_result o buf (Printf.sprintf "User %s does not exist" user)
++ with Not_found -> print_command_result o (Printf.sprintf "User %s does not exist" user)
+ end
+
+ else
+- print_command_result o buf "You are not allowed to remove groups from a user";
++ print_command_result o "You are not allowed to remove groups from a user";
+ _s ""
+ ), "<user> <group> :\t\tremove a group from a mldonkey user";
+
+ "userdgroup", Arg_two (fun user group o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user
+ || o.conn_user.ui_user.user_name = user then
+ begin
+@@ -2994,76 +3079,71 @@
+ if update_dgroup () then
+ begin
+ user2_user_set_default_group u g;
+- print_command_result o buf (Printf.sprintf "Changed default group of user %s to group %s" u.user_name (user2_print_user_default_group u))
++ print_command_result o (Printf.sprintf "Changed default group of user %s to group %s" u.user_name (user2_print_user_default_group u))
+ end
+- else print_command_result o buf (Printf.sprintf "User %s is not member of group %s" u.user_name group)
+- with Not_found -> print_command_result o buf (Printf.sprintf "Group %s does not exist" group)
++ else print_command_result o (Printf.sprintf "User %s is not member of group %s" u.user_name group)
++ with Not_found -> print_command_result o (Printf.sprintf "Group %s does not exist" group)
+ end
+- with Not_found -> print_command_result o buf (Printf.sprintf "User %s does not exist" user)
++ with Not_found -> print_command_result o (Printf.sprintf "User %s does not exist" user)
+ end
+ else
+- print_command_result o buf "You are not allowed to change default group";
++ print_command_result o "You are not allowed to change default group";
+ _s ""
+ ), "<user> <group|None> :\tchange user default group";
+
+ "passwd", Arg_one (fun passwd o ->
+- let buf = o.conn_buf in
+ begin
+ try
+ let u = user2_user_find o.conn_user.ui_user.user_name in
+ user2_user_set_password u passwd;
+- print_command_result o buf (Printf.sprintf "Password of user %s changed" u.user_name)
+- with Not_found -> print_command_result o buf (Printf.sprintf "User %s does not exist" o.conn_user.ui_user.user_name)
++ print_command_result o (Printf.sprintf "Password of user %s changed" u.user_name)
++ with Not_found -> print_command_result o (Printf.sprintf "User %s does not exist" o.conn_user.ui_user.user_name)
+ end;
+ _s ""
+ ), "<passwd> :\t\t\tchange own password";
+
+ "usermail", Arg_two (fun user mail o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user
+ || o.conn_user.ui_user.user_name = user then
+ begin
+ try
+ let u = user2_user_find user in
+ user2_user_set_mail u mail;
+- print_command_result o buf (Printf.sprintf "User %s has new mail %s" user mail)
+- with Not_found -> print_command_result o buf (Printf.sprintf "User %s does not exist" user)
++ print_command_result o (Printf.sprintf "User %s has new mail %s" user mail)
++ with Not_found -> print_command_result o (Printf.sprintf "User %s does not exist" user)
+ end
+- else print_command_result o buf "You are not allowed to change mail addresses";
++ else print_command_result o "You are not allowed to change mail addresses";
+ _s ""
+ ), "<user> <mail> :\t\tchange user mail address";
+
+ "userdls", Arg_two (fun user dls o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user then
+ begin
+ try
+ let u = user2_user_find user in
+ user2_user_set_dls u (int_of_string dls);
+- print_command_result o buf (Printf.sprintf "User %s has now %s downloads allowed" user (user2_print_user_dls (user2_user_find user)))
+- with Not_found -> print_command_result o buf (Printf.sprintf "User %s does not exist" user)
++ print_command_result o (Printf.sprintf "User %s has now %s downloads allowed" user (user2_print_user_dls (user2_user_find user)))
++ with Not_found -> print_command_result o (Printf.sprintf "User %s does not exist" user)
+ end
+- else print_command_result o buf "You are not allowed to change this value";
++ else print_command_result o "You are not allowed to change this value";
+ _s ""
+ ), "<user> <num> :\t\t\tchange number of allowed concurrent downloads";
+
+ "usercommit", Arg_two (fun user dir o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user
+ || o.conn_user.ui_user.user_name = user then
+ begin
+ try
+ let u = user2_user_find user in
+ user2_user_set_commit_dir u dir;
+- print_command_result o buf (Printf.sprintf "User %s has new commit dir %s" u.user_name u.user_commit_dir)
+- with Not_found -> print_command_result o buf (Printf.sprintf "User %s does not exist" user)
++ print_command_result o (Printf.sprintf "User %s has new commit dir %s" u.user_name u.user_commit_dir)
++ with Not_found -> print_command_result o (Printf.sprintf "User %s does not exist" user)
+ end
+- else print_command_result o buf "You are not allowed to change this value";
++ else print_command_result o "You are not allowed to change this value";
+ _s ""
+ ), "<user> <dir> :\t\tchange user specific commit directory";
+
+ "groupadd", Arg_two (fun group admin o ->
+- let buf = o.conn_buf in
+ let g_admin =
+ try
+ bool_of_string admin
+@@ -3071,19 +3151,18 @@
+ in
+ if user2_is_admin o.conn_user.ui_user then
+ if user2_group_exists group then
+- print_command_result o buf (Printf.sprintf "Group %s already exists" group)
++ print_command_result o (Printf.sprintf "Group %s already exists" group)
+ else
+ begin
+ user2_group_add group g_admin;
+- print_command_result o buf (Printf.sprintf "Group %s added" group)
++ print_command_result o (Printf.sprintf "Group %s added" group)
+ end
+ else
+- print_command_result o buf "You are not allowed to add a group";
++ print_command_result o "You are not allowed to add a group";
_s ""
- ), "<group> <admin: true | false>: add new mldonkey group";
+ ), "<group> <admin: true|false> :\tadd new mldonkey group";
"groupdel", Arg_one (fun group o ->
- let buf = o.conn_buf in
-@@ -3345,22 +3367,22 @@
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user then
+ begin
+ try
+@@ -3091,46 +3170,45 @@
+ let g_dls = user2_num_group_dls g in
+ let g_mem = user2_num_group_members g in
+ if g_dls <> 0 then
+- print_command_result o buf
++ print_command_result o
+ (Printf.sprintf "Can not remove group %s, it has %d download%s"
+ group g_dls (Printf2.print_plural_s g_dls))
+ else
+ if g_mem <> 0 then
+- print_command_result o buf
++ print_command_result o
+ (Printf.sprintf "Can not remove group %s, it has %d member%s"
+ group g_mem (Printf2.print_plural_s g_mem))
+ else
+ if g.group_name = system_user_default_group.group_name then
+- print_command_result o buf (Printf.sprintf "Can not remove system group %s" group)
++ print_command_result o (Printf.sprintf "Can not remove system group %s" group)
+ else
+ begin
+ user2_group_remove g;
+- print_command_result o buf (Printf.sprintf "Removed group %s" group)
++ print_command_result o (Printf.sprintf "Removed group %s" group)
+ end
+- with Not_found -> print_command_result o buf (Printf.sprintf "Group %s does not exist" group)
++ with Not_found -> print_command_result o (Printf.sprintf "Group %s does not exist" group)
+ end
+ else
+- print_command_result o buf "You are not allowed to remove users";
++ print_command_result o "You are not allowed to remove users";
+ _s ""
+ ), "<group> :\t\t\tremove an unused mldonkey group";
+
+ "groupadmin", Arg_two (fun group admin o ->
+- let buf = o.conn_buf in
+ if user2_is_admin o.conn_user.ui_user then
+ begin
+ try
+ let g = user2_group_find group in
+ if g.group_name = system_user_default_group.group_name then
+- print_command_result o buf (Printf.sprintf "Can not change state of system group %s" group)
++ print_command_result o (Printf.sprintf "Can not change state of system group %s" group)
+ else
+ begin
+ user2_group_admin g (bool_of_string admin);
+- print_command_result o buf (Printf.sprintf "Changed admin status of group %s to %b" g.group_name g.group_admin)
++ print_command_result o (Printf.sprintf "Changed admin status of group %s to %b" g.group_name g.group_admin)
+ end
+- with Not_found -> print_command_result o buf (Printf.sprintf "Group %s does not exist" group)
++ with Not_found -> print_command_result o (Printf.sprintf "Group %s does not exist" group)
+ end
+ else
+- print_command_result o buf "You are not allowed to change group admin status";
++ print_command_result o "You are not allowed to change group admin status";
+ _s ""
+ ), "<group> <true|false> :\tchange group admin status";
+
+@@ -3163,12 +3241,11 @@
+ ( "0", "srh ar", "Download quota", "Max DLs" ) ;
+ ( "0", "srh ar", "Download count", "DLs" ) ];
+
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+ user2_users_iter (fun user ->
+- incr counter;
+ let u_dls = user2_num_user_dls user in
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"\\>"
+- (if !counter mod 2 == 0 then "dl-1" else "dl-2");
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>"
++ (html_mods_cntr ());
+ if user <> admin_user && (u_dls = 0) then Printf.bprintf buf
+ "\\<td title=\\\"Click to remove user\\\"
+ onMouseOver=\\\"mOvr(this);\\\"
+@@ -3343,24 +3420,24 @@
+ "Downloads";
+ |] (List.rev !list);
end
- end else print_command_result o buf "You are not allowed to list users";
+- end else print_command_result o buf "You are not allowed to list users";
++ end else print_command_result o "You are not allowed to list users";
_s ""
- ), "\t\t\t\t\tprint users";
+ ), ":\t\t\t\t\tprint users";
"whoami", Arg_none (fun o ->
- print_command_result o o.conn_buf o.conn_user.ui_user.user_name;
+- print_command_result o o.conn_buf o.conn_user.ui_user.user_name;
++ print_command_result o o.conn_user.ui_user.user_name;
_s ""
- ), "\t\t\t\t\tprint logged-in user name";
+ ), ":\t\t\t\tprint logged-in user name";
"groups", Arg_none (fun o ->
- print_command_result o o.conn_buf (user2_print_user_groups " " o.conn_user.ui_user);
+- print_command_result o o.conn_buf (user2_print_user_groups " " o.conn_user.ui_user);
++ print_command_result o (user2_print_user_groups " " o.conn_user.ui_user);
_s ""
- ), "\t\t\t\t\tprint groups of logged-in user";
+ ), ":\t\t\t\tprint groups of logged-in user";
"dgroup", Arg_none (fun o ->
- print_command_result o o.conn_buf (user2_print_user_default_group o.conn_user.ui_user);
+- print_command_result o o.conn_buf (user2_print_user_default_group o.conn_user.ui_user);
++ print_command_result o (user2_print_user_default_group o.conn_user.ui_user);
_s ""
- ), "\t\t\t\t\tprint default group of logged-in user";
+ ), ":\t\t\t\tprint default group of logged-in user";
"chgrp", Arg_two (fun group filenum o ->
let num = int_of_string filenum in
-@@ -3368,8 +3390,13 @@
+@@ -3368,8 +3445,13 @@
let file = file_find num in
if String.lowercase group = "none" then
begin
@@ -4549,43 +6496,146 @@ diff -u -r1.202 -r1.209
+ if user2_allow_file_admin file o.conn_user.ui_user then
+ begin
+ set_file_group file None;
-+ print_command_result o o.conn_buf (Printf.sprintf (_b "Changed group of download %d to %s") num group)
++ print_command_result o (Printf.sprintf (_b "Changed group of download %d to %s") num group)
+ end
+ else
-+ print_command_result o o.conn_buf (Printf.sprintf (_b "You are not allowed to change group of download %d to %s") num group)
++ print_command_result o (Printf.sprintf (_b "You are not allowed to change group of download %d to %s") num group)
end
else
begin
-@@ -3401,7 +3428,19 @@
+@@ -3379,13 +3461,13 @@
+ List.mem g (file_owner file).user_groups then
+ begin
+ set_file_group file (Some g);
+- print_command_result o o.conn_buf (Printf.sprintf (_b "Changed group of download %d to %s") num group)
++ print_command_result o (Printf.sprintf (_b "Changed group of download %d to %s") num group)
+ end
+ else
+- print_command_result o o.conn_buf (Printf.sprintf (_b "You are not allowed to change group of download %d to %s") num group)
+- with Not_found -> print_command_result o o.conn_buf (Printf.sprintf (_b "Group %s not found") group)
++ print_command_result o (Printf.sprintf (_b "You are not allowed to change group of download %d to %s") num group)
++ with Not_found -> print_command_result o (Printf.sprintf (_b "Group %s not found") group)
+ end
+- with Not_found -> print_command_result o o.conn_buf (Printf.sprintf (_b "File %d not found") num)
++ with Not_found -> print_command_result o (Printf.sprintf (_b "File %d not found") num)
+ end;
+ _s ""
+ ), "<group> <num> :\t\t\tchange group of download <num> to <group>, use group = none for private file";
+@@ -3401,13 +3483,25 @@
if user2_allow_file_admin file o.conn_user.ui_user then
begin
set_file_owner file u;
- print_command_result o o.conn_buf (Printf.sprintf (_b "Changed owner of download %d to %s") num user)
+ match file_group file with
+ | None ->
-+ print_command_result o o.conn_buf (Printf.sprintf (_b "Changed owner of download %d to %s") num user)
++ print_command_result o (Printf.sprintf (_b "Changed owner of download %d to %s") num user)
+ | Some g ->
+ if List.mem g u.user_groups then
-+ print_command_result o o.conn_buf (Printf.sprintf (_b "Changed owner of download %d to %s") num user)
++ print_command_result o (Printf.sprintf (_b "Changed owner of download %d to %s") num user)
+ else
+ begin
+ set_file_group file u.user_default_group;
-+ print_command_result o o.conn_buf (Printf.sprintf
++ print_command_result o (Printf.sprintf
+ (_b "owner %s is not member of file_group %s, changing file_group to user_default_group %s")
+ user g.group_name (user2_print_user_default_group u))
+ end
end
else
- print_command_result o o.conn_buf (Printf.sprintf (_b "You are not allowed to change owner of download %d to %s") num user)
+- print_command_result o o.conn_buf (Printf.sprintf (_b "You are not allowed to change owner of download %d to %s") num user)
+- with Not_found -> print_command_result o o.conn_buf (Printf.sprintf (_b "User %s not found") user)
++ print_command_result o (Printf.sprintf (_b "You are not allowed to change owner of download %d to %s") num user)
++ with Not_found -> print_command_result o (Printf.sprintf (_b "User %s not found") user)
+ end
+- with Not_found -> print_command_result o o.conn_buf (Printf.sprintf (_b "File %d not found") num)
++ with Not_found -> print_command_result o (Printf.sprintf (_b "File %d not found") num)
+ end;
+ _s ""
+ ), "<user> <num> :\t\t\tchange owner of download <num> to <user>";
+Index: src/daemon/driver/driverControlers.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/driver/driverControlers.ml,v
+retrieving revision 1.93
+retrieving revision 1.96
+diff -u -r1.93 -r1.96
+--- src/daemon/driver/driverControlers.ml 19 Nov 2006 23:03:42 -0000 1.93
++++ src/daemon/driver/driverControlers.ml 28 Jan 2007 20:39:59 -0000 1.96
+@@ -1493,25 +1493,6 @@
+ read_theme_page this_page else
+ if !!html_mods then !!CommonMessages.download_html_js_mods0
+ else !!CommonMessages.download_html_js_old)
+- | "porttest" ->
+- html_open_page buf t r true;
+- let age time =
+- Date.time_to_string (BasicSocket.last_time () - time) "verbose" in
+- networks_iter (fun n ->
+- let result =
+- match network_porttest_result n with
+- PorttestNotAvailable -> None
+- | PorttestNotStarted -> Some "porttest not started"
+- | PorttestInProgress time ->
+- Some (Printf.sprintf "porttest started %s ago" (age time))
+- | PorttestResult (time, s) ->
+- Some (Printf.sprintf "porttest finished %s ago, %s" (age time) s)
+- in
+- (match result with
+- None -> ()
+- | Some result ->
+- Printf.bprintf buf "%s:<br> %s<br>\n" n.network_name result));
+- Printf.bprintf buf "<br><br><a href=\"porttest\">Reload</a>"
+ | _ -> raise Not_found
+ with
+ | Not_found ->
+Index: src/daemon/driver/driverGraphics_gd.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/driver/driverGraphics_gd.ml,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- src/daemon/driver/driverGraphics_gd.ml 28 Nov 2006 23:15:21 -0000 1.3
++++ src/daemon/driver/driverGraphics_gd.ml 6 Jan 2007 17:31:48 -0000 1.4
+@@ -264,7 +264,7 @@
+ in
+ let day_string n =
+ let time = Unix.localtime (basetime -. float_of_int(n * my_time / x_divisions ())) in
+- Printf.sprintf "%02d.%02d." time.Unix.tm_mday time.Unix.tm_mon
++ Printf.sprintf "%02d.%02d." time.Unix.tm_mday (time.Unix.tm_mon + 1)
+ in
+ if show_days then
+ begin
Index: src/daemon/driver/driverInteractive.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/driver/driverInteractive.ml,v
retrieving revision 1.118
-retrieving revision 1.122
-diff -u -r1.118 -r1.122
+retrieving revision 1.126
+diff -u -r1.118 -r1.126
--- src/daemon/driver/driverInteractive.ml 28 Nov 2006 23:17:31 -0000 1.118
-+++ src/daemon/driver/driverInteractive.ml 3 Dec 2006 20:57:56 -0000 1.122
-@@ -1115,7 +1115,8 @@
++++ src/daemon/driver/driverInteractive.ml 6 Feb 2007 22:26:58 -0000 1.126
+@@ -391,13 +391,10 @@
+
+ let print_table_html_mods buf lines =
+
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+
+ List.iter (fun line ->
+- if (!counter mod 2 == 0) then Printf.bprintf buf "\\<tr class=dl-1"
+- else Printf.bprintf buf "\\<tr class=dl-2";
+- incr counter;
+-
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"" (html_mods_cntr ());
+ Array.iter (fun data ->
+ Printf.bprintf buf "%s" data;
+ ) line;
+@@ -668,7 +665,7 @@
+ (List.length guifiles) (size_of_int64 !tdl) (size_of_int64 !tsize) (!trate /. 1024.)
+ (let unread = ref 0 in
+ Fifo.iter (fun (t,i,num,n,s) -> if t > !last_message_log then incr unread) chat_message_fifo;
+-if !unread > 0 then Printf.sprintf "\\<td class=downloaded title=\\\"%d unread messages\\\"\\>\\<a onClick=\\\"mSub('fstatus','version');mSub('output','message')\\\"\\>(+%d)\\</a\\>\\&nbsp;\\</td\\>" !unread !unread else "");
++if !unread > 0 then Printf.sprintf "\\<td onMouseOver=\\\"mOvr(this);\\\" onMouseOut=\\\"mOut(this);\\\" class=downloaded title=\\\"%d unread messages\\\"\\>\\<a onClick=\\\"mSub('fstatus','version');mSub('output','message')\\\"\\>(+%d)\\</a\\>\\&nbsp;\\</td\\>" !unread !unread else "");
+
+ if !!html_mods_vd_network then Printf.bprintf buf
+ "\\<td title=\\\"Sort by network\\\" class=dlheader\\>\\<input style=\\\"padding-left: 0px; padding-right: 0px;\\\" class=headbutton type=submit value=N name=sortby\\>\\</td\\>";
+@@ -1115,7 +1112,8 @@
if o.conn_output <> HTML && !!improved_telnet then
begin
@@ -4595,7 +6645,7 @@ diff -u -r1.118 -r1.122
simple_print_file_list false buf list o
end
else
-@@ -1124,29 +1125,37 @@
+@@ -1124,29 +1122,37 @@
let sorter =
match o.conn_sortvd with
@@ -4653,7 +6703,27 @@ diff -u -r1.118 -r1.122
with _ -> list
in
simple_print_file_list false buf list o
-@@ -1259,7 +1268,7 @@
+@@ -1191,6 +1197,7 @@
+ let counter = ref 0 in
+ if use_html_mods o then
+ begin
++ html_mods_cntr_init ();
+ if !!html_mods_use_js_tooltips then Printf.bprintf buf "\\<div id=\\\"object1\\\" style=\\\"position:absolute; background-color:#FFFFDD;color:black;border-color:black;border-width:20px;font-size:8pt; visibility:visible; left:25px; top:-100px; z-index:+1\\\" onmouseover=\\\"overdiv=1;\\\" onmouseout=\\\"overdiv=0; setTimeout(\\\'hideLayer()\\\',1000)\\\"\\>\\&nbsp;\\</div\\>\n";
+ html_mods_table_header_colspan buf "resultsTable" "results" [
+ ( "1", "0", "srh", "Network", "Network" ) ;
+@@ -1211,10 +1218,7 @@
+ if !counter >= !!max_displayed_results then raise Exit;
+
+ if use_html_mods o then
+- begin
+- if (!counter mod 2 == 0) then Printf.bprintf buf "\\<tr class=\\\"dl-1\\\"\\>"
+- else Printf.bprintf buf "\\<tr class=\\\"dl-2\\\"\\>";
+- end;
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>" (html_mods_cntr ());
+
+ user.ui_last_results <- (!counter, rs) :: user.ui_last_results;
+ let network_name =
+@@ -1259,7 +1263,7 @@
let nl = ref false in
List.iter (fun t ->
match t.tag_name with
@@ -4662,7 +6732,7 @@ diff -u -r1.118 -r1.122
| _ ->
Buffer.add_string buf ((if !nl then "<br>" else begin nl := true;"" end) ^
escaped_string_of_field t ^ ": " ^ get_tag_value t);
-@@ -1275,7 +1284,7 @@
+@@ -1275,7 +1279,7 @@
let nl = ref false in
List.iter (fun t ->
match t.tag_name with
@@ -4671,7 +6741,7 @@ diff -u -r1.118 -r1.122
| _ ->
Buffer.add_string buf ((if !nl then "\n" else begin nl := true;"" end) ^
"|| (" ^
-@@ -1331,8 +1340,8 @@
+@@ -1331,8 +1335,8 @@
let cformat = ref "" in
List.iter (fun t ->
(match t.tag_name with
@@ -4682,7 +6752,7 @@ diff -u -r1.118 -r1.122
| Field_Availability -> cavail := get_tag_value t
| Field_Completesources -> csource := get_tag_value t
| Field_Length -> clength := get_tag_value t
-@@ -1383,9 +1392,9 @@
+@@ -1383,9 +1387,9 @@
| Field_Format
| Field_Bitrate
(* TODO : "urn" shouldn't be some kind of Field_Uid of Gnutella ? *)
@@ -4694,7 +6764,7 @@ diff -u -r1.118 -r1.122
| _ ->
Buffer.add_string buf ("\\<span title=\\\"" ^
get_tag_value t ^ "\\\"\\>(" ^
-@@ -1490,9 +1499,9 @@
+@@ -1490,9 +1494,9 @@
user.ui_last_results <- (!counter, rs) :: user.ui_last_results;
files := [|
@@ -4705,7 +6775,7 @@ diff -u -r1.118 -r1.122
(
let names = r.result_names in
-@@ -1704,8 +1713,8 @@
+@@ -1704,8 +1708,8 @@
Intmap.iter (fun r_num (avail,rs) ->
let r = IndexedResults.get_result rs in
results := (rs, r, !avail) :: !results) s.search_results;
@@ -4716,7 +6786,94 @@ diff -u -r1.118 -r1.122
) !results in
Printf.bprintf buf "Result of search %d\n" s.search_num;
-@@ -2448,7 +2457,9 @@
+@@ -1877,7 +1881,7 @@
+ );
+ tack list
+ (
+- "Build on:\t",
++ "Built on:\t",
+ Autoconf.build_system ^ " (" ^ Unix2.endianness () ^ ")" ^
+ (if Autoconf.glibc_version = "" then ""
+ else
+@@ -1941,12 +1945,11 @@
+ ( "0", "srh", "", "" ) ]
+ else
+ Printf.bprintf buf "\n\t--Buildinfo--\n";
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+ List.iter (fun (desc, text) ->
+- incr counter;
+ if html then
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\</tr\\>"
+- (if !counter mod 2 = 0 then "dl-1" else "dl-2") desc text
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\</tr\\>"
++ (html_mods_cntr ()) desc text
+ else
+ Printf.bprintf buf "%s %s\n" desc text;
+ ) list;
+@@ -2036,10 +2039,11 @@
+ tack list
+ (
+ "",
+- Printf.sprintf "\t\t max_string_length: %d - word_size: %d - max_array_length: %d"
++ Printf.sprintf "\t\t max_string_length: %d - word_size: %d - max_array_length: %d - max_int: %d"
+ Sys.max_string_length
+ Sys.word_size
+ Sys.max_array_length
++ Pervasives.max_int
+ );
+ tack list
+ (
+@@ -2060,12 +2064,11 @@
+ ( "0", "srh", "", "" ) ]
+ else
+ Printf.bprintf buf "\n\t--Runinfo--\n";
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+ List.iter (fun (desc, text) ->
+- incr counter;
+ if html then
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\</tr\\>"
+- (if !counter mod 2 = 0 then "dl-1" else "dl-2") desc text
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\</tr\\>"
++ (html_mods_cntr ()) desc text
+ else
+ Printf.bprintf buf "%s %s\n" desc text;
+ ) list;
+@@ -2136,7 +2139,7 @@
+ let fill_dir_line = String.make (!len_dir - 9) '-' in
+ let fill_strategy = String.make (!len_strategy - 4) ' ' in
+ let fill_strategy_line = String.make (!len_strategy - 4) '-' in
+- let counter = ref 0 in
++ html_mods_cntr_init ();
+ if html then
+ html_mods_table_header buf "sharesTable" "shares" [
+ ( "0", "srh", "Directory", "Directory" ) ;
+@@ -2154,7 +2157,6 @@
+ fill_dir_line fill_strategy_line;
+ end;
+ List.iter (fun (dir, strategy) ->
+- incr counter;
+ let diskused =
+ match Unix32.diskused dir with
+ | None -> Printf.sprintf "---"
+@@ -2172,11 +2174,10 @@
+ in
+ let filesystem = Unix32.filesystem dir in
+ if html then
+- begin
+- Printf.bprintf buf "\\<tr class=\\\"%s\\\"\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\<td class=\\\"sr ar\\\"\\>%s\\</td\\>\\<td class=\\\"sr ar\\\"\\>%s\\</td\\>\\<td class=\\\"sr ar\\\"\\>%s\\</td\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\</tr\\>"
+- (if !counter mod 2 = 0 then "dl-1" else "dl-2")
+- dir strategy diskused diskfree percentfree filesystem
+- end
++ Printf.bprintf buf "\\<tr class=\\\"dl-%d\\\"\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>
++ \\<td class=\\\"sr ar\\\"\\>%s\\</td\\>\\<td class=\\\"sr ar\\\"\\>%s\\</td\\>
++ \\<td class=\\\"sr ar\\\"\\>%s\\</td\\>\\<td class=\\\"sr\\\"\\>%s\\</td\\>\\</tr\\>"
++ (html_mods_cntr ()) dir strategy diskused diskfree percentfree filesystem
+ else
+ Printf.bprintf buf "%-*s|%-*s|%8s|%8s|%5s|%-s\n"
+ (max !len_dir (!len_dir - String.length dir)) dir
+@@ -2448,7 +2449,9 @@
( "0", "srh", "Preview", "P" ) ;
( "0", "srh", "Filename", "Filename" );
( "0", "srh", "Statistic links", "Stats" );
@@ -4727,7 +6884,7 @@ diff -u -r1.118 -r1.122
else
begin
Printf.bprintf buf " Requests | Bytes | Uploaded | File\n";
-@@ -2456,10 +2467,10 @@
+@@ -2456,10 +2459,10 @@
end;
html_mods_cntr_init ();
@@ -4742,7 +6899,7 @@ diff -u -r1.118 -r1.122
) list in
List.iter (fun impl ->
-@@ -2474,8 +2485,9 @@
+@@ -2474,8 +2477,9 @@
(if !!html_mods_use_js_tooltips then
Printf.bprintf buf " onMouseOver=\\\"mOvr(this);setTimeout('popLayer(\\\\\'%s<br>%s%s\\\\\')',%d);setTimeout('hideLayer()',%d);return true;\\\" onMouseOut=\\\"mOut(this);hideLayer();setTimeout('hideLayer()',%d)\\\"\\>"
(Http_server.html_real_escaped (Filename.basename (Charset.to_utf8 impl.impl_shared_codedname)))
@@ -4754,7 +6911,7 @@ diff -u -r1.118 -r1.122
| Some magic -> "File type: " ^ (Http_server.html_real_escaped magic) ^ "<br>")
(if impl.impl_shared_servers = [] then "" else
Printf.sprintf "<br>Published on %d %s<br>%s"
-@@ -2497,7 +2509,6 @@
+@@ -2497,7 +2501,6 @@
let uploaded = Int64.to_float impl.impl_shared_uploaded in
let size = Int64.to_float impl.impl_shared_size in
@@ -4762,7 +6919,7 @@ diff -u -r1.118 -r1.122
html_mods_td buf [
("", "sr ar", Printf.sprintf "%d" impl.impl_shared_requests);
("", "sr ar", size_of_int64 impl.impl_shared_uploaded);
-@@ -2515,7 +2526,9 @@
+@@ -2515,7 +2518,9 @@
(Md4.to_string impl.impl_shared_id) "T1"
(Md4.to_string impl.impl_shared_id) "T2"
(Md4.to_string impl.impl_shared_id) "B"));
@@ -4773,14 +6930,61 @@ diff -u -r1.118 -r1.122
Printf.bprintf buf "\\</tr\\>\n";
end
else
+Index: src/daemon/driver/driverInterface.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/daemon/driver/driverInterface.ml,v
+retrieving revision 1.61
+retrieving revision 1.63
+diff -u -r1.61 -r1.63
+--- src/daemon/driver/driverInterface.ml 26 Nov 2006 13:54:09 -0000 1.61
++++ src/daemon/driver/driverInterface.ml 25 Jan 2007 13:29:05 -0000 1.63
+@@ -470,15 +470,13 @@
+ gui.gui_events.gui_new_events <- ev :: gui.gui_events.gui_new_events
+ ) console_messages;
+
+- if user2_is_admin gui.gui_conn.conn_user.ui_user then
+ gui_send gui (
+- P.Options_info (simple_options "" downloads_ini));
++ P.Options_info (simple_options "" downloads_ini (user2_is_admin gui.gui_conn.conn_user.ui_user)));
+
+- if user2_is_admin gui.gui_conn.conn_user.ui_user then
+ networks_iter_all (fun r ->
+ List.iter (fun opfile ->
+ let prefix = r.network_shortname ^ "-" in
+- let args = simple_options prefix opfile in
++ let args = simple_options prefix opfile (user2_is_admin gui.gui_conn.conn_user.ui_user) in
+ gui_send gui (P.Options_info args)) r.network_config_file);
+
+ (* Options panels defined in downloads.ini *)
+@@ -1091,8 +1089,18 @@
+ let s = server_find num in
+ server_rename s name
+ | P.ServerSetPreferred (num, preferred) ->
+- let s = server_find num in
+- server_set_preferred s preferred
++ if user2_is_admin gui.gui_conn.conn_user.ui_user then
++ server_set_preferred (server_find num) preferred
++ else
++ begin
++ let o = gui.gui_conn in
++ let buf = o.conn_buf in
++ Buffer.reset buf;
++ Buffer.add_string buf "\nYou are not allowed to change preferred status\n";
++ gui_send gui (P.Console (
++ DriverControlers.dollar_escape o false
++ (Buffer.contents buf)))
++ end
+
+ with
+ Failure s ->
Index: src/daemon/driver/driverMain.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/daemon/driver/driverMain.ml,v
retrieving revision 1.133
-retrieving revision 1.134
-diff -u -r1.133 -r1.134
+retrieving revision 1.135
+diff -u -r1.133 -r1.135
--- src/daemon/driver/driverMain.ml 28 Nov 2006 23:15:21 -0000 1.133
-+++ src/daemon/driver/driverMain.ml 8 Dec 2006 12:26:25 -0000 1.134
++++ src/daemon/driver/driverMain.ml 17 Jan 2007 18:53:28 -0000 1.135
@@ -54,7 +54,6 @@
let minute_timer () =
@@ -4789,7 +6993,31 @@ diff -u -r1.133 -r1.134
CommonUploads.upload_credit_timer ();
CommonInteractive.force_download_quotas ();
CommonResult.dummy_result.result_time <- last_time ();
-@@ -446,6 +445,10 @@
+@@ -306,6 +305,23 @@
+ "-pid", Arg.String (fun s -> pid := s;
+ ),
+ _s ": directory for pid file";
++ "-useradd", Arg.Rest (fun s ->
++ (match String2.split s ' ' with
++ | user :: pass :: _ ->
++ if user2_user_exists user then
++ begin
++ user2_user_set_password (user2_user_find user) pass;
++ Printf.printf "%sPassword of user %s changed\n%!" (log_time ()) user
++ end
++ else
++ begin
++ user2_user_add user (Md4.Md4.string pass) ();
++ Printf.printf "%sUser %s added\n%!" (log_time ()) user
++ end;
++ Options.save_with_help_private users_ini;
++ Printf.printf "%sSaved changes to users.ini\n%!" (log_time ())
++ | _ -> raise (Arg.Bad "invalid syntax"));
++ exit 0), _s "\"<user> <pass>\" : create user/change password";
+ ] @
+ !more_args
+ @
+@@ -446,6 +462,10 @@
add_infinite_timer 0.1 CommonUploads.upload_download_timer;
add_infinite_timer !!buffer_writes_delay (fun _ -> Unix32.flush ());
@@ -4800,6 +7028,100 @@ diff -u -r1.133 -r1.134
history_timeflag := (Unix.time());
update_download_history ();
update_upload_history ();
+Index: src/gtk/gui/gui_friends.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/gtk/gui/gui_friends.ml,v
+retrieving revision 1.7
+retrieving revision 1.8
+diff -u -r1.7 -r1.8
+--- src/gtk/gui/gui_friends.ml 28 Nov 2006 12:58:10 -0000 1.7
++++ src/gtk/gui/gui_friends.ml 8 Jan 2007 14:07:55 -0000 1.8
+@@ -61,10 +61,7 @@
+ | BlackListedHost -> gettext M.black_listed, Some !!O.color_not_connected
+
+ let string_color_of_client friend_tab c =
+- match c.client_files with
+- Some _ when friend_tab ->
+- gettext M.o_col_files_listed, Some !!O.color_downloading
+- | _ -> string_color_of_state c.client_state
++ string_color_of_state c.client_state
+
+ let shorten maxlen s =
+ let len = String.length s in
+@@ -256,14 +253,7 @@
+ Gui_com.send (GuiProto.FindFriend s)
+
+ method on_select c =
+- match c.client_files with
+- None ->
+-(* lprintf "No file for friend %d" c.client_num; lprint_newline (); *)
+ Gui_com.send (GuiProto.GetClient_files c.client_num)
+- | Some tree ->
+-(* lprintf "%d files for friend %d" (List.length l) c.client_num;
+- lprint_newline (); *)
+- box_files#update_tree (Some tree)
+
+ method on_deselect f =
+ box_files#update_tree None
+@@ -284,8 +274,6 @@
+ method h_update_friend f_new =
+ try
+ let (row, f) = self#find_client f_new.client_num in
+- if f_new.client_files <> None then
+- f.client_files <- f_new.client_files;
+ f.client_state <- f_new.client_state;
+ f.client_type <- f_new.client_type;
+ f.client_rating <- f_new.client_rating;
+@@ -426,8 +414,6 @@
+ self#remove_item row c
+ end else
+ let _ = () in
+- if c_new.client_files <> None then
+- c.client_files <- c_new.client_files;
+ c.client_state <- c_new.client_state;
+ c.client_rating <- c_new.client_rating;
+ c.client_name <- c_new.client_name;
+Index: src/gtk/gui/gui_main.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/gtk/gui/gui_main.ml,v
+retrieving revision 1.14
+retrieving revision 1.15
+diff -u -r1.14 -r1.15
+--- src/gtk/gui/gui_main.ml 27 Jun 2006 10:38:35 -0000 1.14
++++ src/gtk/gui/gui_main.ml 8 Jan 2007 14:07:55 -0000 1.15
+@@ -127,7 +127,6 @@
+ if is_in_locations then
+ gui#tab_downloads#h_update_location c;
+
+- if c.client_files <> None then cc.client_files <- c.client_files;
+ cc.client_state <- c.client_state;
+
+ if c.client_state = RemovedHost then begin
+@@ -420,13 +419,11 @@
+ try
+ let c = Hashtbl.find G.locations num in
+ try
+- let tree = match c.client_files with
+- None -> { file_tree_list = []; file_tree_name = "" }
+- | Some tree -> { tree with file_tree_list = tree.file_tree_list }
+- in
+-
++ let tree = { file_tree_list = []; file_tree_name = "" } in
+ add_file tree dirname file;
++(*
+ ignore (canon_client gui { c with client_files = Some tree })
++*)
+
+ with _ ->
+ (* lprintf "File already there"; lprint_newline (); *)
+@@ -519,6 +516,7 @@
+
+ | Search s -> ()
+ | Version _ -> ()
++ | Stats (_, _) -> ()
+
+ with e ->
+ lprintf "Exception %s in reader\n" (Printexc2.to_string e)
Index: src/gtk/newgui/gui_downloads.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/gtk/newgui/gui_downloads.ml,v
@@ -4834,11 +7156,30 @@ Index: src/gtk/newgui/gui_friends.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/gtk/newgui/gui_friends.ml,v
retrieving revision 1.20
-retrieving revision 1.21
-diff -u -r1.20 -r1.21
+retrieving revision 1.22
+diff -u -r1.20 -r1.22
--- src/gtk/newgui/gui_friends.ml 28 Nov 2006 12:58:11 -0000 1.20
-+++ src/gtk/newgui/gui_friends.ml 2 Dec 2006 12:35:46 -0000 1.21
-@@ -435,8 +435,10 @@
++++ src/gtk/newgui/gui_friends.ml 8 Jan 2007 14:07:55 -0000 1.22
+@@ -89,9 +89,7 @@
+ | BlackListedHost -> O.gdk_pix M.o_xpm_blacklistedhost
+
+ let client_pix c =
+- match c.client_files with
+- Some l -> O.gdk_pix M.o_xpm_files_listed
+- | _ -> state_pix c.client_state
++ state_pix c.client_state
+
+
+ let type_pix t =
+@@ -427,7 +425,6 @@
+ client_type = c.gclient_type;
+ client_tags = c.gclient_tags;
+ client_name = c.gclient_name;
+- client_files = c.gclient_files;
+ client_rating = c.gclient_rating;
+ client_chat_port = 0;
+ client_connect_time = c.gclient_connect_time;
+@@ -435,10 +432,13 @@
client_os = None;
client_release = c.gclient_release;
client_emulemod = c.gclient_emulemod;
@@ -4850,8 +7191,18 @@ diff -u -r1.20 -r1.21
+ client_session_uploaded = 0L;
client_upload = c.gclient_upload;
client_sui_verified = None;
++ client_file_queue = [];
(* client_sock_addr = c.gclient_sock_addr;*)
-@@ -457,8 +459,8 @@
+ }
+
+@@ -451,14 +451,14 @@
+ gclient_type = c.client_type;
+ gclient_tags = c.client_tags;
+ gclient_name = c.client_name;
+- gclient_files = c.client_files;
++ gclient_files = None;
+ gclient_rating = c.client_rating;
+ gclient_connect_time = (BasicSocket.last_time () - c.client_connect_time);
gclient_software = c.client_software;
gclient_release = c.client_release;
gclient_emulemod = c.client_emulemod;
@@ -4862,7 +7213,7 @@ diff -u -r1.20 -r1.21
gclient_upload = c.client_upload;
gclient_sock_addr = string_of_kind c.client_kind;
gclient_net_pixmap =
-@@ -494,8 +496,8 @@
+@@ -494,8 +494,8 @@
f.gclient_software <- f_new.client_software;
f.gclient_release <- f_new.client_release;
f.gclient_emulemod <- f_new.client_emulemod;
@@ -4873,7 +7224,15 @@ diff -u -r1.20 -r1.21
f.gclient_upload <- f_new.client_upload;
f.gclient_sock_addr <- string_of_kind f_new.client_kind;
if box_friends_is_visible then self#update_row f row
-@@ -643,8 +645,10 @@
+@@ -635,7 +635,6 @@
+ client_type = c.gclient_type;
+ client_tags = c.gclient_tags;
+ client_name = c.gclient_name;
+- client_files = c.gclient_files;
+ client_rating = c.gclient_rating;
+ client_chat_port = 0;
+ client_connect_time = c.gclient_connect_time;
+@@ -643,10 +642,13 @@
client_os = None;
client_release = c.gclient_release;
client_emulemod = c.gclient_emulemod;
@@ -4885,8 +7244,18 @@ diff -u -r1.20 -r1.21
+ client_session_uploaded = 0L;
client_upload = c.gclient_upload;
client_sui_verified = None;
++ client_file_queue = [];
(* client_sock_addr = string_of_kind c.gclient_kind; *)
-@@ -665,8 +669,8 @@
+ }
+
+@@ -659,14 +661,14 @@
+ gclient_type = c.client_type;
+ gclient_tags = c.client_tags;
+ gclient_name = c.client_name;
+- gclient_files = c.client_files;
++ gclient_files = None;
+ gclient_rating = c.client_rating;
+ gclient_connect_time = (BasicSocket.last_time () - c.client_connect_time);
gclient_software = c.client_software;
gclient_release = c.client_release;
gclient_emulemod = c.client_emulemod;
@@ -4897,7 +7266,7 @@ diff -u -r1.20 -r1.21
gclient_upload = c.client_upload;
gclient_sock_addr = string_of_kind c.client_kind;
gclient_net_pixmap =
-@@ -711,9 +715,9 @@
+@@ -711,9 +713,9 @@
c.gclient_kind <- c_new.client_kind;
c.gclient_tags <- c_new.client_tags;
c.gclient_software <- c_new.client_software;
@@ -4935,24 +7304,45 @@ diff -u -r1.10 -r1.11
| _ -> ()
) tags;
!value
+Index: src/gtk2/gui/guiMain.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/gtk2/gui/guiMain.ml,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- src/gtk2/gui/guiMain.ml 29 Jun 2006 15:56:44 -0000 1.9
++++ src/gtk2/gui/guiMain.ml 8 Jan 2007 14:07:55 -0000 1.10
+@@ -456,6 +456,7 @@
+ | GiftServerStats _ -> assert false
+ | Search s -> ()
+ | Version v -> ()
++ | Stats (_, _) -> ()
+
+ with e ->
+ Printf2.lprintf "Exception %s in reader\n" (Printexc2.to_string e)
Index: src/gtk2/gui/guiMisc.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/gtk2/gui/guiMisc.ml,v
retrieving revision 1.20
-retrieving revision 1.22
-diff -u -r1.20 -r1.22
+retrieving revision 1.24
+diff -u -r1.20 -r1.24
--- src/gtk2/gui/guiMisc.ml 28 Nov 2006 12:58:11 -0000 1.20
-+++ src/gtk2/gui/guiMisc.ml 3 Dec 2006 20:49:42 -0000 1.22
-@@ -1055,7 +1055,7 @@
++++ src/gtk2/gui/guiMisc.ml 8 Jan 2007 14:07:55 -0000 1.24
+@@ -1050,11 +1050,13 @@
+ | Field_Completesources -> "completesources"
+ | Field_Filename -> "filename"
+ | Field_Size -> "size"
++ | Field_Size_Hi -> "size_hi"
+ | Field_Uid -> "uid"
+ | Field_Medialength -> "length"
| Field_Mediacodec -> "codec"
| Field_Lastseencomplete -> "lastseencompl"
| Field_Filerating -> "rating"
-- | Field_UNKNOWN s -> U.simple_utf8_of s
+ | Field_KNOWN s -> U.simple_utf8_of s
+ | Field_UNKNOWN s -> U.simple_utf8_of s
let tags_to_string tags =
- let s = ref "" in
-@@ -1276,8 +1276,8 @@
+@@ -1276,8 +1278,8 @@
source_connect_time = BasicSocket.last_time () - c.client_connect_time;
source_last_seen = BasicSocket.current_time ();
source_software = concat_strings c.client_software (concat_strings c.client_emulemod c.client_release);
@@ -5014,11 +7404,41 @@ Index: src/networks/bittorrent/bTInteractive.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/bittorrent/bTInteractive.ml,v
retrieving revision 1.123
-retrieving revision 1.125
-diff -u -r1.123 -r1.125
+retrieving revision 1.127
+diff -u -r1.123 -r1.127
--- src/networks/bittorrent/bTInteractive.ml 12 Nov 2006 14:17:45 -0000 1.123
-+++ src/networks/bittorrent/bTInteractive.ml 3 Dec 2006 20:57:56 -0000 1.125
-@@ -406,8 +406,10 @@
++++ src/networks/bittorrent/bTInteractive.ml 4 Feb 2007 17:22:18 -0000 1.127
+@@ -171,18 +171,21 @@
+ Printf.bprintf buf "\\</tr\\>\\<tr class=\\\"dl-%d\\\"\\>" (html_mods_cntr ());
+ let tracker_header_printed = ref false in
+ List.iter (fun tracker ->
+- let tracker_text, tracker_error =
+- (match tracker.tracker_status with
+- Disabled s | Disabled_mld s | Disabled_failure s ->
+- Printf.sprintf "disabled: %s" tracker.tracker_url, s
+- | _ -> tracker.tracker_url, "")
++ let tracker_text =
++ match tracker.tracker_status with
++ | Disabled s | Disabled_mld s | Disabled_failure s ->
++ Printf.sprintf "\\<font color=\\\"red\\\"\\>disabled: %s\\<br\\>\\--error: %s\\</font\\>" tracker.tracker_url s
++ | _ ->
++ Printf.sprintf "enabled: %s" tracker.tracker_url
++
+ in
+ html_mods_td buf [
+ (if not !tracker_header_printed then
+- ("Tracker(s) (mouseover for errors)", "sr br", "Tracker(s)")
++ ("Tracker(s)", "sr br", "Tracker(s)")
+ else
+- ("", "sr br", ""));
+- (tracker_error, "sr", tracker_text)];
++ ("", "sr br", "")
++ );
++ (tracker.tracker_url, "sr", tracker_text)];
+ Printf.bprintf buf "\\</tr\\>\\<tr class=\\\"dl-%d\\\"\\>" (html_mods_cntr ());
+ tracker_header_printed := true;
+ ) file.file_trackers;
+@@ -406,8 +409,10 @@
( "0", "srh", "IP address", "IP address" ) ;
( "0", "srh br ar", "Port", "Port" ) ;
] @ (if !Geoip.active then [( "0", "srh br ar", "Country Code/Name", "CC" )] else []) @ [
@@ -5031,7 +7451,7 @@ diff -u -r1.123 -r1.125
( "0", "srh ar", "Interested [T]rue, [F]alse", "I" ) ;
( "0", "srh ar", "Choked [T]rue, [F]alse", "C" ) ;
( "1", "srh br ar", "Allowed to write", "A" ) ;
-@@ -458,8 +460,10 @@
+@@ -458,8 +463,10 @@
("", "sr", (Ip.to_string (fst c.client_host)));
("", "sr br ar", Printf.sprintf "%d" (snd c.client_host));
] @ (if !Geoip.active then [( cn, "sr br", cc)] else []) @ [
@@ -5044,7 +7464,7 @@ diff -u -r1.123 -r1.125
("", "sr", (btos c.client_interested));
("", "sr", (btos c.client_choked));
("", "sr br ar", (Int64.to_string c.client_allowed_to_write));
-@@ -880,8 +884,10 @@
+@@ -880,8 +887,10 @@
P.client_name = (Printf.sprintf "%s:%d" (Ip.to_string ip) port);
P.client_software = (brand_to_string c.client_brand);
P.client_release = c.client_release;
@@ -5057,7 +7477,7 @@ diff -u -r1.123 -r1.125
P.client_upload = Some (c.client_file.file_name);
P.client_connect_time = c.client_connect_time;
-@@ -906,11 +912,11 @@
+@@ -906,11 +915,11 @@
let cc = as_client c in
client_print cc o;
Printf.bprintf buf (_b "\n%18sDown : %-10s Uploaded: %-10s Ratio: %s%1.1f (%s)\n") ""
@@ -5074,7 +7494,7 @@ diff -u -r1.123 -r1.125
else 1.)
("BT");
(Printf.bprintf buf (_b "%18sFile : %s\n") "" info.GuiTypes.file_name)
-@@ -948,8 +954,10 @@
+@@ -948,8 +957,10 @@
("", "sr", "N");
("", "sr", (Ip.to_string (fst c.client_host)));
] @ (if !Geoip.active then [(cn, "sr", cc)] else []) @ [
@@ -5087,7 +7507,16 @@ diff -u -r1.123 -r1.125
("", "sr", info.GuiTypes.file_name); ]);
true
-@@ -1263,6 +1271,9 @@
+@@ -1047,7 +1058,7 @@
+ ) !current_files;
+ _s "done"
+ end else
+- begin print_command_result o o.conn_buf "You are not allowed to use seeded_torrents";
++ begin print_command_result o "You are not allowed to use seeded_torrents";
+ "" end
+ ), _s ":\t\t\tprint all seeded .torrent files on this server";
+
+@@ -1263,6 +1274,9 @@
CommonNetwork.register_commands commands;
@@ -5097,6 +7526,38 @@ diff -u -r1.123 -r1.125
shared_ops.op_shared_unshare <- (fun file ->
(if !verbose_share then lprintf_file_nl (as_file file) "unshare file");
BTGlobals.unshare_file file);
+Index: src/networks/bittorrent/bTOptions.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/bittorrent/bTOptions.ml,v
+retrieving revision 1.30
+retrieving revision 1.31
+diff -u -r1.30 -r1.31
+--- src/networks/bittorrent/bTOptions.ml 21 Aug 2006 18:30:15 -0000 1.30
++++ src/networks/bittorrent/bTOptions.ml 15 Jan 2007 18:26:27 -0000 1.31
+@@ -26,6 +26,7 @@
+ let bittorrent_section = file_section bittorrent_ini ["Bittorrent"] "Bittorrent options"
+
+ let client_port = define_option bittorrent_section ["client_port"]
++ ~restart: true
+ "The port to bind the client to"
+ int_option 6882
+
+@@ -99,6 +100,7 @@
+ int_option (-1)
+
+ let import_new_torrents_interval = define_option bittorrent_section ["import_new_torrents_interval"]
++ ~restart: true
+ "Interval in seconds 'torrents/incoming' is scanned for new torrent files to be downloaded,
+ 0 to deactivate, changes require restart"
+ float_option 60.
+@@ -130,6 +132,7 @@
+ string_option "default"
+
+ let options_version = define_option bittorrent_section ["options_version"]
++ ~internal: true
+ "(internal option)"
+ int_option 0
+
Index: src/networks/bittorrent/bTStats.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/bittorrent/bTStats.ml,v
@@ -5125,6 +7586,22 @@ diff -u -r1.8 -r1.9
bt_upload_counter := !bt_upload_counter ++ v;
global_count_upload network v
+Index: src/networks/bittorrent/bTTracker.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/bittorrent/bTTracker.ml,v
+retrieving revision 1.25
+retrieving revision 1.26
+diff -u -r1.25 -r1.26
+--- src/networks/bittorrent/bTTracker.ml 27 Jul 2006 21:45:05 -0000 1.25
++++ src/networks/bittorrent/bTTracker.ml 15 Jan 2007 18:26:27 -0000 1.26
+@@ -96,6 +96,7 @@
+ let ntracked_files = ref 0
+
+ let tracker_port = define_option bittorrent_section ["tracker_port"]
++ ~restart: true
+ "The port to bind the tracker to"
+ int_option 6881
+
Index: src/networks/bittorrent/bTTypes.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/bittorrent/bTTypes.ml,v
@@ -5171,14 +7648,38 @@ diff -u -r1.28 -r1.29
else list
);
+Index: src/networks/direct_connect/dcOptions.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/direct_connect/dcOptions.ml,v
+retrieving revision 1.7
+retrieving revision 1.8
+diff -u -r1.7 -r1.8
+--- src/networks/direct_connect/dcOptions.ml 5 Nov 2005 16:23:40 -0000 1.7
++++ src/networks/direct_connect/dcOptions.ml 15 Jan 2007 18:26:27 -0000 1.8
+@@ -57,6 +57,7 @@
+
+
+ let dc_port = define_option directconnect_section ["client_port"]
++ ~restart: true
+ "The port to bind the client to"
+ int_option 4444
+
+@@ -88,6 +89,7 @@
+ string_option "Pk=mldc"
+
+ let options_version = define_option directconnect_section ["options_version"]
++ ~internal: true
+ "(internal option)"
+ int_option 0
+
Index: src/networks/donkey/donkeyClient.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyClient.ml,v
retrieving revision 1.110
-retrieving revision 1.114
-diff -u -r1.110 -r1.114
+retrieving revision 1.121
+diff -u -r1.110 -r1.121
--- src/networks/donkey/donkeyClient.ml 26 Nov 2006 16:36:29 -0000 1.110
-+++ src/networks/donkey/donkeyClient.ml 3 Dec 2006 20:49:42 -0000 1.114
++++ src/networks/donkey/donkeyClient.ml 15 Jan 2007 21:32:56 -0000 1.121
@@ -68,40 +68,43 @@
(*************************************************************************)
(* adding a source to the source-management *)
@@ -5256,7 +7757,16 @@ diff -u -r1.110 -r1.114
let is_banned c sock =
c.client_banned <- Hashtbl.mem banned_ips (fst (peer_addr sock))
-@@ -245,18 +248,22 @@
+@@ -112,7 +115,7 @@
+ match cb with
+ Brand_lmule | Brand_newemule | Brand_cdonkey |
+ Brand_emuleplus | Brand_hydranode | Brand_mldonkey3 |
+- Brand_shareaza | Brand_amule | Brand_lphant | Brand_verycd -> true
++ Brand_shareaza | Brand_amule | Brand_lphant | Brand_verycd | Brand_imp -> true
+ | _ -> false
+
+ let ban_client c sock msg =
+@@ -245,20 +248,7 @@
c.client_source.DonkeySources.source_sock <- NoConnection
| Connection sock ->
(try
@@ -5269,27 +7779,105 @@ diff -u -r1.110 -r1.114
- Printf.sprintf ", send %s" (size_of_int64 cc.client_uploaded) else "")
- (if cc.client_downloaded > 0L then
- Printf.sprintf ", rec %s" (size_of_int64 cc.client_downloaded) else "")
-+ let log_print cc = lprintf_nl "Client[%d] %s disconnected, connected %s%s%s"
-+ (client_num c) (full_client_identifier c)
-+ (Date.time_to_string (last_time () - c.client_connect_time) "verbose")
-+ (if c.client_total_uploaded > 0L then
-+ Printf.sprintf ", send %s (%s)%s"
-+ (size_of_int64 c.client_session_uploaded)
-+ (size_of_int64 c.client_total_uploaded)
-+ (match client_upload (as_client c) with | None -> ""
-+ | Some f -> " of " ^ (CommonFile.file_best_name f)) else "")
-+ (if c.client_total_downloaded > 0L then
-+ Printf.sprintf ", rec %s (%s)"
-+ (size_of_int64 c.client_session_downloaded)
-+ (size_of_int64 c.client_total_downloaded) else "")
- in
- if c.client_debug ||
+- in
+- if c.client_debug ||
- (!verbose && (c.client_uploaded > 0L || c.client_downloaded > 0L)) then
-+ (!verbose && (c.client_session_uploaded > 0L || c.client_session_downloaded > 0L)) then
- log_print c;
-
+- log_print c;
+-
++ DonkeyOneFile.remove_client_slot c;
c.client_comp <- None;
-@@ -599,7 +606,7 @@
+ (try if c.client_checked then count_seen c with _ -> ());
+ (try if !!log_clients_on_console && c.client_name <> "" then
+@@ -266,43 +256,34 @@
+ c.client_connect_time <- 0;
+ (try Hashtbl.remove connected_clients c.client_md4 with _ -> ());
+ (try CommonUploads.remove_pending_slot (as_client c) with _ -> ());
+- set_client_has_a_slot (as_client c) NoSlot;
+-(* connection_failed c.client_connection_control; *)
+ (try TcpBufferedSocket.close sock reason with _ -> ());
+
+ (* Remove the Connected and NoLimit tags *)
+ set_client_type c (client_type c
+ land (lnot (client_initialized_tag lor client_nolimit_tag)));
+-(* c.client_chunks <- [||];*)
+ c.client_source.DonkeySources.source_sock <- NoConnection;
+ save_join_queue c;
+ c.client_slot <- SlotNotAsked;
+- let files = c.client_file_queue in
+
+- (try DonkeyOneFile.clean_current_download c with _ -> ());
++(* clean_client_zones: clean all structures related to downloads when
++ a client disconnects *)
++ (try
++ match c.client_download with
++ | None -> ()
++ | Some (file, up) ->
++ CommonSwarming.unregister_uploader up;
++ c.client_download <- None
++ with _ -> ());
+
+ List.iter (fun (file, chunks, up) ->
+ try CommonSwarming.unregister_uploader up with _ -> ()
+- )
+- files;
++ ) c.client_file_queue;
++
+ c.client_file_queue <- [];
+- if c.client_upload != None then CommonUploads.refill_upload_slots ();
++ c.client_session_downloaded <- 0L;
+
+ with e -> lprintf_nl "Exception %s in disconnect_client"
+ (Printexc2.to_string e));
+-(* lprintf "Client %d to source:" (client_num c);
+- List.iter (fun r ->
+- lprint_char (
+- match r.request_result with
+- | File_chunk -> 'C'
+- | File_upload -> 'U'
+- | File_not_found -> '-'
+- | File_found -> '+'
+- | File_possible -> '?'
+- | File_expected -> '!'
+- | File_new_source -> 'n'
+- )) c.client_files;
+- lprintf "\n"; *)
+ set_client_disconnected c reason;
+ DonkeySources.source_disconnected c.client_source
+
+@@ -441,16 +422,24 @@
+
+
+ let new_chunk up begin_pos end_pos =
+- if begin_pos <> end_pos then
+- let pair = (begin_pos, end_pos) in
+- (match up.up_chunks with
+- [] ->
++ let req_size = end_pos -- begin_pos in
++ let req_location = (begin_pos ++ end_pos) // (2L ** block_size) in
++ if !verbose_upload then
++ lprintf_nl "new block: (%Ld,%Ld) size %Ld chunk #%Ld" begin_pos end_pos req_size req_location;
++ if (req_size < Int64.zero) || (req_size > zone_size) || ((up.up_current <> req_location) && (req_size <> Int64.zero)) then
++ up.up_finish <- true;
++ if ((not up.up_finish) || (not !!upload_complete_chunks)) && (req_size > Int64.zero) && (req_size <= zone_size) then
++ let chunk = (begin_pos, end_pos) in
++ (* the zone requested is already "in the pipe" *)
++ if not (List.mem chunk up.up_flying_chunks) then
++ match up.up_chunks with
++ | [] ->
+ up.up_pos <- begin_pos;
+ up.up_end_chunk <- end_pos;
+- up.up_chunks <- [pair];
+- | chunks ->
+- if not (List.mem pair chunks) then
+- up.up_chunks <- chunks @ [pair])
++ up.up_chunks <- [chunk];
++ | up_chunks ->
++ if not (List.mem chunk up_chunks) then
++ up.up_chunks <- up_chunks @ [chunk]
+
+ let identify_client_brand c =
+ if c.client_brand = Brand_unknown then
+@@ -599,7 +588,7 @@
List.iter (fun tag ->
let s = to_lowercase (string_of_tag_value tag.tag_value) in
match tag.tag_name with
@@ -5298,7 +7886,15 @@ diff -u -r1.110 -r1.114
begin
let rec iter i len =
if i < len then
-@@ -661,33 +668,40 @@
+@@ -647,6 +636,7 @@
+ | 6 -> Brand_hydranode
+ | 10 -> Brand_mldonkey3
+ | 20 -> Brand_lphant
++ | 60 -> Brand_imp
+ | 240 -> Brand_verycd
+ | _ -> Brand_unknown
+
+@@ -661,33 +651,42 @@
iter 0 (Array.length mod_array)
let update_client_from_tags c tags =
@@ -5317,6 +7913,7 @@ diff -u -r1.110 -r1.114
)
- | Field_UNKNOWN "emule_miscoptions1" ->
+ | Field_KNOWN "emule_miscoptions1" ->
++ c.client_emule_proto.received_miscoptions1 <- true;
for_int64_tag tag (fun i ->
- DonkeyProtoClient.update_emule_proto_from_miscoptions1
- c.client_emule_proto i
@@ -5329,6 +7926,7 @@ diff -u -r1.110 -r1.114
)
- | Field_UNKNOWN "emule_miscoptions2" ->
+ | Field_KNOWN "emule_miscoptions2" ->
++ c.client_emule_proto.received_miscoptions2 <- true;
for_int64_tag tag (fun i ->
- DonkeyProtoClient.update_emule_proto_from_miscoptions2
- c.client_emule_proto i
@@ -5351,7 +7949,7 @@ diff -u -r1.110 -r1.114
for_int_tag tag (fun i ->
c.client_emule_proto.emule_version <- i;
let compatibleclient = (i lsr 24) in
-@@ -697,60 +711,62 @@
+@@ -697,60 +696,62 @@
if c.client_brand = Brand_unknown then
lprintf_nl "[emule_version] Brand_unknown %s" (full_client_identifier c);
)
@@ -5433,7 +8031,7 @@ diff -u -r1.110 -r1.114
) tags
let fight_disguised_mods c =
-@@ -771,7 +787,7 @@
+@@ -771,7 +772,7 @@
emule_info with
DonkeyProtoClient.EmuleClientInfo.protversion = 255;
DonkeyProtoClient.EmuleClientInfo.tags = [
@@ -5442,7 +8040,16 @@ diff -u -r1.110 -r1.114
]} in
client_send c (DonkeyProtoClient.EmuleClientInfoReq emule_osinfo);
c.client_osinfo_sent <- true
-@@ -1160,7 +1176,7 @@
+@@ -1128,7 +1129,7 @@
+ let module M = DonkeyProtoClient in
+
+ if !verbose_msg_clients || c.client_debug then begin
+- lprintf_nl "Message from %s" (string_of_client c);
++ lprintf_nl "Message from %s" (full_client_identifier c);
+ M.print t;
+ end;
+
+@@ -1160,7 +1161,7 @@
List.iter (fun tag ->
match tag with
@@ -5451,12 +8058,93 @@ diff -u -r1.110 -r1.114
set_client_name c s t.CR.md4
| _ -> ()
) c.client_tags;
-@@ -2018,13 +2034,13 @@
+@@ -1401,7 +1402,7 @@
+ | Some f -> CommonFile.file_best_name f);
+ (* end *)
+
+- | M.CloseSlotReq _ ->
++ | M.OutOfPartsReq _ ->
+ set_client_state c (Connected 0);
begin
+ match c.client_download with
+@@ -1411,7 +1412,7 @@
+ lprintf_nl "Slot closed during download";
+ CommonSwarming.clear_uploader_ranges up
+ end;
+-(* DonkeyOneFile.clean_current_download c; *)
++ c.client_session_downloaded <- 0L;
+ c.client_slot <- SlotNotAsked;
+ (* OK, the slot is closed, but what should we do now ????? *)
+ begin
+@@ -1419,7 +1420,7 @@
+ [] -> ()
+ | _ ->
+ if !verbose_download then
+- lprintf_nl "CloseSlotReq";
++ lprintf_nl "OutOfPartsReq";
+ DonkeyOneFile.request_slot c;
+ set_rtimeout sock !!queued_timeout;
+ end
+@@ -1560,8 +1561,7 @@
+ (* if file.file_exists then verify_chunks file *)
+ end
+
+-
+- | M.EmuleCompressedPart (md4, statpos, newsize, bloc) ->
++ | M.EmuleCompressedPart t ->
+
+ set_lifetime sock active_lifetime;
+ if !!reliable_sources &&
+@@ -1572,12 +1572,13 @@
+ raise Not_found
+ end;
+
++ let module Q = M.EmuleCompressedPart in
+ let comp = match c.client_comp with
+ None ->
+ let comp = {
+- comp_md4 = md4;
+- comp_pos = statpos;
+- comp_total = Int64.to_int newsize;
++ comp_md4 = t.Q.md4;
++ comp_pos = t.Q.statpos;
++ comp_total = Int64.to_int t.Q.newsize;
+ comp_len = 0;
+ comp_blocs = [];
+ } in
+@@ -1585,8 +1586,8 @@
+ comp
+ | Some comp -> comp
+ in
+- comp.comp_blocs <- bloc :: comp.comp_blocs;
+- comp.comp_len <- comp.comp_len + String.length bloc;
++ comp.comp_blocs <- t.Q.bloc :: comp.comp_blocs;
++ comp.comp_len <- comp.comp_len + String.length t.Q.bloc;
+
+ (* lprintf "Comp bloc: %d/%d\n" comp.comp_len comp.comp_total; *)
+ if comp.comp_len = comp.comp_total then begin
+@@ -2008,44 +2009,65 @@
+ | M.QueryBlocReq t when !CommonUploads.has_upload = 0 &&
+ client_has_a_slot (as_client c) ->
+
+- if !verbose_upload then
+- lprintf_nl "donkeyClient: uploader %s ask for block" (full_client_identifier c);
+-
+ let module Q = M.QueryBloc in
+- let file = find_file t.Q.md4 in
++ let file = find_file t.Q.md4 in
++
++ if !verbose_upload then lprintf_nl "donkeyClient: uploader %s asks for %s"
++ (full_client_identifier c) (file_best_name file);
++
+ let prio = (file_priority file) in
+ let client_upload_lifetime = ref ((max 0 !!upload_lifetime) * 60) in
+- begin
- if !!dynamic_upload_lifetime
+- if !!dynamic_upload_lifetime
- && c.client_uploaded > c.client_downloaded
- && c.client_uploaded > Int64.of_int !!dynamic_upload_threshold ** zone_size
++ if !!dynamic_upload_lifetime && not !!upload_complete_chunks
+ && c.client_session_uploaded > c.client_session_downloaded
+ && c.client_session_uploaded > Int64.of_int !!dynamic_upload_threshold ** zone_size
then
@@ -5464,11 +8152,110 @@ diff -u -r1.110 -r1.114
Int64.to_int
(Int64.of_int !client_upload_lifetime
- ** c.client_downloaded // c.client_uploaded);
+- if last_time() > c.client_connect_time +
+- !client_upload_lifetime + 5 * prio then
+- begin
+ ** c.client_session_downloaded // c.client_session_uploaded);
- if last_time() > c.client_connect_time +
- !client_upload_lifetime + 5 * prio then
- begin
-@@ -2193,7 +2209,7 @@
+
+-(* And what happens if we were downloading from this client also ? *)
+-
+- disconnect_client c (Closed_for_error "Upload lifetime expired");
++ let client_received_enough c =
++ if !!upload_full_chunks && not !!upload_complete_chunks then
++ c.client_session_uploaded > (block_size ++ 20L ** 1024L)
++ else
++ last_time() > c.client_connect_time + !client_upload_lifetime + 5 * prio
++ in
++
++ begin
++ if client_received_enough c then
++ if Intmap.length !CommonUploads.pending_slots_map = 0 then
++ begin
++ if !verbose_upload then lprintf_nl
++ "donkeyClient: not closing upload slot of %s (%s), pending slots empty, sending next block..."
++ (full_client_identifier c) (file_best_name file)
++ end
++ else begin
++ DonkeyOneFile.remove_client_slot c;
+ raise Not_found
+ end;
+-
++
+ set_lifetime sock active_lifetime;
+ set_rtimeout sock !!upload_timeout;
+-
++
+ let up, waiting = match c.client_upload with
+- Some ({ up_file = f } as up) when f == file -> up, up.up_waiting
++ | Some ({ up_file = f } as up) when f == file ->
++ (* zones are received in the order they're sent, so we
++ know that the oldest of the zones "in fly" must have
++ been received when this QueryBlockReq was sent *)
++ (match up.up_flying_chunks with
++ | [] -> ()
++ | _ :: q -> up.up_flying_chunks <- q);
++ up, up.up_waiting
+ | Some old_up ->
+ {
+ up_file = file;
+ up_pos = Int64.zero;
+ up_end_chunk = Int64.zero;
+ up_chunks = [];
++ up_flying_chunks = [];
++ up_current = Int64.zero;
++ up_finish = true;
+ up_waiting = old_up.up_waiting;
+ }, old_up.up_waiting
+ | _ ->
+@@ -2054,18 +2076,31 @@
+ up_pos = Int64.zero;
+ up_end_chunk = Int64.zero;
+ up_chunks = [];
++ up_flying_chunks = [];
++ up_current = ((t.Q.start_pos1 ++ t.Q.end_pos1) // (2L ** block_size));
++ up_finish = false;
+ up_waiting = false;
+ }, false
+ in
+ new_chunk up t.Q.start_pos1 t.Q.end_pos1;
+ new_chunk up t.Q.start_pos2 t.Q.end_pos2;
+ new_chunk up t.Q.start_pos3 t.Q.end_pos3;
++ (match up.up_chunks with
++ [] ->
++(* it should never happen here, that a client with up.up_finish = false
++ has an empty block queue *)
++ if up.up_finish && !!upload_complete_chunks then
++ begin
++ DonkeyOneFile.remove_client_slot c;
++ raise Not_found
++ end;
++ | chunks ->
+ c.client_upload <- Some up;
+ set_client_upload (as_client c) (as_file file);
+ if not waiting && !CommonUploads.has_upload = 0 then begin
+ CommonUploads.ready_for_upload (as_client c);
+ up.up_waiting <- true
+- end
++ end)
+ end;
+ if !verbose_upload then lprintf_nl "QueryBloc treated"
+
+@@ -2141,12 +2176,12 @@
+ let init_client sock c =
+ set_handler sock WRITE_DONE (fun s ->
+ match c.client_upload with
+- None -> ()
+- | Some up ->
++ | Some ({ up_chunks = _ :: _ } as up) ->
+ if not up.up_waiting && !CommonUploads.has_upload = 0 then begin
+ up.up_waiting <- true;
+ CommonUploads.ready_for_upload (as_client c)
+ end
++ | _ -> ()
+ );
+ (*
+ set_handler sock (BASIC_EVENT RTIMEOUT) (fun s ->
+@@ -2193,7 +2228,7 @@
let name = ref "" in
List.iter (fun tag ->
match tag with
@@ -5477,15 +8264,305 @@ diff -u -r1.110 -r1.114
| _ -> ()
) t.CR.tags;
+Index: src/networks/donkey/donkeyComplexOptions.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyComplexOptions.ml,v
+retrieving revision 1.61
+retrieving revision 1.62
+diff -u -r1.61 -r1.62
+--- src/networks/donkey/donkeyComplexOptions.ml 28 Nov 2006 11:56:12 -0000 1.61
++++ src/networks/donkey/donkeyComplexOptions.ml 6 Jan 2007 18:15:17 -0000 1.62
+@@ -559,6 +559,8 @@
+ r.result_size <- v;
+ | { tag_name = Field_Size; tag_value = (Uint16 v| Uint8 v) } ->
+ r.result_size <- Int64.of_int v;
++ | { tag_name = Field_Size_Hi; tag_value = Uint8 v } ->
++ r.result_size <- Int64.logor r.result_size (Int64.shift_left (Int64.of_int v) 32);
+ | { tag_name = Field_Format; tag_value = String s } ->
+ r.result_tags <- tag :: r.result_tags;
+ r.result_format <- s
+Index: src/networks/donkey/donkeyFiles.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyFiles.ml,v
+retrieving revision 1.22
+retrieving revision 1.27
+diff -u -r1.22 -r1.27
+--- src/networks/donkey/donkeyFiles.ml 21 Nov 2006 22:34:33 -0000 1.22
++++ src/networks/donkey/donkeyFiles.ml 15 Jan 2007 18:28:03 -0000 1.27
+@@ -61,6 +61,51 @@
+ where nseconds = Fifo.length upload_clients
+
+ *)
++exception Cache_table_hit of string * string
++type cache_entry = {
++ md4 : Md4.t;
++ begin_offset : int64;
++ end_offset : int64;
++ cached_part : string;
++ comp_part : string
++ }
++let cache_table_index = ref 0
++let cache_table_size = !!upload_compression_table_size
++let ( cache_table : cache_entry Weak.t ) = Weak.create cache_table_size
++let cached_load file begin_offset end_offset compress=
++ try
++ for i = 0 to cache_table_size-1 do
++ match Weak.get cache_table i with
++ Some ({md4=md4;begin_offset=bo;end_offset=eo;cached_part=cached_file;comp_part=cached_comp}) when (md4 = file.file_md4) && (bo=begin_offset) && (eo=end_offset) ->
++ if !verbose_upload then
++ lprintf_nl "Cache Hit for %s (%Ld,%Ld)" (file_best_name file) begin_offset end_offset;
++ if (compress && (String.length cached_comp > 0)) || not compress then raise (Cache_table_hit(cached_file,cached_comp))
++ | _ -> ()
++ done;
++ let entry_length = Int64.to_int(end_offset -- begin_offset) in
++ let cached_file = String.create entry_length in
++ Unix32.read (file_fd file) begin_offset cached_file 0 entry_length;
++ let cached_comp = if compress then
++ Zlib.compress_string ~level:!!upload_compression_level cached_file
++ else
++ ""
++ in
++ cache_table_index := (!cache_table_index + 1) mod cache_table_size;
++ let (entry : cache_entry)={
++ md4=file.file_md4;
++ begin_offset=begin_offset;
++ end_offset=end_offset;
++ cached_part=cached_file;
++ comp_part=cached_comp} in
++ Weak.set cache_table !cache_table_index (Some entry);
++ if !verbose_upload then
++ lprintf_nl "Cache Miss for %s (%Ld,%Ld) orig.len %d comp.len %d" (file_best_name file) begin_offset end_offset (String.length cached_file) (String.length cached_comp);
++ Some (cached_file,cached_comp)
++ with
++ | Cache_table_hit (cached_file,cached_comp) -> Some (cached_file,cached_comp)
++ | End_of_file -> if !verbose then lprintf_nl
++ "End_of_file in cached_load file %s size %Ld begin %Ld end %Ld" (file_best_name file) (file_size file) begin_offset end_offset; None
++
+
+ module NewUpload = struct
+
+@@ -74,14 +119,12 @@
+ M.CloseSlotReq Q.t)
+ *)
+
+- let rec send_small_block c sock file begin_pos len_int =
+-(* lprintf "send_small_block %d\n" len_int; *)
+-(* let len_int = Int32.to_int len in *)
++ let rec send_small_block_plain c sock file begin_offset cfile pos len_int sixtyfour =
+ try
+ if !verbose_upload then
+- lprintf_nl "Sending %s to %s, begin %Ld len %d"
++ lprintf_nl "Sending plain %s to %s, begin_offset %Ld pos %d len %d"
+ (file_best_name file) (full_client_identifier c)
+- (begin_pos) (len_int);
++ (begin_offset) (pos) (len_int);
+
+ let msg =
+ (
+@@ -89,8 +132,9 @@
+ let module B = M.Bloc in
+ M.BlocReq {
+ B.md4 = file.file_md4;
+- B.start_pos = begin_pos;
+- B.end_pos = begin_pos ++ (Int64.of_int len_int);
++ B.usesixtyfour = sixtyfour;
++ B.start_pos = begin_offset ++ (Int64.of_int pos);
++ B.end_pos = begin_offset ++ (Int64.of_int(pos + len_int));
+ B.bloc_str = "";
+ B.bloc_begin = 0;
+ B.bloc_len = 0;
+@@ -101,7 +145,7 @@
+ let upload_buffer = String.create (slen + len_int) in
+ String.blit s 0 upload_buffer 0 slen;
+ DonkeyProtoCom.new_string msg upload_buffer;
+- Unix32.read (file_fd file) begin_pos upload_buffer slen len_int;
++ String.blit cfile pos upload_buffer slen len_int;
+ let uploaded = Int64.of_int len_int in
+ count_upload c uploaded;
+ CommonUploads.consume_bandwidth len_int;
+@@ -114,36 +158,95 @@
+ write_string sock upload_buffer;
+ check_end_upload c sock
+ with
+- End_of_file -> lprintf_nl "Can not send file %s to %s, file removed?"
++ | e -> if !verbose then lprintf_nl
++ "Exception %s in send_small_block_plain" (Printexc2.to_string e)
++
++ let rec send_small_block_compressed c sock file begin_offset ccomp pos len_int pay_len sixtyfour =
++ try
++ if !verbose_upload then
++ lprintf_nl "Sending compressed %s to %s, begin_offset %Ld pos %d len %d"
+ (file_best_name file) (full_client_identifier c)
++ (begin_offset) (pos) (len_int);
++
++ let msg =
++ (
++ let module M = DonkeyProtoClient in
++ let module B = M.EmuleCompressedPart in
++ M.EmuleCompressedPart {
++ B.md4 = file.file_md4;
++ B.usesixtyfour = sixtyfour;
++ B.statpos = begin_offset;
++ B.newsize = Int64.of_int pay_len;
++ B.bloc = "";
++ }
++ ) in
++ let s = client_msg_to_string c.client_emule_proto msg in
++ let slen = String.length s in
++ let upload_buffer = String.create (slen + len_int) in
++ String.blit s 0 upload_buffer 0 slen;
++ DonkeyProtoCom.new_string msg upload_buffer;
++ String.blit ccomp pos upload_buffer slen len_int;
++ CommonUploads.consume_bandwidth len_int;
++
++ write_string sock upload_buffer;
++ check_end_upload c sock
++ with
+ | e -> if !verbose then lprintf_nl
+- "Exception %s in send_small_block" (Printexc2.to_string e)
++ "Exception %s in send_small_block_compressed" (Printexc2.to_string e)
+
+ let rec send_client_block c sock per_client =
+-(* lprintf "send_client_block\n"; *)
++ try
+ if per_client > 0 && CommonUploads.can_write_len sock max_msg_size then
+ match c.client_upload with
+- | Some ({ up_chunks = _ :: chunks } as up) ->
+- if up.up_file.file_shared = None then begin
++ | Some ({ up_chunks = (begin_offset,end_offset) :: chunks } as up) ->
++ if file_is_largefile up.up_file && c.client_emule_proto.emule_largefiles <> 1 then begin
++ DonkeyOneFile.remove_client_slot c;
++ lprintf_nl "File %s is too large for %s." (file_best_name up.up_file) (full_client_identifier c);
++ end else
++ if up.up_file.file_shared = None then
+ (* Is there a message to warn that a file is not shared anymore ? *)
+- c.client_upload <- None;
+- end else
+- let max_len = up.up_end_chunk -- up.up_pos in
+- let max_len = Int64.to_int max_len in
+- let msg_block_size_int = min msg_block_size_int per_client in
+- if max_len <= msg_block_size_int then
++ DonkeyOneFile.remove_client_slot c
++ else
++ let compress = !!upload_compression && (c.client_emule_proto.emule_compression <> 0) in
++ let cfile,ccomp = match cached_load up.up_file begin_offset end_offset compress with
++ Some (cached_file,cached_comp) -> cached_file,cached_comp
++ | _ -> "",""
++ in
++ let compressed = compress && ((String.length ccomp) + !!upload_compression_threshold < (String.length cfile)) in
++ let pay_len = if compressed then (String.length ccomp) else (String.length cfile) in
++ let pos = Int64.to_int (up.up_pos -- begin_offset) in
++ let max_len = pay_len - pos in
++ let allowed_msg_block_size_int = min msg_block_size_int per_client in
++ let sixtyfour = end_offset >= old_max_emule_file_size in
++ if max_len <= allowed_msg_block_size_int then
+ (* last block from chunk *)
+ begin
++ if compressed then
++ begin
++ send_small_block_compressed c sock up.up_file begin_offset ccomp pos max_len pay_len sixtyfour;
++ let uploaded = end_offset -- begin_offset in
++ count_upload c uploaded;
++ (match up.up_file.file_shared with None -> ()
++ | Some impl ->
++ shared_must_update_downloaded (as_shared impl);
++ impl.impl_shared_uploaded <-
++ impl.impl_shared_uploaded ++ uploaded)
++ end
++ else
++ send_small_block_plain c sock up.up_file begin_offset cfile pos max_len sixtyfour
++ ;
+ if !verbose_upload then
+- lprintf_nl "End of chunk (%d) %Ld %s" max_len up.up_end_chunk (file_best_name up.up_file);
+- send_small_block c sock up.up_file up.up_pos max_len;
++ lprintf_nl "End of chunk %Ld %Ld %s" begin_offset end_offset (file_best_name up.up_file);
++ up.up_flying_chunks <- up.up_flying_chunks @ [(begin_offset,end_offset)];
+ up.up_chunks <- chunks;
+ let per_client = per_client - max_len in
+ match chunks with
+- [] ->
++ | [] ->
+ if !verbose_upload then
+- lprintf_nl "NO CHUNKS";
+- c.client_upload <- None;
++ lprintf_nl "NO MORE CHUNKS";
++ up.up_waiting <- false;
++ if up.up_finish && !!upload_complete_chunks then
++ DonkeyOneFile.remove_client_slot c;
+ | (begin_pos, end_pos) :: _ ->
+ up.up_pos <- begin_pos;
+ up.up_end_chunk <- end_pos;
+@@ -151,14 +254,25 @@
+ end
+ else
+ (* small block from chunk *)
++ if allowed_msg_block_size_int >= msg_block_size_int then
++ begin
++ if compressed then
+ begin
+- send_small_block c sock up.up_file up.up_pos
+- msg_block_size_int;
++ send_small_block_compressed c sock up.up_file begin_offset ccomp pos msg_block_size_int pay_len sixtyfour;
++ end
++ else
++ begin
++ send_small_block_plain c sock up.up_file begin_offset cfile pos msg_block_size_int sixtyfour;
++ end
++ ;
+ up.up_pos <- up.up_pos ++ (Int64.of_int msg_block_size_int);
+ let per_client = per_client-msg_block_size_int in
+ send_client_block c sock per_client
+ end
+ | _ -> ()
++ with
++ | e -> if !verbose then lprintf_nl
++ "Exception %s in send_client_block" (Printexc2.to_string e)
+
+ let upload_to_client c size =
+ (* lprintf "upload_to_client %d\n" size; *)
+@@ -168,10 +282,10 @@
+ let size = min max_msg_size size in
+ send_client_block c sock size;
+ (match c.client_upload with
+- None -> ()
+- | Some up ->
++ | Some ({ up_chunks = _ :: _ }) ->
+ if !CommonUploads.has_upload = 0 then
+ CommonUploads.ready_for_upload (as_client c)
++ | _ -> ()
+ )
+ )
+ let _ =
Index: src/networks/donkey/donkeyGlobals.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyGlobals.ml,v
retrieving revision 1.110
-retrieving revision 1.112
-diff -u -r1.110 -r1.112
+retrieving revision 1.115
+diff -u -r1.110 -r1.115
--- src/networks/donkey/donkeyGlobals.ml 26 Nov 2006 16:36:29 -0000 1.110
-+++ src/networks/donkey/donkeyGlobals.ml 4 Dec 2006 12:00:19 -0000 1.112
-@@ -595,8 +595,10 @@
++++ src/networks/donkey/donkeyGlobals.ml 28 Jan 2007 20:26:46 -0000 1.115
+@@ -104,6 +104,7 @@
+ let as_file file = as_file file.file_file
+ let file_priority file = file.file_file.impl_file_priority
+ let file_size file = file.file_file.impl_file_size
++let file_is_largefile f = file_size f > old_max_emule_file_size
+ let file_downloaded file = file_downloaded (as_file file)
+ let file_age file = file.file_file.impl_file_age
+ let file_fd file = file_fd (as_file file)
+@@ -287,6 +288,12 @@
+
+ let connected_servers () = !connected_server_list
+
++let logged_in_servers () =
++List.filter (fun s ->
++ match server_state s with
++ | Connected _ -> true
++ | _ -> false) !connected_server_list
++
+ let get_udp_sock () =
+ match !udp_sock with
+ None -> failwith "No UDP socket"
+@@ -595,16 +602,15 @@
client_osinfo = None;
client_checked = false;
client_connected = false;
@@ -5496,9 +8573,17 @@ diff -u -r1.110 -r1.112
+ client_total_downloaded = Int64.zero;
+ client_total_uploaded = Int64.zero;
client_banned = false;
- client_score = 0;
- client_next_queue = 0;
-@@ -650,8 +652,10 @@
+- client_score = 0;
+- client_next_queue = 0;
+ client_rank = 0;
+ client_connect_time = 0;
+ client_requests_sent = 0;
+ client_requests_received = 0;
+- client_indirect_address = None;
+ client_slot = SlotNotAsked;
+ client_debug = false;
+ client_pending_messages = [];
+@@ -650,16 +656,15 @@
client_osinfo = None;
client_checked = false;
client_connected = false;
@@ -5509,13 +8594,47 @@ diff -u -r1.110 -r1.112
+ client_session_downloaded = Int64.zero;
+ client_session_uploaded = Int64.zero;
client_banned = false;
- client_score = 0;
- client_next_queue = 0;
-@@ -1018,6 +1022,6 @@
+- client_score = 0;
+- client_next_queue = 0;
+ client_rank = 0;
+ client_connect_time = 0;
+ client_requests_received = 0;
+ client_requests_sent = 0;
+- client_indirect_address = None;
+ client_slot = SlotNotAsked;
+ client_debug = Intset.mem s.DonkeySources.source_num !debug_clients;
+ client_pending_messages = [];
+@@ -715,17 +720,6 @@
+ let friend_add c =
+ friend_add (as_client c)
+
+-let string_of_client c =
+- Printf.sprintf "client[%d] %s(%s) %s" (client_num c)
+- c.client_name (brand_to_string c.client_brand)
+- (match c.client_kind with
+- Indirect_address (server_ip, server_port, ip, port, real_ip) ->
+- Printf.sprintf " I[%s:%d]" (Ip.to_string real_ip) port;
+- | Direct_address (ip,port) ->
+- Printf.sprintf " D[%s:%d]" (Ip.to_string ip) port;
+- | Invalid_address _ -> ""
+- )
+-
+ let string_of_server s =
+ Printf.sprintf "%s:%d" (Ip.to_string s.server_ip) s.server_port
+
+@@ -1017,7 +1011,13 @@
+
let full_client_identifier c =
Printf.sprintf "%s (%s%s) '%s'"
- (Ip.to_string c.client_ip)
+- (Ip.to_string c.client_ip)
- (brand_to_string_short c.client_brand)
++ (match c.client_kind with
++ Indirect_address (server_ip, server_port, ip, port, real_ip) ->
++ Printf.sprintf "%s:%d(lowID, server:%s:%d]"
++ (Ip.to_string real_ip) port (Ip.to_string server_ip) server_port;
++ | Direct_address (ip,port) ->
++ Printf.sprintf "%s:%d" (Ip.to_string ip) port;
++ | Invalid_address _ -> " invalid IP")
+ (GuiTypes.client_software_short (brand_to_string_short c.client_brand) c.client_osinfo)
(if c.client_emule_proto.emule_release = "" then "" else " " ^ c.client_emule_proto.emule_release)
(String.escaped c.client_name)
@@ -5627,10 +8746,10 @@ Index: src/networks/donkey/donkeyInteractive.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyInteractive.ml,v
retrieving revision 1.140
-retrieving revision 1.145
-diff -u -r1.140 -r1.145
+retrieving revision 1.149
+diff -u -r1.140 -r1.149
--- src/networks/donkey/donkeyInteractive.ml 26 Nov 2006 17:27:40 -0000 1.140
-+++ src/networks/donkey/donkeyInteractive.ml 6 Dec 2006 22:33:05 -0000 1.145
++++ src/networks/donkey/donkeyInteractive.ml 30 Jan 2007 21:23:01 -0000 1.149
@@ -113,44 +113,44 @@
let server = check_add_server r.S.ip r.S.port in
List.iter (fun tag ->
@@ -5703,7 +8822,16 @@ diff -u -r1.140 -r1.145
CommonSwarming.set_absent swarmer absents
end;
-@@ -447,16 +448,16 @@
+@@ -429,6 +430,8 @@
+ filename_met := Some s;
+ | { tag_name = Field_Size; tag_value = Uint64 v } ->
+ size := v
++ | { tag_name = Field_Size_Hi; tag_value = Uint64 v } ->
++ size := Int64.logor !size (Int64.shift_left v 32)
+ | _ -> ()
+ ) f.P.tags;
+ ignore (really_query_download
+@@ -447,16 +450,16 @@
List.iter (fun tag ->
match tag with
@@ -5723,7 +8851,31 @@ diff -u -r1.140 -r1.145
if Sys.file_exists s then (* be careful on that *)
temp_dir := s
else (lprintf_nl "Bad temp directory, using default";
-@@ -797,7 +798,7 @@
+@@ -559,8 +562,9 @@
+ | "ed2k://" :: "file" :: name :: size :: md4 :: "/" :: "sources" :: sources :: _
+ | "file" :: name :: size :: md4 :: "/" :: "sources" :: sources :: _ ->
+ (* ed2k://|file|Wikipedia_3.3_noimages.iso|2666311680|747735CD46B61DA92973E9A8840A9C99|/|sources,62.143.4.124:4662|/ *)
+- if Int64.of_string size >= 4294967295L then
+- (Printf.sprintf (_b "Files > 4GB are not allowed")), false
++ if Int64.of_string size >= max_emule_file_size then
++ (Printf.sprintf (_b "Files > %s are not allowed")
++ (Int64ops.int64_to_human_readable max_emule_file_size)), false
+ else
+ begin
+ let md4 = if String.length md4 > 32 then
+@@ -599,8 +603,9 @@
+ end
+ | "ed2k://" :: "file" :: name :: size :: md4 :: _
+ | "file" :: name :: size :: md4 :: _ ->
+- if Int64.of_string size >= 4294967295L then
+- (Printf.sprintf (_b "Files > 4GB are not allowed")), false
++ if Int64.of_string size >= max_emule_file_size then
++ (Printf.sprintf (_b "Files > %s are not allowed")
++ (Int64ops.int64_to_human_readable max_emule_file_size)), false
+ else
+ let md4 = if String.length md4 > 32 then
+ String.sub md4 0 32 else md4 in
+@@ -797,9 +802,10 @@
) !current_files
) args;
""
@@ -5731,26 +8883,76 @@ diff -u -r1.140 -r1.145
+ ) , "<f1> <f2> ... :\t\ttry to recover these files at byte level";
"preferred", Arg_two (fun arg1 arg2 o ->
++ if CommonUserDb.user2_is_admin o.conn_user.ui_user then
let preferred = bool_of_string arg1 in
-@@ -809,7 +810,7 @@
+ let ip = Ip.of_string arg2 in
+ Hashtbl.iter (fun ip_s s ->
+@@ -809,19 +815,28 @@
end
) servers_by_key;
"ok"
- ), "<true/false> <ip> :\t\tset the server with this IP as preferred";
++ else
++ _s "You are not allowed to change preferred status"
+ ), "<true|false> <ip> :\t\tset the server with this IP as preferred";
"bs", Arg_multiple (fun args o ->
++ if CommonUserDb.user2_is_admin o.conn_user.ui_user then begin
List.iter (fun arg ->
-@@ -817,7 +818,7 @@
+ let range = Ip.range_of_string arg in
server_black_list =:= range :: !!server_black_list;
) args;
"done"
- ), "<range1> <range2> ... :\t\t\tadd these IPs to the servers black list (can be single IPs, CIDR ranges or begin-end ranges)";
++ end else
++ _s "You are not allowed to blacklist servers"
+ ), "<range1> <range2> ... :\t\tadd these IPs to the servers black list (can be single IPs, CIDR ranges or begin-end ranges)";
"port", Arg_one (fun arg o ->
++ if CommonUserDb.user2_is_admin o.conn_user.ui_user then begin
donkey_port =:= int_of_string arg;
-@@ -1195,9 +1196,10 @@
+- "new port will change at next restart"),
++ "new port will change at next restart"
++ end else
++ _s "You are not allowed to change connection port"
++ ),
+ "<port> :\t\t\t\tchange connection port";
+
+ "scan_temp", Arg_none (fun o ->
+@@ -925,7 +940,7 @@
+ if use_html_mods o then Printf.bprintf buf "\\</table\\>\\</div\\>";
+ "" end
+ else begin
+- print_command_result o o.conn_buf "You are not allowed to use scan_temp";
++ print_command_result o "You are not allowed to use scan_temp";
+ "" end
+
+ ), ":\t\t\t\tprint temp directory content";
+@@ -935,7 +950,7 @@
+ DonkeySources.print o.conn_buf o.conn_output;
+ "" end
+ else begin
+- print_command_result o o.conn_buf "You are not allowed to list sources";
++ print_command_result o "You are not allowed to list sources";
+ "" end
+ ), ":\t\t\t\tshow sources currently known";
+
+@@ -991,11 +1006,14 @@
+ ), ":\t\t\t\treset client_md4/client_private_key to random values";
+
+ "bp", Arg_multiple (fun args o ->
++ if CommonUserDb.user2_is_admin o.conn_user.ui_user then begin
+ List.iter (fun arg ->
+ let port = int_of_string arg in
+ port_black_list =:= port :: !!port_black_list;
+ ) args;
+ "done"
++ end else
++ _s "You are not allowed to blacklist ports"
+ ), "<port1> <port2> ... :\t\tadd these ports to the port black list";
+ ]
+
+@@ -1195,14 +1213,16 @@
P.client_os = c.client_osinfo;
P.client_release = c.client_emule_proto.emule_release;
P.client_emulemod = brand_mod_to_string_short c.client_brand_mod;
@@ -5764,7 +8966,13 @@ diff -u -r1.140 -r1.145
P.client_upload =
(match client_upload (as_client c) with
Some f -> Some (CommonFile.file_best_name f)
-@@ -1396,8 +1398,10 @@
+ | None -> None);
+ P.client_sui_verified = c.client_sui_verified;
++ P.client_file_queue = List.map (fun (file,_,_) -> as_file file) c.client_file_queue
+ }
+ );
+ client_ops.op_client_debug <- (fun c debug ->
+@@ -1396,8 +1416,10 @@
( "0", "srh", "Secure User Identification [N]one, [P]assed, [F]ailed", "S" ) ;
( "0", "srh br", "IP address", "IP address" ) ;
] @ (if !Geoip.active then [( "0", "srh br", "Country Code/Name", "CC" )] else []) @ [
@@ -5777,7 +8985,7 @@ diff -u -r1.140 -r1.145
( "1", "srh ar", "Your queue rank on this client", "Rnk" ) ;
( "1", "srh ar br", "Source score", "Scr" ) ;
( "1", "srh ar br", "Last ok", "LO" ) ;
-@@ -1476,8 +1480,10 @@
+@@ -1476,8 +1498,10 @@
));
("", "sr br", ip_string);
] @ (if !Geoip.active then [(cn, "sr br", cc)] else []) @ [
@@ -5790,7 +8998,76 @@ diff -u -r1.140 -r1.145
("", "sr ar", Printf.sprintf "%d" c.client_rank);
("", "sr ar br", Printf.sprintf "%d" c.client_source.DonkeySources.source_score);
("", "sr ar br", (string_of_date (c.client_source.DonkeySources.source_age)));
-@@ -1698,10 +1704,10 @@
+@@ -1679,6 +1703,68 @@
+ c.client_name
+ (string_of_date (c.client_source.DonkeySources.source_age))
+ );
++ client_ops.op_client_print_info <- (fun c o ->
++ let buf = o.conn_buf in
++ let ip_string,cc,cn = get_ips_cc_cn c in
++
++ Printf.bprintf buf "Client %d: %s\n"
++ (client_num c)
++ (full_client_identifier c);
++ (
++ match c.client_osinfo with
++ | Some i -> Printf.bprintf buf " osinfo: %s\n" i
++ | None -> ()
++ );
++ Printf.bprintf buf " state: %s, rank: %d\n"
++ (string_of_connection_state (client_state c)) c.client_rank;
++ if !Geoip.active then Printf.bprintf buf " country: %s: %s\n" cc cn;
++ Printf.bprintf buf " MD4: %s\n" (Md4.to_string c.client_md4);
++ Printf.bprintf buf " downloaded\n";
++ Printf.bprintf buf " - session %s\n" (size_of_int64 c.client_session_downloaded);
++ Printf.bprintf buf " - total %s\n" (size_of_int64 c.client_total_downloaded);
++ (
++ match c.client_download with
++ | Some (f,_) -> Printf.bprintf buf " downloading file %s\n" (file_best_name f)
++ | None -> Printf.bprintf buf " not downloading\n"
++ );
++ Printf.bprintf buf " uploaded\n";
++ Printf.bprintf buf " - session %s\n" (size_of_int64 c.client_session_uploaded);
++ Printf.bprintf buf " - total %s\n" (size_of_int64 c.client_total_uploaded);
++ (
++ match c.client_upload with
++ | Some u -> Printf.bprintf buf " uploading file %s\n" (file_best_name u.up_file)
++ | _ -> Printf.bprintf buf " not uploading\n"
++ );
++ Printf.bprintf buf " SUI %s\n" (
++ match c.client_sui_verified with
++ | None -> "not supported"
++ | Some b -> if b then "passed" else "failed"
++ );
++ Printf.bprintf buf " kind: %s\n" (
++ match c.client_kind with
++ | Direct_address (ip,port) ->
++ Printf.sprintf "highID %s:%d" (Ip.to_string ip) port
++ | Indirect_address (server_ip, server_port, id, port, real_ip) ->
++ Printf.sprintf "lowID %s:%d, server %s:%d"
++ (Ip.to_string real_ip) port (Ip.to_string server_ip) server_port
++ | Invalid_address (name,md4) -> Printf.sprintf "invalid"
++ );
++ if c.client_emule_proto.received_miscoptions1 then
++ Printf.bprintf buf "\nmiscoptions1:\n%s" (DonkeyProtoClient.print_emule_proto_miscoptions1 c.client_emule_proto)
++ else
++ Printf.bprintf buf "no miscoptions1 received\n";
++ if c.client_emule_proto.received_miscoptions2 then
++ Printf.bprintf buf "miscoptions2:\n%s" (DonkeyProtoClient.print_emule_proto_miscoptions2 c.client_emule_proto)
++ else
++ Printf.bprintf buf "no miscoptions2 received\n";
++ List.iter (fun (file,_,_) -> Printf.bprintf buf "\nQueue: %s" (file_best_name file)) c.client_file_queue;
++ List.iter (fun r ->
++ Printf.bprintf buf "\nSource file: %s, score %d, request time %d"
++ (CommonFile.file_best_name (r.DonkeySources.request_file.DonkeySources.manager_file ()))
++ r.DonkeySources.request_score
++ r.DonkeySources.request_time;
++ ) c.client_source.DonkeySources.source_files;
++ );
+ client_ops.op_client_dprint <- (fun c o file ->
+ let info = file_info file in
+ let buf = o.conn_buf in
+@@ -1698,10 +1784,10 @@
Direct_address (ip,port) -> (Ip.to_string ip)
| _ -> (string_of_client_addr c));
Printf.bprintf buf "\n%14sDown : %-10s Uploaded: %-10s Ratio: %s%1.1f (%s)\n" ""
@@ -5805,7 +9082,7 @@ diff -u -r1.140 -r1.145
(brand_to_string c.client_brand);
(Printf.bprintf buf "%14sFile : %s\n" "" info.GuiTypes.file_name);
end;
-@@ -1754,8 +1760,10 @@
+@@ -1754,8 +1840,10 @@
));
("", "sr", ip_string);
] @ (if !Geoip.active then [(cn, "sr", cc)] else []) @ [
@@ -5818,7 +9095,7 @@ diff -u -r1.140 -r1.145
("", "sr", info.GuiTypes.file_name) ]);
Printf.bprintf buf "\\</tr\\>";
-@@ -1774,6 +1782,29 @@
+@@ -1774,6 +1862,29 @@
)
let _ =
@@ -5852,10 +9129,10 @@ Index: src/networks/donkey/donkeyMain.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyMain.ml,v
retrieving revision 1.63
-retrieving revision 1.64
-diff -u -r1.63 -r1.64
+retrieving revision 1.67
+diff -u -r1.63 -r1.67
--- src/networks/donkey/donkeyMain.ml 26 Nov 2006 16:36:29 -0000 1.63
-+++ src/networks/donkey/donkeyMain.ml 3 Dec 2006 20:49:42 -0000 1.64
++++ src/networks/donkey/donkeyMain.ml 28 Jan 2007 20:39:59 -0000 1.67
@@ -137,14 +137,14 @@
let emule_compatoptions = D.emule_compatoptions m in
client_to_client_tags :=
@@ -5879,7 +9156,15 @@ diff -u -r1.63 -r1.64
];
(* server capabilities *)
-@@ -161,42 +161,42 @@
+@@ -154,49 +154,49 @@
+ extended := !extended lor 0x04; (* support of auxport *)
+ extended := !extended lor 0x08; (* newtags *)
+ (*extended := !extended lor 0x10; (* unicode *) *)
+-(*extended := !extended lor 0x100; (* files > 4GB *) *)
++ extended := !extended lor 0x100; (* files > 4GB *)
+ (*extended := !extended lor 0x200; (* support crypt *) *)
+ (*extended := !extended lor 0x400; (* request crypt *) *)
+ (*extended := !extended lor 0x800; (* require crypt *) *)
client_to_server_tags :=
[
@@ -5944,14 +9229,26 @@ diff -u -r1.63 -r1.64
]
let enable () =
+@@ -405,7 +405,10 @@
+ !kademlia_port_info, "kademlia_port UDP";
+ ]);
+ network.op_network_porttest_result <-
+- (fun _ -> !DonkeyInteractive.porttest_result);
++ (fun _ -> match !DonkeyInteractive.porttest_result with
++ | PorttestResult (time, s) ->
++ PorttestResult (time, (String2.dehtmlize s))
++ | _ -> !DonkeyInteractive.porttest_result);
+ CommonInteractive.register_gui_options_panel "eDonkey"
+ gui_donkey_options_panel;
+ CommonInteractive.register_gui_options_panel "Overnet"
Index: src/networks/donkey/donkeyMftp.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyMftp.ml,v
retrieving revision 1.13
-retrieving revision 1.15
-diff -u -r1.13 -r1.15
+retrieving revision 1.17
+diff -u -r1.13 -r1.17
--- src/networks/donkey/donkeyMftp.ml 9 Feb 2006 11:45:12 -0000 1.13
-+++ src/networks/donkey/donkeyMftp.ml 4 Dec 2006 12:00:19 -0000 1.15
++++ src/networks/donkey/donkeyMftp.ml 15 Jan 2007 21:32:56 -0000 1.17
@@ -179,7 +179,9 @@
List.assoc name names_of_tag
with Not_found ->
@@ -5963,7 +9260,15 @@ diff -u -r1.13 -r1.15
tag_value = v
}, pos
-@@ -223,3 +225,75 @@
+@@ -211,6 +213,7 @@
+ "\005", Field_Lastseencomplete;
+ "\021", Field_Availability;
+ "\048", Field_Completesources;
++ "\058", Field_Size_Hi;
+ "\208", Field_Artist;
+ "\209", Field_Album;
+ "\210", Field_Title;
+@@ -223,3 +226,77 @@
"Album", Field_Album;
"Title", Field_Title;
]
@@ -5998,6 +9303,7 @@ diff -u -r1.13 -r1.15
+ "\092", "mod_secure_community";
+ "\093", "mod_unknown0x5d";
+ "\096", "mod_unknown0x60";
++ "\100", "mod_unknown0x64";
+ "\102", "mod_fusion";
+ "\103", "mod_fusion_version";
+
@@ -6005,6 +9311,7 @@ diff -u -r1.13 -r1.15
+ "\105", "edonkeyclc serverip?";
+ "\106", "edonkeyclc serverport?";
+
++ "\108", "mod_unknown0x6c";
+ "\117", "mod_unknown0x75"; (* http://emule-project.net @ NewMule *)
+ "\118", "mod_unknown0x76";
+ "\119", "mod_tarod";
@@ -6055,14 +9362,248 @@ diff -u -r1.6 -r1.7
\ No newline at end of file
+val file_common_tags : (string * CommonTypes.field) list
+val client_common_tags : (string * string) list
-Index: src/networks/donkey/donkeyPandora.ml
+Index: src/networks/donkey/donkeyOneFile.ml
===================================================================
-RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyPandora.ml,v
+RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyOneFile.ml,v
+retrieving revision 1.46
+retrieving revision 1.49
+diff -u -r1.46 -r1.49
+--- src/networks/donkey/donkeyOneFile.ml 21 Nov 2006 22:34:34 -0000 1.46
++++ src/networks/donkey/donkeyOneFile.ml 15 Jan 2007 18:28:03 -0000 1.49
+@@ -100,11 +100,30 @@
+ end
+
+ let remove_client_slot c =
++ if c.client_debug || (
++ !verbose &&
++ (c.client_session_uploaded > 0L || c.client_session_downloaded > 0L)) then
++ lprintf_nl "Client[%d] %s disconnected, connected %s%s%s"
++ (client_num c) (full_client_identifier c)
++ (Date.time_to_string (last_time () - c.client_connect_time) "verbose")
++ (if c.client_total_uploaded > 0L then
++ Printf.sprintf ", send %s (%s)%s"
++ (size_of_int64 c.client_session_uploaded)
++ (size_of_int64 c.client_total_uploaded)
++ (match client_upload (as_client c) with | None -> ""
++ | Some f -> " of " ^ (CommonFile.file_best_name f)) else "")
++ (if c.client_total_downloaded > 0L then
++ Printf.sprintf ", rec %s (%s)%s"
++ (size_of_int64 c.client_session_downloaded)
++ (size_of_int64 c.client_total_downloaded)
++ (match c.client_download with | None -> ""
++ | Some (f,_) -> " of " ^ (file_best_name f)) else "");
+ set_client_has_a_slot (as_client c) NoSlot;
+ client_send c (
+ let module M = DonkeyProtoClient in
+- let module Q = M.CloseSlot in
+- M.CloseSlotReq Q.t);
++ let module Q = M.OutOfParts in
++ M.OutOfPartsReq Q.t);
++ c.client_session_uploaded <- 0L;
+ c.client_upload <- None
+
+ let unshare_file file =
+@@ -218,16 +237,17 @@
+
+ (* let next_file _ = failwith "next_file not implemented" *)
+
+-(* clean_client_zones: clean all structures related to downloads when
+- a client disconnects *)
+-let clean_current_download c =
+- match c.client_download with
+- None -> ()
+- | Some (file, up) ->
+- CommonSwarming.unregister_uploader up;
+- c.client_download <- None
+-
+ let send_get_range_request c file ranges =
++ let rec check_large (rangelist : (int64 * int64 * range) list) =
++ match rangelist with
++ | [] -> false
++ | (x,y,_ : (int64 * int64 * range))::tail_range ->
++ (x > old_max_emule_file_size) || (y > old_max_emule_file_size) || (check_large tail_range)
++ in
++ let is_large_request = check_large ranges in
++ if file_is_largefile file && c.client_emule_proto.emule_largefiles <> 1 then
++ lprintf_nl "File %s is too large for %s." (file_best_name file) (full_client_identifier c)
++ else
+ match c.client_source.DonkeySources.source_sock with
+ | Connection sock ->
+
+@@ -239,6 +259,7 @@
+ [x1,y1,_] ->
+ {
+ Q.md4 = file.file_md4;
++ Q.usesixtyfour = is_large_request;
+ Q.start_pos1 = x1;
+ Q.end_pos1 = y1;
+ Q.start_pos2 = zero;
+@@ -250,6 +271,7 @@
+ | [x1,y1,_; x2,y2,_] ->
+ {
+ Q.md4 = file.file_md4;
++ Q.usesixtyfour = is_large_request;
+ Q.start_pos1 = x1;
+ Q.end_pos1 = y1;
+ Q.start_pos2 = x2;
+@@ -261,6 +283,7 @@
+ | [x1,y1,_; x2,y2,_; x3,y3,_ ] ->
+ {
+ Q.md4 = file.file_md4;
++ Q.usesixtyfour = is_large_request;
+ Q.start_pos1 = x1;
+ Q.end_pos1 = y1;
+ Q.start_pos2 = x2;
+@@ -377,9 +400,7 @@
+ or start querying blocks if already in the queue *)
+ let request_slot c =
+ if c.client_slot = SlotNotAsked then begin
+- if !verbose_download then begin
+- lprintf_nl "start_download";
+- end;
++ if !verbose_download then lprintf_nl "start_download";
+ do_if_connected c.client_source.DonkeySources.source_sock (fun sock ->
+ sort_file_queue c;
+ match c.client_file_queue with
+@@ -472,8 +493,9 @@
+ match tag with
+ { tag_name = Field_Filename; tag_value = String s } -> file_name := s
+ | { tag_name = Field_Size; tag_value = Uint64 v } -> file_size := v
+- | { tag_name = Field_Availability;
+- tag_value = (Uint64 v| Fint64 v) } ->
++ | { tag_name = Field_Size_Hi; tag_value = Uint8 v } ->
++ file_size := Int64.logor !file_size (Int64.shift_left (Int64.of_int v) 32)
++ | { tag_name = Field_Availability; tag_value = (Uint64 v| Fint64 v) } ->
+ availability := Int64.to_int v; new_tags := tag :: !new_tags
+ | _ -> new_tags := tag :: !new_tags
+ ) tags;
+Index: src/networks/donkey/donkeyOneFile.mli
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyOneFile.mli,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
+--- src/networks/donkey/donkeyOneFile.mli 12 Nov 2005 11:20:21 -0000 1.7
++++ src/networks/donkey/donkeyOneFile.mli 15 Jan 2007 18:28:03 -0000 1.8
+@@ -20,7 +20,6 @@
+ open CommonSwarming
+ open Md4
+
+-val clean_current_download : DonkeyTypes.client -> unit
+ val get_from_client : DonkeyTypes.client -> unit
+ val request_slot : DonkeyTypes.client -> unit
+ val check_files_downloaded : unit -> unit
+Index: src/networks/donkey/donkeyOptions.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyOptions.ml,v
+retrieving revision 1.57
+retrieving revision 1.61
+diff -u -r1.57 -r1.61
+--- src/networks/donkey/donkeyOptions.ml 26 Nov 2006 16:36:29 -0000 1.57
++++ src/networks/donkey/donkeyOptions.ml 15 Jan 2007 18:26:27 -0000 1.61
+@@ -30,6 +30,7 @@
+ int_option 30
+
+ let donkey_port = define_option donkey_section ["port"]
++ ~restart: true
+ "The port used for connection by other donkey clients."
+ int_option (2000 + Random.int 20000)
+
+@@ -174,6 +175,16 @@
+ "How long a downloading client can stay in my upload queue (in minutes >5)"
+ int_option 90
+
++let upload_full_chunks = define_expert_option donkey_section ["upload_full_chunks"]
++ "If true, each client is allowed to receive one chunk, this setting overrides upload_lifetime"
++ bool_option false
++
++let upload_complete_chunks = define_expert_option donkey_section ["upload_complete_chunks"]
++ "If true, each client is allowed to complete only one chunk, independent, if it is empty or
++ partial. this setting overrides upload_full_chunks and dynamic_upload_lifetime,
++ but is, as a failsafe, limited by upload_lifetime (should be set reasonable high)"
++ bool_option false
++
+ let dynamic_upload_lifetime = define_expert_option donkey_section ["dynamic_upload_lifetime"]
+ "Each client upload lifetime depends on download-upload ratio"
+ bool_option false
+@@ -182,6 +193,48 @@
+ "Uploaded zones (1 zone = 180 kBytes) needed to enable the dynamic upload lifetime"
+ int_option 10
+
++let upload_compression = define_expert_option donkey_section ["upload_compression"]
++ "Enables compressed upload as part of the protocol"
++ bool_option true
++
++let upload_compression_threshold = define_expert_option donkey_section ["upload_compression_threshold"]
++ "Sizedifference in bytes between one zone (180 kBytes) and its compressed
++ counterpart, which has to occure, to send compressed parts instead of plain."
++ int_option 2000
++
++let _ =
++ option_hook upload_compression_threshold (fun _ ->
++ if !!upload_compression_threshold < 0 then
++ upload_compression_threshold =:= 0
++ )
++
++let upload_compression_level = define_expert_option donkey_section ["upload_compression_level"]
++ "Level of the used zlibcompression. allowed are values between 0 and 9. higher
++ level means better compression, but higher cpu usage too. (emules default
++ compression level for compressed parts is 9)"
++ int_option 9
++
++let _ =
++ option_hook upload_compression_level (fun _ ->
++ if !!upload_compression_level < 0
++ || !!upload_compression_level > 9 then
++ upload_compression_level =:= 9
++ )
++
++let upload_compression_table_size = define_expert_option donkey_section ["upload_compression_table_size"]
++ ~restart: true
++ "Size of the cache table in entries (ca. 2 * 180 kbytes). zones have to be
++ compressed at once, but only parts of it are sent at a time (10 kbytes).
++ to reduce diskaccess and repeated compression to a minimum, size should be
++ at least the number of total upload slots. restart of core is required."
++ int_option 20
++
++let _ =
++ option_hook upload_compression_table_size (fun _ ->
++ if !!upload_compression_table_size < 1 then
++ upload_compression_table_size =:= 1
++ )
++
+ let connected_server_timeout = define_expert_option donkey_section ["connected_server_timeout"]
+ "How long can a silent server stay connected"
+ float_option 1800.
+@@ -200,6 +253,7 @@
+ int_option 2
+
+ let remove_old_servers_delay = define_expert_option donkey_section ["remove_old_servers_delay"]
++ ~restart: true
+ "How often should remove old donkey servers (see max_server_age) be called
+ (in seconds, 0 to disable)"
+ float_option 900.
+@@ -267,10 +321,12 @@
+ "Overnet options"
+
+ let overnet_port = define_option overnet_section [overnet_options_section_name; "port"]
++ ~restart: true
+ "port for overnet"
+ int_option (2000 + Random.int 20000)
+
+ let options_version = define_expert_option donkey_section ["options_version"]
++ ~internal: true
+ "(internal option)"
+ int_option 3
+
+Index: src/networks/donkey/donkeyPandora.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyPandora.ml,v
+retrieving revision 1.7
+retrieving revision 1.9
+diff -u -r1.7 -r1.9
--- src/networks/donkey/donkeyPandora.ml 3 Apr 2006 20:50:09 -0000 1.7
-+++ src/networks/donkey/donkeyPandora.ml 3 Dec 2006 20:49:42 -0000 1.8
++++ src/networks/donkey/donkeyPandora.ml 6 Jan 2007 18:15:17 -0000 1.9
@@ -98,23 +98,23 @@
let update_emule_proto_from_tags e tags =
List.iter (fun tag ->
@@ -6094,24 +9635,71 @@ diff -u -r1.7 -r1.8
for_int_tag tag (fun i ->
e.emule_secident <- i land 0x3)
| s ->
-@@ -138,7 +138,7 @@
+@@ -138,12 +138,23 @@
begin
try
- let options = find_tag (Field_UNKNOWN "emule_miscoptions1") tags in
+ let options = find_tag (Field_KNOWN "emule_miscoptions1") tags in
++ (
match options with
- Uint64 v | Fint64 v ->
+- Uint64 v | Fint64 v ->
++ | Uint64 v | Fint64 v ->
update_emule_proto_from_miscoptions1 emule v
+ | _ ->
+ lprintf "CANNOT INTERPRETE EMULE OPTIONS\n"
++ );
++
++ let options2 = find_tag (Field_KNOWN "emule_miscoptions2") tags in
++ (
++ match options2 with
++ | Uint64 v | Fint64 v ->
++ update_emule_proto_from_miscoptions2 emule v
++ | _ ->
++ lprintf "CANNOT INTERPRETE EMULE OPTIONS2\n"
++ );
+
+ with _ -> ()
+ end;
+@@ -151,14 +162,14 @@
+ | P.UnknownReq (227,_) ->
+ emule.emule_extendedrequest <- -1
+
+- | P.EmuleCompressedPart (md4, statpos, newsize, bloc) ->
++ | P.EmuleCompressedPart t ->
+
+ let comp = match c.client_comp with
+ None ->
+ let comp = {
+- comp_md4 = md4;
+- comp_pos = statpos;
+- comp_total = Int64.to_int newsize;
++ comp_md4 = t.EmuleCompressedPart.md4;
++ comp_pos = t.EmuleCompressedPart.statpos;
++ comp_total = Int64.to_int t.EmuleCompressedPart.newsize;
+ comp_len = 0;
+ comp_blocs = [];
+ } in
+@@ -166,8 +177,8 @@
+ comp
+ | Some comp -> comp
+ in
+- comp.comp_blocs <- bloc :: comp.comp_blocs;
+- comp.comp_len <- comp.comp_len + String.length bloc;
++ comp.comp_blocs <- t.EmuleCompressedPart.bloc :: comp.comp_blocs;
++ comp.comp_len <- comp.comp_len + String.length t.EmuleCompressedPart.bloc;
+
+ (* lprintf "Comp bloc: %d/%d\n" comp.comp_len comp.comp_total; *)
+ if comp.comp_len = comp.comp_total then begin
Index: src/networks/donkey/donkeyProtoClient.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyProtoClient.ml,v
retrieving revision 1.40
-retrieving revision 1.42
-diff -u -r1.40 -r1.42
+retrieving revision 1.45
+diff -u -r1.40 -r1.45
--- src/networks/donkey/donkeyProtoClient.ml 26 Nov 2006 16:36:29 -0000 1.40
-+++ src/networks/donkey/donkeyProtoClient.ml 3 Dec 2006 20:49:42 -0000 1.42
-@@ -39,41 +39,84 @@
++++ src/networks/donkey/donkeyProtoClient.ml 8 Jan 2007 12:20:40 -0000 1.45
+@@ -39,67 +39,110 @@
(int_of_string(Autoconf.minor_version) lsl 10) lor
(int_of_string(Autoconf.sub_version) lsl 7)
@@ -6132,6 +9720,7 @@ diff -u -r1.40 -r1.42
+ emule_features = 3;
+
+(* emule_miscoptions1 *)
++ received_miscoptions1 = false;
+ emule_aich = 0;
+ emule_unicode = 0;
+ emule_udpver = 0;
@@ -6149,11 +9738,12 @@ diff -u -r1.40 -r1.42
+ emule_supportpreview = 0;
+
+(* emule_miscoptions2 *)
++ received_miscoptions2 = false;
+ emule_require_crypt = 0;
+ emule_request_crypt = 0;
+ emule_support_crypt = 0;
+ emule_extmultipacket = 0;
-+ emule_largefiles = 0;
++ emule_largefiles = 1;
+ emule_kad_version = 0;
}
@@ -6206,14 +9796,17 @@ diff -u -r1.40 -r1.42
+ Buffer.contents buf
+
let emule_miscoptions2 m =
- (*
+-(*
let o =
-@@ -83,23 +126,24 @@
- *)
- Int64.zero
+ (m.emule_largefiles lsl 4)
+ in
+ Int64.of_int o
+-*)
+- Int64.zero
-let update_emule_proto_from_miscoptions1 m o =
-- let o = Int64.to_int o in
++let update_emule_proto_from_miscoptions2 m o =
+ let o = Int64.to_int o in
- m.emule_udpver <- (o lsr 24) land 0xf;
- m.emule_compression <- (o lsr 20) land 0xf;
- m.emule_secident <- (o lsr 16) land 0xf;
@@ -6226,8 +9819,7 @@ diff -u -r1.40 -r1.42
-
-let update_emule_proto_from_miscoptions2 m o = ()
-(*
-+let update_emule_proto_from_miscoptions2 m o =
- let o = Int64.to_int o in
+- let o = Int64.to_int o in
- m.emule_largefiles <- (o lsr 4) land 0x1
-*)
+ m.emule_require_crypt <- (o lsr 9) land 0x1;
@@ -6249,7 +9841,7 @@ diff -u -r1.40 -r1.42
let emule_compatoptions m =
(m.emule_osinfosupport lsl 0)
-@@ -146,23 +190,10 @@
+@@ -146,23 +189,10 @@
left_bytes : string;
}
@@ -6276,7 +9868,123 @@ diff -u -r1.40 -r1.42
let parse reply len s =
let hash_len, pos = if not reply then get_uint8 s 1, 2 else -1, 1 in
-@@ -787,49 +818,10 @@
+@@ -388,7 +418,6 @@
+
+ let print t =
+ lprintf_nl "CHUNKS for %s" (Md4.to_string t.md4);
+- lprint_string " ";
+ lprintf_nl "%s\n" (Bitv.to_string t.chunks)
+
+ let write buf t =
+@@ -423,7 +452,7 @@
+ }
+
+ let print t =
+- lprintf_nl "CHUNKS for %s" (Md4.to_string t.md4);
++ lprintf_nl "CHUNKSMd4 for %s" (Md4.to_string t.md4);
+ lprint_string " ";
+ Array.iter (fun b ->
+ lprintf " %s" (Md4.to_string b))
+@@ -462,6 +491,7 @@
+ module Bloc = struct
+ type t = {
+ md4 : Md4.t;
++ usesixtyfour : bool;
+ start_pos : int64;
+ end_pos: int64;
+ bloc_str: string;
+@@ -469,14 +499,15 @@
+ bloc_len : int;
+ }
+
+- let parse len s =
++ let parse usesixtyfour len s =
+ {
+ md4 = get_md4 s 1;
+- start_pos = get_uint64_32 s 17;
+- end_pos = get_uint64_32 s 21;
++ usesixtyfour = usesixtyfour;
++ start_pos = if usesixtyfour then get_int64 s 17 else get_uint64_32 s 17;
++ end_pos = if usesixtyfour then get_int64 s 25 else get_uint64_32 s 21;
+ bloc_str = s;
+- bloc_begin = 25;
+- bloc_len = len - 25;
++ bloc_begin = if usesixtyfour then 33 else 25;
++ bloc_len = if usesixtyfour then len - 33 else len - 25;
+ }
+
+ let print t =
+@@ -487,14 +518,15 @@
+
+ let write buf t =
+ buf_md4 buf t.md4;
+- buf_int64_32 buf t.start_pos;
+- buf_int64_32 buf t.end_pos;
++ if t.usesixtyfour then buf_int64 buf t.start_pos else buf_int64_32 buf t.start_pos;
++ if t.usesixtyfour then buf_int64 buf t.end_pos else buf_int64_32 buf t.end_pos;
+ Buffer.add_substring buf t.bloc_str t.bloc_begin t.bloc_len
+ end
+
+ module QueryBloc = struct
+ type t = {
+ md4 : Md4.t;
++ usesixtyfour : bool;
+ start_pos1 : int64; (* 180 ko *)
+ end_pos1: int64;
+ start_pos2 : int64;
+@@ -503,15 +535,16 @@
+ end_pos3: int64;
+ }
+
+- let parse len s =
++ let parse usesixtyfour len s =
+ {
+ md4 = get_md4 s 1;
+- start_pos1 = get_uint64_32 s 17;
+- end_pos1 = get_uint64_32 s 29;
+- start_pos2 = get_uint64_32 s 21;
+- end_pos2 = get_uint64_32 s 33;
+- start_pos3 = get_uint64_32 s 25;
+- end_pos3 = get_uint64_32 s 37;
++ usesixtyfour = usesixtyfour;
++ start_pos1 = if usesixtyfour then get_int64 s 17 else get_uint64_32 s 17;
++ end_pos1 = if usesixtyfour then get_int64 s 41 else get_uint64_32 s 29;
++ start_pos2 = if usesixtyfour then get_int64 s 25 else get_uint64_32 s 21;
++ end_pos2 = if usesixtyfour then get_int64 s 49 else get_uint64_32 s 33;
++ start_pos3 = if usesixtyfour then get_int64 s 33 else get_uint64_32 s 25;
++ end_pos3 = if usesixtyfour then get_int64 s 57 else get_uint64_32 s 37;
+ }
+
+ let print t =
+@@ -523,12 +556,12 @@
+
+ let write buf t =
+ buf_md4 buf t.md4;
+- buf_int64_32 buf t.start_pos1;
+- buf_int64_32 buf t.start_pos2;
+- buf_int64_32 buf t.start_pos3;
+- buf_int64_32 buf t.end_pos1;
+- buf_int64_32 buf t.end_pos2;
+- buf_int64_32 buf t.end_pos3
++ if t.usesixtyfour then buf_int64 buf t.start_pos1 else buf_int64_32 buf t.start_pos1;
++ if t.usesixtyfour then buf_int64 buf t.start_pos2 else buf_int64_32 buf t.start_pos2;
++ if t.usesixtyfour then buf_int64 buf t.start_pos3 else buf_int64_32 buf t.start_pos3;
++ if t.usesixtyfour then buf_int64 buf t.end_pos1 else buf_int64_32 buf t.end_pos1;
++ if t.usesixtyfour then buf_int64 buf t.end_pos2 else buf_int64_32 buf t.end_pos2;
++ if t.usesixtyfour then buf_int64 buf t.end_pos3 else buf_int64_32 buf t.end_pos3
+ end
+
+ let unit = ()
+@@ -554,7 +587,7 @@
+
+ module AvailableSlot = NoArg(struct let m = "AvailableSlot" end)
+ module ReleaseSlot = NoArg(struct let m = "ReleaseSlot" end)
+-module CloseSlot = NoArg(struct let m = "CloseSlot" end)
++module OutOfParts = NoArg(struct let m = "OutOfParts" end)
+ module ViewFiles = NoArg(struct let m = "VIEW FILES" end)
+ module ViewDirs = NoArg(struct let m = "VIEW DIRS" end)
+
+@@ -787,49 +820,10 @@
mutable tags : tag list;
}
@@ -6328,15 +10036,213 @@ diff -u -r1.40 -r1.42
let parse len s =
let version = get_uint8 s 1 in
+@@ -1090,6 +1084,35 @@
+ buf_string buf t.comment
+ end
+
++module EmuleCompressedPart = struct
++
++ type t = {
++ md4 : Md4.t;
++ usesixtyfour : bool;
++ statpos : int64;
++ newsize : int64;
++ bloc : string;
++ }
++
++ let parse usesixtyfour len s =
++ {
++ md4 = get_md4 s 1;
++ usesixtyfour = usesixtyfour;
++ statpos = if usesixtyfour then get_int64 s 17 else get_uint64_32 s 17;
++ newsize = if usesixtyfour then get_uint64_32 s 25 else get_uint64_32 s 21;
++ bloc = if usesixtyfour then String.sub s 29 (len-29) else String.sub s 25 (len-25)
++ }
++
++ let print t =
++ lprintf_nl "EmuleCompressedPart for %s %Ld %Ld len %d"
++ (Md4.to_string t.md4) t.statpos t.newsize (String.length t.bloc)
++
++ let write buf t =
++ buf_md4 buf t.md4;
++ if t.usesixtyfour then buf_int64 buf t.statpos else buf_int64_32 buf t.statpos;
++ buf_int64_32 buf t.newsize;
++ Buffer.add_string buf t.bloc
++ end
+
+ module EmulePortTestReq = struct
+
+@@ -1115,7 +1138,7 @@
+ | JoinQueueReq of JoinQueue.t (* sent before queryBloc *)
+ | AvailableSlotReq of AvailableSlot.t
+ | ReleaseSlotReq of ReleaseSlot.t
+-| CloseSlotReq of CloseSlot.t
++| OutOfPartsReq of OutOfParts.t
+ | QueryChunksReq of QueryChunks.t
+ | QueryChunksReplyReq of QueryChunksReply.t
+ | QueryChunkMd4Req of QueryChunkMd4.t
+@@ -1147,7 +1170,7 @@
+ | EmuleSecIdentStateReq of EmuleSecIdentStateReq.t
+ | EmuleMultiPacketReq of Md4.t * t list
+ | EmuleMultiPacketAnswerReq of Md4.t * t list
+-| EmuleCompressedPart of Md4.t * int64 * int64 * string
++| EmuleCompressedPart of EmuleCompressedPart.t
+ | EmulePortTestReq of EmulePortTestReq.t
+
+ let rec print t =
+@@ -1162,7 +1185,7 @@
+ | JoinQueueReq t -> JoinQueue.print t
+ | AvailableSlotReq t -> AvailableSlot.print t
+ | ReleaseSlotReq t -> ReleaseSlot.print t
+- | CloseSlotReq t -> CloseSlot.print t
++ | OutOfPartsReq t -> OutOfParts.print t
+ | QueryChunksReq t -> QueryChunks.print t
+ | QueryChunksReplyReq t -> QueryChunksReply.print t
+ | QueryChunkMd4Req t -> QueryChunkMd4.print t
+@@ -1216,9 +1239,8 @@
+ EmuleSignatureReq.print t
+ | EmulePublicKeyReq t ->
+ EmulePublicKeyReq.print t
+- | EmuleCompressedPart (md4, statpos, newsize, bloc) ->
+- lprintf_nl "EmuleCompressedPart for %s %Ld %Ld len %d"
+- (Md4.to_string md4) statpos newsize (String.length bloc)
++ | EmuleCompressedPart t ->
++ EmuleCompressedPart.print t
+ | EmulePortTestReq t ->
+ EmulePortTestReq.print t
+ | UnknownReq (opcode, s) ->
+@@ -1265,11 +1287,7 @@
+
+ | 0x40 (* 64 *) ->
+ (* OP_COMPRESSEDPART *)
+- let md4 = get_md4 s 1 in
+- let statpos = get_uint64_32 s 17 in
+- let newsize = get_uint64_32 s 21 in
+- let bloc = String.sub s 25 (len-25) in
+- EmuleCompressedPart (md4, statpos, newsize, bloc)
++ EmuleCompressedPart (EmuleCompressedPart.parse false len s)
+
+ | 0x85 (* 133 *) ->
+ EmulePublicKeyReq(EmulePublicKeyReq.parse len s)
+@@ -1352,6 +1370,10 @@
+ in
+ EmuleMultiPacketAnswerReq (md4, iter s 17 len)
+
++ | 0xa1 (* 161 *) -> (* OP_COMPRESSEDPART_I64 *)
++ EmuleCompressedPart (EmuleCompressedPart.parse true len s)
++ | 0xa2 -> BlocReq (Bloc.parse true len s) (* OP_SENDINGPART_I64 *)
++ | 0xa3 -> QueryBlocReq (QueryBloc.parse true len s) (*OP_REQUESTPARTS_I64 *)
+ | 0xfe (* 254 *) ->
+ EmulePortTestReq s
+
+@@ -1377,8 +1399,8 @@
+ begin
+ match opcode with
+ | 1 -> ConnectReq (Connect.parse false len s)
+- | 70 -> BlocReq (Bloc.parse len s)
+- | 71 -> QueryBlocReq (QueryBloc.parse len s)
++ | 70 -> BlocReq (Bloc.parse false len s)
++ | 71 -> QueryBlocReq (QueryBloc.parse false len s)
+ | 72 -> NoSuchFileReq (NoSuchFile.parse len s)
+ | 73 -> EndOfDownloadReq (EndOfDownload.parse len s)
+ | 74 -> ViewFilesReq (ViewFiles.parse len s)
+@@ -1396,8 +1418,8 @@
+ | 85 -> AvailableSlotReq (AvailableSlot.parse len s)
+ (* ReleaseSlot: the upload is finished *)
+ | 86 -> ReleaseSlotReq (ReleaseSlot.parse len s)
+-(* CloseSlot: the upload slot is not available *)
+- | 87 -> CloseSlotReq (CloseSlot.parse len s)
++(* OutOfParts: the upload slot is not available *)
++ | 87 -> OutOfPartsReq (OutOfParts.parse len s)
+ | 88 -> QueryFileReq (QueryFile.parse emule_version len s)
+ | 89 -> QueryFileReplyReq (QueryFileReply.parse len s)
+ | 92 -> QueueRankReq (QueueRank.parse len s)
+@@ -1470,6 +1492,8 @@
+ | EmuleQueueRankingReq _
+ | EmuleCompressedPart _
+ -> 0xC5
++ | QueryBlocReq t when t.QueryBloc.usesixtyfour -> 0xC5
++ | BlocReq t when t.Bloc.usesixtyfour -> 0xC5
+ | _
+ -> 227
+ in
+@@ -1491,10 +1515,10 @@
+ buf_int8 buf 77;
+ OtherLocations.write buf t
+ | QueryBlocReq t ->
+- buf_int8 buf 71;
++ buf_int8 buf (if t.QueryBloc.usesixtyfour then 0xa3 else 71);
+ QueryBloc.write buf t
+ | BlocReq t ->
+- buf_int8 buf 70;
++ buf_int8 buf (if t.Bloc.usesixtyfour then 0xa2 else 70);
+ Bloc.write buf t
+ | JoinQueueReq t ->
+ buf_int8 buf 84;
+@@ -1517,9 +1541,9 @@
+ | ReleaseSlotReq t ->
+ buf_int8 buf 86;
+ ReleaseSlot.write buf t
+- | CloseSlotReq t ->
++ | OutOfPartsReq t ->
+ buf_int8 buf 87;
+- CloseSlot.write buf t
++ OutOfParts.write buf t
+ | ViewFilesReq t ->
+ buf_int8 buf 74;
+ ViewFiles.write buf t
+@@ -1578,13 +1602,9 @@
+ | EmuleFileDescReq t ->
+ buf_int8 buf 0x61;
+ EmuleFileDesc.write buf t
+- | EmuleCompressedPart (md4, statpos, newsize, bloc) ->
+- buf_int8 buf 0x40;
+- buf_md4 buf md4;
+- buf_int64_32 buf statpos;
+- buf_int64_32 buf newsize;
+- Buffer.add_string buf bloc
+-
++ | EmuleCompressedPart t ->
++ buf_int8 buf (if t.EmuleCompressedPart.usesixtyfour then 0xa1 else 0x40);
++ EmuleCompressedPart.write buf t
+ | EmuleMultiPacketReq (md4, list) ->
+ buf_int8 buf 0x92;
+ buf_md4 buf md4;
Index: src/networks/donkey/donkeyProtoCom.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyProtoCom.ml,v
retrieving revision 1.33
-retrieving revision 1.34
-diff -u -r1.33 -r1.34
+retrieving revision 1.36
+diff -u -r1.33 -r1.36
--- src/networks/donkey/donkeyProtoCom.ml 8 Oct 2006 14:20:22 -0000 1.33
-+++ src/networks/donkey/donkeyProtoCom.ml 2 Dec 2006 12:35:46 -0000 1.34
-@@ -339,8 +339,8 @@
++++ src/networks/donkey/donkeyProtoCom.ml 8 Jan 2007 11:06:42 -0000 1.36
+@@ -79,14 +79,7 @@
+ let client_send c m =
+ let emule_version = c.client_emule_proto in
+ if !verbose_msg_clients || c.client_debug then begin
+- lprintf_nl "Sent to client[%d] %s(%s) %s" (client_num c)
+- c.client_name (brand_to_string c.client_brand)
+- (match c.client_kind with
+- Indirect_address (server_ip, server_port, ip, port, real_ip) ->
+- Printf.sprintf "[%s:%d]" (Ip.to_string (ip_of_id ip)) port
+- | Direct_address (ip,port) -> Printf.sprintf "[%s:%d]" (Ip.to_string ip) port
+- | Invalid_address _ -> ""
+- );
++ lprintf_nl "Sent to client %s" (full_client_identifier c);
+ DonkeyProtoClient.print m;
+ lprint_newline ();
+ end;
+@@ -234,7 +227,8 @@
+ if !verbose_share then lprintf_nl "tag_file: Sharing %s" name;
+ name
+ ))::
+- (int64_tag Field_Size file.file_file.impl_file_size) ::
++ (int64_tag Field_Size_Hi (Int64.shift_right_logical file.file_file.impl_file_size 32)) ::
++ (int64_tag Field_Size (Int64.logand file.file_file.impl_file_size 0xffffffffL)) ::
+ (
+ (match file.file_format with
+ FormatNotComputed next_time when
+@@ -339,8 +333,8 @@
str_int s 0 nfiles;
let s = String.sub s 0 prev_len in
if !verbose_share || !verbose then
@@ -6470,10 +10376,10 @@ Index: src/networks/donkey/donkeyProtoServer.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyProtoServer.ml,v
retrieving revision 1.23
-retrieving revision 1.25
-diff -u -r1.23 -r1.25
+retrieving revision 1.26
+diff -u -r1.23 -r1.26
--- src/networks/donkey/donkeyProtoServer.ml 26 Nov 2006 16:36:29 -0000 1.23
-+++ src/networks/donkey/donkeyProtoServer.ml 3 Dec 2006 20:49:42 -0000 1.25
++++ src/networks/donkey/donkeyProtoServer.ml 6 Jan 2007 18:15:17 -0000 1.26
@@ -28,31 +28,6 @@
open DonkeyTypes
open DonkeyMftp
@@ -6545,6 +10451,21 @@ diff -u -r1.23 -r1.25
]
let rec parse_clients s pos nclients left =
+@@ -833,7 +808,13 @@
+ Printf.bprintf oc "QUERY LOCATION OF %s [%Ld]\n" (Md4.to_string t.md4) t.size
+
+ let write buf t =
+- buf_md4 buf t.md4; buf_int64_32 buf t.size
++ buf_md4 buf t.md4;
++ if t.size > old_max_emule_file_size then
++ begin
++ buf_int64_32 buf 0L; buf_int64 buf t.size
++ end
++ else
++ buf_int64_32 buf t.size
+ end
+
+ module QueryLocationReply = struct
Index: src/networks/donkey/donkeyProtoUdp.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyProtoUdp.ml,v
@@ -6637,10 +10558,10 @@ Index: src/networks/donkey/donkeyShare.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyShare.ml,v
retrieving revision 1.55
-retrieving revision 1.56
-diff -u -r1.55 -r1.56
+retrieving revision 1.58
+diff -u -r1.55 -r1.58
--- src/networks/donkey/donkeyShare.ml 9 Oct 2006 16:17:19 -0000 1.55
-+++ src/networks/donkey/donkeyShare.ml 3 Dec 2006 20:57:56 -0000 1.56
++++ src/networks/donkey/donkeyShare.ml 28 Jan 2007 20:26:46 -0000 1.58
@@ -44,12 +44,7 @@
| Some _ -> ()
| None ->
@@ -6664,7 +10585,35 @@ diff -u -r1.55 -r1.56
impl_shared_servers = []
} in
file.file_shared <- Some impl;
-@@ -333,12 +328,6 @@
+@@ -189,12 +184,17 @@
+ build a list of files_to_send with yet unpublished files *)
+ begin
+ let files_to_send = ref [] in
++ let can_publish f = not (file_is_largefile f && not s.server_has_largefiles) in
+ List.iter (fun f ->
+ match f.file_shared with
+ Some impl ->
+ if not (List.mem (CommonServer.as_server s.server_server) impl.impl_shared_servers)
+- && List.length !files_to_send < !!max_published_files then
++ && List.length !files_to_send < !!max_published_files && can_publish f then
+ files_to_send := f :: !files_to_send
++ else
++ if not (can_publish f) then
++ lprintf_nl "Can not publish largefile %s because server %s does not support largefiles"
++ (file_best_name f) (string_of_server s)
+ | _ -> () (* this case never happens *)
+ ) all_shared;
+
+@@ -221,7 +221,7 @@
+
+ end
+ end
+- ) (connected_servers ());
++ ) (logged_in_servers ());
+
+ (*
+ The problem: sh.shared_fd might be closed during the execution of the
+@@ -333,12 +333,6 @@
let found = ref false in
List.iter (fun sh -> if sh.shared_name = fullname then found := true) !shared_files;
if not !found then begin
@@ -6677,7 +10626,7 @@ diff -u -r1.55 -r1.56
let rec impl = {
impl_shared_update = 1;
impl_shared_fullname = fullname;
-@@ -350,7 +339,7 @@
+@@ -350,7 +344,7 @@
impl_shared_id = Md4.null;
impl_shared_val = pre_shared;
impl_shared_requests = 0;
@@ -6718,13 +10667,16 @@ Index: src/networks/donkey/donkeyTypes.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyTypes.ml,v
retrieving revision 1.52
-retrieving revision 1.54
-diff -u -r1.52 -r1.54
+retrieving revision 1.59
+diff -u -r1.52 -r1.59
--- src/networks/donkey/donkeyTypes.ml 26 Nov 2006 16:36:29 -0000 1.52
-+++ src/networks/donkey/donkeyTypes.ml 2 Dec 2006 12:35:46 -0000 1.54
-@@ -33,20 +33,32 @@
++++ src/networks/donkey/donkeyTypes.ml 15 Jan 2007 21:32:56 -0000 1.59
+@@ -32,21 +32,37 @@
+ let lprintf_n fmt =
lprintf2 log_prefix fmt
++exception Donkey_large_file
++
type emule_proto = {
- mutable emule_comments : int;
mutable emule_version : int;
@@ -6736,6 +10688,7 @@ diff -u -r1.52 -r1.54
+ mutable emule_features : int;
+(* emule_miscoptions1 *)
++ mutable received_miscoptions1 : bool;
+ mutable emule_aich : int;
+ mutable emule_unicode : int;
+ mutable emule_udpver : int;
@@ -6753,6 +10706,7 @@ diff -u -r1.52 -r1.54
+ mutable emule_supportpreview : int;
+
+(* emule_miscoptions2 *)
++ mutable received_miscoptions2 : bool;
+ mutable emule_require_crypt : int;
+ mutable emule_request_crypt : int;
+ mutable emule_support_crypt : int;
@@ -6762,7 +10716,39 @@ diff -u -r1.52 -r1.54
}
type emule_tag_name =
-@@ -557,8 +569,10 @@
+@@ -69,15 +85,6 @@
+ mutable nwarnings : int;
+ }
+
+-type client_score =
+- Client_not_connected
+-| Client_has_file
+-| Client_has_priority_file
+-| Client_has_chunk
+-| Client_has_priority_chunk
+-| Client_has_upload
+-| Client_has_priority_upload
+-
+ type reliability =
+ Reliability_neutral
+ | Reliability_reliable
+@@ -100,6 +107,7 @@
+ | Brand_emuleplus
+ | Brand_hydranode
+ | Brand_verycd
++| Brand_imp
+
+ let brand_list = [
+ ( Brand_unknown , "unknown" , "unk" ) ;
+@@ -118,6 +126,7 @@
+ ( Brand_emuleplus , "ePlus" , "eM+" ) ;
+ ( Brand_hydranode , "Hydra" , "Hyd" ) ;
+ ( Brand_verycd , "VeryCD" , "VCD" ) ;
++ ( Brand_imp , "IMPmule" , "IMP" ) ;
+ ]
+
+ let brand_count = List.length brand_list
+@@ -557,20 +566,19 @@
mutable client_checked : bool;
mutable client_connected : bool;
(* statistics *)
@@ -6775,7 +10761,30 @@ diff -u -r1.52 -r1.54
mutable client_brand : brand;
mutable client_brand_mod : brand_mod;
mutable client_osinfo_sent : bool;
-@@ -688,20 +702,32 @@
+ mutable client_osinfo : string option;
+ mutable client_banned : bool;
+- mutable client_score : int;
+- mutable client_next_queue : int;
+ mutable client_rank : int;
+ mutable client_connect_time : int;
+ mutable client_requests_received : int;
+ mutable client_requests_sent: int;
+- mutable client_indirect_address : (Ip.t * Ip.t * int) option;
+ mutable client_slot : slot_status;
+ mutable client_debug : bool;
+ mutable client_pending_messages: string list;
+@@ -602,6 +610,10 @@
+ mutable up_pos : int64;
+ mutable up_end_chunk : int64;
+ mutable up_chunks : (int64 * int64) list;
++ (* zones sent but not yet received by other peer, oldest first *)
++ mutable up_flying_chunks : (int64 * int64) list;
++ mutable up_current : int64;
++ mutable up_finish : bool;
+ mutable up_waiting : bool;
+ }
+
+@@ -688,21 +700,41 @@
CommonServer.server_state (as_server server.server_server)
let dummy_emule_proto = {
@@ -6789,6 +10798,7 @@ diff -u -r1.52 -r1.54
+ emule_features = 0;
+(* emule_miscoptions1 *)
++ received_miscoptions1 = false;
+ emule_aich = 0;
+ emule_unicode = 0;
+ emule_udpver = 0;
@@ -6806,6 +10816,7 @@ diff -u -r1.52 -r1.54
+ emule_supportpreview = 0;
+
+(* emule_miscoptions2 *)
++ received_miscoptions2 = false;
+ emule_require_crypt = 0;
+ emule_request_crypt = 0;
+ emule_support_crypt = 0;
@@ -6815,6 +10826,13 @@ diff -u -r1.52 -r1.54
}
let emule_proto () =
+ { dummy_emule_proto with emule_version = 0 }
++
++let old_max_emule_file_size = 4290048000L
++(* #define OLD_MAX_EMULE_FILE_SIZE 4290048000ui64 // (4294967295/PARTSIZE)*PARTSIZE = ~4GB *)
++
++let max_emule_file_size = 0x4000000000L
++(* #define MAX_EMULE_FILE_SIZE 0x4000000000ui64 // = 2^38 = 256GB *)
Index: src/networks/donkey/donkeyUdp.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyUdp.ml,v
@@ -6897,10 +10915,10 @@ Index: src/networks/fasttrack/fasttrackProto.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/fasttrack/fasttrackProto.ml,v
retrieving revision 1.17
-retrieving revision 1.18
-diff -u -r1.17 -r1.18
+retrieving revision 1.19
+diff -u -r1.17 -r1.19
--- src/networks/fasttrack/fasttrackProto.ml 28 Aug 2006 18:19:16 -0000 1.17
-+++ src/networks/fasttrack/fasttrackProto.ml 3 Dec 2006 20:49:42 -0000 1.18
++++ src/networks/fasttrack/fasttrackProto.ml 6 Jan 2007 18:15:17 -0000 1.19
@@ -108,30 +108,30 @@
let tag_of_tag tag s =
@@ -6945,17 +10963,18 @@ diff -u -r1.17 -r1.18
let n1, pos = get_dynint s 0 in
let n2, pos = get_dynint s pos in
{ tag_name = tag; tag_value = Pair (n1, n2) }
-@@ -145,7 +145,8 @@
+@@ -145,7 +145,9 @@
| Field_Lastseencomplete
| Field_Mediacodec
| Field_Medialength
- | Field_UNKNOWN _ ->
++ | Field_Size_Hi
+ | Field_UNKNOWN _
+ | Field_KNOWN _ ->
string_tag tag s
-@@ -433,7 +434,7 @@
+@@ -433,7 +435,7 @@
let tags =
if words <> "" then
@@ -6964,7 +10983,7 @@ diff -u -r1.17 -r1.18
else tags in
buf_int8 b (List.length tags);
-@@ -458,7 +459,7 @@
+@@ -458,7 +460,7 @@
buf_int8 b (
try List.assoc tag name_of_tag with
_ -> match tag with
@@ -6973,7 +10992,7 @@ diff -u -r1.17 -r1.18
| _ -> assert false);
buf_string b s;
) tags;
-@@ -869,7 +870,7 @@
+@@ -869,7 +871,7 @@
let tag = try
List2.assoc_inv tag name_of_tag
with _ ->
@@ -6982,7 +11001,7 @@ diff -u -r1.17 -r1.18
in
iter_tags (pos + tag_len) (n-1)
((new_tag tag tagdata) :: tags)
-@@ -916,7 +917,7 @@
+@@ -916,7 +918,7 @@
List2.assoc_inv tag name_of_tag
with Not_found ->
lprintf "WARNING Unknown tag %d\n" tag;
@@ -6991,7 +11010,7 @@ diff -u -r1.17 -r1.18
in
let v, pos = get_string m (pos+2) in
let tag = tag_of_tag tag v in
-@@ -1939,6 +1940,7 @@
+@@ -1939,6 +1941,7 @@
| Field_Artist
| Field_Title
| Field_Codec
@@ -6999,7 +11018,14 @@ diff -u -r1.17 -r1.18
| Field_UNKNOWN _
| Field_Filename ->
tags := (Substring, string_tag field w) :: !tags
-@@ -1957,14 +1959,14 @@
+@@ -1951,20 +1954,21 @@
+ | Field_Lastseencomplete
+ | Field_Mediacodec
+ | Field_Medialength
++ | Field_Size_Hi
+ | Field_Size -> ()
+ end
+ | QHasMinVal (field, value) ->
begin
match field with
| Field_Size
@@ -7128,6 +11154,22 @@ diff -u -r1.52 -r1.53
("", "sr", info.GuiTypes.file_name); ]);
true
)
+Index: src/networks/fileTP/fileTPOptions.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/fileTP/fileTPOptions.ml,v
+retrieving revision 1.11
+retrieving revision 1.12
+diff -u -r1.11 -r1.12
+--- src/networks/fileTP/fileTPOptions.ml 30 May 2006 10:54:14 -0000 1.11
++++ src/networks/fileTP/fileTPOptions.ml 15 Jan 2007 18:26:27 -0000 1.12
+@@ -55,6 +55,7 @@
+ string_option "range"
+
+ let options_version = define_option fileTP_section ["options_version"]
++ ~internal: true
+ "(internal option)"
+ int_option 0
+
Index: src/networks/fileTP/fileTPSSH.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/fileTP/fileTPSSH.ml,v
@@ -7196,6 +11238,59 @@ diff -u -r1.67 -r1.68
("", "sr", info.GuiTypes.file_name); ]);
true
)
+Index: src/networks/gnutella/gnutellaOptions.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/gnutella/gnutellaOptions.ml,v
+retrieving revision 1.20
+retrieving revision 1.21
+diff -u -r1.20 -r1.21
+--- src/networks/gnutella/gnutellaOptions.ml 12 May 2006 21:02:38 -0000 1.20
++++ src/networks/gnutella/gnutellaOptions.ml 15 Jan 2007 18:26:27 -0000 1.21
+@@ -37,6 +37,7 @@
+ if !!max_ultrapeers > 10 then max_ultrapeers =:= 10)
+
+ let client_port = define_option gnutella_section ["client_port"]
++ ~restart: true
+ "The port to bind the client to"
+ int_option GnutellaNetwork.port
+
+@@ -155,6 +156,7 @@
+ string_option ""
+
+ let options_version = define_option gnutella_section ["options_version"]
++ ~internal: true
+ "(internal option)"
+ int_option 0
+
+Index: src/networks/openFT/openFTOptions.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/openFT/openFTOptions.ml,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- src/networks/openFT/openFTOptions.ml 5 Nov 2005 16:23:41 -0000 1.4
++++ src/networks/openFT/openFTOptions.ml 15 Jan 2007 18:26:27 -0000 1.5
+@@ -27,10 +27,12 @@
+ int_option 5
+
+ let port = define_option openft_ini ["client_port"]
++ ~restart: true
+ "The port to bind the client to"
+ int_option 1215
+
+ let http_port = define_option openft_ini ["http_port"]
++ ~restart: true
+ "The port to bind the client to for downloads"
+ int_option 1216
+
+@@ -43,6 +45,7 @@
+ int_option 20
+
+ let options_version = define_option openft_ini ["options_version"]
++ ~internal: true
+ "(internal option)"
+ int_option 0
+
Index: src/networks/opennap/opennapInteractive.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/opennap/opennapInteractive.ml,v
@@ -7222,6 +11317,30 @@ diff -u -r1.26 -r1.27
{ t with S.bitrate = Some (Int64.to_int value, OP.AtBest) };
| Field_Size -> t
| _ -> t
+Index: src/networks/opennap/opennapOptions.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/networks/opennap/opennapOptions.ml,v
+retrieving revision 1.11
+retrieving revision 1.12
+diff -u -r1.11 -r1.12
+--- src/networks/opennap/opennapOptions.ml 5 Nov 2005 16:23:41 -0000 1.11
++++ src/networks/opennap/opennapOptions.ml 15 Jan 2007 18:26:27 -0000 1.12
+@@ -27,6 +27,7 @@
+ let opennap_section = file_section opennap_ini ["Opennap"] "Opennap options"
+
+ let client_port = define_option opennap_section ["client_port"]
++ ~restart: true
+ "The port to bind the client to"
+ int_option 6699
+
+@@ -63,6 +64,7 @@
+ int_option 400
+
+ let options_version = define_expert_option opennap_section ["options_version"]
++ ~internal: true
+ "(internal option)"
+ int_option 0
+
Index: src/networks/server/serverUdp.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/server/serverUdp.ml,v
@@ -7239,169 +11358,39 @@ diff -u -r1.2 -r1.3
s1.DonkeyTypes.server_last_message >=
s2.DonkeyTypes.server_last_message
) !alive_servers in
-Index: src/utils/cdk/sort2.ml
+Index: src/networks/soulseek/slskOptions.ml
===================================================================
-RCS file: src/utils/cdk/sort2.ml
-diff -N src/utils/cdk/sort2.ml
---- src/utils/cdk/sort2.ml 22 Apr 2003 22:33:39 -0000 1.1
-+++ /dev/null 1 Jan 1970 00:00:00 -0000
-@@ -1,97 +0,0 @@
--(***********************************************************************)
--(* *)
--(* Objective Caml *)
--(* *)
--(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
--(* *)
--(* Copyright 1996 Institut National de Recherche en Informatique et *)
--(* en Automatique. All rights reserved. This file is distributed *)
--(* under the terms of the GNU Library General Public License, with *)
--(* the special exception on linking described in file ../LICENSE. *)
--(* *)
--(***********************************************************************)
--
--(* Merging and sorting *)
--
--open Array
--
-- (*
--let rec merge order l1 l2 =
-- match l1 with
-- [] -> l2
-- | h1 :: t1 ->
-- match l2 with
-- [] -> l1
-- | h2 :: t2 ->
-- if order h1 h2
-- then h1 :: merge order t1 l2
-- else h2 :: merge order l1 t2
--
--let list order l =
-- let rec initlist = function
-- [] -> []
-- | [e] -> [[e]]
-- | e1::e2::rest ->
-- (if order e1 e2 then [e1;e2] else [e2;e1]) :: initlist rest in
-- let rec merge2 = function
-- l1::l2::rest -> merge order l1 l2 :: merge2 rest
-- | x -> x in
-- let rec mergeall = function
-- [] -> []
-- | [l] -> l
-- | llist -> mergeall (merge2 llist) in
-- mergeall(initlist l)
-- *)
--
--let swap arr i j =
-- let tmp = unsafe_get arr i in
-- unsafe_set arr i (unsafe_get arr j);
-- unsafe_set arr j tmp
--
--let subarray cmp arr pos len =
-- let rec qsort lo hi =
-- if hi - lo >= 6 then begin
-- let mid = (lo + hi) lsr 1 in
-- (* Select median value from among LO, MID, and HI. Rearrange
-- LO and HI so the three values are sorted. This lowers the
-- probability of picking a pathological pivot. It also
-- avoids extra comparisons on i and j in the two tight "while"
-- loops below. *)
-- if cmp (unsafe_get arr mid) (unsafe_get arr lo) <= 0 then swap arr mid lo;
-- if cmp (unsafe_get arr hi) (unsafe_get arr mid) <= 0 then begin
-- swap arr mid hi;
-- if cmp (unsafe_get arr mid) (unsafe_get arr lo) <= 0 then swap arr mid lo
-- end;
-- let pivot = unsafe_get arr mid in
-- let i = ref (lo + 1) and j = ref (hi - 1) in
-- if not (cmp pivot (unsafe_get arr hi) <= 0)
-- || not (cmp (unsafe_get arr lo) pivot <= 0)
-- then raise (Invalid_argument "Sort.array");
-- while !i < !j do
-- while not (cmp pivot (unsafe_get arr !i) <= 0) do incr i done;
-- while not (cmp (unsafe_get arr !j) pivot <= 0) do decr j done;
-- if !i < !j then swap arr !i !j;
-- incr i; decr j
-- done;
-- (* Recursion on smaller half, tail-call on larger half *)
-- if !j - lo <= hi - !i then begin
-- qsort lo !j; qsort !i hi
-- end else begin
-- qsort !i hi; qsort lo !j
-- end
-- end in
-- qsort pos (pos+len-1);
-- (* Finish sorting by insertion sort *)
-- for i = pos+1 to pos+len - 1 do
-- let val_i = (unsafe_get arr i) in
-- if not (cmp (unsafe_get arr (i - 1)) val_i <= 0) then begin
-- unsafe_set arr i (unsafe_get arr (i - 1));
-- let j = ref (i - 1) in
-- while !j >= 1 && not (cmp (unsafe_get arr (!j - 1)) val_i <= 0) do
-- unsafe_set arr !j (unsafe_get arr (!j - 1));
-- decr j
-- done;
-- unsafe_set arr !j val_i
-- end
-- done
--
-Index: src/utils/cdk/sort2.mli
-===================================================================
-RCS file: src/utils/cdk/sort2.mli
-diff -N src/utils/cdk/sort2.mli
---- src/utils/cdk/sort2.mli 22 Apr 2003 22:33:39 -0000 1.1
-+++ /dev/null 1 Jan 1970 00:00:00 -0000
-@@ -1,43 +0,0 @@
--(***********************************************************************)
--(* *)
--(* Objective Caml *)
--(* *)
--(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
--(* *)
--(* Copyright 1996 Institut National de Recherche en Informatique et *)
--(* en Automatique. All rights reserved. This file is distributed *)
--(* under the terms of the GNU Library General Public License, with *)
--(* the special exception on linking described in file ../LICENSE. *)
--(* *)
--(***********************************************************************)
--
--(** Sorting and merging lists.
--
-- @deprecated This module is obsolete and exists only for backward
-- compatibility.
-- The sorting functions in {!Array} and {!List} should be used instead.
-- The new functions are faster and use less memory.
--*)
--
--(*
--val list : ('a -> 'a -> bool) -> 'a list -> 'a list
--(** Sort a list in increasing order according to an ordering predicate.
-- The predicate should return [true] if its first argument is
-- less than or equal to its second argument. *)
--*)
--
--val subarray : ('a -> 'a -> int) -> 'a array -> int -> int -> unit
--(** Sort an array in increasing order according to an
-- ordering predicate.
-- The predicate should return [true] if its first argument is
-- less than or equal to its second argument.
-- The array is sorted in place. *)
--
-- (*
--val merge : ('a -> 'a -> bool) -> 'a list -> 'a list -> 'a list
--(** Merge two lists according to the given predicate.
-- Assuming the two argument lists are sorted according to the
-- predicate, [merge] returns a sorted list containing the elements
-- from the two lists. The behavior is undefined if the two
-- argument lists were not sorted. *)
--*)
+RCS file: /sources/mldonkey/mldonkey/src/networks/soulseek/slskOptions.ml,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- src/networks/soulseek/slskOptions.ml 5 Nov 2005 16:23:41 -0000 1.9
++++ src/networks/soulseek/slskOptions.ml 15 Jan 2007 18:26:27 -0000 1.10
+@@ -46,6 +46,7 @@
+ *)
+
+ let slsk_port = define_option soulseek_section ["client_port"]
++ ~restart: true
+ "The port to bind the client to"
+ int_option 2234
+
+@@ -74,6 +75,7 @@
+ "the last token used for a query is saved here" int_option 1
+
+ let options_version = define_option soulseek_section ["options_version"]
++ ~internal: true
+ "(internal option)"
+ int_option 0
+
Index: src/utils/cdk/string2.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/utils/cdk/string2.ml,v
retrieving revision 1.9
-retrieving revision 1.10
-diff -u -r1.9 -r1.10
+retrieving revision 1.11
+diff -u -r1.9 -r1.11
--- src/utils/cdk/string2.ml 20 Jul 2006 15:30:21 -0000 1.9
-+++ src/utils/cdk/string2.ml 3 Dec 2006 20:49:43 -0000 1.10
-@@ -322,3 +322,9 @@
++++ src/utils/cdk/string2.ml 28 Jan 2007 20:39:59 -0000 1.11
+@@ -322,3 +322,19 @@
i >= l || p s.[i] && aux (i+1) in
aux 0
@@ -7411,27 +11400,54 @@ diff -u -r1.9 -r1.10
+ Printf.bprintf buf "%02x " (int_of_char c)
+ ) s;
+ Buffer.contents buf
++
++let ( |> ) x f = f x
++
++let dehtmlize =
++ let br_regexp = Str.regexp_case_fold "<br>" in
++ let tag_regexp = Str.regexp "<[^>]*>" in
++ fun s ->
++ s
++ |> Str.global_replace br_regexp "\n"
++ |> Str.global_replace tag_regexp ""
Index: src/utils/cdk/string2.mli
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/utils/cdk/string2.mli,v
retrieving revision 1.10
-retrieving revision 1.11
-diff -u -r1.10 -r1.11
+retrieving revision 1.12
+diff -u -r1.10 -r1.12
--- src/utils/cdk/string2.mli 20 Jul 2006 15:30:21 -0000 1.10
-+++ src/utils/cdk/string2.mli 3 Dec 2006 20:49:43 -0000 1.11
-@@ -103,3 +103,4 @@
++++ src/utils/cdk/string2.mli 28 Jan 2007 20:39:59 -0000 1.12
+@@ -103,3 +103,8 @@
val exists: (char -> bool) -> string -> bool
val existsi: (int -> char -> bool) -> string -> bool
val for_all: (char -> bool) -> string -> bool
+val hex_string_of_string : string -> string
++
++(* [dehtmlize s] replace all <br> with \n and remove all remaining html tags from string [s] *)
++val dehtmlize: string -> string
++
Index: src/utils/cdk/unix2.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/utils/cdk/unix2.ml,v
retrieving revision 1.31
-retrieving revision 1.32
-diff -u -r1.31 -r1.32
+retrieving revision 1.33
+diff -u -r1.31 -r1.33
--- src/utils/cdk/unix2.ml 12 Aug 2006 20:36:14 -0000 1.31
-+++ src/utils/cdk/unix2.ml 28 Nov 2006 23:52:17 -0000 1.32
++++ src/utils/cdk/unix2.ml 6 Feb 2007 22:26:59 -0000 1.33
+@@ -78,10 +78,10 @@
+ with End_of_file -> ())
+
+ let is_directory filename =
+- try let s = Unix.stat filename in s.st_kind = S_DIR with _ -> false
++ try let s = Unix.LargeFile.stat filename in s.LargeFile.st_kind = S_DIR with _ -> false
+
+ let is_link filename =
+- try let s = Unix.lstat filename in s.st_kind = S_LNK with _ -> false
++ try let s = Unix.LargeFile.lstat filename in s.LargeFile.st_kind = S_LNK with _ -> false
+
+ let chmod f o =
+ try
@@ -89,7 +89,7 @@
with e ->
lprintf_nl "warning: chmod failed on %s: %s" f (Printexc2.to_string e)
@@ -7454,24 +11470,340 @@ diff -u -r1.31 -r1.32
let copy oldname newname =
tryopen_read_bin oldname (fun ic ->
-+ let stats = Unix.fstat (Unix.descr_of_in_channel ic) in
++ let stats = Unix.LargeFile.fstat (Unix.descr_of_in_channel ic) in
tryopen_write_bin newname (fun oc ->
+ let descr = Unix.descr_of_out_channel oc in
-+ (try Unix.fchown descr stats.Unix.st_uid stats.Unix.st_gid
++ (try Unix.fchown descr stats.Unix.LargeFile.st_uid stats.Unix.LargeFile.st_gid
+ with e -> lprintf_nl "copy: failed to preserve owner");
-+ (try Unix.fchmod descr stats.Unix.st_perm
++ (try Unix.fchmod descr stats.Unix.LargeFile.st_perm
+ with e -> lprintf_nl "copy: failed to preserve mode");
let buffer_len = 8192 in
let buffer = String.create buffer_len in
let rec copy_file () =
+Index: src/utils/cdk/zip.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/utils/cdk/zip.ml,v
+retrieving revision 1.7
+retrieving revision 1.8
+diff -u -r1.7 -r1.8
+--- src/utils/cdk/zip.ml 20 Jul 2006 11:33:58 -0000 1.7
++++ src/utils/cdk/zip.ml 6 Feb 2007 22:26:59 -0000 1.8
+@@ -10,7 +10,7 @@
+ (* *)
+ (***********************************************************************)
+
+-(* $Id: zip.ml,v 1.7 2006/07/20 11:33:58 spiralvoice Exp $ *)
++(* $Id: zip.ml,v 1.8 2007/02/06 22:26:59 spiralvoice Exp $ *)
+
+ (* Module [Zip]: reading and writing ZIP archives *)
+
+@@ -544,7 +544,7 @@
+ match mtime with
+ Some t -> mtime
+ | None ->
+- try Some((Unix.stat infilename).Unix.st_mtime)
++ try Some((Unix.LargeFile.stat infilename).Unix.LargeFile.st_mtime)
+ with Unix.Unix_error(_,_,_) -> None in
+ try
+ copy_channel_to_entry ic ofile ~extra ~comment ~level ?mtime:mtime' name;
+Index: src/utils/lib/misc.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/utils/lib/misc.ml,v
+retrieving revision 1.7
+retrieving revision 1.8
+diff -u -r1.7 -r1.8
+--- src/utils/lib/misc.ml 25 Oct 2006 11:12:38 -0000 1.7
++++ src/utils/lib/misc.ml 6 Feb 2007 22:26:59 -0000 1.8
+@@ -67,12 +67,13 @@
+ List.iter (zip_extract_entry ic) (Zip.entries ic))
+
+ let rec zip_add_entry oc file =
+- let s = Unix.stat file in
+- match s.Unix.st_kind with
++ let module U = Unix.LargeFile in
++ let s = U.stat file in
++ match s.U.st_kind with
+ Unix.S_REG ->
+- Zip.copy_file_to_entry file oc ~mtime:s.Unix.st_mtime file
++ Zip.copy_file_to_entry file oc ~mtime:s.U.st_mtime file
+ | Unix.S_DIR ->
+- Zip.add_entry "" oc ~mtime:s.Unix.st_mtime
++ Zip.add_entry "" oc ~mtime:s.U.st_mtime
+ (if Filename.check_suffix file "/" then file else file ^ "/");
+ Unix2.tryopen_dir file (fun d ->
+ try
+Index: src/utils/lib/options.ml4
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/utils/lib/options.ml4,v
+retrieving revision 1.22
+retrieving revision 1.23
+diff -u -r1.22 -r1.23
+--- src/utils/lib/options.ml4 21 Oct 2006 19:35:54 -0000 1.22
++++ src/utils/lib/options.ml4 15 Jan 2007 18:26:27 -0000 1.23
+@@ -61,6 +61,9 @@
+ mutable option_hooks : (unit -> unit) list;
+ option_section : options_section;
+ option_advanced : bool;
++ option_restart : bool;
++ option_public : bool;
++ option_internal : bool;
+ }
+ and options_file =
+ { mutable file_name : string;
+@@ -137,6 +140,7 @@
+
+ let define_simple_option
+ normalp (section : options_section) (option_name : string list) desc
++ restart public internal
+ (option_help : string) (option_class : 'a option_class)
+ (default_value : 'a) (advanced : bool) =
+ let desc = match desc with None -> "" | Some s -> s in
+@@ -145,6 +149,9 @@
+ option_class = option_class; option_value = default_value;
+ option_default = default_value;
+ option_hooks = []; option_section = section;
++ option_restart = (match restart with None -> false | Some v -> v);
++ option_public = (match public with None -> false | Some v -> v);
++ option_internal = (match internal with None -> false | Some v -> v);
+ option_advanced = advanced; option_desc = desc; }
+ in
+ section.section_options <-
+@@ -168,16 +175,16 @@
+ let define_header_option
+ opfile option_name option_help option_class default_value =
+ define_simple_option false (List.hd opfile.file_sections)
+- option_name None option_help option_class
++ option_name None None None None option_help option_class
+ default_value false
+
+-let define_option opfile option_name ?desc option_help option_class default_value =
+- define_simple_option true opfile option_name desc option_help option_class
++let define_option opfile option_name ?desc ?restart ?public ?internal option_help option_class default_value =
++ define_simple_option true opfile option_name desc restart public internal option_help option_class
+ default_value false
+
+ let define_expert_option
+- opfile option_name ?desc option_help option_class default_value =
+- define_simple_option true opfile option_name desc option_help option_class
++ opfile option_name ?desc ?restart ?public ?internal option_help option_class default_value =
++ define_simple_option true opfile option_name desc restart public internal option_help option_class
+ default_value true
+
+
+@@ -379,12 +386,16 @@
+ let rec save_module indent oc list =
+ let subm = ref [] in
+ List.iter
+- (fun (name, help, value) ->
++ (fun (name, help, restart, internal, value) ->
+ match name with
+ [] -> assert false
+ | [name] ->
+ if !with_help && help <> "" then
+ Printf.fprintf oc "\n\t(* %s *)\n" (tabulate help);
++ if restart then
++ Printf.fprintf oc "\t(* changing this option requires restart of MLDonkey core *)\n";
++ if internal then
++ Printf.fprintf oc "\t(* Do not change this option, internal use only! *)\n";
+ Printf.fprintf oc "%s %s = " indent (safe_string name);
+ save_value indent oc value;
+ Printf.fprintf oc "\n"
+@@ -393,7 +404,7 @@
+ try List.assoc m !subm with
+ e -> let p = ref [] in subm := (m, p) :: !subm; p
+ in
+- p := (tail, help, value) :: !p)
++ p := (tail, help, restart, internal, value) :: !p)
+ list;
+ List.iter
+ (fun (m, p) ->
+@@ -804,6 +815,7 @@
+
+ let option_to_value o =
+ o.option_name, o.option_help,
++ o.option_restart, o.option_internal,
+ (try o.option_class.to_value o.option_value with
+ e ->
+ lprintf "Error while saving option \"%s\": %s\n"
+@@ -1045,29 +1057,6 @@
+ let help = o.option_help in if help = "" then "No Help Available" else help
+ let advanced o = o.option_advanced
+
+-(*
+-let simple_options opfile =
+- let list = ref [] in
+- List.iter (fun s ->
+- List.iter
+- (fun o ->
+- match o.option_name with
+- [] | _ :: _ :: _ -> ()
+- | [name] ->
+- match o.option_class.to_value o.option_value with
+- Module _ | SmallList _ | List _ | DelayedValue _ ->
+- begin match o.option_class.string_wrappers with
+- None -> ()
+- | Some (to_string, from_string) ->
+- list := (name, to_string o.option_value) :: !list
+- end
+- | v -> list := (name, safe_value_to_string v) :: !list)
+- s.section_options)
+- opfile.file_sections;
+- !list
+-*)
+-
+-
+ let get_option opfile name =
+ (* lprintf "get_option [%s]\n" name;*)
+ let rec iter name list sections =
+@@ -1140,6 +1129,9 @@
+ option_advanced : bool;
+ option_default : string;
+ option_type : string;
++ option_restart : bool;
++ option_public : bool;
++ option_internal : bool;
+ }
+
+ end
+@@ -1173,13 +1165,17 @@
+ M.option_advanced = o.option_advanced;
+ M.option_help = o.option_help;
+ M.option_type = o.option_class.class_name;
++ M.option_restart = o.option_restart;
++ M.option_public = o.option_public;
++ M.option_internal = o.option_internal;
+ }
+
+-let simple_options prefix opfile =
++let simple_options prefix opfile admin =
+ let list = ref [] in
+ List.iter (fun s ->
+ List.iter
+ (fun o ->
++ if admin || o.option_public then
+ try list := strings_of_option prefix o :: !list with _ -> ())
+ s.section_options)
+ opfile.file_sections;
+@@ -1195,7 +1191,7 @@
+ set_simple_option opfile oi.M.option_name s),
+ Printf.sprintf "<string> : \t%s (current: %s)"
+ oi.M.option_help oi.M.option_value)
+- (simple_options prefix opfile)
++ (simple_options prefix opfile true)
+
+ let prefixed_args prefix file =
+ List.map
+@@ -1224,6 +1220,9 @@
+ option_advanced : bool;
+ option_default : string;
+ option_type : string;
++ option_restart : bool;
++ option_public : bool;
++ option_internal : bool;
+ }
+
+ let iter_section f s =
+Index: src/utils/lib/options.mli
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/utils/lib/options.mli,v
+retrieving revision 1.10
+retrieving revision 1.11
+diff -u -r1.10 -r1.11
+--- src/utils/lib/options.mli 21 Oct 2006 19:35:54 -0000 1.10
++++ src/utils/lib/options.mli 15 Jan 2007 18:26:27 -0000 1.11
+@@ -43,6 +43,9 @@
+ option_advanced : bool;
+ option_default : string;
+ option_type : string;
++ option_restart : bool; (* changing this option requires a restart *)
++ option_public : bool; (* send this option to GUIs even for non-admin users *)
++ option_internal : bool; (* this option should not be changed by users *)
+ }
+
+ exception SideEffectOption
+@@ -77,9 +80,11 @@
+ (*4 Creating options *)
+ val define_option : options_section ->
+ string list -> ?desc: string ->
++ ?restart: bool -> ?public: bool -> ?internal: bool ->
+ string -> 'a option_class -> 'a -> 'a option_record
+ val define_expert_option : options_section ->
+ string list -> ?desc: string ->
++ ?restart: bool -> ?public: bool -> ?internal: bool ->
+ string -> 'a option_class -> 'a -> 'a option_record
+ val define_header_option : options_file ->
+ string list -> string -> 'a option_class -> 'a -> 'a option_record
+@@ -183,7 +188,7 @@
+ val value_to_filename : option_value -> string
+
+ val set_simple_option : options_file -> string -> string -> unit
+-val simple_options : string -> options_file -> option_info list
++val simple_options : string -> options_file -> bool -> option_info list
+ val get_simple_option : options_file -> string -> string
+ val set_option_hook : options_file -> string -> (unit -> unit) -> unit
+
+Index: src/utils/lib/os_stubs.h
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/utils/lib/os_stubs.h,v
+retrieving revision 1.16
+retrieving revision 1.17
+diff -u -r1.16 -r1.17
+--- src/utils/lib/os_stubs.h 5 Sep 2006 14:19:10 -0000 1.16
++++ src/utils/lib/os_stubs.h 8 Jan 2007 11:02:08 -0000 1.17
+@@ -34,6 +34,7 @@
+ typedef SOCKET OS_SOCKET;
+ typedef unsigned int uint;
+ extern void win32_maperr(unsigned long errcode);
++unsigned char * utf8_to_utf16(const char * str);
+
+ /*******************************************************************
+
+Index: src/utils/lib/stubs_c.c
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/utils/lib/stubs_c.c,v
+retrieving revision 1.42
+retrieving revision 1.43
+diff -u -r1.42 -r1.43
+--- src/utils/lib/stubs_c.c 15 Aug 2006 11:32:51 -0000 1.42
++++ src/utils/lib/stubs_c.c 8 Jan 2007 11:02:08 -0000 1.43
+@@ -954,7 +954,7 @@
+ FARPROC f;
+ int retval = 0;
+ WCHAR tmp [MAX_PATH], resolved_path [MAX_PATH];
+- WCHAR * wpath=utf8_to_utf16(path);
++ WCHAR * wpath = (WCHAR *)utf8_to_utf16(path);
+ realpath(wpath, resolved_path);
+ free(wpath);
+ if (!resolved_path)
+Index: src/utils/lib/syslog.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/utils/lib/syslog.ml,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- src/utils/lib/syslog.ml 24 Jul 2006 20:15:16 -0000 1.2
++++ src/utils/lib/syslog.ml 6 Feb 2007 22:26:59 -0000 1.3
+@@ -124,10 +124,11 @@
+ }
+
+ let open_connection loginfo =
++ let module U = Unix.LargeFile in
+ match loginfo.logpath with
+ "" -> raise (Syslog_error "unable to find the syslog socket or pipe, is syslogd running?")
+ | logpath ->
+- (match (Unix.stat logpath).Unix.st_kind with
++ (match (U.stat logpath).U.st_kind with
+ Unix.S_SOCK ->
+ let logaddr = Unix.ADDR_UNIX logpath in
+ (try
Index: src/utils/lib/unix32.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/utils/lib/unix32.ml,v
retrieving revision 1.65
-retrieving revision 1.66
-diff -u -r1.65 -r1.66
+retrieving revision 1.67
+diff -u -r1.65 -r1.67
--- src/utils/lib/unix32.ml 15 Jul 2006 11:52:54 -0000 1.65
-+++ src/utils/lib/unix32.ml 28 Nov 2006 23:52:18 -0000 1.66
++++ src/utils/lib/unix32.ml 6 Feb 2007 22:26:59 -0000 1.67
@@ -31,15 +31,14 @@
let max_buffered = ref (Int64.of_int (1024 * 1024))
@@ -7500,6 +11832,19 @@ diff -u -r1.65 -r1.66
else
Unix.openfile t.filename ro_flag 0o400
with e ->
+@@ -206,9 +206,9 @@
+ let owner t =
+ try
+ check_destroyed t;
+- let s = Unix.fstat (local_force_fd t) in
+- let user = Unix.getpwuid s.Unix.st_uid in
+- let group = Unix.getgrgid s.Unix.st_gid in
++ let s = Unix.LargeFile.fstat (local_force_fd t) in
++ let user = Unix.getpwuid s.Unix.LargeFile.st_uid in
++ let group = Unix.getgrgid s.Unix.LargeFile.st_gid in
+ user.Unix.pw_name, group.Unix.gr_name
+ with e ->
+ if !verbose then lprintf_nl "Exception in FDCache.owner %s: %s"
@@ -254,9 +254,9 @@
check_destroyed t;
close t;
@@ -7531,3 +11876,26 @@ diff -u -r1.23 -r1.24
val close : t -> unit
(* val force_fd : t -> Unix.file_descr *)
+Index: src/utils/net/http_client.ml
+===================================================================
+RCS file: /sources/mldonkey/mldonkey/src/utils/net/http_client.ml,v
+retrieving revision 1.35
+retrieving revision 1.36
+diff -u -r1.35 -r1.36
+--- src/utils/net/http_client.ml 21 Nov 2006 22:34:34 -0000 1.35
++++ src/utils/net/http_client.ml 4 Feb 2007 17:27:45 -0000 1.36
+@@ -334,6 +334,14 @@
+ raise Not_found
+ end
+
++ | 400 when r.req_request = HEAD ->
++ lprintf_nl "Error 400 received for HEAD %s, re-try GET" (Url.to_string_no_args r.req_url);
++ let r2 = {
++ r with
++ req_request = GET;
++ } in
++ get_page r2 content_handler f ferr
++
+ | 404 ->
+ lprintf_nl "404: Not found for: %s" (Url.to_string_no_args r.req_url);
+ close sock (Closed_for_error "bad reply");