qemu-commits
[Top][All Lists]
Advanced

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

[Qemu-commits] [qemu/qemu] bad022: qga: Support Unicode paths in guest-f


From: GitHub
Subject: [Qemu-commits] [qemu/qemu] bad022: qga: Support Unicode paths in guest-file-open on w...
Date: Thu, 01 Nov 2018 11:28:07 -0700

  Branch: refs/heads/master
  Home:   https://github.com/qemu/qemu
  Commit: bad0227d3ac4f706673df9690b77840ed89dec40
      
https://github.com/qemu/qemu/commit/bad0227d3ac4f706673df9690b77840ed89dec40
  Author: Jonathon Reinhart <address@hidden>
  Date:   2018-10-30 (Tue, 30 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga: Support Unicode paths in guest-file-open on win32

Currently, the win32 port of QEMU Guest Agent does not properly handle Unicode
paths. The JSON decoder produces a valid UTF-8 path string, but this is passed
directly to CreateFileA, which is expecting an ANSI string and not UTF-8. This
leads to mangled filenames.

This patch follows the example of qmp_guest_set_user_password() and uses
g_utf8_to_utf16() to convert the string to UTF-16 and calls CreateFileW()
explicitly.

Signed-off-by: Jonathon Reinhart <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 0692b03ee135f6295168082199af55c6f289794d
      
https://github.com/qemu/qemu/commit/0692b03ee135f6295168082199af55c6f289794d
  Author: Chen Hanxiao <address@hidden>
  Date:   2018-10-30 (Tue, 30 Oct 2018)

  Changed paths:
    M qga/commands-win32.c
    M qga/main.c
    M qga/vss-win32.c
    M qga/vss-win32.h
    M qga/vss-win32/requester.cpp
    M qga/vss-win32/requester.h

  Log Message:
  -----------
  qga-win: add support for qmp_guest_fsfreeze_freeze_list

This patch add support for freeze specified fs.

The valid mountpoints list member are [1]:

  The path of a mounted folder, for example, Y:\MountX\
  A drive letter, for example, D:\
  A volume GUID path of the form \\?\Volume{GUID}\,
      where GUID identifies the volume
  A UNC path that specifies a remote file share,
      for example, \\Clusterx\Share1\

[1] 
https://docs.microsoft.com/en-us/windows/desktop/api/vsbackup/nf-vsbackup-ivssbackupcomponents-addtosnapshotset

Cc: Michael Roth <address@hidden>
Signed-off-by: Chen Hanxiao <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: b4bf912a6c19449e68af7b4173a8c6da21904d99
      
https://github.com/qemu/qemu/commit/b4bf912a6c19449e68af7b4173a8c6da21904d99
  Author: Igor Mammedov <address@hidden>
  Date:   2018-10-30 (Tue, 30 Oct 2018)

  Changed paths:
    M qga/commands-posix.c

  Log Message:
  -----------
  qga: ignore non present cpus when handling qmp_guest_get_vcpus()

If VM has VCPUs plugged sparselly (for example a VM started with
3 VCPUs (cpu0, cpu1 and cpu2) and then cpu1 was hotunplugged so
only cpu0 and cpu2 are present), QGA will rise a error
  error: internal error: unable to execute QEMU agent command 'guest-get-vcpus':
  open("/sys/devices/system/cpu/cpu1/"): No such file or directory
when
  virsh vcpucount FOO --guest
is executed.
Fix it by ignoring non present CPUs when fetching CPUs status from sysfs.

Signed-off-by: Igor Mammedov <address@hidden>
Reviewed-by: Laszlo Ersek <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 3efac6ebb88e4d099f07fef65178ebaa595ae770
      
https://github.com/qemu/qemu/commit/3efac6ebb88e4d099f07fef65178ebaa595ae770
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M configure

  Log Message:
  -----------
  configure: add test for libudev

Signed-off-by: Tomáš Golembiovský <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
*make libudev optional to avoid breaking existing build/test environments
*disable libudev for --static builds
Signed-off-by: Michael Roth <address@hidden>


  Commit: b616105a904bc350a409e12c39af0ae210900124
      
https://github.com/qemu/qemu/commit/b616105a904bc350a409e12c39af0ae210900124
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/Makefile.objs
    M qga/commands-posix.c
    M qga/qapi-schema.json

  Log Message:
  -----------
  qga: linux: report disk serial number

Add reporting of disk serial number on Linux guests. The feature depends
on libudev.

Example:

    {
      "name": "dm-2",
      "mountpoint": "/",
      ...
      "disk": [
  {
    "serial": "SAMSUNG_MZ7LN512HCHP-000L1_S1ZKNXAG822493",
    ...
  }
      ],
    }

Signed-off-by: Tomáš Golembiovský <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 6589ce35734e7e71463485650e5fb6e4bbe64729
      
https://github.com/qemu/qemu/commit/6589ce35734e7e71463485650e5fb6e4bbe64729
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-posix.c
    M qga/qapi-schema.json

  Log Message:
  -----------
  qga: linux: return disk device in guest-get-fsinfo

Report device node of the disk on Linux (e.g. "/dev/sda2").
Requirs libudev.

Signed-off-by: Tomáš Golembiovský <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 0d7f937e2a3ef6d80e8cb3d2cbca95f7365b451e
      
https://github.com/qemu/qemu/commit/0d7f937e2a3ef6d80e8cb3d2cbca95f7365b451e
  Author: Sameeh Jubran <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga-win: prevent crash when executing fsinfo command

The fsinfo command is currently implemented for Windows only and it's disk
parameter can be enabled by adding the define "CONFIG_QGA_NTDDSCSI" to the qga
code. When enabled and executed the qemu-ga crashed with the following message:

------------------------------------------------
File qapi/qapi-visit-core.c, Line 49

Expression: !(v->type & VISITOR_OUTPUT) || *obj)
------------------------------------------------

