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

Re: [libvirt] PATCH: Latest MinGW patches



On Wed, Sep 03, 2008 at 01:35:27PM +0100, Daniel P. Berrange wrote:
> I've got a MinGW build environment setup on Fedora 10 now, so just checked
> out what the latest state of libvirt CVS is.
> 
> With the attached patch, I can run configure with:
> 
>   ./configure  \
>       --build=i686-pc-linux-gnu \
>       --host=i686-pc-mingw32 \
>       --prefix=/usr/i686-pc-mingw32/sys-root/mingw \
>       --without-libvirtd \
>       --without-xen \
>       --without-qemu \
>       --without-sasl \
>       --without-lxc \
>       --without-openvz \
>       --without-python

Aside from the PKG_CONFIG_PATH I already mentioned you need to set CC
and also pass --without-avahi and --without-polkit, so complete 
invocation is actually

  PKG_CONFIG_PATH=/usr/i686-pc-mingw32/sys-root/mingw/lib/pkgconfig \
  CC="i686-pc-mingw32-gcc" \
  ./configure \
    --build=$(uname -m)-pc-linux \
    --host=i686-pc-mingw32 \
    --prefix=/usr/i686-pc-mingw32/sys-root/mingw \
    --without-sasl \
    --without-avahi \
    --without-polkit \
    --without-python \
    --without-xen \
    --without-qemu \
    --without-lxc \
    --without-openvz \
    --without-libvirtd

This new version of the patch fixes two small bugs in the original, and
also adds the mingw-libvirt.spec.in and makes the autobuild.sh script
build this RPM too, if mingw build chain is present. THis means we will
get fully validation of the windows compatability for our nightly builds

Daniel

Index: .cvsignore
===================================================================
RCS file: /data/cvs/libvirt/.cvsignore,v
retrieving revision 1.10
diff -u -p -r1.10 .cvsignore
--- .cvsignore	2 Jan 2008 16:31:21 -0000	1.10
+++ .cvsignore	3 Sep 2008 16:44:21 -0000
@@ -20,6 +20,7 @@ ltconfig
 update.log
 libvirt.pc
 libvirt.spec
+mingw-libvirt.spec
 COPYING
 m4
 ABOUT-NLS
Index: Makefile.am
===================================================================
RCS file: /data/cvs/libvirt/Makefile.am,v
retrieving revision 1.27
diff -u -p -r1.27 Makefile.am
--- Makefile.am	13 Jun 2008 09:08:44 -0000	1.27
+++ Makefile.am	3 Sep 2008 16:44:21 -0000
@@ -10,6 +10,7 @@ ACLOCAL_AMFLAGS = -I m4 -I gnulib/m4
 
 EXTRA_DIST = \
   libvirt.spec libvirt.spec.in \
+  mingw-libvirt.spec mingw-libvirt.spec.in \
   libvirt.pc libvirt.pc.in \
   $(man_MANS) autobuild.sh \
   .x-sc_avoid_if_before_free \
Index: autobuild.sh
===================================================================
RCS file: /data/cvs/libvirt/autobuild.sh,v
retrieving revision 1.10
diff -u -p -r1.10 autobuild.sh
--- autobuild.sh	28 Aug 2008 09:08:44 -0000	1.10
+++ autobuild.sh	3 Sep 2008 16:44:21 -0000
@@ -17,8 +17,6 @@ rm -rf coverage
 ./autogen.sh --prefix="$AUTOBUILD_INSTALL_ROOT" \
   --enable-test-coverage \
   --enable-compile-warnings=error \
-  --with-openvz \
-  --with-lxc \
   --with-xen-proxy
 
 # If the MAKEFLAGS envvar does not yet include a -j option,
@@ -44,6 +42,7 @@ test -x /usr/bin/lcov && make cov
 rm -f *.tar.gz
 make dist
 
+
 if [ -f /usr/bin/rpmbuild ]; then
   if [ -n "$AUTOBUILD_COUNTER" ]; then
     EXTRA_RELEASE=".auto$AUTOBUILD_COUNTER"
