bug-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Eclipse, cvs, and extssh


From: Mark D. Baushke
Subject: Re: Eclipse, cvs, and extssh
Date: Fri, 25 Jan 2008 09:46:15 -0800

Hi Bruno,

For cvs 1.12.x, you could use CVSROOT=":ext;CVS_RSH=ssh:hostname:/path" for
those repositories that need to use ssh and
CVSROOT=":ext;CVS_RSH=rsh:hostname:/path" for those repositories that
need to use rsh. This is probably a superior method for handing these
problems providing that it does not give Eclipse heartburn...

For cvs 1.11.x, you are correct. Both that the default is still "rsh"
(the test host I checked does not appear to have "rsh" installed, so
RSH_DFLT was "ssh" and I regret any confusion my previous message
caused) and that setting CVS_RSH will impact both :ext: and :extssh:
methods at the same time which was part of Derek's original intent.

For the current cvs 1.11.x (without the tentative patch given after my
.signature), there is no way to set CVS_RSH or CVSROOT to anything where
:extssh: is not a simple alias for :ext: and a CVSROOT (or CVS/Root)
which uses the extended syntax for 1.12.x will not work properly for cvs
1.11.x.

I suppose I could consider the addition of a CVS_SSH environment
variable, but it is not clear to me that "rsh" is viable enough to
continue to use it at all and I suspect it might be better to convert to
a default of "ssh" and try to get folks to stop using "rsh" as a
'security' fix...

Are any folks really still using "rsh" these days?

        -- Mark

PS: Below is an experimental (untested) patch to cvs 1.11.x (current
top-of-tree sources) which would implement a CVS_SSH and SSH_DFLT for
the :extssh: method. I'd like to know if it completely solves your
problem or if I have managed to forget something.

Index: Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/Makefile.in,v
retrieving revision 1.88.4.17
diff -u -p -r1.88.4.17 Makefile.in
--- Makefile.in 22 Aug 2007 21:24:08 -0000      1.88.4.17
+++ Makefile.in 25 Jan 2008 17:39:27 -0000
@@ -189,6 +189,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 
 # Unix source subdirs, where we'll want to run lint and etags:
 # This is a legacy variable from b4 Automake
Index: config.h.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/config.h.in,v
retrieving revision 1.71.4.13
diff -u -p -r1.71.4.13 config.h.in
--- config.h.in 28 Jun 2006 20:49:30 -0000      1.71.4.13
+++ config.h.in 25 Jan 2008 17:39:27 -0000
@@ -433,6 +433,10 @@
    it. */
 #undef SIZE_MAX
 