After some digging, turns out that the GuestPCIAddress is null and the
qapi visitor doesn't like that, so we can always allocate it instead and
initiate all it's members to -1.

Signed-off-by: Sameeh Jubran <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
Signed-off-by: Michael Roth <address@hidden>
Signed-off-by: Tomáš Golembiovský <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 6880b94f8a53e34833bf895b3004b2e48c0ffe74
      
https://github.com/qemu/qemu/commit/6880b94f8a53e34833bf895b3004b2e48c0ffe74
  Author: Sameeh Jubran <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga-win: fsinfo: pci-info: allow partial info

The call to SetupDiGetDeviceRegistryProperty might fail because the
value doesn't exist in the registry, in this case we shouldn't exit from
the loop but instead continue to look for other available values in the
registry and set this value as unavailable (-1).

Signed-off-by: Sameeh Jubran <address@hidden>
Signed-off-by: Michael Roth <address@hidden>
Signed-off-by: Tomáš Golembiovský <address@hidden>
*squash in fix for when get_pci_info() returns NULL pci_controller field
*fix handling for error_set() cases in get_pci_info(), not just NULL return
*force all -1 PCI addr fields if any single one of them isn't found
Signed-off-by: Michael Roth <address@hidden>


  Commit: 76dc75ca549109499a7a6e275a80662f2390f686
      
https://github.com/qemu/qemu/commit/76dc75ca549109499a7a6e275a80662f2390f686
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M configure

  Log Message:
  -----------
  build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI

There was inconsistency between commits:

  50cbebb9a3 configure: add configure check for ntdddisk.h
  a3ef3b2272 qga: added bus type and disk location path

The first commit added #define CONFIG_QGA_NTDDDISK but the second commit
expected the name to be CONFIG_QGA_NTDDSCSI. As a result the code in
second patch was never used.

Renaming the option to CONFIG_QGA_NTDDSCSI to match the name of header
file that is being checked for.

Signed-off-by: Tomáš Golembiovský <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
Reviewed-by: Sameeh Jubran <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 222682abb3800b9c644b7832543510ade3d5138b
      
https://github.com/qemu/qemu/commit/222682abb3800b9c644b7832543510ade3d5138b
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga-win: add debugging information