@@ -51,5 +50,40 @@ if [ -f /usr/bin/rpmbuild ]; then
     NOW=`date +"%s"`
     EXTRA_RELEASE=".$USER$NOW"
   fi
-  rpmbuild --nodeps --define "extra_release $EXTRA_RELEASE" -ta --clean *.tar.gz
+
+  rpmbuild --nodeps \
+     --define "extra_release $EXTRA_RELEASE" \
+     --define "_sourcedir `pwd`" \
+     -ba --clean libvirt.spec
+fi
+
+if [ -x /usr/bin/i686-pc-mingw32-gcc ]; then
+  make distclean
+
+  PKG_CONFIG_PATH=$AUTOBUILD_INSTALL_ROOT/i686-pc-mingw32/sys-root/mingw/lib/pkgconfig \
+  CC="i686-pc-mingw32-gcc" \
+  ./configure \
+    --build=$(uname -m)-pc-linux \
+    --host=i686-pc-mingw32 \
+    --prefix=$AUTOBUILD_INSTALL_ROOT/i686-pc-mingw32/sys-root/mingw \
+    --without-sasl \
+    --without-avahi \
+    --without-polkit \
+    --without-python \
+    --without-xen \
+    --without-qemu \
+    --without-lxc \
+    --without-openvz \
+    --without-libvirtd
+
+  make
+  make install
+
+  #set -o pipefail
+  #make check 2>&1 | tee "$RESULTS"
+
+  rpmbuild --nodeps \
+     --define "extra_release $EXTRA_RELEASE" \
+     --define "_sourcedir `pwd`" \
+     -ba --clean mingw-libvirt.spec
 fi
Index: configure.in
===================================================================
RCS file: /data/cvs/libvirt/configure.in,v
retrieving revision 1.163
diff -u -p -r1.163 configure.in
--- configure.in	27 Aug 2008 20:05:58 -0000	1.163
+++ configure.in	3 Sep 2008 16:44:21 -0000
@@ -65,10 +65,10 @@ dnl Use --disable-largefile if you don't
 AC_SYS_LARGEFILE
 
 dnl Availability of various common functions (non-fatal if missing).
-AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity])
+AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid])
 
 dnl Availability of various common headers (non-fatal if missing).
-AC_CHECK_HEADERS([pwd.h paths.h sys/syslimits.h sys/utsname.h sys/wait.h winsock2.h sched.h termios.h])
+AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/syslimits.h sys/utsname.h sys/wait.h winsock2.h sched.h termios.h])
 
 dnl Where are the XDR functions?
 dnl If portablexdr is installed, prefer that.