+/* The default remote shell to use, if one does not specify the CVS_SSH
+   environment variable. */
+#undef SSH_DFLT
+
 /* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
 #undef STAT_MACROS_BROKEN
 
Index: configure
===================================================================
RCS file: /cvsroot/cvs/ccvs/configure,v
retrieving revision 1.174.2.81
diff -u -p -r1.174.2.81 configure
--- configure   14 Dec 2007 17:22:54 -0000      1.174.2.81
+++ configure   25 Jan 2008 17:39:28 -0000
@@ -716,6 +716,7 @@ LIBOBJS
 KRB4
 includeopt
 EDITOR
+with_default_ssh
 with_default_rsh
 LTLIBOBJS'
 ac_subst_files='MKTEMP_SH_FUNCTION'
@@ -1365,6 +1366,8 @@ Optional Packages:
   --with-gssapi           GSSAPI directory (default autoselects)
   --with-editor           The default text editor CVS should use for log
                           messages (default autoselects)
+  --with-ssh              The default remote shell CVS will use for :extssh:
+                          transport (default autodetects)
   --with-rsh              The default remote shell CVS will use for :ext:
                           transport (default autodetects)
   --with-tmpdir           The temporary directory CVS should use as a default
@@ -12125,13 +12128,100 @@ _ACEOF
 
 
 
+# What remote shell transport should the :extssh: client cvs default to using?
+
+# Check whether --with-ssh was given.
+if test "${with_ssh+set}" = set; then
+  withval=$with_ssh;
+else
+  with_ssh="ssh ssh2 ssh1"
+fi
+
+
+if test no = "$with_ssh"; then
+  { echo "$as_me:$LINENO: WARNING: Failed to find usable remote shell. Using 
'ssh'." >&5
+echo "$as_me: WARNING: Failed to find usable remote shell. Using 'ssh'." >&2;}
+  with_ssh=ssh
+elif test yes = "$with_ssh"; then
+  # Make --with-ssh mean the same thing as --with-ssh=ssh
+  with_ssh=ssh
+fi
+
+if echo $with_ssh |grep ^/ >/dev/null; then
+  # If $with_ssh is an absolute path, issue a warning if the executable
+  # doesn't exist or isn't usable, but then trust the user and use it
+  # regardless
+  with_default_ssh=$with_ssh
+  { echo "$as_me:$LINENO: checking for a remote shell" >&5
+echo $ECHO_N "checking for a remote shell... $ECHO_C" >&6; }
+  if ! test -f $with_ssh \
+      || ! test -x $with_ssh; then
+    # warn the user that they may encounter problems
+    { echo "$as_me:$LINENO: WARNING: $with_ssh is not a path to an executable 
file" >&5
+echo "$as_me: WARNING: $with_ssh is not a path to an executable file" >&2;}
+  fi
+else
+  # Search for a remote shell
+  for ac_prog in $with_ssh
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with 
args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_with_default_ssh+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$with_default_ssh"; then
+  ac_cv_prog_with_default_ssh="$with_default_ssh" # Let the user override the 
test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x 
"$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_with_default_ssh="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+with_default_ssh=$ac_cv_prog_with_default_ssh
+if test -n "$with_default_ssh"; then
+  { echo "$as_me:$LINENO: result: $with_default_ssh" >&5
+echo "${ECHO_T}$with_default_ssh" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$with_default_ssh" && break
+done
+test -n "$with_default_ssh" || with_default_ssh=""ssh""
+
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define SSH_DFLT "$with_default_ssh"
+_ACEOF
+
+
+
+
 # What remote shell transport should our client cvs default to using?
 
 # Check whether --with-rsh was given.
 if test "${with_rsh+set}" = set; then
   withval=$with_rsh;
 else
-          with_rsh="remsh rsh ssh"
+          with_rsh="remsh rsh ssh ssh2 ssh1"
 fi
 
 
@@ -14034,11 +14124,12 @@ LIBOBJS!$LIBOBJS$ac_delim
 KRB4!$KRB4$ac_delim
 includeopt!$includeopt$ac_delim
 EDITOR!$EDITOR$ac_delim
+with_default_ssh!$with_default_ssh$ac_delim
 with_default_rsh!$with_default_rsh$ac_delim
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 8; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 9; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
Index: configure.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/configure.in,v
retrieving revision 1.176.2.72
diff -u -p -r1.176.2.72 configure.in
--- configure.in        14 Dec 2007 17:22:54 -0000      1.176.2.72
+++ configure.in        25 Jan 2008 17:39:29 -0000
@@ -495,6 +495,53 @@ dnl end --with-editor
 dnl
 
 dnl
+dnl begin --with-ssh
+dnl
+
+# What remote shell transport should the :extssh: client cvs default to using?
+AC_ARG_WITH(
+  [ssh],
+  AC_HELP_STRING(
+    [--with-ssh],
+    [The default remote shell CVS will use for :extssh: transport
+     (default autodetects)]), ,
+  [with_ssh="ssh ssh2 ssh1"])
+
+if test no = "$with_ssh"; then
+  AC_MSG_WARN([Failed to find usable remote shell. Using 'ssh'.])
+  with_ssh=ssh
+elif test yes = "$with_ssh"; then
+  # Make --with-ssh mean the same thing as --with-ssh=ssh
+  with_ssh=ssh
+fi
+
+if echo $with_ssh |grep ^/ >/dev/null; then
+  # If $with_ssh is an absolute path, issue a warning if the executable
+  # doesn't exist or isn't usable, but then trust the user and use it
+  # regardless
+  with_default_ssh=$with_ssh
+  AC_MSG_CHECKING([for a remote shell])
+  if ! test -f $with_ssh \
+      || ! test -x $with_ssh; then
+    # warn the user that they may encounter problems
+    AC_MSG_WARN([$with_ssh is not a path to an executable file])
+  fi
+else
+  # Search for a remote shell
+  AC_CHECK_PROGS([with_default_ssh], [$with_ssh], "ssh")
+fi
+
+AC_DEFINE_UNQUOTED(
+  [SSH_DFLT], ["$with_default_ssh"],
+  [The default remote shell to use, if one does not specify the
+   CVS_SSH environment variable.])
+dnl done with finding a default CVS_SSH value
+dnl
+dnl end --with-ssh
+dnl
+
+
+dnl
 dnl begin --with-rsh
 dnl
 dnl Many sites no longer desire the use of "rsh" as the default
@@ -511,7 +558,7 @@ AC_ARG_WITH(
   dnl and `remsh' is the remote shell, but look for it first since it
   dnl probably won't exist on any platform where it shouldn't be preferred
   dnl to `rsh'.
-  [with_rsh="remsh rsh ssh"])
+  [with_rsh="remsh rsh ssh ssh2 ssh1"])
 
 if test no = "$with_rsh"; then
   AC_MSG_WARN([Failed to find usable remote shell. Using 'rsh'.])
Index: contrib/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/contrib/Makefile.in,v
retrieving revision 1.51.4.13
diff -u -p -r1.51.4.13 Makefile.in
--- contrib/Makefile.in 22 Aug 2007 21:24:55 -0000      1.51.4.13
+++ contrib/Makefile.in 25 Jan 2008 17:39:29 -0000
@@ -181,6 +181,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 contribdir = $(pkgdatadir)/contrib
 contrib_SCRIPTS = \
        check_cvs \
Index: diff/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/diff/Makefile.in,v
retrieving revision 1.28.4.12
diff -u -p -r1.28.4.12 Makefile.in
--- diff/Makefile.in    22 Aug 2007 21:24:55 -0000      1.28.4.12
+++ diff/Makefile.in    25 Jan 2008 17:39:29 -0000
@@ -165,6 +165,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 INCLUDES = -I$(top_srcdir)/lib
 noinst_LIBRARIES = libdiff.a
 libdiff_a_SOURCES = diff.c diff3.c analyze.c cmpbuf.c cmpbuf.h io.c \
Index: doc/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/doc/Makefile.in,v
retrieving revision 1.55.4.25
diff -u -p -r1.55.4.25 Makefile.in
--- doc/Makefile.in     22 Aug 2007 21:24:55 -0000      1.55.4.25
+++ doc/Makefile.in     25 Jan 2008 17:39:29 -0000
@@ -183,6 +183,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 info_TEXINFOS = cvs.texinfo cvsclient.texi
 man_MANS = $(srcdir)/cvs.1
 PSS = \
Index: doc/cvs.texinfo
===================================================================
RCS file: /cvsroot/cvs/ccvs/doc/cvs.texinfo,v
retrieving revision 1.545.2.71
diff -u -p -r1.545.2.71 cvs.texinfo
--- doc/cvs.texinfo     25 Jan 2008 00:11:27 -0000      1.545.2.71
+++ doc/cvs.texinfo     25 Jan 2008 17:39:30 -0000
@@ -2183,7 +2183,14 @@ For information on disk space requiremen
 @ref{Creating a repository}.
 
 @node Connecting via rsh
-@subsection Connecting with rsh
+@subsection Connecting with rsh or ssh
+
+@cindex ssh
+@sc{cvs} may use the @samp{ssh} protocol to perform
+these operations, so the remote user host needs to have
+a either an agent like @code{ssh-agent} to hold
+credentials or a @file{.shosts} file which grants
+access to the local user.
 
 @cindex rsh
 @sc{cvs} uses the @samp{rsh} protocol to perform these
@@ -2208,6 +2215,13 @@ Then test that @samp{rsh} is working wit
 rsh -l bach faun.example.org 'echo $PATH'
 @end example
 
+@noindent
+To test that @samp{ssh} is working use
+
+@example
+ssh -l bach faun.example.org 'echo $PATH'
+@end example
+
 @cindex CVS_SERVER, environment variable
 Next you have to make sure that @code{rsh} will be able
 to find the server.  Make sure that the path which
@@ -2229,12 +2243,17 @@ There is no need to edit @file{inetd.con
 
 @cindex :server:, setting up
 @cindex :ext:, setting up
+@cindex :extssh:, setting up
 @cindex Kerberos, using kerberized rsh
 @cindex SSH (rsh replacement)
 @cindex rsh replacements (Kerberized, SSH, &c)
-There are two access methods that you use in @code{CVSROOT}
-for rsh.  @code{:server:} specifies an internal rsh
+There are three access methods that you use in @code{CVSROOT}
+for rsh or ssh.  @code{:server:} specifies an internal rsh
 client, which is supported only by some @sc{cvs} ports.
+@code{:extssh:} specifies an external ssh program. By
+default this is @code{ssh} but you may set the
+@code{CVS_SSH} environment variable to invoke another
+program or wrapper script.
 @code{:ext:} specifies an external rsh program.  By
 default this is @code{rsh} but you may set the
 @code{CVS_RSH} environment variable to invoke another
@@ -2255,8 +2274,8 @@ to be inapplicable; consult the document
 replacement.
 @c FIXME: there should be a way to specify the
 @c program in CVSROOT, not CVS_RSH, so that one can use
-@c different ones for different roots.  e.g. ":ext;rsh=remsh:"
-@c instead of ":ext:".
+@c different ones for different roots.  e.g.
+@c ":ext;CVS_RSH=remsh:" instead of ":ext:".
 @c See also the comment in src/client.c for rationale
 @c concerning "rsh" being the default and never
 @c "remsh".
@@ -13891,6 +13910,12 @@ Specifies the external program which @sc
 when @code{:ext:} access method is specified.
 @pxref{Connecting via rsh}.
 
+@cindex CVS_SSH, environment variable
+@item $CVS_SSH
+Specifies the external program which @sc{cvs} connects with,
+when @code{:extssh:} access method is specified.
+@pxref{Connecting via rsh}.
+
 @item $CVS_SERVER
 Used in client-server mode when accessing a remote
 repository using @sc{rsh}.  It specifies the name of
Index: lib/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/lib/Makefile.in,v
retrieving revision 1.61.4.18
diff -u -p -r1.61.4.18 Makefile.in
--- lib/Makefile.in     22 Aug 2007 21:24:56 -0000      1.61.4.18
+++ lib/Makefile.in     25 Jan 2008 17:39:30 -0000
@@ -193,6 +193,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 
 # For now we need to include $(top_srcdir)/src because some systems
 # (at least 'AIX rioscpu2 3 4 000030498200',
Index: man/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/man/Makefile.in,v
retrieving revision 1.32.4.13
diff -u -p -r1.32.4.13 Makefile.in
--- man/Makefile.in     22 Aug 2007 21:24:56 -0000      1.32.4.13
+++ man/Makefile.in     25 Jan 2008 17:39:31 -0000
@@ -166,6 +166,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 man_MANS = cvs.5 cvsbug.8
 EXTRA_DIST = \
        .cvsignore \
Index: src/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/Makefile.in,v
retrieving revision 1.83.4.15
diff -u -p -r1.83.4.15 Makefile.in
--- src/Makefile.in     22 Aug 2007 21:24:57 -0000      1.83.4.15
+++ src/Makefile.in     25 Jan 2008 17:39:31 -0000
@@ -199,6 +199,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 
 # $(includeopt) is CVS specific and set by configure
 # FIXME - This includes line is dependant on its order.  This means there is
Index: src/client.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/client.c,v
retrieving revision 1.318.4.47
diff -u -p -r1.318.4.47 client.c
--- src/client.c        25 Jan 2008 00:11:28 -0000      1.318.4.47
+++ src/client.c        25 Jan 2008 17:39:31 -0000
@@ -4726,15 +4726,20 @@ start_rsh_server (root, to_server, from_
     /* If you're working through firewalls, you can set the
        CVS_RSH environment variable to a script which uses rsh to
        invoke another rsh on a proxy machine.  */