The windows code generaly lacks debug information (compared to posix
code). This patch adds some related to HW info in guest-get-fsinfo
command.

Signed-off-by: Tomáš Golembiovský <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: c76d70f498bd2dea9dafb7fcc2aa1b7a418f0f31
      
https://github.com/qemu/qemu/commit/c76d70f498bd2dea9dafb7fcc2aa1b7a418f0f31
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga-win: refactor disk properties (bus)

Refactor code that queries bus type to be more generic. The function
get_disk_bus_type() has been renamed to build_guest_disk_info().
Following commit(s) will extend this function.

Signed-off-by: Tomáš Golembiovský <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: fb08aa703f4c601155aa65943eb29c1ad3972386
      
https://github.com/qemu/qemu/commit/fb08aa703f4c601155aa65943eb29c1ad3972386
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga-win: report disk serial number

Signed-off-by: Tomáš Golembiovský <address@hidden>
*coding style fix-ups (declarations at beginning of block)
*improve readability for user-visible errors
*cover additional edge-cases with debug statements
Signed-off-by: Michael Roth <address@hidden>


  Commit: 9e65fd659e1557c294d26a4daa3ae313312bcf68
      
https://github.com/qemu/qemu/commit/9e65fd659e1557c294d26a4daa3ae313312bcf68
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga-win: refactor disk info

Refactor building of disk info into a function that builds the list and
a function that returns infor for single disk. This will be used in
future commit that will handle multi-disk volumes.

Signed-off-by: Tomáš Golembiovský <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: b1ba8890e63ce9432c41c5c3fc229f54c87c9c99
      
https://github.com/qemu/qemu/commit/b1ba8890e63ce9432c41c5c3fc229f54c87c9c99
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga-win: handle multi-disk volumes

Probe the volume for disk extents and return list of all disks.
Originally only first disk of composite volume was returned.

Note that the patch changes get_pci_info() from one state of brokenness
into a different state of brokenness. In other words it still does not do
what it's supposed to do (see comment in code). If anyone knows how to
fix it, please step in.

Signed-off-by: Tomáš Golembiovský <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 4550dee80fc1bba37bce141a3d6f83c3e390e719
      
https://github.com/qemu/qemu/commit/4550dee80fc1bba37bce141a3d6f83c3e390e719
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga-win: return disk device in guest-get-fsinfo

Report device UNC of the disk. It is reported as "\\.\PhysicalDriveX".

Signed-off-by: Tomáš Golembiovský <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 7fae5184790680b39f4d627d069981816f4c3191
      
https://github.com/qemu/qemu/commit/7fae5184790680b39f4d627d069981816f4c3191
  Author: Tomáš Golembiovský <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga-win: demystify namespace stripping

It was not obvious what exactly the cryptic string copying does to the
GUID. This change makes the intent clearer.

Signed-off-by: Tomáš Golembiovský <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: d9c85b6cc5a2597e72299bc6644c966236378e50
      
https://github.com/qemu/qemu/commit/d9c85b6cc5a2597e72299bc6644c966236378e50
  Author: Li Qiang <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/commands-win32.c

  Log Message:
  -----------
  qga: fix an off-by-one issue

Signed-off-by: Li Qiang <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 50d5b3c465ffafbd6973acb8afde1f1e4ca5a2da
      
https://github.com/qemu/qemu/commit/50d5b3c465ffafbd6973acb8afde1f1e4ca5a2da
  Author: Michael Roth <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/main.c

  Log Message:
  -----------
  qga: group agent init/cleanup init separate routines

This patch better separates the init/cleanup routines out into
separate functions to make the start-up procedure a bit easier to
follow. This will be useful when we eventually break out the actual
start/stop of the agent's main loop into separates routines that
can be called multiple times after the init phase.

Signed-off-by: Michael Roth <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: 0f4d3a4912d1ca6585409b92d1d7fefb8baf60fa
      
