Hello community, here is the log from the commit of package libvdpau for openSUSE:Factory checked in at 2014-07-10 08:18:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libvdpau (Old) and /work/SRC/openSUSE:Factory/.libvdpau.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libvdpau" Changes: -------- --- /work/SRC/openSUSE:Factory/libvdpau/libvdpau.changes 2013-10-29 09:39:22.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.libvdpau.new/libvdpau.changes 2014-07-10 09:32:06.000000000 +0200 @@ -1,0 +2,9 @@ +Wed Jul 2 07:49:16 UTC 2014 - [email protected] + +- Update to v0.8 + * This release fixes an incorrect type for VdpPictureInfo and + adds an environment variable, VDPAU_DRIVER_PATH, which can be + used to override the default search path that the library uses + to find its backend driver libraries. + +------------------------------------------------------------------- Old: ---- libvdpau-0.6.tar.gz New: ---- libvdpau-0.8.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libvdpau.spec ++++++ --- /var/tmp/diff_new_pack.kQYQ9s/_old 2014-07-10 09:32:06.000000000 +0200 +++ /var/tmp/diff_new_pack.kQYQ9s/_new 2014-07-10 09:32:06.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package libvdpau # -# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,13 +17,13 @@ Name: libvdpau -Version: 0.6 +Version: 0.8 Release: 0 Summary: VDPAU wrapper and trace libraries License: MIT Group: System/Libraries Url: http://people.freedesktop.org/~aplattner -Source: http://people.freedesktop.org/~aplattner/vdpau/%{name}-%{version}.tar.gz +Source: http://people.freedesktop.org/~aplattner/vdpau/%{name}-%{version}.tar.bz2 Source1: vdpauinfo-0.1.tar.gz Source2: README Source99: baselibs.conf ++++++ libvdpau-0.6.tar.gz -> libvdpau-0.8.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/AUTHORS new/libvdpau-0.8/AUTHORS --- old/libvdpau-0.6/AUTHORS 2013-02-02 00:34:58.000000000 +0100 +++ new/libvdpau-0.8/AUTHORS 2014-07-01 18:15:31.000000000 +0200 @@ -4,3 +4,6 @@ Kiran Pawar James Le Cuirot Robert Morell +Dave Airlie +Emil Velikov +Reimar Döffinger diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/ChangeLog new/libvdpau-0.8/ChangeLog --- old/libvdpau-0.6/ChangeLog 2013-02-02 00:37:44.000000000 +0100 +++ new/libvdpau-0.8/ChangeLog 2014-07-01 18:56:40.000000000 +0200 @@ -1,3 +1,132 @@ +commit 6dd2fa1ffb567b5062293816deb2fc66723f2860 +Author: Aaron Plattner <[email protected]> +Date: Tue Jul 1 09:16:05 2014 -0700 + + Bump version to 0.8 + + Signed-off-by: Aaron Plattner <[email protected]> + +commit ee9491a1216f47e10cbb551391a01c7fcde940d2 +Author: Emil Velikov <[email protected]> +Date: Mon Mar 10 13:12:30 2014 -0700 + + Add VDPAU_DRIVER_PATH support + + Allow the user to specify the location of the backend driver, + via the VDPAU_DRIVER_PATH environment variable. This allows + easier testing of VDPAU backends without the need to rebuild + libvdpau. + + Inspired by LIBGL_DRIVERS_PATH from mesa. + + Signed-off-by: Emil Velikov <[email protected]> + Acked-by: Stephen Warren <[email protected]> + Reviewed-by: Aaron Plattner <[email protected]> + Signed-off-by: Aaron Plattner <[email protected]> + +commit 186195b1a84f2517205522e7ab8e0f62ad61c329 +Author: Reimar Döffinger <[email protected]> +Date: Tue Feb 18 14:48:16 2014 -0800 + + Fix incorrect VdpPictureInfo typedef. + + VdpPictureInfo should not be a pointer, otherwise the + VdpDecoderRender function signature asks for a pointer to a pointer. + But it really does expect a pointer directly to e.g. VdpPictureInfoH264. + + Signed-off-by: Reimar Döffinger <[email protected]> + Tested-by: Reimar Döffinger <[email protected]> + Reviewed-by: Stephen Warren <[email protected]> + Signed-off-by: Aaron Plattner <[email protected]> + +commit 903d961a802ae65a9ecf014929a3ad3f50c6faf6 +Author: Emil Velikov <[email protected]> +Date: Fri Jan 17 11:12:24 2014 -0800 + + trace: remove trailing whitespace + + Signed-off-by: Emil Velikov <[email protected]> + Reviewed-by: Aaron Plattner <[email protected]> + Signed-off-by: Aaron Plattner <[email protected]> + +commit 7748591f9ba57483528972e36693536f27ce1f20 +Author: Aaron Plattner <[email protected]> +Date: Thu Aug 1 13:42:28 2013 -0700 + + Bump version to 0.7 + + Signed-off-by: Aaron Plattner <[email protected]> + +commit 556e43bf1640c998aed137a38d403df8c72067bd +Author: Aaron Plattner <[email protected]> +Date: Thu Aug 1 13:48:17 2013 -0700 + + trace: delete unused _vdp_cap_dump_point + + Nothing actually uses VdpPoint, so this tracing function was never called. I + left the VdpPoint type in vdpau.h for now, just in case anyone actually uses it + themselves. + + Signed-off-by: Aaron Plattner <[email protected]> + +commit 30ca342707d77649fa79fa19ba3f6658b2c59092 +Author: Aaron Plattner <[email protected]> +Date: Thu Aug 1 13:38:50 2013 -0700 + + Make init_config and init_fixes static + + Fixes -Wmissing-prototypes warnings. + + Signed-off-by: Aaron Plattner <[email protected]> + +commit 22a2f15f3e5f36641f72211da9f786b6778d0481 +Author: Dave Airlie <[email protected]> +Date: Wed Jul 24 20:29:28 2013 -0700 + + vdpau: add prime support at connection setup + + This just ports the code from the mesa glx setup into vdpau, + this just picks the correct driver to load on the client side, + + at least for gallium/vl code we need another similiar change + inside the driver code to pick the correct drm device. + + Signed-off-by: Dave Airlie <[email protected]> + Tested-by: Martin Peres <[email protected]> + Tested-by: Hohahiu <[email protected]> + Reviewed-by: Aaron Plattner <[email protected]> + Signed-off-by: Aaron Plattner <[email protected]> + Bug: https://bugs.freedesktop.org/show_bug.cgi?id=67283 + +commit e6c11e0be829b0a80a3b020f7f9f56e0c7d0585a +Author: Aaron Plattner <[email protected]> +Date: Mon Jul 22 13:54:13 2013 -0700 + + Don't leak the vdpau_wrapper.cfg file pointer + + init_config opens vdpau_wrapper.cfg and reads its contents, but never closes it. + This causes a file descriptor leak if libvdpau is unloaded and reloaded. + + Signed-off-by: Aaron Plattner <[email protected]> + Reviewed-by: Andy Ritger <[email protected]> + Reviewed-by: Josep Torra <[email protected]> + +commit 626037b813cf19d9a0ddde9c4a5a39f8df951478 +Author: Aaron Plattner <[email protected]> +Date: Mon Jul 22 14:43:23 2013 -0700 + + init_config: remove unused local variable 'ret' + + Signed-off-by: Aaron Plattner <[email protected]> + +commit af29b18ed000c0f82bf3805902393e7bb0e5b7e7 +Author: Kiran Pawar <[email protected]> +Date: Mon Aug 1 02:07:29 2011 -0700 + + trace: fix Coverity dead code warnings + + Signed-off-by: Aaron Plattner <[email protected]> + commit 5a5969684bdfeca3bd0dd9b21c1da406b225dab1 Author: Aaron Plattner <[email protected]> Date: Fri Feb 1 15:34:34 2013 -0800 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/configure new/libvdpau-0.8/configure --- old/libvdpau-0.6/configure 2013-02-02 00:37:36.000000000 +0100 +++ new/libvdpau-0.8/configure 2014-07-01 18:16:38.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for libvdpau 0.6. +# Generated by GNU Autoconf 2.68 for libvdpau 0.8. # # Report bugs to <[email protected]>. # @@ -570,8 +570,8 @@ # Identity of this package. PACKAGE_NAME='libvdpau' PACKAGE_TARNAME='libvdpau' -PACKAGE_VERSION='0.6' -PACKAGE_STRING='libvdpau 0.6' +PACKAGE_VERSION='0.8' +PACKAGE_STRING='libvdpau 0.8' PACKAGE_BUGREPORT='[email protected]' PACKAGE_URL='' @@ -1333,7 +1333,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libvdpau 0.6 to adapt to many kinds of systems. +\`configure' configures libvdpau 0.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1403,7 +1403,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libvdpau 0.6:";; + short | recursive ) echo "Configuration of libvdpau 0.8:";; esac cat <<\_ACEOF @@ -1526,7 +1526,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libvdpau configure 0.6 +libvdpau configure 0.8 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -1925,7 +1925,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libvdpau $as_me 0.6, which was +It was created by libvdpau $as_me 0.8, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -2740,7 +2740,7 @@ # Define the identity of the package. PACKAGE='libvdpau' - VERSION='0.6' + VERSION='0.8' cat >>confdefs.h <<_ACEOF @@ -16325,7 +16325,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libvdpau $as_me 0.6, which was +This file was extended by libvdpau $as_me 0.8, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -16391,7 +16391,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -libvdpau config.status 0.6 +libvdpau config.status 0.8 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/configure.ac new/libvdpau-0.8/configure.ac --- old/libvdpau-0.6/configure.ac 2013-02-02 00:33:13.000000000 +0100 +++ new/libvdpau-0.8/configure.ac 2014-07-01 18:14:53.000000000 +0200 @@ -1,6 +1,6 @@ AC_PREREQ(2.60) -AC_INIT(libvdpau, 0.6, [[email protected]], libvdpau) +AC_INIT(libvdpau, 0.8, [[email protected]], libvdpau) AM_INIT_AUTOMAKE([dist-bzip2 foreign]) AM_MAINTAINER_MODE diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/include/vdpau/vdpau.h new/libvdpau-0.8/include/vdpau/vdpau.h --- old/libvdpau-0.6/include/vdpau/vdpau.h 2011-08-04 18:34:04.000000000 +0200 +++ new/libvdpau-0.8/include/vdpau/vdpau.h 2014-05-31 22:40:10.000000000 +0200 @@ -2638,7 +2638,7 @@ } VdpBitstreamBuffer; /** - * \brief A generic "picture information" pointer type. + * \brief A generic "picture information" type. * * This type serves solely to document the expected usage of a * generic (void *) function parameter. In actual usage, the @@ -2647,7 +2647,7 @@ * picking the type appropriate for the decoder object in * question. */ -typedef void * VdpPictureInfo; +typedef void VdpPictureInfo; /** * \brief Picture parameter information for an MPEG 1 or MPEG 2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/include/vdpau/vdpau_x11.h new/libvdpau-0.8/include/vdpau/vdpau_x11.h --- old/libvdpau-0.6/include/vdpau/vdpau_x11.h 2010-02-10 23:51:15.000000000 +0100 +++ new/libvdpau-0.8/include/vdpau/vdpau_x11.h 2014-05-31 22:40:10.000000000 +0200 @@ -81,6 +81,8 @@ * - \c /usr/lib/vdpau/libvdpau_nvidia.so.1 * - \c /usr/lib/vdpau/libvdpau_intel.so.1 * - \c /usr/lib/vdpau/libvdpau_ati.so.1 + * The library path can be overridden by the VDPAU_DRIVER_PATH + * environment variable. * * The VDPAU wrapper library implements just one function; \ref * vdp_device_create_x11. The wrapper will implement this function diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/src/mesa_dri2.c new/libvdpau-0.8/src/mesa_dri2.c --- old/libvdpau-0.6/src/mesa_dri2.c 2013-01-25 01:55:06.000000000 +0100 +++ new/libvdpau-0.8/src/mesa_dri2.c 2013-07-26 07:16:07.000000000 +0200 @@ -128,6 +128,20 @@ req->dri2ReqType = X_DRI2Connect; req->window = window; req->driverType = DRI2DriverVDPAU; +#ifdef DRI2DriverPrimeShift + { + char *prime = getenv("DRI_PRIME"); + if (prime) { + unsigned int primeid; + errno = 0; + primeid = strtoul(prime, NULL, 0); + if (errno == 0) + req->driverType |= + ((primeid & DRI2DriverPrimeMask) << DRI2DriverPrimeShift); + } + } +#endif + if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/src/vdpau_wrapper.c new/libvdpau-0.8/src/vdpau_wrapper.c --- old/libvdpau-0.6/src/vdpau_wrapper.c 2013-01-25 01:55:06.000000000 +0100 +++ new/libvdpau-0.8/src/vdpau_wrapper.c 2014-05-31 22:40:10.000000000 +0200 @@ -30,6 +30,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include <vdpau/vdpau_x11.h> #if DRI2 #include "mesa_dri2.h" @@ -66,7 +67,8 @@ #endif -#define DRIVER_LIB_FORMAT "%slibvdpau_%s.so%s" +#define DRIVER_FALLBACK_LIB_FORMAT "libvdpau_%s.so" +#define DRIVER_LIB_FORMAT "%s/libvdpau_%s.so.1" static char * _vdp_get_driver_name_from_dri2( Display * display, @@ -107,6 +109,7 @@ { char const * vdpau_driver; char * vdpau_driver_dri2 = NULL; + const char * vdpau_driver_path = NULL; char vdpau_driver_lib[PATH_MAX]; char const * vdpau_trace; char const * func_name; @@ -120,24 +123,41 @@ vdpau_driver = "nvidia"; } - if (snprintf(vdpau_driver_lib, sizeof(vdpau_driver_lib), DRIVER_LIB_FORMAT, - VDPAU_MODULEDIR "/", vdpau_driver, ".1") >= - sizeof(vdpau_driver_lib)) { - fprintf(stderr, "Failed to construct driver path: path too long\n"); - if (vdpau_driver_dri2) { - XFree(vdpau_driver_dri2); - vdpau_driver_dri2 = NULL; + if (geteuid() == getuid()) { + /* don't allow setuid apps to use VDPAU_DRIVER_PATH */ + vdpau_driver_path = getenv("VDPAU_DRIVER_PATH"); + if (vdpau_driver_path && + snprintf(vdpau_driver_lib, sizeof(vdpau_driver_lib), + DRIVER_LIB_FORMAT, vdpau_driver_path, vdpau_driver) < + sizeof(vdpau_driver_lib)) { + _vdp_driver_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL); + } + } + + /* Fallback to VDPAU_MODULEDIR when VDPAU_DRIVER_PATH is not set, + * or if we fail to create the driver path/dlopen the library. */ + if (!_vdp_driver_dll) { + if (snprintf(vdpau_driver_lib, sizeof(vdpau_driver_lib), + DRIVER_LIB_FORMAT, VDPAU_MODULEDIR, vdpau_driver) >= + sizeof(vdpau_driver_lib)) { + fprintf(stderr, "Failed to construct driver path: path too long\n"); + if (vdpau_driver_dri2) { + XFree(vdpau_driver_dri2); + vdpau_driver_dri2 = NULL; + } + _VDP_ERROR_BREAKPOINT(); + return VDP_STATUS_NO_IMPLEMENTATION; + } + else { + _vdp_driver_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL); } - _VDP_ERROR_BREAKPOINT(); - return VDP_STATUS_NO_IMPLEMENTATION; } - _vdp_driver_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL); if (!_vdp_driver_dll) { /* Try again using the old path, which is guaranteed to fit in PATH_MAX * if the complete path fit above. */ - snprintf(vdpau_driver_lib, sizeof(vdpau_driver_lib), DRIVER_LIB_FORMAT, - "", vdpau_driver, ""); + snprintf(vdpau_driver_lib, sizeof(vdpau_driver_lib), + DRIVER_FALLBACK_LIB_FORMAT, vdpau_driver); _vdp_driver_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL); } @@ -328,11 +348,10 @@ } } -void init_config(void) +static void init_config(void) { FILE *fp; char buffer[1024]; - int ret; fp = fopen(VDPAU_SYSCONFDIR "/vdpau_wrapper.cfg", "r"); if (!fp) { @@ -357,9 +376,11 @@ _disable_flash_pq_bg_color = atoi(param); } } + + fclose(fp); } -void init_fixes(void) +static void init_fixes(void) { if (_inited_fixes) { return; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/test/dlclose.c new/libvdpau-0.8/test/dlclose.c --- old/libvdpau-0.6/test/dlclose.c 2013-01-28 23:51:16.000000000 +0100 +++ new/libvdpau-0.8/test/dlclose.c 2013-07-25 06:38:16.000000000 +0200 @@ -1,3 +1,4 @@ +#include <dirent.h> #include <dlfcn.h> #include <stdio.h> #include <vdpau/vdpau.h> @@ -8,11 +9,32 @@ #define FAIL 1 #define SKIP 77 +static int countOpenFDs(void) +{ + DIR *dir = opendir("/proc/self/fd"); + struct dirent *ent; + int count = 0; + + if (!dir) { + fprintf(stderr, "Couldn't open /proc/self/fd; skipping file descriptor " + "leak test\n"); + return 0; + } + + while (ent = readdir(dir)) { + count++; + } + + closedir(dir); + return count; +} + int main() { // Work around a bug in libXext: dlclosing it after it has registered the // Generic Event Extension causes an identical bug to the one this program // is trying to test for. + int nOpenFDs = countOpenFDs(); void *libXext = dlopen("libXext.so.6", RTLD_LAZY); void *libvdpau = dlopen("../src/.libs/libvdpau.so", RTLD_LAZY); Display *dpy = XOpenDisplay(NULL); @@ -60,5 +82,11 @@ dlclose(libvdpau); XCloseDisplay(dpy); + // Make sure no file descriptors were leaked. + if (countOpenFDs() != nOpenFDs) { + fprintf(stderr, "Mismatch in the number of open file descriptors!\n"); + return FAIL; + } + return PASS; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvdpau-0.6/trace/vdpau_trace.cpp new/libvdpau-0.8/trace/vdpau_trace.cpp --- old/libvdpau-0.6/trace/vdpau_trace.cpp 2010-01-28 23:53:38.000000000 +0100 +++ new/libvdpau-0.8/trace/vdpau_trace.cpp 2014-01-28 21:25:40.000000000 +0100 @@ -174,23 +174,6 @@ ); } -static void _vdp_cap_dump_point( - VdpPoint const * point -) -{ - if (!point) { - fprintf(_vdp_cap_data.fp, "NULL"); - return; - } - - fprintf( - _vdp_cap_data.fp, - "{%u, %u}", - point->x, - point->y - ); -} - static void _vdp_cap_dump_rect( VdpRect const * rect ) @@ -468,16 +451,16 @@ (int32_t)picture_info_mpeg4->trb[0], (int32_t)picture_info_mpeg4->trb[1], (uint32_t)picture_info_mpeg4->vop_time_increment_resolution, - (uint32_t)picture_info_mpeg4->vop_coding_type, + (uint32_t)picture_info_mpeg4->vop_coding_type, (uint32_t)picture_info_mpeg4->vop_fcode_forward, (uint32_t)picture_info_mpeg4->vop_fcode_backward, (uint32_t)picture_info_mpeg4->resync_marker_disable, - (uint32_t)picture_info_mpeg4->interlaced, - (uint32_t)picture_info_mpeg4->quant_type, - (uint32_t)picture_info_mpeg4->quarter_sample, - (uint32_t)picture_info_mpeg4->short_video_header, + (uint32_t)picture_info_mpeg4->interlaced, + (uint32_t)picture_info_mpeg4->quant_type, + (uint32_t)picture_info_mpeg4->quarter_sample, + (uint32_t)picture_info_mpeg4->short_video_header, (uint32_t)picture_info_mpeg4->rounding_control, - (uint32_t)picture_info_mpeg4->alternate_vertical_scan_flag, + (uint32_t)picture_info_mpeg4->alternate_vertical_scan_flag, (uint32_t)picture_info_mpeg4->top_field_first ); for (uint32_t i = 0; i < _VDP_TRACE_ARSIZE(picture_info_mpeg4->intra_quantizer_matrix); ++i) { @@ -4608,11 +4591,9 @@ if (_vdp_cap_data.level >= LEVEL_PARAMS) { fprintf( _vdp_cap_data.fp, - "%p, %d, %s, %s", + "%p, %d, -, -", display, - screen, - device ? "-" : "NULL", - get_proc_address ? "-" : "NULL" + screen ); } fputs(")\n", _vdp_cap_data.fp); -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