-    char *cvs_rsh = getenv ("CVS_RSH");
+    char *env_cvs_rsh = getenv ("CVS_RSH");
+    char *env_cvs_ssh = getenv ("CVS_SSH");
+    char *cvs_rsh;
     char *cvs_server = getenv ("CVS_SERVER");
     int i = 0;
     /* This needs to fit "rsh", "-b", "-l", "USER", "host",
        "cmd (w/ args)", and NULL.  We leave some room to grow. */
     char *rsh_argv[10];
 
+    if (root->method == extssh_method)
+       cvs_rsh = env_cvs_ssh ? env_cvs_ssh : SSH_DFLT;
     if (!cvs_rsh)
-       cvs_rsh = RSH_DFLT;
+       cvs_rsh = env_cvs_rsh ? env_cvs_rsh : RSH_DFLT;
+
     if (!cvs_server)
        cvs_server = "cvs";
 
@@ -4788,14 +4793,19 @@ start_rsh_server (root, to_server, from_
     /* If you're working through firewalls, you can set the
        CVS_RSH environment variable to a script which uses rsh to
        invoke another rsh on a proxy machine.  */
-    char *cvs_rsh = getenv ("CVS_RSH");
+    char *env_cvs_rsh = getenv ("CVS_RSH");
+    char *env_cvs_ssh = getenv ("CVS_SSH");
+    char *cvs_rsh;
     char *cvs_server = getenv ("CVS_SERVER");
     char *command;
     int tofd, fromfd;
     int child_pid;
 
+    if (root->method == extssh_method)
+       cvs_rsh = env_cvs_ssh ? env_cvs_ssh : SSH_DFLT;
     if (!cvs_rsh)
-       cvs_rsh = RSH_DFLT;
+       cvs_rsh = env_cvs_rsh ? env_cvs_rsh : RSH_DFLT;
+
     if (!cvs_server)
        cvs_server = "cvs";
 
Index: tools/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/tools/Makefile.in,v
retrieving revision 1.23.4.12
diff -u -p -r1.23.4.12 Makefile.in
--- tools/Makefile.in   22 Aug 2007 21:24:57 -0000      1.23.4.12
+++ tools/Makefile.in   25 Jan 2008 17:39:31 -0000
@@ -162,6 +162,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 EXTRA_DIST = \
        README .cvsignore
 
Index: vms/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/vms/Makefile.in,v
retrieving revision 1.22.4.17
diff -u -p -r1.22.4.17 Makefile.in
--- vms/Makefile.in     22 Aug 2007 21:24:57 -0000      1.22.4.17
+++ vms/Makefile.in     25 Jan 2008 17:39:31 -0000
@@ -165,6 +165,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 EXTRA_DIST = \
     .cvsignore \
     ChangeLog \
Index: windows-NT/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/windows-NT/Makefile.in,v
retrieving revision 1.29.4.21
diff -u -p -r1.29.4.21 Makefile.in
--- windows-NT/Makefile.in      22 Aug 2007 21:24:57 -0000      1.29.4.21
+++ windows-NT/Makefile.in      25 Jan 2008 17:39:31 -0000
@@ -179,6 +179,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 EXTRA_DIST = \
        JmgStat.c \
        JmgStat.h \
Index: windows-NT/SCC/Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/windows-NT/SCC/Makefile.in,v
retrieving revision 1.18.4.11
diff -u -p -r1.18.4.11 Makefile.in
--- windows-NT/SCC/Makefile.in  22 Aug 2007 21:24:57 -0000      1.18.4.11
+++ windows-NT/SCC/Makefile.in  25 Jan 2008 17:39:31 -0000
@@ -163,6 +163,7 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 with_default_rsh = @with_default_rsh@
+with_default_ssh = @with_default_ssh@
 EXTRA_DIST = \
        .cvsignore \
        README.txt \




reply via email to

[Prev in Thread] Current Thread [Next in Thread]