https://github.com/qemu/qemu/commit/0f4d3a4912d1ca6585409b92d1d7fefb8baf60fa
  Author: Michael Roth <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/main.c

  Log Message:
  -----------
  qga: hang GAConfig/socket_activation off of GAState global

For w32 services we rely on the global GAState to access resources
associated with the agent within service_main(). Currently this is
sufficient for starting the agent since we open the channel once prior
to calling service_main(), and simply start the GMainLoop to start the
agent from within service_main().

Eventually we want to be able to also [re-]open the communication
channel from within service_main(), which requires access to
config/socket_activation variables, so we hang them off GAState in
preparation for that.

Signed-off-by: Michael Roth <address@hidden>
Signed-off-by: Sameeh Jubran <address@hidden>
*dont move GAConfig struct, just the typedef
*fix build bisect for w32
Signed-off-by: Michael Roth <address@hidden>


  Commit: d88495a864011139683e62fb7f84db93c7b51881
      
https://github.com/qemu/qemu/commit/d88495a864011139683e62fb7f84db93c7b51881
  Author: Michael Roth <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/main.c

  Log Message:
  -----------
  qga: move w32 service handling out of run_agent()

Eventually we want a w32 service to be able to restart the qga main
loop from within service_main(). To allow for this we move service
handling out of run_agent() such that service_main() calls
run_agent() instead of the reverse.

Signed-off-by: Michael Roth <address@hidden>
Signed-off-by: Bishara AbuHattoum <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: d951fadad6cce10d83f736de691fc2003b89bac4
      
https://github.com/qemu/qemu/commit/d951fadad6cce10d83f736de691fc2003b89bac4
  Author: Michael Roth <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/main.c

  Log Message:
  -----------
  qga: add --retry-path option for re-initializing channel on failure

This adds an option to instruct the agent to periodically attempt
re-opening the communication channel after a channel error has
occurred. The main use-case for this is providing an OS-independent
way of allowing the agent to survive situations like hotplug/unplug of
the communication channel, or initial guest set up where the agent may
be installed/started prior to the installation of the channel device's
driver.

There are nicer ways of implementing this functionality via things
like systemd services, but this option is useful for platforms like
*BSD/w32.

Currently a channel error will result in the GSource for that channel
being removed from the GMainLoop, but the main loop continuing to run.
That behavior results in a dead loop when --retry-path isn't set, and
prevents us from knowing when to attempt re-opening the channel when
it is set, so we also force the loop to exit as part of this patch.

Signed-off-by: Michael Roth <address@hidden>


  Commit: ebc88c0ecf1ab8cb64cea9cf7973d05a12ed45e6
      
https://github.com/qemu/qemu/commit/ebc88c0ecf1ab8cb64cea9cf7973d05a12ed45e6
  Author: Michael Roth <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/installer/qemu-ga.wxs

  Log Message:
  -----------
  qga-win: install service with --retry-path set by default

It's nicer from a management perspective that the agent can survive
hotplug/unplug of the channel device, or be started prior to the
installation of the channel device's driver without and still be able
to resume normal function afterward. On linux there are alternatives
like systemd to support this, but on w32 --retry-path is the only
option so it makes sense to set it by default when installed as a
w32 service.

Signed-off-by: Michael Roth <address@hidden>


  Commit: a2c1ac4e22da848e0fef262086e0f29fbc6ff83a
      
https://github.com/qemu/qemu/commit/a2c1ac4e22da848e0fef262086e0f29fbc6ff83a
  Author: Michael Roth <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/channel-win32.c

  Log Message:
  -----------
  qga-win: report specific error when failing to open channel

Useful in general, but especially now that errors might occur more
frequently with --retry-path set.

Signed-off-by: Michael Roth <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: b70d6afe4d7f252259d3344e12daa2d6baf006e2
      
https://github.com/qemu/qemu/commit/b70d6afe4d7f252259d3344e12daa2d6baf006e2
  Author: Bishara AbuHattoum <address@hidden>
  Date:   2018-10-31 (Wed, 31 Oct 2018)

  Changed paths:
    M qga/main.c
    M qga/service-win32.h

  Log Message:
  -----------
  qga-win: changing --retry-path option behavior