@@ -649,6 +649,20 @@ AC_ARG_WITH([storage-iscsi],
 AC_ARG_WITH([storage-disk],
 [  --with-storage-disk         with GPartd Disk backend for the storage driver (on)],[],[with_storage_disk=check])
 
+with_storage_dir=yes
+if test "$with_libvirtd" = "no"; then
+  with_storage_dir=no
+  with_storage_fs=no
+  with_storage_lvm=no
+  with_storage_iscsi=no
+  with_storage_disk=no
+fi
+if test "$with_storage_dir" = "yes" ; then
+  AC_DEFINE_UNQUOTED([WITH_STORAGE_DIR], 1, [whether directory backend for storage driver is enabled])
+fi
+AM_CONDITIONAL([WITH_STORAGE_DIR], [test "$with_storage_dir" = "yes"])
+
+
 if test "$with_storage_fs" = "yes" -o "$with_storage_fs" = "check"; then
   AC_PATH_PROG([MOUNT], [mount], [], [$PATH:/sbin:/usr/sbin])
   AC_PATH_PROG([UMOUNT], [umount], [], [$PATH:/sbin:/usr/sbin])
@@ -1024,7 +1038,7 @@ AC_OUTPUT(Makefile src/Makefile include/
 	  docs/examples/python/Makefile \
 	  gnulib/lib/Makefile \
 	  gnulib/tests/Makefile \
-          libvirt.pc libvirt.spec \
+          libvirt.pc libvirt.spec mingw-libvirt.spec \
           po/Makefile.in \
 	  include/libvirt/Makefile include/libvirt/libvirt.h \
 	  python/Makefile python/tests/Makefile \
@@ -1053,7 +1067,7 @@ AC_MSG_NOTICE([Libvirtd: $with_libvirtd]
 AC_MSG_NOTICE([])
 AC_MSG_NOTICE([Storage Drivers])
 AC_MSG_NOTICE([])
-AC_MSG_NOTICE([     Dir: yes])
+AC_MSG_NOTICE([     Dir: $with_storage_dir])
 AC_MSG_NOTICE([      FS: $with_storage_fs])
 AC_MSG_NOTICE([   NetFS: $with_storage_fs])
 AC_MSG_NOTICE([     LVM: $with_storage_lvm])
Index: mingw-libvirt.spec.in
===================================================================
RCS file: mingw-libvirt.spec.in
diff -N mingw-libvirt.spec.in
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ mingw-libvirt.spec.in	3 Sep 2008 16:44:21 -0000
@@ -0,0 +1,89 @@
+%define __os_install_post /usr/lib/rpm/brp-compress %{nil}
+
+Name:           mingw-libvirt
+Version:        @VERSION@
+Release:        1%{?dist}%{?extra_release}
+Summary:        MinGW Windows libvirt virtualization library
+
+License:        LGPLv2+
+Group:          Development/Libraries
+URL:            http://www.libvirt.org/
+Source0:        ftp://libvirt.org/libvirt/libvirt-%{version}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires:  mingw-gcc
+BuildRequires:  mingw-binutils
+BuildRequires:  mingw-libgpg-error
+BuildRequires:  mingw-libgcrypt
+BuildRequires:  mingw-gnutls
+BuildRequires:  mingw-libxml2
+BuildRequires:  mingw-portablexdr
+
+Requires:       mingw-runtime
+Requires:       mingw-libgpg-error
+Requires:       mingw-libgcrypt
+Requires:       mingw-gnutls
+Requires:       mingw-libxml2
+
+%description
+MinGW Windows libvirt virtualization library.
+
+
+%prep
+%setup -q -n libvirt-%{version}
+
+
+%build
+# XXX enable SASL in future
+PKG_CONFIG_PATH="%{_prefix}/i686-pc-mingw32/sys-root/mingw/lib/pkgconfig" \
+CC="i686-pc-mingw32-gcc" \
+CFLAGS="-O2 -g -Wall -pipe" \
+./configure \
+  --build=%_build \
+  --host=i686-pc-mingw32 \
+  --prefix=%{_prefix}/i686-pc-mingw32/sys-root/mingw \
+  --without-sasl \
+  --without-avahi \
+  --without-polkit \
+  --without-python \
+  --without-xen \
+  --without-qemu \
+  --without-lxc \
+  --without-openvz \
+  --without-libvirtd
+make
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+make DESTDIR=$RPM_BUILD_ROOT install
+
+rm -rf $RPM_BUILD_ROOT/%{_prefix}/i686-pc-mingw32/sys-root/mingw/etc/libvirt
+rm -rf $RPM_BUILD_ROOT/%{_prefix}/i686-pc-mingw32/sys-root/mingw/share/doc/*
+rm -rf $RPM_BUILD_ROOT/%{_prefix}/i686-pc-mingw32/sys-root/mingw/share/gtk-doc/*
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%files
+%defattr(-,root,root)
+%{_prefix}/i686-pc-mingw32/sys-root/mingw/bin/libvirt-0.dll
+%{_prefix}/i686-pc-mingw32/sys-root/mingw/bin/virsh.exe
+
+%{_prefix}/i686-pc-mingw32/sys-root/mingw/lib/libvirt.a
+%{_prefix}/i686-pc-mingw32/sys-root/mingw/lib/libvirt.dll.a
+%{_prefix}/i686-pc-mingw32/sys-root/mingw/lib/libvirt.la
+%{_prefix}/i686-pc-mingw32/sys-root/mingw/lib/pkgconfig/libvirt.pc
+
+%dir %{_prefix}/i686-pc-mingw32/sys-root/mingw/include/libvirt
+%{_prefix}/i686-pc-mingw32/sys-root/mingw/include/libvirt/libvirt.h
+%{_prefix}/i686-pc-mingw32/sys-root/mingw/include/libvirt/virterror.h
+
+%{_prefix}/i686-pc-mingw32/sys-root/mingw/share/man/man1/virsh.1*
+
+
+%changelog
+* Tue Sep  2 2008 Daniel P. Berrange <berrange redhat com> - 0.4.4-1
+- Initial RPM release, largely based on earlier work from several sources.
Index: qemud/remote_protocol.c
===================================================================
RCS file: /data/cvs/libvirt/qemud/remote_protocol.c,v
retrieving revision 1.17
diff -u -p -r1.17 remote_protocol.c
--- qemud/remote_protocol.c	27 Aug 2008 20:05:59 -0000	1.17
+++ qemud/remote_protocol.c	3 Sep 2008 16:44:22 -0000
@@ -6,6 +6,7 @@
 #include "remote_protocol.h"
 #include <config.h>
 #include "internal.h"
+#include "socketcompat.h"
 
 bool_t
 xdr_remote_nonnull_string (XDR *xdrs, remote_nonnull_string *objp)
Index: qemud/remote_protocol.h
===================================================================
RCS file: /data/cvs/libvirt/qemud/remote_protocol.h,v
retrieving revision 1.17
diff -u -p -r1.17 remote_protocol.h
--- qemud/remote_protocol.h	27 Aug 2008 20:05:59 -0000	1.17
+++ qemud/remote_protocol.h	3 Sep 2008 16:44:22 -0000
@@ -15,6 +15,7 @@ extern "C" {
 
 #include <config.h>
 #include "internal.h"
+#include "socketcompat.h"
 #define REMOTE_MESSAGE_MAX 262144
 #define REMOTE_STRING_MAX 65536
 
Index: qemud/remote_protocol.x
===================================================================
RCS file: /data/cvs/libvirt/qemud/remote_protocol.x,v
retrieving revision 1.17
diff -u -p -r1.17 remote_protocol.x
--- qemud/remote_protocol.x	27 Aug 2008 20:05:59 -0000	1.17
+++ qemud/remote_protocol.x	3 Sep 2008 16:44:22 -0000
@@ -38,6 +38,7 @@
 
 %#include <config.h>
 %#include "internal.h"
+%#include "socketcompat.h"
 
 /*----- Data types. -----*/
 
Index: src/Makefile.am
===================================================================
RCS file: /data/cvs/libvirt/src/Makefile.am,v
retrieving revision 1.92
diff -u -p -r1.92 Makefile.am
--- src/Makefile.am	27 Aug 2008 11:19:45 -0000	1.92
+++ src/Makefile.am	3 Sep 2008 16:44:22 -0000
@@ -58,7 +58,8 @@ NETWORK_CONF_SOURCES =						\
 
 # Storage driver generic impl APIs
 STORAGE_CONF_SOURCES =						\
-		storage_conf.h storage_conf.c
+		storage_conf.h storage_conf.c			\
+		storage_backend.h storage_backend.c
 
 
 # The remote RPC driver, covering domains, storage, networks, etc
@@ -109,8 +110,7 @@ QEMU_DRIVER_SOURCES =						\
 
 # And finally storage backend specific impls
 STORAGE_DRIVER_SOURCES =					\
-		storage_driver.h storage_driver.c		\
-		storage_backend.h storage_backend.c
+		storage_driver.h storage_driver.c
 
 STORAGE_DRIVER_FS_SOURCES =					\
 		storage_backend_fs.h storage_backend_fs.c
Index: src/storage_backend.c
===================================================================
RCS file: /data/cvs/libvirt/src/storage_backend.c,v
retrieving revision 1.20
diff -u -p -r1.20 storage_backend.c
--- src/storage_backend.c	27 Aug 2008 11:42:52 -0000	1.20
+++ src/storage_backend.c	3 Sep 2008 16:44:22 -0000
@@ -24,9 +24,13 @@
 #include <config.h>
 
 #include <string.h>
+#if HAVE_REGEX_H
 #include <regex.h>
+#endif
 #include <sys/types.h>
+#if HAVE_SYS_WAIT_H
 #include <sys/wait.h>
+#endif
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdint.h>
@@ -38,6 +42,10 @@
 #endif
 
 #include "internal.h"
+#include "util.h"
+#include "memory.h"
+
+#include "storage_backend.h"
 
 #if WITH_STORAGE_LVM
 #include "storage_backend_logical.h"
@@ -48,15 +56,14 @@
 #if WITH_STORAGE_DISK
 #include "storage_backend_disk.h"
 #endif
-
-#include "util.h"
-#include "memory.h"
-
-#include "storage_backend.h"
+#if WITH_STORAGE_DIR
 #include "storage_backend_fs.h"
+#endif
 
 static virStorageBackendPtr backends[] = {
+#if WITH_STORAGE_DIR
     &virStorageBackendDirectory,
+#endif
 #if WITH_STORAGE_FS
     &virStorageBackendFileSystem,
     &virStorageBackendNetFileSystem,
@@ -209,8 +216,12 @@ virStorageBackendUpdateVolInfoFD(virConn
         return -2;
 
     if (S_ISREG(sb.st_mode)) {
+#ifndef __MINGW32__
         vol->allocation = (unsigned long long)sb.st_blocks *
             (unsigned long long)sb.st_blksize;
+#else
+        vol->allocation = sb.st_size;
+#endif
         /* Regular files may be sparse, so logical size (capacity) is not same
          * as actual allocation above
          */
@@ -337,6 +348,8 @@ virStorageBackendStablePath(virConnectPt
     return devpath;
 }
 
+
+#ifndef __MINGW32__
 /*
  * Run an external program.
  *
@@ -620,3 +633,33 @@ virStorageBackendRunProgNul(virConnectPt
 
     return 0;
 }
+
+#else
+
+int
+virStorageBackendRunProgRegex(virConnectPtr conn,
+                              virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
+                              const char *const*prog ATTRIBUTE_UNUSED,
+                              int nregex ATTRIBUTE_UNUSED,
+                              const char **regex ATTRIBUTE_UNUSED,
+                              int *nvars ATTRIBUTE_UNUSED,
+                              virStorageBackendListVolRegexFunc func ATTRIBUTE_UNUSED,
+                              void *data ATTRIBUTE_UNUSED,
+                              int *outexit ATTRIBUTE_UNUSED)
+{
+    virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, _("%s no implemented on Win32"), __FUNCTION__);
+    return -1;
+}
+
+int
+virStorageBackendRunProgNul(virConnectPtr conn,
+                            virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
+                            const char **prog ATTRIBUTE_UNUSED,
+                            size_t n_columns ATTRIBUTE_UNUSED,
+                            virStorageBackendListVolNulFunc func ATTRIBUTE_UNUSED,
+                            void *data ATTRIBUTE_UNUSED)
+{
+    virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, _("%s no implemented on Win32"), __FUNCTION__);
+    return -1;
+}
+#endif
Index: src/storage_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/storage_conf.c,v
retrieving revision 1.13
diff -u -p -r1.13 storage_conf.c
--- src/storage_conf.c	3 Sep 2008 07:12:37 -0000	1.13
+++ src/storage_conf.c	3 Sep 2008 16:44:22 -0000
@@ -189,7 +189,11 @@ virStoragePoolDefParsePerms(virConnectPt
     }
 
     if (virXPathNode(conn, "/pool/permissions/owner", ctxt) == NULL) {
+#if HAVE_GETUID
         perms->uid = getuid();
+#else
+        perms->uid = 0;
+#endif
     } else {
         if (virXPathLong(conn, "number(/pool/permissions/owner)", ctxt, &v) < 0) {
             virStorageReportError(conn, VIR_ERR_XML_ERROR,
@@ -200,7 +204,11 @@ virStoragePoolDefParsePerms(virConnectPt
     }
 
     if (virXPathNode(conn, "/pool/permissions/group", ctxt) == NULL) {
-        perms->uid = getgid();
+#if HAVE_GETGID
+        perms->gid = getgid();
+#else
+        perms->gid = 0;
+#endif
     } else {
         if (virXPathLong(conn, "number(/pool/permissions/group)", ctxt, &v) < 0) {
             virStorageReportError(conn, VIR_ERR_XML_ERROR,
@@ -425,7 +433,7 @@ virStoragePoolDefParse(virConnectPtr con
     if (!xml) {
         if (conn && conn->err.code == VIR_ERR_NONE)
               virStorageReportError(conn, VIR_ERR_XML_ERROR,
-                                    _("failed to parse xml document"));
+                                    "%s",_("failed to parse xml document"));
         goto cleanup;
     }
 
@@ -590,7 +598,11 @@ virStorageVolDefParsePerms(virConnectPtr
     }
 
     if (virXPathNode(conn, "/volume/permissions/owner", ctxt) == NULL) {
+#if HAVE_GETUID
         perms->uid = getuid();
+#else
+        perms->uid = 0;
+#endif
     } else {
         if (virXPathLong(conn, "number(/volume/permissions/owner)", ctxt, &v) < 0) {
             virStorageReportError(conn, VIR_ERR_XML_ERROR,
@@ -600,7 +612,11 @@ virStorageVolDefParsePerms(virConnectPtr
         perms->uid = (int)v;
     }
     if (virXPathNode(conn, "/volume/permissions/group", ctxt) == NULL) {
+#if HAVE_GETGID
         perms->gid = getgid();
+#else
+        perms->gid = 0;
+#endif
     } else {
         if (virXPathLong(conn, "number(/volume/permissions/group)", ctxt, &v) < 0) {
             virStorageReportError(conn, VIR_ERR_XML_ERROR,
@@ -799,7 +815,7 @@ virStorageVolDefParse(virConnectPtr conn
     if (!xml) {
         if (conn && conn->err.code == VIR_ERR_NONE)
               virStorageReportError(conn, VIR_ERR_XML_ERROR,
-                                    _("failed to parse xml document"));
+                                    "%s", _("failed to parse xml document"));
         goto cleanup;
     }
 
Index: src/util.c
===================================================================
RCS file: /data/cvs/libvirt/src/util.c,v
retrieving revision 1.56
diff -u -p -r1.56 util.c
--- src/util.c	2 Sep 2008 10:29:51 -0000	1.56
+++ src/util.c	3 Sep 2008 16:44:22 -0000
@@ -440,22 +440,13 @@ virRun(virConnectPtr conn,
 int
 virExec(virConnectPtr conn,
         const char *const*argv ATTRIBUTE_UNUSED,
+        const char *const*envp ATTRIBUTE_UNUSED,
+        const fd_set *keepfd ATTRIBUTE_UNUSED,
         int *retpid ATTRIBUTE_UNUSED,
         int infd ATTRIBUTE_UNUSED,
         int *outfd ATTRIBUTE_UNUSED,
-        int *errfd ATTRIBUTE_UNUSED)
-{
-    ReportError (conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__);
-    return -1;
-}
-
-int
-virExecNonBlock(virConnectPtr conn,
-                const char *const*argv ATTRIBUTE_UNUSED,
-                int *retpid ATTRIBUTE_UNUSED,
-                int infd ATTRIBUTE_UNUSED,
-                int *outfd ATTRIBUTE_UNUSED,
-                int *errfd ATTRIBUTE_UNUSED)
+        int *errfd ATTRIBUTE_UNUSED,
+        int flags ATTRIBUTE_UNUSED)
 {
     ReportError (conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__);
     return -1;

-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|


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