Miklos Tirpak [Mon, 7 Apr 2008 13:31:24 +0000 (13:31 +0000)]
verify the return value of append_branch()
Nils Ohlmeier [Fri, 4 Apr 2008 15:56:15 +0000 (15:56 +0000)]
[Port from 2.0] Fixed authentication issue for non-REGISTER requests
Thanks to Stefan Sayer for this out!
Miklos Tirpak [Fri, 4 Apr 2008 08:40:53 +0000 (08:40 +0000)]
Two configuration variables are introduced that can help
troubleshooting memory leaks: mem_dump_pkg, and mem_dump_shm
Useage:
sercmd cfg.set_now_int mem_dump_pkg <pid_number>
Dumps the pkg memory status of the given processs
sercmd cfg.set_now_int mem_dump_shm 1
Dumps the shm memory status
Miklos Tirpak [Tue, 1 Apr 2008 14:20:50 +0000 (14:20 +0000)]
include cfg_rpc module in the standard module list
Vaclav Kubart [Tue, 1 Apr 2008 13:14:59 +0000 (13:14 +0000)]
added missing '{'
Miklos Tirpak [Tue, 1 Apr 2008 13:05:23 +0000 (13:05 +0000)]
missing include statement is fixed
Pavel Kasparek [Tue, 1 Apr 2008 12:50:28 +0000 (12:50 +0000)]
adding sems to dependencies of ser-ai1 package
Pavel Kasparek [Tue, 1 Apr 2008 09:37:21 +0000 (09:37 +0000)]
added registrar module modparam to limit maximum number of contacts
Bogdan Pintea [Mon, 31 Mar 2008 18:57:54 +0000 (18:57 +0000)]
Various warnings fixed (mostly appearing with 64b compiles).
Closes issue SER-343.
Bogdan Pintea [Mon, 31 Mar 2008 18:41:48 +0000 (18:41 +0000)]
New selects exported, allowing to dissecting the content of an attribute by
interpreting it as a "name-addr" value.
Ex.:
$loaded_uri = "\"display name\" <UserName@HostName;param>"
$user = @avp["$loaded_uri"].nameaddr.uri.user
'$user' will contain "UserName".
Closes issue #SER-365.
Bogdan Pintea [Mon, 31 Mar 2008 18:19:49 +0000 (18:19 +0000)]
New TM export - cancel_all_uacs() - to allow canceling all branches of a
transaction. (Closes issue #SER-253).
Some error messages are corrected to reflect new function name.
(Bits of code for the AS support also added; issue #SER-346 in the works.)
Miklos Tirpak [Mon, 31 Mar 2008 16:26:08 +0000 (16:26 +0000)]
Message flags are updated in shared memory even if they are modified
after the first t_newtran() function call.
Fixes SER-297
Bogdan Pintea [Mon, 31 Mar 2008 06:35:57 +0000 (06:35 +0000)]
New script directive to allow specifying the modules' path. This is equivalent
to the command line parameter -L.
Example:
loadpath "/usr/lib/ser/modules/"
loadmodule "maxfwd"
Closes issue #SER-364.
Miklos Tirpak [Wed, 26 Mar 2008 13:22:36 +0000 (13:22 +0000)]
Do not print out "no more records" ERROR message when use_dns_failover
is enabled, it is not an error, simply there is no more destination
in the SRV or A record.
Miklos Tirpak [Wed, 26 Mar 2008 11:06:03 +0000 (11:06 +0000)]
Message lumps are saved to shared memory when t_relay() is called
the first time, instead of saving them by t_newtran(). The advantage is
that the SIP msg modifications that are made after t_newtran() are saved
as well, and they are propagated to failure route.
t_save_lumps() function is introduced, it can be used to force saving
the lumps before t_relay(), check the doc for details.
Fixes SER-303
The change can be reverted by uncommenting #define POSTPONE_MSG_CLONING
in sip_msg.h.
Miklos Tirpak [Wed, 26 Mar 2008 09:47:18 +0000 (09:47 +0000)]
select_list() function must not return the global class when the global
flag is not set.
Fixes SER-368
Jan Janak [Fri, 21 Mar 2008 13:14:16 +0000 (13:14 +0000)]
- added support for extra authentication checks along with comments explaining
what is checked when and why. Disabled by default.
Miklos Tirpak [Tue, 18 Mar 2008 17:04:16 +0000 (17:04 +0000)]
- Session Timer proxy support is introduced (RFC 4028)
- custom config parameters are added to the script
- t_relay_cancel() is enabled to bypass the routing logic if possible
- NAT fixes (patch from Nils Ohlmeier)
- Record routing and loose routing is split into two parts to support
encoding of AVPs that are lately set in the script (patch from
Nils Ohlmeier)
Miklos Tirpak [Mon, 17 Mar 2008 11:16:19 +0000 (11:16 +0000)]
on_sl_reply module parameter is introduced:
It defines the route block that is called if a reply with no associated
transaction is received.
Closes SER-330
Miklos Tirpak [Mon, 17 Mar 2008 10:39:51 +0000 (10:39 +0000)]
t_drop_replies() script function is introduced.
It can be used to drop the received replies in failure_route block,
and disable all the previous replies to be selected again.
Closes SER-301
Miklos Tirpak [Mon, 17 Mar 2008 09:45:22 +0000 (09:45 +0000)]
fixing function name in the error message
Pavel Kasparek [Thu, 13 Mar 2008 14:17:39 +0000 (14:17 +0000)]
typo fixed
Pavel Kasparek [Thu, 13 Mar 2008 11:12:51 +0000 (11:12 +0000)]
fixing nathelper module parameter name to natping_crlf
Andrei Pelinescu-Onciul [Wed, 12 Mar 2008 20:42:30 +0000 (20:42 +0000)]
- fix: sip_msg_cloner wrongly translated parsed_uri when the message had
new_uri set (probably not seen until now because we set parsed_uri_ok to 0
on failure route and we didn't have non-failure callbacks causing the uri to
be reparsed)
Andrei Pelinescu-Onciul [Tue, 11 Mar 2008 23:59:27 +0000 (23:59 +0000)]
- use cancel_b_method also when CANCEL-ing due to received 6xx
Andrei Pelinescu-Onciul [Tue, 11 Mar 2008 22:05:44 +0000 (22:05 +0000)]
- cancel_b_method is now 1 by default => changes default cancel unreplied
branch behaviour: keep retransmitting the INVITE until a response is received
or the timeout kicks in (if the received response is provisional a CANCEL
will be automatically sent back). To revert to the old behaviour (stop
retransmissions and send back fake 487s) use
modparam("tm", "cancel_b_method", 0).
Jiri Kuthan [Mon, 10 Mar 2008 20:58:19 +0000 (20:58 +0000)]
uncommented disabling crlf natping
Miklos Tirpak [Mon, 10 Mar 2008 14:14:10 +0000 (14:14 +0000)]
reparse_on_dns_failover module parameter is introduced
(I forgot the commint the config files)
Miklos Tirpak [Mon, 10 Mar 2008 14:09:01 +0000 (14:09 +0000)]
- Requests after a DNS failover are constructed from the outgoing
message buffer of the failed branch instead of from the incomming
request.
- reparse_on_dns_failover module parameter is introduced.
Closes SER-300
Miklos Tirpak [Mon, 10 Mar 2008 10:37:24 +0000 (10:37 +0000)]
log message is changed to debug level in cfg_lookup_var(),
the message does not indicate an error in the framework
Pavel Kasparek [Mon, 10 Mar 2008 10:12:28 +0000 (10:12 +0000)]
debian debconf - forgotten +++ removed
Andrei Pelinescu-Onciul [Mon, 10 Mar 2008 09:58:15 +0000 (09:58 +0000)]
- missing docs for the cancel_b_method tm parameter
Pavel Kasparek [Mon, 10 Mar 2008 09:54:34 +0000 (09:54 +0000)]
debian debconf configuration - new separate question for ip address used for sending REGISTER replication
Andrei Pelinescu-Onciul [Sat, 8 Mar 2008 00:20:36 +0000 (00:20 +0000)]
- added a new tm parameter (cancel_b_method) that selects between 3 different
behaviours when attempting to cancel a branch where no reply was received:
0 (default) - stop request retransmission and send back a fake 487 (old ser
behaviour) ;
1 - keep retransmitting the request until a reply is received or the final
reply timeout kicks in ;
2 - stop request retransmission and send and retransmit a cancel on the
branch (this is not rfc conformant, but IMHO it wouldn't hurt) .
Greger V. Teigre [Fri, 7 Mar 2008 08:54:18 +0000 (08:54 +0000)]
added improved and modified onsip.org make_and_install wrapper script to simplify compile and installation. Run ./make_and_install to see docs. NOTE! Currently only tested for bash, patches to improve compatibility are welcome!
Jan Janak [Thu, 6 Mar 2008 12:14:10 +0000 (12:14 +0000)]
- base64 functions from rr module moved to libcds to make them accessible from
other modules.
Jiri Kuthan [Wed, 5 Mar 2008 05:17:20 +0000 (05:17 +0000)]
various patches from Alfred, anti-relay-to-private-address-space
protection added
Andrei Pelinescu-Onciul [Mon, 3 Mar 2008 19:01:18 +0000 (19:01 +0000)]
- fixed latest changes: restored @ (don't show .d creation commands), restored
set -e, replaced {} with () (more portable)
Ondrej Martinek [Mon, 3 Mar 2008 16:35:44 +0000 (16:35 +0000)]
Fixed %.d:%.c rule to fail if the target file was not created or is empty
Andrei Pelinescu-Onciul [Sun, 2 Mar 2008 15:30:52 +0000 (15:30 +0000)]
- warning fix
Andrei Pelinescu-Onciul [Sun, 2 Mar 2008 15:11:59 +0000 (15:11 +0000)]
- replaced strndup() in get_abs_pathname() since strndup is a GNU extensions
not present in non glibc based OSes
Andrei Pelinescu-Onciul [Sun, 2 Mar 2008 15:04:16 +0000 (15:04 +0000)]
- .d generation fix: sed with POSIX.1 re (e.g. Darwin, Solaris) does not
support '\?' (or '\+' or '\|')
Andrei Pelinescu-Onciul [Fri, 29 Feb 2008 20:21:58 +0000 (20:21 +0000)]
- store all the module response_f callbacks in an array (small performance
improvement when lots of modules are loaded)
Miklos Tirpak [Fri, 29 Feb 2008 10:04:49 +0000 (10:04 +0000)]
log_facility config parameter is declared in the cfg framework
Andrei Pelinescu-Onciul [Thu, 28 Feb 2008 23:32:10 +0000 (23:32 +0000)]
- new script function: t_grep_status("code") -- returns true if any branch received code as the final reply (or if no final reply was yet received, but a
"code" provisional reply). [old patch]
Andrei Pelinescu-Onciul [Thu, 28 Feb 2008 23:23:45 +0000 (23:23 +0000)]
- slight optimization of the pre-RFC3261 matching
Andrei Pelinescu-Onciul [Thu, 28 Feb 2008 23:12:53 +0000 (23:12 +0000)]
- try matching e2e acks in t_lookup() only for transactions which are
interested in them (have the TMCB_E2EACK_IN or TMCB_E2EACK_RETR_IN callbacks
registered). This should improve performance a little in the common case
when no E2EACK callbacks are registered.
- e2e ack fix: when matching e2e acks use the saved totag list => no more
problems with possible wrong transaction matching when a downstream forked
INVITE arrives and more then one branch is replied with 2xx.
Andrei Pelinescu-Onciul [Thu, 28 Feb 2008 23:07:00 +0000 (23:07 +0000)]
- e2e ack related fixes: - atomically mark seen e2e ack for a specific
branch/totag (the TMCB_E2EACK_IN callbacks should
now be called only once)
- for local transaction remember totags only if
the TMCB_LOCAL_COMPLETED callback is registered
(we use totags to avoid calling this callback
multiple times for the same retrans. final reply)
Andrei Pelinescu-Onciul [Thu, 28 Feb 2008 01:31:47 +0000 (01:31 +0000)]
- fix: try to match acks first to negative replied transaction and only if
this fails take into account possible e2e proxied transaction matching (
matching to transactions replied w/ 2xx). This bug will appear if we have
several forked invites arriving at the proxy and one of them gets a negative
reply while another one gets a 2xx => the 2xx replied one might steal the
negative ack. Note: this doesn't fix the same problem when all the invites are
replied with 2xx (in this case all the e2e acks will be matched to the last
invite, but this would be a problem only for properly accounting e2e acks).
Thanks to Bogdan Pintea for spotting it.
Related to SER-346.
Andrei Pelinescu-Onciul [Wed, 27 Feb 2008 22:21:25 +0000 (22:21 +0000)]
- cleanup: e2e_cancel() sets the cancel transaction label to be the same as the invite one only if E2E_CANCEL_HOP_BY_HOP is not defined. This is not a bugfix, because even if the labels are the same and the cancel is sent hop by hop there won't be any problem: the upstream cancel replies will match only the invite transaction and not the cancel, because the cancel transaction always has 0 branches in this case (it's used only for sending a reply back downstream).
Related to SER-346.
Andrei Pelinescu-Onciul [Tue, 26 Feb 2008 18:12:46 +0000 (18:12 +0000)]
- t_check_status() fix: in some error case a noninit pointer could be used
(patch from Bogdan Pintea <pintea@iptego.de>, part of SER-346)
Andrei Pelinescu-Onciul [Tue, 26 Feb 2008 17:37:59 +0000 (17:37 +0000)]
- stop retransmissions even if a final reply is received before we have
got a chance to start the retransmission timers.
Closes SER-362.
Miklos Tirpak [Tue, 26 Feb 2008 17:07:35 +0000 (17:07 +0000)]
Select fixup is postponed until the config is shmized, if the fixup
fails at parsing time. It can happen that the config group is not ready
at parsing time (dynamic group), but a module tries to parse a @cfg_get
select call in mod_init, or when the modparams are parsed.
Pavel Kasparek [Tue, 26 Feb 2008 15:34:54 +0000 (15:34 +0000)]
added depenedency to serweb to ser-ai1 meta-package
Miklos Tirpak [Tue, 26 Feb 2008 09:53:06 +0000 (09:53 +0000)]
Call set_final_timer() only if the reply is really going to be
sent out.
Closes SER-302
Miklos Tirpak [Tue, 26 Feb 2008 08:43:45 +0000 (08:43 +0000)]
Do not check uac->request.t_active when performing DNS failover
upon receiving a 503 response, t_active is always 0 in this case.
Closes SER-361
Miklos Tirpak [Mon, 25 Feb 2008 08:57:42 +0000 (08:57 +0000)]
t_reset_fr(), t_reset_retr(), and t_reset_max_lifetime() are added,
they can be used to reset the timer values to the default setting.
Closes SER-360
Andrei Pelinescu-Onciul [Sat, 23 Feb 2008 13:35:04 +0000 (13:35 +0000)]
- make config parse error stick out
Patch from Bogdan Pintea <pintea@iptego.de>.
Closes: SER-337
Andrei Pelinescu-Onciul [Sat, 23 Feb 2008 13:21:53 +0000 (13:21 +0000)]
- fix/improvement: the cmd line option '-c' returns -1, no matter if config is
OK or not, making it difficult to use from start scripts that want to check
the config first. Now it returns 0 if the config is ok.i
Patch from Bogdan Pintea <pintea@iptego.de>.
Closes SER-336.
Andrei Pelinescu-Onciul [Sat, 23 Feb 2008 13:10:19 +0000 (13:10 +0000)]
- fix: return status not checked when converting a string into a number in
comp_str(...) (used when comparing string to numbers in ser.cfg). Patch from
Bogdan Pintea <pintea@iptego.de>.
Closes SER-338.
Miklos Tirpak [Thu, 21 Feb 2008 11:09:23 +0000 (11:09 +0000)]
- CFG_ATOMIC flag is introduced: indicates that the variable can
be changed at any time, there is no need to wait for the SIP
message processing to finish
- debug config parameter is changed to CFG_ATOMIC type
Miklos Tirpak [Wed, 20 Feb 2008 14:52:23 +0000 (14:52 +0000)]
NULL child callback value was not checked, when a cfg driver called
cfg_set_now() before forking.
Andrei Pelinescu-Onciul [Wed, 20 Feb 2008 14:37:29 +0000 (14:37 +0000)]
- tcp flags cleanup (preparation for bigger tls related changes)
Miklos Tirpak [Wed, 20 Feb 2008 12:37:42 +0000 (12:37 +0000)]
cfg_get_handle() is introduced, the function can be used to get the handle
of a module config group. Modules can read each other's configuration
if neccessary this way.
Andrei Pelinescu-Onciul [Tue, 19 Feb 2008 15:42:17 +0000 (15:42 +0000)]
- fix: compile problems in io_watch_add if ser is compiled on linux with
NO_SIGIO=1 (patch from Ondrej Martinek <ondra@iptel.org>)
Miklos Tirpak [Mon, 18 Feb 2008 13:47:51 +0000 (13:47 +0000)]
fixing wrong placement of cfg_update() (thanks to Ondrej Martinek)
Miklos Tirpak [Mon, 18 Feb 2008 10:40:21 +0000 (10:40 +0000)]
minor simplification: some memcpy()s are replaced with assignment
Michal Matyska [Fri, 15 Feb 2008 17:37:24 +0000 (17:37 +0000)]
- adding any_uri.transport select
NOTE: if there is no transport parameter in the uri, it returns the default transport based on the uri type (sip/sips).
Michal Matyska [Fri, 15 Feb 2008 13:58:30 +0000 (13:58 +0000)]
- fix e2e ACK with maddr in request-uri
Miklos Tirpak [Fri, 15 Feb 2008 12:11:46 +0000 (12:11 +0000)]
tm module parameters are changed to use the configuration framework,
that means the parameters are changeable on-the-fly.
("fr_timer_avp", "fr_inv_timer_avp", and "tw_append" are left untouched)
Miklos Tirpak [Fri, 15 Feb 2008 09:13:39 +0000 (09:13 +0000)]
CFG_UNREF is moved outside of the lock in cfg_install_global function
(shm_free()s might take longer)
Patch from Andrei
Miklos Tirpak [Wed, 13 Feb 2008 16:14:21 +0000 (16:14 +0000)]
fixing the parameter of the per-child process callback, it did not
alway contain the variable name properly
Miklos Tirpak [Wed, 13 Feb 2008 15:25:13 +0000 (15:25 +0000)]
do not allow dns_servers_no to be set higher than the number of
DNS servers defined in /etc/resolv.conf
Miklos Tirpak [Wed, 13 Feb 2008 15:17:39 +0000 (15:17 +0000)]
pass the name of the changed variable to the callback in resolv_reinit()
Jan Janak [Wed, 13 Feb 2008 13:30:37 +0000 (13:30 +0000)]
- Added DB_NO_TZ flag, when set on a timestamp fields then
timezone shifts/conversions will be inhibited. The flag
has no effect on other field types.
Miklos Tirpak [Tue, 12 Feb 2008 16:17:58 +0000 (16:17 +0000)]
fixing the construction of ACK and CANCEL: the requests may end with
CRLF CR CRLF by mistake (patch from Bogdan Pintea)
Miklos Tirpak [Mon, 11 Feb 2008 17:11:59 +0000 (17:11 +0000)]
- use_dns_cache can be enabled/disabled runtime
- dns_cache_init is introduced: if set to 0, the dns cache is not
initialized, and cannot be enabled later (default is 1)
- dst_blacklist_init is introduced: if set to 0, the dst blacklist is
not initialized (similar to dns_cache_init) (default is 1)
Andrei Pelinescu-Onciul [Mon, 11 Feb 2008 16:42:32 +0000 (16:42 +0000)]
- missing '(' in sed dep. rules fixed (thanks to Ondrej <ondra@iptel.org)
Closes: SER-354
Jan Janak [Mon, 11 Feb 2008 16:07:16 +0000 (16:07 +0000)]
- applied patch by Brocha Strous and Stefan Sayer
closes SER-247
Miklos Tirpak [Mon, 11 Feb 2008 10:11:00 +0000 (10:11 +0000)]
"#include <libgen.h>" is moved to ut.c because of dirname() function
Miklos Tirpak [Mon, 11 Feb 2008 09:58:29 +0000 (09:58 +0000)]
DNS resolver and cache parameters use the configuration framework
that makes the config variables changeable on-the-fly.
- The resolver is reinitialized by each child process separately
when dns_retr_time, dns_retr_no, dns_servers_no, or dns_use_search_list
is changed.
- dns_reinit is introduced: the resolver is reinitialized when the
variable is set to 1, and the variable is reseted to 0 again.
It can be set via RPC for example, when /etc/resolv.conf changes,
but none of the SER config parameters are affected.
- A callback function is called by each child process after the resolver
has been reinitialized, if DNS_WATCHDOG_SUPPORT is enabled.
- socket_types is changed to be a global variable, and set by
fix_all_socket_lists(), because we have to remember for
the socket types, and do not allow dns_try_ipv6 to be enabled if there
is no ipv6 interface.
- minor bug is corrected: the expiration check is removed from
dns_cache_clean() function, when non-expired entries are deleted.
Miklos Tirpak [Fri, 8 Feb 2008 17:09:45 +0000 (17:09 +0000)]
- Call the per-child process callback functions even if the
config variables are changed before forking, so the modules/core
will not miss the change.
- fixing a very unlikely bug: when a module kept forking and destroying
new processes runtime (only jabber module does so), and two variables
were changed after the forked process called called cfg_update()
and before exited, and both variables had per-child process callback,
and all the other child processes updated their own local config faster
then this one, the list of the callbacks was not released, thus the
memory was not freed.
Jan Janak [Fri, 8 Feb 2008 05:37:44 +0000 (05:37 +0000)]
- Make sure that the global cfg_file variable always contains
full absolute pathname.
- Added get_abs_pathname function that can be used to convert
relative pathnames to absolutes with using the location of
cfg_file (or another file) as reference.
Jan Janak [Fri, 8 Feb 2008 05:36:49 +0000 (05:36 +0000)]
- make default pathnames of certificate files relative to the main
SER config file
Andrei Pelinescu-Onciul [Tue, 5 Feb 2008 21:47:58 +0000 (21:47 +0000)]
- verno++ to reflect the tcp changes
Andrei Pelinescu-Onciul [Tue, 5 Feb 2008 21:47:29 +0000 (21:47 +0000)]
- avoid extra read syscalls (detect short reads) in poll_et or sigio_rt case
(should improve performace)
- if POLLRDHUP or EPOLLRDHUP are supported (linux >= 2.6.17) use them
and avoid an extra syscall on EOF
- on write error try to see if there's still some data in the socket read
buffer and try to process it first (if there's no more data do a quick
connection destroy)
Andrei Pelinescu-Onciul [Tue, 5 Feb 2008 21:37:28 +0000 (21:37 +0000)]
- automatically "listen" for POLLRDHUP or EPOLLRDHUP if supported (linux
only)
Jan Janak [Tue, 5 Feb 2008 06:46:44 +0000 (06:46 +0000)]
- uses spaces instead of tabs, otherwise gmake refuses to process it
Jan Janak [Mon, 4 Feb 2008 22:46:27 +0000 (22:46 +0000)]
- server-side database functions added
Miklos Tirpak [Mon, 4 Feb 2008 16:37:55 +0000 (16:37 +0000)]
Make a difference between non-existing variable, and not readable variable
when the value cannot be retrieved. (reported by Vladimir Marek)
Miklos Tirpak [Mon, 4 Feb 2008 16:07:44 +0000 (16:07 +0000)]
typo fixed
Jan Janak [Mon, 4 Feb 2008 14:11:37 +0000 (14:11 +0000)]
- fixed wrong request method check, discovered by Jan Andres
Jan Janak [Mon, 4 Feb 2008 13:54:47 +0000 (13:54 +0000)]
- fixed wrong variable used in get_to_uid, reported by
Jan Andres
Jan Janak [Mon, 4 Feb 2008 10:19:21 +0000 (10:19 +0000)]
- added misssing get_to_uid, reported by Jan Andres
Jan Janak [Sat, 2 Feb 2008 13:21:09 +0000 (13:21 +0000)]
- obsolete scripts and utilities removed
closes SER-308
Jan Janak [Sat, 2 Feb 2008 13:00:09 +0000 (13:00 +0000)]
- removed duplicated doxygen comment
Jan Janak [Sat, 2 Feb 2008 12:26:59 +0000 (12:26 +0000)]
- doxygen comment moved to the header file
Jan Janak [Sat, 2 Feb 2008 12:24:41 +0000 (12:24 +0000)]
- get_to_uid modified to retrieve the UID from the Request-URI for
non-REGISTER requests, and from the To header for REGISTER requests.
Closes SER-234
Jan Janak [Fri, 1 Feb 2008 18:42:58 +0000 (18:42 +0000)]
- fixed testing of return value of fix_param
closes SER-323
Pavel Kasparek [Fri, 1 Feb 2008 14:50:14 +0000 (14:50 +0000)]
cut'n'paste errors fixed