Currently whenever the qemu-ga's service doesn't find the virtio-serial
the run_agent() loops in a QGA_RETRY_INTERVAL (default 5 seconds)
intervals and try to restart the qemu-ga which causes a synchronous loop.
Changed to wait and listen for the serial events by registering for
notifications a proper serial event handler that deals with events:
  DBT_DEVICEARRIVAL        indicates that the device has been inserted and
                     is available
  DBT_DEVICEREMOVECOMPLETE indicates that the devive has been removed
Which allow us to determine when the channel path is available for the
qemu-ga to restart.

Signed-off-by: Bishara AbuHattoum <address@hidden>
Signed-off-by: Sameeh Jubran <address@hidden>
Signed-off-by: Michael Roth <address@hidden>


  Commit: f96a3165ab1c36dbf4cb63e8761fa45457381aca
      
https://github.com/qemu/qemu/commit/f96a3165ab1c36dbf4cb63e8761fa45457381aca
  Author: Peter Maydell <address@hidden>
  Date:   2018-11-01 (Thu, 01 Nov 2018)

  Changed paths:
    M configure
    M qga/Makefile.objs
    M qga/channel-win32.c
    M qga/commands-posix.c
    M qga/commands-win32.c
    M qga/installer/qemu-ga.wxs
    M qga/main.c
    M qga/qapi-schema.json
    M qga/service-win32.h
    M qga/vss-win32.c
    M qga/vss-win32.h
    M qga/vss-win32/requester.cpp
    M qga/vss-win32/requester.h

  Log Message:
  -----------
  Merge remote-tracking branch 'remotes/mdroth/tags/qga-pull-2018-10-30-v3-tag' 
into staging

qemu-ga patch queue for soft-freeze

* support for --retry-path option for recovering from communication
  path failures
* support for serial/device name in guest-get-fsinfo for linux/w32
* support for freezing individual mount points in guest-fsfreeze-*
* fixes for unicode paths on w32, not-present vcpus in guest-get-vcpus,
  buffer overflow in guest-get-fsinfo for w32, and other minor fixes

v3:
* remove redundant check for --static in configure
* correct authorship on "qga-win: add debugging information"

v2:
* set libudev=off in configure for static builds

# gpg: Signature made Wed 31 Oct 2018 14:13:58 GMT
# gpg:                using RSA key 3353C9CEF108B584
# gpg: Good signature from "Michael Roth <address@hidden>"
# gpg:                 aka "Michael Roth <address@hidden>"
# gpg:                 aka "Michael Roth <address@hidden>"
# Primary key fingerprint: CEAC C9E1 5534 EBAB B82D  3FA0 3353 C9CE F108 B584

* remotes/mdroth/tags/qga-pull-2018-10-30-v3-tag: (24 commits)
  qga-win: changing --retry-path option behavior
  qga-win: report specific error when failing to open channel
  qga-win: install service with --retry-path set by default
  qga: add --retry-path option for re-initializing channel on failure
  qga: move w32 service handling out of run_agent()
  qga: hang GAConfig/socket_activation off of GAState global
  qga: group agent init/cleanup init separate routines
  qga: fix an off-by-one issue
  qga-win: demystify namespace stripping
  qga-win: return disk device in guest-get-fsinfo
  qga-win: handle multi-disk volumes
  qga-win: refactor disk info
  qga-win: report disk serial number
  qga-win: refactor disk properties (bus)
  qga-win: add debugging information
  build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI
  qga-win: fsinfo: pci-info: allow partial info
  qga-win: prevent crash when executing fsinfo command
  qga: linux: return disk device in guest-get-fsinfo
  qga: linux: report disk serial number
  ...

Signed-off-by: Peter Maydell <address@hidden>


Compare: https://github.com/qemu/qemu/compare/00878c95165d...f96a3165ab1c
      **NOTE:** This service has been marked for deprecation: 
https://developer.github.com/changes/2018-04-25-github-services-deprecation/

      Functionality will be removed from GitHub.com on January 31st, 2019.

reply via email to

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