rpms/nspluginwrapper/devel nspluginwrapper-1.1.0-build.patch, NONE, 1.1 nspluginwrapper-1.1.0-fork.patch, NONE, 1.1 nspluginwrapper-1.1.0-runtime-restart.patch, NONE, 1.1 nspluginwrapper.spec, 1.48, 1.49 sources, 1.9, 1.10 nspluginwrapper-0.9.91.5-cpp-plugins.patch, 1.1, NONE nspluginwrapper-0.9.91.5-fork.patch, 1.1, NONE nspluginwrapper-0.9.91.5-npviewer-gthread.patch, 1.2, NONE nspluginwrapper-0.9.91.5-restart.patch, 1.1, NONE nspluginwrapper-0.9.91.5-rh.patch, 1.2, NONE nspluginwrapper-0.9.91.5-rpc-error.patch, 1.1, NONE nspluginwrapper-0.9.91.5-runtime-restart.patch, 1.2, NONE nspluginwrapper-0.9.91.5-xulrunner.patch, 1.2, NONE
Martin Stransky (stransky)
fedora-extras-commits at redhat.com
Tue Jul 8 13:17:50 UTC 2008
- Previous message (by thread): rpms/libvirt/F-9 libvirt-0.4.4-boot-cdrom.patch, NONE, 1.1 libvirt.spec, 1.88, 1.89
- Next message (by thread): rpms/gyachi/EL-5 .cvsignore, 1.3, 1.4 gyachi.spec, 1.10, 1.11 sources, 1.3, 1.4
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: stransky
Update of /cvs/pkgs/rpms/nspluginwrapper/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv11531
Modified Files:
nspluginwrapper.spec sources
Added Files:
nspluginwrapper-1.1.0-build.patch
nspluginwrapper-1.1.0-fork.patch
nspluginwrapper-1.1.0-runtime-restart.patch
Removed Files:
nspluginwrapper-0.9.91.5-cpp-plugins.patch
nspluginwrapper-0.9.91.5-fork.patch
nspluginwrapper-0.9.91.5-npviewer-gthread.patch
nspluginwrapper-0.9.91.5-restart.patch
nspluginwrapper-0.9.91.5-rh.patch
nspluginwrapper-0.9.91.5-rpc-error.patch
nspluginwrapper-0.9.91.5-runtime-restart.patch
nspluginwrapper-0.9.91.5-xulrunner.patch
Log Message:
* Tue Jul 8 2008 Martin Stransky <stransky at redhat.com> 1.1.0-1
- update to latest upstream version (1.1.0)
nspluginwrapper-1.1.0-build.patch:
--- NEW FILE nspluginwrapper-1.1.0-build.patch ---
diff -up nspluginwrapper-1.1.0/configure.build nspluginwrapper-1.1.0/configure
--- nspluginwrapper-1.1.0/configure.build 2008-06-29 22:19:50.000000000 +0200
+++ nspluginwrapper-1.1.0/configure 2008-07-07 16:26:11.000000000 +0200
@@ -3,6 +3,8 @@
# nspluginwrapper configure script (C) 2005-2008 Gwenole Beauchesne
# derived from qemu configure script, (C) 2003 Fabrice Bellard
#
+set -x
+
PACKAGE=nspluginwrapper
# set temporary file name
@@ -23,11 +25,14 @@ TMPS="${TMPDIR1}/npw-conf-${RANDOM}-$$-$
prefix="/usr"
lib32=""
lib64=""
-x_base_dirs=""
-biarch="guess"
-build_viewer="guess"
+base_lib=""
+base_libdir=""
+pkglibdir=""
+x_base_dir=""
+biarch="no"
+build_viewer="no"
build_player="yes"
-linux_only="guess"
+linux_only="yes"
strip="no"
cc="gcc"
cxx="g++"
@@ -62,6 +67,8 @@ x86_64|amd64)
;;
esac
bigendian="no"
+with_xpcom="no"
+with_gecko="mozilla"
# find source path
# XXX: we assume an absolute path is given when launching configure,
@@ -79,6 +86,9 @@ case "$opt" in
--prefix=*)
prefix=`echo $opt | cut -d '=' -f 2`
;;
+--pkgdir=*)
+ pkgdir=`echo $opt | cut -d '=' -f 2`
+ ;;
--pkglibdir=*)
pkglibdir=`echo $opt | cut -d '=' -f 2`
;;
@@ -88,6 +98,12 @@ case "$opt" in
--target-cpu=*)
target_cpu=`echo $opt | cut -d '=' -f 2 | sed -e 's/^i.86$/i386/'`
;;
+--with-base-lib=*)
+ base_lib=`echo $opt | cut -d '=' -f 2`
+ ;;
+--with-base-libdir=*)
+ base_libdir=`echo $opt | cut -d '=' -f 2`
+ ;;
--enable-generic)
linux_only="no"
;;
@@ -122,7 +138,7 @@ case "$opt" in
lib64=`echo $opt | cut -d '=' -f 2`
;;
--with-x11-prefix=*)
- x_base_dirs=`echo $opt | cut -d '=' -f 2`
+ x_base_dir=`echo $opt | cut -d '=' -f 2`
;;
--with-cc=*)
cc=`echo $opt | cut -d '=' -f 2`
@@ -130,6 +146,12 @@ case "$opt" in
--with-cxx=*)
cxx=`echo $opt | cut -d '=' -f 2`
;;
+--with-xpcom=*)
+ with_xpcom=`echo $opt | cut -d '=' -f 2`
+ ;;
+--with-gecko=*)
+ with_gecko=`echo $opt | cut -d '=' -f 2`
+ ;;
esac
done
@@ -364,8 +386,8 @@ rm -f $TMPC $TMPE
# check for GTK+ 2.0 compile CFLAGS
if test "$build_viewer" = "yes" -o "$build_player" = "yes"; then
if $pkgconfig --exists gtk+-2.0; then
- GTK_CFLAGS=`$pkgconfig --cflags gtk+-2.0`
- GTK_LDFLAGS=`$pkgconfig --libs gtk+-2.0`
+ GTK_CFLAGS=`$pkgconfig --cflags gtk+-2.0 gthread-2.0`
+ GTK_LDFLAGS=`$pkgconfig --libs gtk+-2.0 gthread-2.0`
else
echo "GTK+ 2.0 environment not found"
exit 1
@@ -415,25 +437,30 @@ EOF
rm -f $TMPC $TMPE
fi
-# check for X11 base dir
-if test -z "$x_base_dirs"; then
- x_base_dirs="
- /usr
- /usr/X11R6
- /usr/local/X11R6
- $prefix
- "
-fi
-for dir in $x_base_dirs; do
- x_include_dir="$dir/include"
- if test -f $x_include_dir/X11/Intrinsic.h; then
- x_lib_dir="$dir/$lib64"
- if test -f $x_lib_dir/libX11.so; then
- x_base_dir=$dir
- break
- fi
+# check for Gecko compile CFLAGS
+if $pkgconfig --exists $with_gecko-plugin; then
+ GECKO_CFLAGS=`$pkgconfig --cflags $with_gecko-plugin`
+ GECKO_LDFLAGS=`$pkgconfig --libs $with_gecko-plugin`
+ GECKO_LIBDIR=""
+else
+ echo "gecko-devel not found"
+ exit 1
+fi
+
+
+# check for XPCOM compile CFLAGS
+if [ $with_xpcom == "yes" ]; then
+ if $pkgconfig --exists $with_gecko-xpcom; then
+ GECKO_CFLAGS="$GECKO_CFLAGS"`$pkgconfig --cflags $with_gecko-xpcom`
+ GECKO_LDFLAGS="$GECKO_LDFLAGS"`$pkgconfig --libs $with_gecko-xpcom`
+ GECKO_LIBDIR="$GECKO_LIBDIR"`$pkgconfig --libs-only-L $with_gecko-xpcom | sed -e "s|-L||" -e "s| ||g"`
+ else
+ echo "gecko-devel (XPCOM) not found"
+ exit 1
fi
-done
+fi
+
+# check for X11 base dir
if test -z "$x_base_dir"; then
echo "X11 environment not found"
exit 1
@@ -544,6 +571,7 @@ EOF
echo "Standard options:"
echo " --help print this message"
echo " --prefix=PREFIX install in PREFIX [$prefix]"
+echo " --pkgdir=name name of package directory [$pkgdir]"
echo " --pkglibdir=ROOT install private files in ROOT [$pkglibdir]"
echo " --target-os=OS build plugin support for target OS [$target_os]"
echo " --target-cpu=CPU build plugin support for target CPU [$target_cpu]"
@@ -560,12 +588,14 @@ echo " --with-lib64=NAME use
echo " --with-x11-prefix=PREFIX use PREFIX as the X11 base dir [autodetect]"
echo " --with-cc=CC use C compiler CC [$cc]"
echo " --with-cxx=CXX use C++ compiler CXX [$cxx]"
+echo " --with-xpcom=yes/no compile and link with XPCOM support"
echo ""
echo "NOTE: The object files are built at the place where configure is launched"
exit 1
fi
echo "Install prefix $prefix"
+echo "nspluginwrapper dir $pkgdir"
echo "nspluginwrapper root dir $pkglibdir"
echo "Strip binaries $strip"
echo "Bi-arch build $biarch"
@@ -582,6 +612,8 @@ echo "host CPU $host_cp
echo "host big endian $bigendian"
echo "target OS $target_os"
echo "target CPU $target_cpu"
+echo "Gecko $with_gecko"
+echo "Gecko XPCOM support $with_xpcom"
config_mak="config-host.mak"
echo "# Automatically generated by configure - do not modify" > $config_mak
@@ -593,18 +625,18 @@ echo "COMPILER=$compiler" >> $config_mak
echo "CC=$cc" >> $config_mak
echo "CXX=$cxx" >> $config_mak
echo "CFLAGS=$CFLAGS" >> $config_mak
+echo "LDFLAGS=$LDFLAGS" >> $config_mak
echo "GLIB_CFLAGS=$GLIB_CFLAGS" >> $config_mak
echo "GLIB_LDFLAGS=$GLIB_LDFLAGS" >> $config_mak
echo "GTK_CFLAGS=$GTK_CFLAGS" >> $config_mak
echo "GTK_LDFLAGS=$GTK_LDFLAGS" >> $config_mak
echo "CURL_CFLAGS=$CURL_CFLAGS" >> $config_mak
echo "CURL_LDFLAGS=$CURL_LDFLAGS" >> $config_mak
-if test "$biarch" = "yes"; then
-echo "LDFLAGS_32=-m32" >> $config_mak
-echo "CFLAGS_32=$CFLAGS_32" >> $config_mak
-else
-echo 'CFLAGS_32=$(CFLAGS)' >> $config_mak
-fi
+echo "GECKO_CFLAGS=$GECKO_CFLAGS" >> $config_mak
+echo "GECKO_LDFLAGS=$GECKO_LDFLAGS" >> $config_mak
+echo "GECKO_LIBDIR=$GECKO_LIBDIR" >> $config_mak
+
+host_os=$target_os
if test "$host_os" = "linux"; then
echo "OS=linux" >> $config_mak
echo "#define HOST_LINUX 1" >> $config_h
@@ -625,6 +657,8 @@ else
echo "Unsupported OS"
exit 1
fi
+
+host_cpu=$target_cpu
if test "$host_cpu" = "i386" ; then
echo "ARCH=i386" >> $config_mak
echo "#define HOST_I386 1" >> $config_h
@@ -666,20 +700,22 @@ if test -n "$fbigendian" ; then
fi
echo "SRC_PATH=$source_path" >> $config_mak
-echo "build_viewer=$build_viewer" >> $config_mak
-echo "build_player=$build_player" >> $config_mak
-echo "biarch=$biarch" >> $config_mak
echo "lib32=$lib32" >> $config_mak
echo "lib64=$lib64" >> $config_mak
echo "prefix=$prefix" >> $config_mak
echo "bindir=$prefix/bin" >> $config_mak
-libdir="$prefix/$lib64"
-echo "libdir=$libdir" >> $config_mak
-echo "#define LIB \"$lib64\"" >> $config_h
-echo "#define LIBDIR \"$libdir\"" >> $config_h
+echo "base_libdir=$base_libdir" >> $config_mak
+echo "#define LIB \"$base_lib\"" >> $config_h
+echo "#define LIBDIR \"$base_libdir\"" >> $config_h
echo "x11prefix=$x_base_dir" >> $config_mak
echo "ALLOW_STRIP=$strip" >> $config_mak
+if [ $with_xpcom == "yes" ]; then
+ echo "#define USE_XPCOM 1" >> $config_h
+else
+ echo "#define USE_XPCOM 0" >> $config_h
+fi
+
VERSION=`sed < $source_path/$PACKAGE.spec -n '/^\%define version[ ]*/s///p'`
RELEASE=`sed < $source_path/$PACKAGE.spec -n '/^\%define release[ ]*/s///p'`
SVNDATE=`sed < $source_path/$PACKAGE.spec -n '/^\%define svndate[ ]*/s///p'`
@@ -700,8 +736,14 @@ else
echo "#define NPW_VERSION \"$VERSION\"" >> $config_h
fi
+echo "#define NPW_PREFIX \"$prefix\"" >> $config_h
+echo "#define NPW_LIB32 \"$lib32\"" >> $config_h
+echo "#define NPW_LIB64 \"$lib64\"" >> $config_h
+
+echo "pkgdir=$pkgdir" >> $config_mak
+echo "#define NPW_DIR \"$pkgdir\"" >> $config_h
+
echo "pkglibdir=$pkglibdir" >> $config_mak
-echo "#define NPW_LIBDIR \"$pkglibdir\"" >> $config_h
if test "$has_visibility_attribute" = "yes"; then
echo "#define attribute_hidden __attribute__((visibility(\"hidden\")))" >> $config_h
@@ -729,9 +771,8 @@ config_h="config.h"
echo "/* Automatically generated by configure - do not modify */" > $config_h
echo "#include \"config-host.h\"" >> $config_h
-if test "$linux_only" = "yes"; then
- echo "#define BUILD_LINUX_ONLY 1" >> $config_h
-fi
+# Linux only by default
+echo "#define BUILD_LINUX_ONLY 1" >> $config_h
if test "$target_os" = "linux"; then
echo "TARGET_OS=linux" >> $config_mak
@@ -772,3 +813,7 @@ if test "$source_path_used" = "yes" ; th
esac
ln -sf $source_path/Makefile Makefile
fi
+
+# Don't strip binaries
+echo "DONT_STRIP=yes" >> $config_mak
+
diff -up nspluginwrapper-1.1.0/Makefile.build nspluginwrapper-1.1.0/Makefile
--- nspluginwrapper-1.1.0/Makefile.build 2008-07-06 22:15:03.000000000 +0200
+++ nspluginwrapper-1.1.0/Makefile 2008-07-07 16:25:17.000000000 +0200
@@ -59,23 +59,6 @@ ifneq (,$(findstring $(OS),netbsd dragon
X_LDFLAGS += -Wl,--rpath,$(x11prefix)/$(lib64)
endif
-ARCH_32 = $(ARCH)
-ifeq ($(biarch), yes)
-ARCH_32 = $(TARGET_ARCH)
-LSB_LIBS = $(LSB_OBJ_DIR)/libc.so $(LSB_OBJ_DIR)/libgcc_s_32.so
-LSB_LIBS += $(LSB_CORE_STUBS:%=$(LSB_OBJ_DIR)/%.so)
-LSB_LIBS += $(LSB_CORE_STATIC_STUBS:%=$(LSB_OBJ_DIR)/%.a)
-LSB_LIBS += $(LSB_DESKTOP_STUBS:%=$(LSB_OBJ_DIR)/%.so)
-endif
-
-LSB_TOP_DIR = $(SRC_PATH)/lsb-build
-LSB_INC_DIR = $(LSB_TOP_DIR)/headers
-LSB_SRC_DIR = $(LSB_TOP_DIR)/stub_libs
-LSB_OBJ_DIR = lsb-build-$(ARCH_32)
-LSB_CORE_STUBS = $(shell cat $(LSB_SRC_DIR)/core_filelist)
-LSB_CORE_STATIC_STUBS = $(shell cat $(LSB_SRC_DIR)/core_static_filelist)
-LSB_DESKTOP_STUBS = $(shell cat $(LSB_SRC_DIR)/desktop_filelist)
-
ifeq (i386,$(TARGET_ARCH))
TARGET_ELF_ARCH = elf32-i386
endif
@@ -83,33 +66,22 @@ ifeq (ppc,$(TARGET_ARCH))
TARGET_ELF_ARCH = elf32-powerpc
endif
-MOZILLA_CFLAGS = -I$(SRC_PATH)/npapi -I$(SRC_PATH)/npapi/nspr
+MOZILLA_CFLAGS = $(GECKO_CFLAGS)
+MOZILLA_LDFLAGS = $(GECKO_LDFLAGS)
npwrapper_LIBRARY = npwrapper.so
-npwrapper_RAWSRCS = npw-wrapper.c npw-rpc.c rpc.c debug.c utils.c npruntime.c
+npwrapper_RAWSRCS = npw-wrapper.c npw-rpc.c rpc.c debug.c utils.c npruntime.c npw-dir.c
npwrapper_SOURCES = $(npwrapper_RAWSRCS:%.c=$(SRC_PATH)/src/%.c)
npwrapper_OBJECTS = $(npwrapper_RAWSRCS:%.c=npwrapper-%.os)
npwrapper_CFLAGS = $(CFLAGS) $(X_CFLAGS) $(MOZILLA_CFLAGS) $(GLIB_CFLAGS)
-npwrapper_LDFLAGS = $(X_LDFLAGS) $(libpthread_LDFLAGS)
-npwrapper_LDFLAGS += $(GLIB_LDFLAGS)
+npwrapper_LDFLAGS = $(LDFLAGS) $(X_LDFLAGS) $(libpthread_LDFLAGS) $(GLIB_LDFLAGS) $(MOZILLA_LDFLAGS)
npviewer_PROGRAM = npviewer.bin
npviewer_RAWSRCS = npw-viewer.c npw-rpc.c rpc.c debug.c utils.c npruntime.c
npviewer_SOURCES = $(npviewer_RAWSRCS:%.c=$(SRC_PATH)/src/%.c)
npviewer_OBJECTS = $(npviewer_RAWSRCS:%.c=npviewer-%.o)
-ifeq ($(biarch),yes)
-npviewer_CFLAGS = $(CFLAGS_32)
-npviewer_CFLAGS += -I$(LSB_INC_DIR)
-npviewer_CFLAGS += -I$(LSB_INC_DIR)/glib-2.0
-npviewer_CFLAGS += -I$(LSB_INC_DIR)/gtk-2.0
-npviewer_LDFLAGS = $(LDFLAGS_32) -L$(LSB_OBJ_DIR)
-npviewer_LDFLAGS += -lgtk-x11-2.0 -lgdk-x11-2.0 -lgobject-2.0 -ldl -lglib-2.0 -lX11 -lXt
-else
-npviewer_CFLAGS += $(GTK_CFLAGS)
-npviewer_LDFLAGS = $(GTK_LDFLAGS) $(X_LDFLAGS)
-endif
-npviewer_CFLAGS += $(MOZILLA_CFLAGS)
-npviewer_LDFLAGS += $(libdl_LDFLAGS) $(libpthread_LDFLAGS) -lgthread-2.0
+npviewer_CFLAGS = $(CFLAGS) $(GTK_CFLAGS) $(MOZILLA_CFLAGS)
+npviewer_LDFLAGS = $(LDFLAGS) $(GTK_LDFLAGS) $(X_LDFLAGS) $(libdl_LDFLAGS) $(libpthread_LDFLAGS) $(MOZILLA_LDFLAGS)
ifeq ($(TARGET_ARCH),i386)
npviewer_MAPFILE = $(SRC_PATH)/src/npw-viewer.map
endif
@@ -117,11 +89,9 @@ ifneq ($(npviewer_MAPFILE),)
npviewer_LDFLAGS += -Wl,--export-dynamic
npviewer_LDFLAGS += -Wl,--version-script,$(npviewer_MAPFILE)
endif
-ifeq ($(OS):$(TARGET_ARCH),linux:i386)
npviewer_SOURCES += $(SRC_PATH)/src/cxxabi-compat.cpp
npviewer_OBJECTS += npviewer-cxxabi-compat.o
npviewer_LDFLAGS += -lsupc++
-endif
npplayer_PROGRAM = npplayer
npplayer_SOURCES = npw-player.c debug.c rpc.c utils.c glibcurl.c gtk2xtbin.c $(tidy_SOURCES)
@@ -151,10 +121,11 @@ libnoxshm_LDFLAGS = $(LDFLAGS_32) -L$(LS
endif
npconfig_PROGRAM = npconfig
-npconfig_RAWSRCS = npw-config.c
+npconfig_RAWSRCS = npw-config.c npw-dir.c
npconfig_SOURCES = $(npconfig_RAWSRCS:%.c=$(SRC_PATH)/src/%.c)
npconfig_OBJECTS = $(npconfig_RAWSRCS:%.c=npconfig-%.o)
-npconfig_LDFLAGS = $(libdl_LDFLAGS)
+npconfig_CFLAGS = $(CFLAGS) $(MOZILLA_CFLAGS)
+npconfig_LDFLAGS = $(LDFLAGS) $(libdl_LDFLAGS) $(MOZILLA_LDFLAGS)
ifneq (,$(findstring $(OS),netbsd dragonfly))
# We will try to dlopen() the native plugin library. If that lib is
# linked against libpthread, then so must our program too.
@@ -170,11 +141,8 @@ CPPFLAGS = -I. -I$(SRC_PATH)
TARGETS = $(npconfig_PROGRAM)
TARGETS += $(nploader_PROGRAM)
TARGETS += $(npwrapper_LIBRARY)
-ifeq ($(build_viewer),yes)
TARGETS += $(npviewer_PROGRAM)
-TARGETS += $(libxpcom_LIBRARY)
TARGETS += $(libnoxshm_LIBRARY)
-endif
ifeq ($(build_player),yes)
TARGETS += $(npplayer_PROGRAM)
endif
@@ -242,56 +210,19 @@ uninstall.config:
rm -f $(DESTDIR)$(pkglibdir)/$(ARCH)/$(OS)/$(npconfig_PROGRAM)
uninstall.mkruntime:
rm -f $(DESTDIR)$(pkglibdir)/noarch/mkruntime
-
-install: install.dirs install.player install.wrapper install.viewer install.libxpcom install.libnoxshm install.loader install.config install.mkruntime
+install: install.dirs install.wrapper install.viewer install.loader install.config
install.dirs:
- mkdir -p $(DESTDIR)$(pkglibdir)/noarch
- mkdir -p $(DESTDIR)$(pkglibdir)/$(ARCH)
- mkdir -p $(DESTDIR)$(pkglibdir)/$(ARCH)/$(OS)
-ifneq ($(ARCH),$(ARCH_32))
- mkdir -p $(DESTDIR)$(pkglibdir)/$(ARCH_32)
- mkdir -p $(DESTDIR)$(pkglibdir)/$(ARCH_32)/$(TARGET_OS)
-endif
-ifeq ($(build_player),yes)
-install.player: $(npplayer_PROGRAM)
- install -m 755 $(STRIP_OPT) $(npplayer_PROGRAM) $(DESTDIR)$(pkglibdir)/$(ARCH)/$(OS)/$(npplayer_PROGRAM)
- mkdir -p $(DESTDIR)$(bindir)
- $(LN_S) $(pkglibdir)/$(ARCH)/$(OS)/$(npplayer_PROGRAM) $(DESTDIR)$(bindir)/nspluginplayer
-else
-install.player:
-endif
+ mkdir -p $(DESTDIR)$(pkglibdir)
install.wrapper: $(npwrapper_LIBRARY)
- install -m 755 $(STRIP_OPT) $(npwrapper_LIBRARY) $(DESTDIR)$(pkglibdir)/$(ARCH)/$(OS)/$(npwrapper_LIBRARY)
-ifeq ($(build_viewer),yes)
-install.viewer: install.viewer.bin install.viewer.glue
-install.libxpcom: do.install.libxpcom
-install.libnoxshm: do.install.libnoxshm
-else
-install.viewer:
-install.libxpcom:
-install.libnoxshm:
-endif
+ install -m 755 $(STRIP_OPT) $(npwrapper_LIBRARY) $(DESTDIR)$(pkglibdir)/$(npwrapper_LIBRARY)
+install.viewer: install.viewer.bin
+
install.viewer.bin: $(npviewer_PROGRAM)
- install -m 755 $(STRIP_OPT) $(npviewer_PROGRAM) $(DESTDIR)$(pkglibdir)/$(ARCH_32)/$(TARGET_OS)/$(npviewer_PROGRAM)
-install.viewer.glue::
- p=$(DESTDIR)$(pkglibdir)/$(ARCH_32)/$(TARGET_OS)/$(npviewer_PROGRAM:%.bin=%); \
- echo "#!/bin/sh" > $$p; \
- echo "TARGET_OS=$(TARGET_OS)" >> $$p; \
- echo "TARGET_ARCH=$(TARGET_ARCH)" >> $$p; \
- echo ". $(pkglibdir)/noarch/$(nploader_PROGRAM)" >> $$p; \
- chmod 755 $$p
-do.install.libxpcom: $(libxpcom_LIBRARY)
- install -m 755 $(STRIP_OPT) $(libxpcom_LIBRARY) $(DESTDIR)$(pkglibdir)/$(ARCH_32)/$(TARGET_OS)/$(libxpcom_LIBRARY)
-do.install.libnoxshm: $(libnoxshm_LIBRARY)
- install -m 755 $(STRIP_OPT) $(libnoxshm_LIBRARY) $(DESTDIR)$(pkglibdir)/$(ARCH_32)/$(TARGET_OS)/$(libnoxshm_LIBRARY)
+ install -m 755 $(STRIP_OPT) $(npviewer_PROGRAM) $(DESTDIR)$(pkglibdir)/$(npviewer_PROGRAM)
install.config: $(npconfig_PROGRAM)
- install -m 755 $(STRIP_OPT) $(npconfig_PROGRAM) $(DESTDIR)$(pkglibdir)/$(ARCH)/$(OS)/$(npconfig_PROGRAM)
- mkdir -p $(DESTDIR)$(bindir)
- $(LN_S) $(pkglibdir)/$(ARCH)/$(OS)/$(npconfig_PROGRAM) $(DESTDIR)$(bindir)/nspluginwrapper
+ install -m 755 $(STRIP_OPT) $(npconfig_PROGRAM) $(DESTDIR)$(pkglibdir)/$(npconfig_PROGRAM)
install.loader: $(nploader_PROGRAM)
- install -m 755 $(nploader_PROGRAM) $(DESTDIR)$(pkglibdir)/noarch/$(nploader_PROGRAM)
-install.mkruntime: $(SRC_PATH)/utils/mkruntime.sh
- install -m 755 $< $(DESTDIR)$(pkglibdir)/noarch/mkruntime
+ install -m 755 $(nploader_PROGRAM) $(DESTDIR)$(pkglibdir)/$(nploader_PROGRAM)
$(archivedir)::
[ -d $(archivedir) ] || mkdir $(archivedir) > /dev/null 2>&1
@@ -340,13 +271,13 @@ npwrapper-%.os: $(SRC_PATH)/src/%.c
$(CC) -o $@ -c $< $(PIC_CFLAGS) $(CPPFLAGS) $(npwrapper_CFLAGS) -DBUILD_WRAPPER
$(npviewer_PROGRAM): $(npviewer_OBJECTS) $(npviewer_MAPFILE) $(LSB_OBJ_DIR) $(LSB_LIBS)
- $(CC) $(LDFLAGS_32) -o $@ $(npviewer_OBJECTS) $(npviewer_LDFLAGS)
+ $(CC) -o $@ $(npviewer_OBJECTS) $(npviewer_LDFLAGS)
npviewer-%.o: $(SRC_PATH)/src/%.c
- $(CC) $(CFLAGS_32) -o $@ -c $< $(CPPFLAGS) $(npviewer_CFLAGS) -DBUILD_VIEWER
+ $(CC) -o $@ -c $< $(CPPFLAGS) $(npviewer_CFLAGS) -DBUILD_VIEWER
npviewer-%.o: $(SRC_PATH)/src/%.cpp
- $(CXX) $(CFLAGS_32) -o $@ -c $< $(CPPFLAGS) $(npviewer_CFLAGS) -DBUILD_VIEWER
+ $(CXX) -o $@ -c $< $(CPPFLAGS) $(npviewer_CFLAGS) -DBUILD_VIEWER
$(npplayer_PROGRAM): $(npplayer_OBJECTS) $(npplayer_MAPFILE) $(LSB_OBJ_DIR) $(LSB_LIBS)
$(CC) $(LDFLAGS) -o $@ $(npplayer_OBJECTS) $(npplayer_LDFLAGS)
@@ -356,12 +287,6 @@ npplayer-%.o: $(SRC_PATH)/src/%.c
npplayer-%.o: $(SRC_PATH)/src/tidy/%.c
$(CC) $(CFLAGS) -o $@ -c $< $(CPPFLAGS) $(npplayer_CFLAGS) -DBUILD_PLAYER
-$(libxpcom_LIBRARY): $(libxpcom_OBJECTS) $(LSB_OBJ_DIR) $(LSB_LIBS)
- $(CC) $(LDFLAGS_32) $(DSO_LDFLAGS) -o $@ $(libxpcom_OBJECTS) $(libxpcom_LDFLAGS) -Wl,--soname,libxpcom.so
-
-libxpcom-%.o: $(SRC_PATH)/src/%.c
- $(CC) $(CFLAGS_32) -o $@ -c $< $(CPPFLAGS) $(libxpcom_CFLAGS) -DBUILD_XPCOM
-
$(libnoxshm_LIBRARY): $(libnoxshm_OBJECTS) $(LSB_OBJ_DIR) $(LSB_LIBS)
$(CC) $(LDFLAGS_32) $(DSO_LDFLAGS) -o $@ $(libnoxshm_OBJECTS) $(libnoxshm_LDFLAGS) -Wl,--soname,libnoxshm.so
@@ -372,17 +297,23 @@ $(npconfig_PROGRAM): $(npconfig_OBJECTS)
$(CC) -o $@ $(npconfig_OBJECTS) $(npconfig_LDFLAGS)
npconfig-%.o: $(SRC_PATH)/src/%.c
- $(CC) -o $@ -c $< $(CPPFLAGS) $(CFLAGS)
+ $(CC) -o $@ -c $< $(CPPFLAGS) $(npconfig_CFLAGS)
$(nploader_PROGRAM): $(nploader_SOURCES)
- sed -e "s|%NPW_LIBDIR%|$(pkglibdir)|" $< > $@
+ sed -e "s|%NPW_PREFIX%|$(prefix)|" \
+ -e "s|%NPW_LIB32%|$(lib32)|" \
+ -e "s|%NPW_LIB64%|$(lib64)|" \
+ -e "s|%TARGET_OS%|$(TARGET_OS)|" \
+ -e "s|%TARGET_ARCH%|$(TARGET_ARCH)|" \
+ -e "s|%GECKO_LIBDIR%|$(GECKO_LIBDIR)|" \
+ -e "s|%NPW_DIR%|$(pkgdir)|" $< > $@
chmod 755 $@
$(LSB_OBJ_DIR)::
@[ -d $(LSB_OBJ_DIR) ] || mkdir $(LSB_OBJ_DIR) > /dev/null 2>&1
$(LSB_OBJ_DIR)/%.o: $(LSB_SRC_DIR)/%.c
- $(CC) $(CFLAGS_32) -nostdinc -fno-builtin -I. -I$(LSB_INC_DIR) -c $< -o $@
+ $(CC) $(CFLAGS) -nostdinc -fno-builtin -I. -I$(LSB_INC_DIR) -c $< -o $@
$(LSB_OBJ_DIR)/%.a: $(LSB_OBJ_DIR)/%.o
$(AR) rc $@ $<
@@ -395,6 +326,6 @@ $(LSB_OBJ_DIR)/libgcc_s_32.so: $(LSB_OBJ
$(LN_S) libgcc_s.so $@
$(LSB_OBJ_DIR)/%.so: $(LSB_OBJ_DIR)/%.o
- $(CC) $(LDFLAGS_32) -nostdlib $(DSO_LDFLAGS) $< -o $@ \
+ $(CC) $(LDFLAGS) -nostdlib $(DSO_LDFLAGS) $< -o $@ \
-Wl,--version-script,$(patsubst $(LSB_OBJ_DIR)/%.o,$(LSB_SRC_DIR)/%.Version,$<) \
-Wl,-soname,`grep "$(patsubst $(LSB_OBJ_DIR)/%.o,%,$<) " $(LSB_SRC_DIR)/LibNameMap.txt | cut -f2 -d' '`
diff -up nspluginwrapper-1.1.0/src/debug.h.build nspluginwrapper-1.1.0/src/debug.h
--- nspluginwrapper-1.1.0/src/debug.h.build 2008-06-21 22:13:34.000000000 +0200
+++ nspluginwrapper-1.1.0/src/debug.h 2008-07-07 16:25:17.000000000 +0200
@@ -33,7 +33,7 @@ extern void npw_printf(const char *forma
extern void npw_vprintf(const char *format, va_list args) attribute_hidden;
#if DEBUG
-#define bug npw_dprintf
+#define bug npw_dprintf("%s:%d",__FILE__,__LINE__);npw_dprintf
#define D(x) x
#else
#define D(x) ;
diff -up nspluginwrapper-1.1.0/src/npw-config.c.build nspluginwrapper-1.1.0/src/npw-config.c
--- nspluginwrapper-1.1.0/src/npw-config.c.build 2008-06-26 23:44:15.000000000 +0200
+++ nspluginwrapper-1.1.0/src/npw-config.c 2008-07-07 16:25:17.000000000 +0200
@@ -38,10 +38,15 @@
#include <pwd.h>
#include <dirent.h>
+#include <asm/types.h>
+
+#include "npw-dir.h"
static bool g_auto = false;
static bool g_verbose = false;
static const char NPW_CONFIG[] = "nspluginwrapper";
+static char *p_plugin_dir = NULL;
+static char *p_plugin_prefix = NULL;
static void error(const char *format, ...)
{
@@ -474,83 +479,32 @@ enum {
EXIT_VIEWER_NOT_FOUND = -2,
EXIT_VIEWER_ERROR = -1,
EXIT_VIEWER_OK = 0,
- EXIT_VIEWER_NATIVE = 20
};
-static int detect_plugin_viewer(const char *filename, NPW_PluginInfo *out_plugin_info)
+static int detect_plugin_viewer_fast(const char *filename, NPW_PluginInfo *out_plugin_info)
{
- static const char *target_arch_table[] = {
- NULL,
- "i386",
- NULL
- };
- const int target_arch_table_size = sizeof(target_arch_table) / sizeof(target_arch_table[0]);
+ char viewer_arch_path[PATH_MAX];
+ get_viewer_path(viewer_arch_path,PATH_MAX,out_plugin_info->target_arch);
+ if (access(viewer_arch_path, F_OK) != 0) {
+ return(EXIT_VIEWER_NOT_FOUND);
+ }
- if (out_plugin_info && out_plugin_info->target_arch[0] != '\0')
- target_arch_table[0] = out_plugin_info->target_arch;
- else
- target_arch_table[0] = NULL;
-
- static const char *target_os_table[] = {
- NULL,
- "linux",
- NULL
- };
- const int target_os_table_size = sizeof(target_os_table) / sizeof(target_os_table[0]);
+ char viewer_path[PATH_MAX];
+ sprintf(viewer_path, "%s/%s", viewer_arch_path, NPW_VIEWER);
+ if (access(viewer_path, F_OK) != 0)
+ return(EXIT_VIEWER_NOT_FOUND);
- if (out_plugin_info && out_plugin_info->target_os[0] != '\0')
- target_os_table[0] = out_plugin_info->target_os;
- else
- target_os_table[0] = NULL;
-
- // don't wrap plugins for host OS/ARCH
- if (out_plugin_info
- && out_plugin_info->target_arch && strcmp(out_plugin_info->target_arch, HOST_ARCH) == 0
- && out_plugin_info->target_os && strcmp(out_plugin_info->target_os, HOST_OS) == 0)
- return EXIT_VIEWER_NATIVE;
-
- for (int i = 0; i < target_arch_table_size; i++) {
- const char *target_arch = target_arch_table[i];
- if (target_arch == NULL)
- continue;
- char viewer_arch_path[PATH_MAX];
- sprintf(viewer_arch_path, "%s/%s", NPW_LIBDIR, target_arch);
- if (access(viewer_arch_path, F_OK) != 0) {
- target_arch_table[i] = NULL; // this target ARCH is not available, skip it for good
- continue;
- }
- for (int j = 0; j < target_os_table_size; j++) {
- const char *target_os = target_os_table[j];
- if (target_os == NULL)
- continue;
- char viewer_path[PATH_MAX];
- sprintf(viewer_path, "%s/%s/%s", viewer_arch_path, target_os, NPW_VIEWER);
- if (access(viewer_path, F_OK) != 0)
- continue;
- int pid = fork();
- if (pid < 0)
- continue;
- else if (pid == 0) {
- execl(viewer_path, NPW_VIEWER, "--test", "--plugin", filename, NULL);
- exit(1);
- }
- else {
- int status;
- while (waitpid(pid, &status, 0) != pid)
- ;
- if (WIFEXITED(status)) {
- status = WEXITSTATUS(status);
- if (status == EXIT_VIEWER_OK && out_plugin_info) {
- strcpy(out_plugin_info->target_arch, target_arch);
- strcpy(out_plugin_info->target_os, target_os);
- }
- return status;
- }
- return EXIT_VIEWER_ERROR;
- }
- }
+ return(EXIT_VIEWER_OK);
+}
+
+static int detect_plugin_viewer(const char *filename, NPW_PluginInfo *out_plugin_info)
+{
+ if(out_plugin_info && out_plugin_info->target_arch) {
+ return(detect_plugin_viewer_fast(filename, out_plugin_info));
+ }
+ else {
+ return(EXIT_VIEWER_NOT_FOUND);
}
- return EXIT_VIEWER_NOT_FOUND;
}
static bool is_plugin_viewer_available(const char *filename, NPW_PluginInfo *out_plugin_info)
@@ -717,7 +671,9 @@ static int do_install_plugin(const char
plugin_base += 1;
char d_plugin_path[PATH_MAX];
- int n = snprintf(d_plugin_path, sizeof(d_plugin_path), "%s/%s.%s", plugin_dir, NPW_WRAPPER_BASE, plugin_base);
+ int n = snprintf(d_plugin_path, sizeof(d_plugin_path),
+ "%s/%s.%s", plugin_dir, p_plugin_prefix ? p_plugin_prefix : NPW_WRAPPER_BASE,
+ plugin_base);
if (n < 0 || n >= sizeof(d_plugin_path))
return 3;
@@ -804,28 +760,32 @@ static int install_plugin(const char *pl
if (g_verbose)
printf("Install plugin %s\n", plugin_path);
- // don't install plugin system-wide if it is only accessible by root
- if (!is_root_only_accessible_plugin(plugin_path)) {
- ret = do_install_plugin(plugin_path, get_system_mozilla_plugin_dir(), plugin_info);
- if (ret == 0)
- return 0;
+ if(p_plugin_dir) {
+ ret = do_install_plugin(plugin_path, p_plugin_dir, plugin_info);
}
+ else {
+ // don't install plugin system-wide if it is only accessible by root
+ if (!is_root_only_accessible_plugin(plugin_path)) {
+ ret = do_install_plugin(plugin_path, get_system_mozilla_plugin_dir(), plugin_info);
+ if (ret == 0)
+ return 0;
+ }
- // don't install plugin in user home dir if already available system-wide
- if (has_system_wide_wrapper_plugin(plugin_path, true)) {
- if (g_verbose)
- printf(" ... already installed system-wide, skipping\n");
- return 0;
+ // don't install plugin in user home dir if already available system-wide
+ if (has_system_wide_wrapper_plugin(plugin_path, true)) {
+ if (g_verbose)
+ printf(" ... already installed system-wide, skipping\n");
+ return 0;
+ }
+
+ const char *user_plugin_dir = get_user_mozilla_plugin_dir();
+ if (access(user_plugin_dir, R_OK | W_OK) < 0 && mkdir_p(user_plugin_dir) < 0)
+ return 1;
+
+ ret = do_install_plugin(plugin_path, user_plugin_dir, plugin_info);
+ if (ret == 0)
+ return 0;
}
-
- const char *user_plugin_dir = get_user_mozilla_plugin_dir();
- if (access(user_plugin_dir, R_OK | W_OK) < 0 && mkdir_p(user_plugin_dir) < 0)
- return 1;
-
- ret = do_install_plugin(plugin_path, user_plugin_dir, plugin_info);
- if (ret == 0)
- return 0;
-
return ret;
}
@@ -968,6 +928,8 @@ static void print_usage(void)
printf(" -h --help print this message\n");
printf(" -v --verbose flag: set verbose mode\n");
printf(" -a --auto flag: set automatic mode for plugins discovery\n");
+ printf(" -d --dir plugin-dir flag: target plugin(s) directory\n");
+ printf(" -p --prefix prefix flag: a prefix of wrapped plugin file\n");
printf(" -l --list list plugins currently installed\n");
printf(" -u --update update plugin(s) currently installed\n");
printf(" -i --install [FILE(S)] install plugin(s)\n");
@@ -993,6 +955,18 @@ static int process_auto(int argc, char *
return 0;
}
+static int process_dir(int argc, char *argv[])
+{
+ p_plugin_dir = argv[0];
+ return 0;
+}
+
+static int process_prefix(int argc, char *argv[])
+{
+ p_plugin_prefix = argv[0];
+ return 0;
+}
+
static int process_list(int argvc, char *argv[])
{
const char **plugin_dirs = get_mozilla_plugin_dirs();
@@ -1048,8 +1022,6 @@ static int process_install(int argc, cha
error("%s is not a valid NPAPI plugin", plugin_path);
ret = detect_plugin_viewer(plugin_path, &plugin_info);
if (ret != EXIT_VIEWER_OK) {
- if (ret == EXIT_VIEWER_NATIVE)
- return 0; /* silently ignore exit status */
error("no appropriate viewer found for %s", plugin_path);
}
ret = install_plugin(plugin_path, &plugin_info);
@@ -1084,55 +1056,54 @@ static int process_remove(int argc, char
int main(int argc, char *argv[])
{
- char **args;
- int i, j, n_args;
-
- n_args = argc - 1;
- args = argv + 1;
+ int i, j;
- if (n_args < 1) {
+ if (argc < 2) {
print_usage();
return 1;
}
- if (args[0][0] != '-') {
+ if (argv[1][0] != '-') {
print_usage();
return 1;
}
static const struct option {
- char short_option;
+ const char *short_option;
const char *long_option;
int (*process_callback)(int argc, char *argv[]);
bool terminal;
+ int extra_args;
}
options[] = {
- { 'h', "help", process_help, 1 },
- { 'v', "verbose", process_verbose, 0 },
- { 'a', "auto", process_auto, 0 },
- { 'l', "list", process_list, 1 },
- { 'u', "update", process_update, 1 },
- { 'i', "install", process_install, 1 },
- { 'r', "remove", process_remove, 1 },
- { 0, NULL, NULL, 1 }
+ { "-h", "--help", process_help, 1, 0 },
+ { "-v", "--verbose", process_verbose, 0, 0 },
+ { "-a", "--auto", process_auto, 0, 0 },
+ { "-d", "--dir", process_dir, 0, 1 },
+ { "-p", "--prefix", process_prefix, 0, 1 },
+ { "-l", "--list", process_list, 1, 0 },
+ { "-u", "--update", process_update, 1, 0 },
+ { "-i", "--install", process_install, 1, 0 },
+ { "-r", "--remove", process_remove, 1, 0 }
};
- for (i = 0; i < n_args; i++) {
- const char *arg = args[i];
+ for (i = 1; i < argc; i++) {
const struct option *opt = NULL;
- for (j = 0; opt == NULL && options[j].process_callback != NULL; j++) {
- if ((arg[0] == '-' && arg[1] == options[j].short_option && arg[2] == '\0') ||
- (arg[0] == '-' && arg[1] == '-' && strcmp(&arg[2], options[j].long_option) == 0))
- opt = &options[j];
+ for (j = 0; j < sizeof(options)/sizeof(options[0]); j++) {
+ if (!strcmp(options[j].short_option,argv[i]) || !strcmp(options[j].long_option,argv[i])) {
+ opt = &options[j];
+ break;
+ }
}
if (opt == NULL) {
- fprintf(stderr, "invalid option %s\n", arg);
+ fprintf(stderr, "invalid option %s\n", argv[i]);
print_usage();
return 1;
}
- int ret = opt->process_callback(n_args - i - 1, args + i + 1);
+ int ret = opt->process_callback(argc - i - 1, argv + i + 1);
if (opt->terminal)
return ret;
+ i += opt->extra_args;
}
return 0;
diff -up /dev/null nspluginwrapper-1.1.0/src/npw-dir.c
--- /dev/null 2008-07-07 15:46:30.273004002 +0200
+++ nspluginwrapper-1.1.0/src/npw-dir.c 2008-07-07 16:25:17.000000000 +0200
@@ -0,0 +1,97 @@
+/*
+ * npw-dir.h - Directory management for nspluginwrapper
+ *
+ * by Martin Stransky <stransky at redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "sysdeps.h"
+#include "npw-dir.h"
+
+#include <assert.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/*
+Expect defined:
+#define NPW_PREFIX (/usr)
+#define NPW_LIB32 (lib)
+#define NPW_LIB64 (lib64)
+#define NPW_DIR (nspluginwrapper)
+*/
+
+char * get_plugin_path(char *p_path, int max_path, const char *p_arch)
+{
+ char *p_arch_lib = NULL;
+
+ if(!strcmp(p_arch, "i386")) {
+ p_arch_lib = NPW_LIB32;
+ }
+ else if(!strcmp(p_arch, "x86_64")) {
+ p_arch_lib = NPW_LIB64;
+ }
+ else {
+ assert(0);
+ }
+ snprintf(p_path,max_path,"%s/%s/%s",NPW_PREFIX,p_arch_lib,NPW_DIR);
+ return(p_path);
+}
+
+char * get_plugin(char *p_path, int max_path, const char *p_arch, const char *p_plugin)
+{
+ char *p_arch_lib = NULL;
+
+ if(!strcmp(p_arch, "i386")) {
+ p_arch_lib = NPW_LIB32;
+ }
+ else if(!strcmp(p_arch, "x86_64")) {
+ p_arch_lib = NPW_LIB64;
+ }
+ else {
+ assert(0);
+ }
+ snprintf(p_path,max_path,"%s/%s/%s/%s",NPW_PREFIX,p_arch_lib,NPW_DIR,p_plugin);
+ return(p_path);
+}
+
+//#define NPW_DEFAULT_PLUGIN_PATH NPW_LIBDIR "/" HOST_ARCH "/" HOST_OS "/" NPW_WRAPPER
+char * get_default_plugin(char *p_path, int max_path)
+{
+ snprintf(p_path,max_path,"%s/%s/%s",LIBDIR,NPW_DIR,NPW_WRAPPER);
+ return(p_path);
+}
+
+//#define NPW_OLD_DEFAULT_PLUGIN_PATH NPW_LIBDIR "/" HOST_ARCH "/" NPW_WRAPPER
+char * get_old_default_plugin(char *p_path, int max_path)
+{
+ return(get_default_plugin(p_path, max_path));
+}
+
+char * get_viewer_path(char *p_path, int max_path, const char *p_arch)
+{
+ return(get_plugin_path(p_path, max_path, p_arch));
+}
+
+char * get_viewer(char *p_path, int max_path, const char *p_arch, const char *p_viewer)
+{
+ return(get_plugin(p_path, max_path, p_arch, p_viewer));
+}
+
+char * get_connection_path(char *p_path, int max_path, const char *p_plugin, int init_count)
+{
+ snprintf(p_path, max_path, "%s/%s/%d-%d", NPW_CONNECTION_PATH, p_plugin, getpid(), init_count);
+ return(p_path);
+}
diff -up /dev/null nspluginwrapper-1.1.0/src/npw-dir.h
--- /dev/null 2008-07-07 15:46:30.273004002 +0200
+++ nspluginwrapper-1.1.0/src/npw-dir.h 2008-07-07 16:25:17.000000000 +0200
@@ -0,0 +1,35 @@
+/*
+ * npw-dir.h - Directory management for nspluginwrapper
+ *
+ * by Martin Stransky <stransky at redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef NPW_DIR_H
+#define NPW_DIR_H
+
+char * get_plugin_path(char *p_path, int max_path, const char *p_arch);
+char * get_plugin(char *p_path, int max_path, const char *p_arch, const char *p_plugin);
+
+char * get_viewer_path(char *p_path, int max_path, const char *p_arch);
+char * get_viewer(char *p_path, int max_path, const char *p_arch, const char *p_viewer);
+
+char * get_default_plugin(char *p_path, int max_path);
+char * get_old_default_plugin(char *p_path, int max_path);
+
+char * get_connection_path(char *p_path, int max_path, const char *p_plugin, int init_count);
+
+#endif
diff -up nspluginwrapper-1.1.0/src/npw-viewer.c.build nspluginwrapper-1.1.0/src/npw-viewer.c
--- nspluginwrapper-1.1.0/src/npw-viewer.c.build 2008-07-06 22:47:22.000000000 +0200
+++ nspluginwrapper-1.1.0/src/npw-viewer.c 2008-07-07 16:25:17.000000000 +0200
@@ -54,10 +54,6 @@
#define DEBUG 1
#include "debug.h"
-
-// [UNIMPLEMENTED] Define to use XPCOM emulation
-#define USE_XPCOM 0
-
// Define to use XEMBED
#define USE_XEMBED 1
@@ -683,11 +679,14 @@ invoke_NPN_GetValue(NPP instance, NPNVar
return NPERR_GENERIC_ERROR;
}
+ D(bug("invoke_NPN_GetValue, variable = %d\n", variable & 0xffff));
+
int32_t ret;
switch (rpc_type_of_NPNVariable(variable)) {
case RPC_TYPE_UINT32:
{
uint32_t n = 0;
+ D(bug("invoke_NPN_GetValue, type = uint32\n"));
error = rpc_method_wait_for_reply(g_rpc_connection, RPC_TYPE_INT32, &ret, RPC_TYPE_UINT32, &n, RPC_TYPE_INVALID);
if (error != RPC_ERROR_NO_ERROR) {
npw_perror("NPN_GetValue() wait for reply", error);
@@ -700,6 +699,7 @@ invoke_NPN_GetValue(NPP instance, NPNVar
case RPC_TYPE_BOOLEAN:
{
uint32_t b = 0;
+ D(bug("invoke_NPN_GetValue, type = boolean\n"));
error = rpc_method_wait_for_reply(g_rpc_connection, RPC_TYPE_INT32, &ret, RPC_TYPE_BOOLEAN, &b, RPC_TYPE_INVALID);
if (error != RPC_ERROR_NO_ERROR) {
npw_perror("NPN_GetValue() wait for reply", error);
@@ -712,6 +712,7 @@ invoke_NPN_GetValue(NPP instance, NPNVar
case RPC_TYPE_NP_OBJECT:
{
NPObject *npobj = NULL;
+ D(bug("invoke_NPN_GetValue, type = object\n"));
error = rpc_method_wait_for_reply(g_rpc_connection, RPC_TYPE_INT32, &ret, RPC_TYPE_NP_OBJECT, &npobj, RPC_TYPE_INVALID);
if (error != RPC_ERROR_NO_ERROR) {
npw_perror("NPN_GetValue() wait for reply", error);
@@ -721,8 +722,12 @@ invoke_NPN_GetValue(NPP instance, NPNVar
*((NPObject **)value) = npobj;
break;
}
+ default:
+ {
+ npw_printf("invoke_NPN_GetValue: WARNING: unhandled type variable %d\n", variable & 0xffff);
+ break;
+ }
}
-
return ret;
}
@@ -755,11 +760,19 @@ g_NPN_GetValue(NPP instance, NPNVariable
case NPNVserviceManager: {
nsIServiceManager *sm;
int ret = NS_GetServiceManager(&sm);
- if (NS_FAILED(ret))
+ if (NS_FAILED(ret)) {
+ npw_printf("WARNING: NS_GetServiceManager failed\n");
return NPERR_GENERIC_ERROR;
+ }
*(nsIServiceManager **)value = sm;
break;
}
+ case NPNVDOMElement:
+ npw_printf("WARNING: NPNVDOMElement is not supported by NPN_GetValue()\n");
+ return NPERR_INVALID_PARAM;
+ case NPNVDOMWindow:
+ npw_printf("WARNING: NPNVDOMWindow is not supported by NPN_GetValue()\n");
+ return NPERR_INVALID_PARAM;
#endif
case NPNVnetscapeWindow: {
PluginInstance *plugin = PLUGIN_INSTANCE(instance);
@@ -783,12 +796,13 @@ g_NPN_GetValue(NPP instance, NPNVariable
case NPNVWindowNPObject:
case NPNVPluginElementNPObject: {
int ret = invoke_NPN_GetValue(instance, variable, value);
- if (ret == NPERR_NO_ERROR)
- return ret;
- // fall-through
+ if(ret != NPERR_NO_ERROR)
+ npw_printf("WARNING: error %d returner for %d from NPN_GetValue()\n", ret, variable & 0xffff);
+ return ret;
+
}
default:
- npw_printf("WARNING: unhandled variable %d in NPN_GetValue()\n", variable);
+ npw_printf("WARNING: unhandled variable %d in NPN_GetValue()\n", variable & 0xffff);
return NPERR_INVALID_PARAM;
}
diff -up nspluginwrapper-1.1.0/src/npw-viewer.sh.build nspluginwrapper-1.1.0/src/npw-viewer.sh
--- nspluginwrapper-1.1.0/src/npw-viewer.sh.build 2008-07-06 18:37:56.000000000 +0200
+++ nspluginwrapper-1.1.0/src/npw-viewer.sh 2008-07-07 16:25:17.000000000 +0200
@@ -4,7 +4,13 @@
#
OS="`uname -s`"
ARCH="`uname -m`"
-NPW_LIBDIR="%NPW_LIBDIR%"
+NPW_PREFIX="%NPW_PREFIX%"
+NPW_LIB32="%NPW_LIB32%"
+NPW_LIB64="%NPW_LIB64%"
+TARGET_OS="%TARGET_OS%"
+TARGET_ARCH="%TARGET_ARCH%"
+NPW_DIR="%NPW_DIR%"
+GECKO_LIBDIR="%GECKO_LIBDIR%"
if test -z "$TARGET_OS"; then
echo "*** NSPlugin Viewer *** error, TARGET_OS not initialized"
@@ -16,11 +22,6 @@ if test -z "$TARGET_ARCH"; then
exit 1
fi
-NPW_VIEWER_DIR=$NPW_LIBDIR/$TARGET_ARCH/$TARGET_OS
-
-# Set a new LD_LIBRARY_PATH that is TARGET specific
-export LD_LIBRARY_PATH=$NPW_VIEWER_DIR
-
# Note that a clever DBT will work at the function level and XShm
# should be possible with a proper native replacement to emulated code
# XXX: BTW, anything other than "yes" is interpreted as "no"
@@ -58,6 +59,9 @@ if test "$ARCH" != "$TARGET_ARCH"; then
NPW_USE_XSHM=no
fi
;;
+ x86_64)
+ LOADER=""
+ ;;
ppc)
if test "$ARCH" = "ppc64"; then
case "$OS" in
@@ -92,6 +96,25 @@ if test "$NPW_USE_XSHM" != "yes"; then
fi
fi
+# Set NPW_VIEWER_DIR (TARGET specific)
+case $TARGET_ARCH in
+ i386)
+ NPW_VIEWER_DIR=$NPW_PREFIX/$NPW_LIB32/$NPW_DIR
+ ;;
+ x86_64)
+ NPW_VIEWER_DIR=$NPW_PREFIX/$NPW_LIB64/$NPW_DIR
+ ;;
+ ppc)
+ NPW_VIEWER_DIR=$NPW_PREFIX/$NPW_LIB32/$NPW_DIR
+ ;;
+ ppc64)
+ NPW_VIEWER_DIR=$NPW_PREFIX/$NPW_LIB64/$NPW_DIR
+ ;;
+esac
+
+# Set a new LD_LIBRARY_PATH that is TARGET specific
+export LD_LIBRARY_PATH=$NPW_VIEWER_DIR:$GECKO_LIBDIR
+
# Expand PATH for RealPlayer package on NetBSD (realplay)
if test "$OS" = "NetBSD"; then
REALPLAYER_HOME="/usr/pkg/lib/RealPlayer"
diff -up nspluginwrapper-1.1.0/src/npw-wrapper.c.build nspluginwrapper-1.1.0/src/npw-wrapper.c
--- nspluginwrapper-1.1.0/src/npw-wrapper.c.build 2008-07-06 22:07:21.000000000 +0200
+++ nspluginwrapper-1.1.0/src/npw-wrapper.c 2008-07-07 16:25:17.000000000 +0200
@@ -44,6 +44,7 @@
#include "rpc.h"
#include "npw-rpc.h"
+#include "npw-dir.h"
#include "utils.h"
#define XP_UNIX 1
@@ -280,7 +281,7 @@ g_NPN_GetValue(NPP instance, NPNVariable
if (mozilla_funcs.getvalue == NULL)
return NPERR_INVALID_FUNCTABLE_ERROR;
- D(bug("NPN_GetValue instance=%p, variable=%d\n", instance, variable));
+ D(bug("NPN_GetValue instance=%p, variable=%d\n", instance, variable & 0xffff));
NPError ret = mozilla_funcs.getvalue(instance, variable, value);
D(bug(" return: %d [%s]\n", ret, string_of_NPError(ret)));
return ret;
@@ -324,6 +325,7 @@ static int handle_NPN_GetValue(rpc_conne
}
}
+ D(bug("NPN_GetValue() - Unknown type of variable %d\n",variable & 0xffff));
abort();
}
@@ -1644,8 +1646,9 @@ invoke_NPP_URLNotify(PluginInstance *plu
error = rpc_method_wait_for_reply(plugin->connection, RPC_TYPE_INVALID);
- if (error != RPC_ERROR_NO_ERROR)
+ if (error != RPC_ERROR_NO_ERROR) {
npw_perror("NPP_URLNotify() wait for reply", error);
+ }
}
static void
@@ -2683,9 +2686,9 @@ static void plugin_init(int is_NP_Initia
static int init_count = 0;
++init_count;
char viewer_path[PATH_MAX];
- sprintf(viewer_path, "%s/%s/%s/%s", NPW_LIBDIR, NPW_Plugin.target_arch, NPW_Plugin.target_os, NPW_VIEWER);
+ get_viewer(viewer_path,PATH_MAX,NPW_Plugin.target_arch,NPW_VIEWER);
char connection_path[128];
- sprintf(connection_path, "%s/%s/%d-%d", NPW_CONNECTION_PATH, plugin_file_name, getpid(), init_count);
+ get_connection_path(connection_path, 128, plugin_file_name, init_count);
// Cache MIME info and plugin name/description
if (g_plugin.name == NULL && g_plugin.description == NULL && g_plugin.formats == NULL) {
diff -up nspluginwrapper-1.1.0/src/sysdeps.h.build nspluginwrapper-1.1.0/src/sysdeps.h
--- nspluginwrapper-1.1.0/src/sysdeps.h.build 2008-06-21 22:13:34.000000000 +0200
+++ nspluginwrapper-1.1.0/src/sysdeps.h 2008-07-07 16:25:17.000000000 +0200
@@ -45,8 +45,8 @@
#define NPW_VIEWER NPW_VIEWER_BASE
#define NPW_WRAPPER_BASE "npwrapper"
#define NPW_WRAPPER NPW_WRAPPER_BASE ".so"
-#define NPW_OLD_DEFAULT_PLUGIN_PATH NPW_LIBDIR "/" HOST_ARCH "/" NPW_WRAPPER
-#define NPW_DEFAULT_PLUGIN_PATH NPW_LIBDIR "/" HOST_ARCH "/" HOST_OS "/" NPW_WRAPPER
+#define NPW_OLD_DEFAULT_PLUGIN_PATH LIBDIR "/" NPW_DIR "/" NPW_WRAPPER
+#define NPW_DEFAULT_PLUGIN_PATH LIBDIR "/" NPW_DIR "/" NPW_WRAPPER
#define NPW_PLUGIN_IDENT "NPW:" NPW_VERSION
#define NPW_PLUGIN_IDENT_SIZE 32
typedef struct __attribute__((packed)) {
nspluginwrapper-1.1.0-fork.patch:
--- NEW FILE nspluginwrapper-1.1.0-fork.patch ---
diff -up nspluginwrapper-1.1.0/src/npw-viewer.c.fork nspluginwrapper-1.1.0/src/npw-viewer.c
--- nspluginwrapper-1.1.0/src/npw-viewer.c.fork 2008-07-08 14:23:26.000000000 +0200
+++ nspluginwrapper-1.1.0/src/npw-viewer.c 2008-07-08 14:26:58.000000000 +0200
@@ -67,6 +67,20 @@
// RPC global connections
rpc_connection_t *g_rpc_connection attribute_hidden = NULL;
+// Viewer orignal pid - check against incorrect plugins
+pid_t viewer_pid = 0;
+
+// Pid support routines
+void pid_set(void)
+{
+ viewer_pid = getpid();
+}
+
+int pid_check(void)
+{
+ return(viewer_pid == getpid());
+}
+
// Instance state information about the plugin
typedef struct _PluginInstance {
NPP instance;
@@ -581,6 +595,9 @@ static void
g_NPN_ForceRedraw(NPP instance)
{
D(bug("NPN_ForceRedraw instance=%p\n", instance));
+
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
UNIMPLEMENTED();
}
@@ -615,9 +632,11 @@ invoke_NPN_GetURL(NPP instance, const ch
static NPError
g_NPN_GetURL(NPP instance, const char *url, const char *target)
{
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
if (instance == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
-
+
D(bug("NPN_GetURL instance=%p\n", instance));
NPError ret = invoke_NPN_GetURL(instance, url, target);
D(bug(" return: %d [%s]\n", ret, string_of_NPError(ret)));
@@ -655,6 +674,9 @@ invoke_NPN_GetURLNotify(NPP instance, co
static NPError
g_NPN_GetURLNotify(NPP instance, const char *url, const char *target, void *notifyData)
{
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
+
if (instance == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
@@ -743,8 +765,11 @@ get_real_netscape_window(NPP instance)
static NPError
g_NPN_GetValue(NPP instance, NPNVariable variable, void *value)
-{
+{
D(bug("NPN_GetValue instance=%p, variable=%d [%08x]\n", instance, variable & 0xffff, variable));
+
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
switch (variable) {
case NPNVxDisplay:
@@ -837,6 +862,9 @@ g_NPN_InvalidateRect(NPP instance, NPRec
{
if (instance == NULL || invalidRect == NULL)
return;
+
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
D(bug("NPN_InvalidateRect instance=%p\n", instance));
invoke_NPN_InvalidateRect(instance, invalidRect);
@@ -848,6 +876,9 @@ static void
g_NPN_InvalidateRegion(NPP instance, NPRegion invalidRegion)
{
D(bug("NPN_InvalidateRegion instance=%p\n", instance));
+
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
UNIMPLEMENTED();
}
@@ -911,6 +942,8 @@ invoke_NPN_PostURL(NPP instance, const c
static NPError
g_NPN_PostURL(NPP instance, const char *url, const char *target, uint32 len, const char *buf, NPBool file)
{
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
if (instance == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
@@ -953,6 +986,9 @@ invoke_NPN_PostURLNotify(NPP instance, c
static NPError
g_NPN_PostURLNotify(NPP instance, const char *url, const char *target, uint32 len, const char *buf, NPBool file, void *notifyData)
{
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
+
if (instance == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
@@ -967,6 +1003,9 @@ static void
g_NPN_ReloadPlugins(NPBool reloadPages)
{
D(bug("NPN_ReloadPlugins reloadPages=%d\n", reloadPages));
+
+ if(!pid_check())
+ return;
UNIMPLEMENTED();
}
@@ -976,6 +1015,9 @@ static JRIEnv *
g_NPN_GetJavaEnv(void)
{
D(bug("NPN_GetJavaEnv\n"));
+
+ if(!pid_check())
+ return NULL;
return NULL;
}
@@ -985,6 +1027,9 @@ static jref
g_NPN_GetJavaPeer(NPP instance)
{
D(bug("NPN_GetJavaPeer instance=%p\n", instance));
+
+ if(!pid_check())
+ return NULL;
return NULL;
}
@@ -1018,6 +1063,8 @@ invoke_NPN_RequestRead(NPStream *stream,
static NPError
g_NPN_RequestRead(NPStream *stream, NPByteRange *rangeList)
{
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
if (stream == NULL || stream->ndata == NULL || rangeList == NULL)
return NPERR_INVALID_PARAM;
@@ -1066,10 +1113,13 @@ g_NPN_SetValue(NPP instance, NPPVariable
if (instance == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
+
PluginInstance *plugin = PLUGIN_INSTANCE(instance);
if (plugin == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
-
+
D(bug("NPN_SetValue instance=%p, variable=%d\n", instance, variable));
NPError ret = invoke_NPN_SetValue(plugin, variable, value);
D(bug(" return: %d [%s]\n", ret, string_of_NPError(ret)));
@@ -1102,6 +1152,9 @@ invoke_NPN_Status(NPP instance, const ch
static void
g_NPN_Status(NPP instance, const char *message)
{
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
+
D(bug("NPN_Status instance=%p\n", instance));
invoke_NPN_Status(instance, message);
D(bug(" done\n"));
@@ -1130,6 +1183,9 @@ invoke_NPN_UserAgent(void)
static const char *
g_NPN_UserAgent(NPP instance)
{
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
+
D(bug("NPN_UserAgent instance=%p\n", instance));
if (g_user_agent == NULL)
g_user_agent = invoke_NPN_UserAgent();
@@ -1212,6 +1268,8 @@ invoke_NPN_NewStream(NPP instance, NPMIM
static NPError
g_NPN_NewStream(NPP instance, NPMIMEType type, const char *target, NPStream **stream)
{
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
if (instance == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
@@ -1257,6 +1315,9 @@ invoke_NPN_DestroyStream(NPP instance, N
static NPError
g_NPN_DestroyStream(NPP instance, NPStream *stream, NPError reason)
{
+ if(!pid_check())
+ return NPERR_INVALID_INSTANCE_ERROR;
+
if (instance == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
@@ -1314,6 +1375,9 @@ invoke_NPN_Write(NPP instance, NPStream
static int32
g_NPN_Write(NPP instance, NPStream *stream, int32 len, void *buf)
{
+ if(!pid_check())
+ return -1;
+
if (instance == NULL)
return -1;
@@ -1350,6 +1414,8 @@ invoke_NPN_PushPopupsEnabledState(NPP in
static void
g_NPN_PushPopupsEnabledState(NPP instance, NPBool enabled)
{
+ if(!pid_check())
+ return;
if (instance == NULL)
return;
@@ -1381,6 +1447,8 @@ invoke_NPN_PopPopupsEnabledState(NPP ins
static void
g_NPN_PopPopupsEnabledState(NPP instance)
{
+ if(!pid_check())
+ return;
if (instance == NULL)
return;
@@ -1480,6 +1548,9 @@ invoke_NPN_CreateObject(NPP instance)
static NPObject *
g_NPN_CreateObject(NPP instance, NPClass *class)
{
+ if(!pid_check())
+ return NULL;
+
if (instance == NULL)
return NULL;
@@ -1520,6 +1591,9 @@ invoke_NPN_RetainObject(NPObject *npobj)
static NPObject *
g_NPN_RetainObject(NPObject *npobj)
{
+ if(!pid_check())
+ return NULL;
+
if (npobj == NULL)
return NULL;
@@ -1558,6 +1632,9 @@ invoke_NPN_ReleaseObject(NPObject *npobj
static void
g_NPN_ReleaseObject(NPObject *npobj)
{
+ if(!pid_check())
+ return;
+
if (npobj == NULL)
return;
@@ -1605,6 +1682,9 @@ static bool
g_NPN_Invoke(NPP instance, NPObject *npobj, NPIdentifier methodName,
const NPVariant *args, uint32_t argCount, NPVariant *result)
{
+ if(!pid_check())
+ return false;
+
if (!instance || !npobj || !npobj->_class || !npobj->_class->invoke)
return false;
@@ -1652,6 +1732,9 @@ static bool
g_NPN_InvokeDefault(NPP instance, NPObject *npobj,
const NPVariant *args, uint32_t argCount, NPVariant *result)
{
+ if(!pid_check())
+ return false;
+
if (!instance || !npobj || !npobj->_class || !npobj->_class->invokeDefault)
return false;
@@ -1697,6 +1780,9 @@ invoke_NPN_Evaluate(NPP instance, NPObje
static bool
g_NPN_Evaluate(NPP instance, NPObject *npobj, NPString *script, NPVariant *result)
{
+ if(!pid_check())
+ return false;
+
if (!instance || !npobj)
return false;
@@ -1746,6 +1832,9 @@ static bool
g_NPN_GetProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName,
NPVariant *result)
{
+ if(!pid_check())
+ return false;
+
if (!instance || !npobj || !npobj->_class || !npobj->_class->getProperty)
return false;
@@ -1792,6 +1881,9 @@ static bool
g_NPN_SetProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName,
const NPVariant *value)
{
+ if(!pid_check())
+ return false;
+
if (!instance || !npobj || !npobj->_class || !npobj->_class->setProperty)
return false;
@@ -1833,6 +1925,9 @@ invoke_NPN_RemoveProperty(NPP instance,
static bool
g_NPN_RemoveProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName)
{
+ if(!pid_check())
+ return false;
+
if (!instance || !npobj || !npobj->_class || !npobj->_class->removeProperty)
return false;
@@ -1874,6 +1969,9 @@ invoke_NPN_HasProperty(NPP instance, NPO
static bool
g_NPN_HasProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName)
{
+ if(!pid_check())
+ return false;
+
if (!instance || !npobj || !npobj->_class || !npobj->_class->hasProperty)
return false;
@@ -1915,6 +2013,9 @@ invoke_NPN_HasMethod(NPP instance, NPObj
static bool
g_NPN_HasMethod(NPP instance, NPObject *npobj, NPIdentifier methodName)
{
+ if(!pid_check())
+ return false;
+
if (!instance || !npobj || !npobj->_class || !npobj->_class->hasMethod)
return false;
@@ -1950,6 +2051,9 @@ invoke_NPN_SetException(NPObject *npobj,
static void
g_NPN_SetException(NPObject *npobj, const NPUTF8 *message)
{
+ if(!pid_check())
+ return;
+
D(bug("NPN_SetException npobj=%p, message='%s'\n", npobj, message));
invoke_NPN_SetException(npobj, message);
D(bug(" done\n"));
@@ -2011,6 +2115,8 @@ invoke_NPN_GetStringIdentifier(const NPU
static NPIdentifier
g_NPN_GetStringIdentifier(const NPUTF8 *name)
{
+ if(!pid_check())
+ return NULL;
if (name == NULL)
return NULL;
@@ -2060,6 +2166,9 @@ invoke_NPN_GetStringIdentifiers(const NP
static void
g_NPN_GetStringIdentifiers(const NPUTF8 **names, uint32_t nameCount, NPIdentifier *identifiers)
{
+ if(!pid_check())
+ return;
+
if (names == NULL)
return;
@@ -2101,6 +2210,9 @@ invoke_NPN_GetIntIdentifier(int32_t inti
static NPIdentifier
g_NPN_GetIntIdentifier(int32_t intid)
{
+ if(!pid_check())
+ return 0;
+
D(bug("NPN_GetIntIdentifier intid=%d\n", intid));
NPIdentifier ret = invoke_NPN_GetIntIdentifier(intid);
D(bug(" return: %p\n", ret));
@@ -2137,6 +2249,9 @@ invoke_NPN_IdentifierIsString(NPIdentifi
static bool
g_NPN_IdentifierIsString(NPIdentifier identifier)
{
+ if(!pid_check())
+ return false;
+
D(bug("NPN_IdentifierIsString identifier=%p\n", identifier));
bool ret = invoke_NPN_IdentifierIsString(identifier);
D(bug(" return: %d\n", ret));
@@ -2173,6 +2288,9 @@ invoke_NPN_UTF8FromIdentifier(NPIdentifi
static NPUTF8 *
g_NPN_UTF8FromIdentifier(NPIdentifier identifier)
{
+ if(!pid_check())
+ return NULL;
+
D(bug("NPN_UTF8FromIdentifier identifier=%p\n", identifier));
NPUTF8 *ret = invoke_NPN_UTF8FromIdentifier(identifier);
D(bug(" return: '%s'\n", ret));
@@ -2210,6 +2328,9 @@ invoke_NPN_IntFromIdentifier(NPIdentifie
static int32_t
g_NPN_IntFromIdentifier(NPIdentifier identifier)
{
+ if(!pid_check())
+ return 0;
+
D(bug("NPN_IntFromIdentifier identifier=%p\n", identifier));
int32_t ret = invoke_NPN_IntFromIdentifier(identifier);
D(bug(" return: %d\n", ret));
@@ -3259,6 +3380,9 @@ static int do_main(int argc, char **argv
}
D(bug(" Plugin connection: %s\n", connection_path));
+ pid_set();
+ D(bug(" Plugin viewer pid: %d\n", viewer_pid));
+
// Cleanup environment, the program may fork/exec a native shell
// script and having 32-bit libraries in LD_PRELOAD is not right,
// though not a fatal error
nspluginwrapper-1.1.0-runtime-restart.patch:
--- NEW FILE nspluginwrapper-1.1.0-runtime-restart.patch ---
diff -up nspluginwrapper-1.1.0/src/npruntime.c.restart nspluginwrapper-1.1.0/src/npruntime.c
--- nspluginwrapper-1.1.0/src/npruntime.c.restart 2008-06-21 22:13:34.000000000 +0200
+++ nspluginwrapper-1.1.0/src/npruntime.c 2008-07-08 14:10:19.000000000 +0200
@@ -59,6 +59,14 @@ NPClass npclass_bridge = {
npclass_invoke_RemoveProperty
};
+int npclass_check(NPObject *npobj)
+{
+ NPObjectInfo *p_info = npobject_info_lookup(npobj);
+ if(!p_info->valid)
+ npw_printf("ERROR: NPObject %p is not valid!\n",npobj);
+ return(p_info->valid);
+}
+
// NPClass::Invalidate
int npclass_handle_Invalidate(rpc_connection_t *connection)
{
@@ -72,7 +80,7 @@ int npclass_handle_Invalidate(rpc_connec
return error;
}
- if (npobj && npobj->_class && npobj->_class->invalidate) {
+ if (npobj && npobj->_class && npclass_check(npobj) && npobj->_class->invalidate) {
D(bug("NPClass::Invalidate(npobj %p)\n", npobj));
npobj->_class->invalidate(npobj);
D(bug(" done\n"));
@@ -83,6 +91,9 @@ int npclass_handle_Invalidate(rpc_connec
void npclass_invoke_Invalidate(NPObject *npobj)
{
+ if(!npclass_check(npobj))
+ return;
+
int error = rpc_method_invoke(g_rpc_connection,
RPC_METHOD_NPCLASS_INVALIDATE,
RPC_TYPE_NP_OBJECT, npobj,
@@ -117,7 +128,7 @@ int npclass_handle_HasMethod(rpc_connect
}
uint32_t ret = 0;
- if (npobj && npobj->_class && npobj->_class->hasMethod) {
+ if (npobj && npobj->_class && npclass_check(npobj) && npobj->_class->hasMethod) {
D(bug("NPClass::HasMethod(npobj %p, name id %p)\n", npobj, name));
ret = npobj->_class->hasMethod(npobj, name);
D(bug(" return: %d\n", ret));
@@ -128,6 +139,9 @@ int npclass_handle_HasMethod(rpc_connect
bool npclass_invoke_HasMethod(NPObject *npobj, NPIdentifier name)
{
+ if(!npclass_check(npobj))
+ return false;
+
int error = rpc_method_invoke(g_rpc_connection,
RPC_METHOD_NPCLASS_HAS_METHOD,
RPC_TYPE_NP_OBJECT, npobj,
@@ -171,7 +185,7 @@ int npclass_handle_Invoke(rpc_connection
uint32_t ret = 0;
NPVariant result;
VOID_TO_NPVARIANT(result);
- if (npobj && npobj->_class && npobj->_class->invoke) {
+ if (npobj && npobj->_class && npclass_check(npobj) && npobj->_class->invoke) {
D(bug("NPClass::Invoke(npobj %p, name id %p)\n", npobj, name));
ret = npobj->_class->invoke(npobj, name, args, argCount, &result);
D(bug(" return: %d\n", ret));
@@ -191,6 +205,9 @@ bool npclass_invoke_Invoke(NPObject *npo
if (result == NULL)
return false;
VOID_TO_NPVARIANT(*result);
+
+ if(!npclass_check(npobj))
+ return false;
int error = rpc_method_invoke(g_rpc_connection,
RPC_METHOD_NPCLASS_INVOKE,
@@ -237,7 +254,7 @@ int npclass_handle_InvokeDefault(rpc_con
uint32_t ret = 0;
NPVariant result;
VOID_TO_NPVARIANT(result);
- if (npobj && npobj->_class && npobj->_class->invokeDefault) {
+ if (npobj && npobj->_class && npclass_check(npobj) && npobj->_class->invokeDefault) {
D(bug("NPClass::InvokeDefault(npobj %p)\n", npobj));
ret = npobj->_class->invokeDefault(npobj, args, argCount, &result);
D(bug(" return: %d\n", ret));
@@ -257,6 +274,9 @@ bool npclass_invoke_InvokeDefault(NPObje
if (result == NULL)
return false;
VOID_TO_NPVARIANT(*result);
+
+ if(!npclass_check(npobj))
+ return false;
int error = rpc_method_invoke(g_rpc_connection,
RPC_METHOD_NPCLASS_INVOKE_DEFAULT,
@@ -299,7 +319,7 @@ int npclass_handle_HasProperty(rpc_conne
}
uint32_t ret = 0;
- if (npobj && npobj->_class && npobj->_class->hasProperty) {
+ if (npobj && npobj->_class && npclass_check(npobj) && npobj->_class->hasProperty) {
D(bug("NPClass::HasProperty(npobj %p, name id %p)\n", npobj, name));
ret = npobj->_class->hasProperty(npobj, name);
D(bug(" return: %d\n", ret));
@@ -310,6 +330,9 @@ int npclass_handle_HasProperty(rpc_conne
bool npclass_invoke_HasProperty(NPObject *npobj, NPIdentifier name)
{
+ if(!npclass_check(npobj))
+ return false;
+
int error = rpc_method_invoke(g_rpc_connection,
RPC_METHOD_NPCLASS_HAS_PROPERTY,
RPC_TYPE_NP_OBJECT, npobj,
@@ -350,7 +373,7 @@ int npclass_handle_GetProperty(rpc_conne
uint32_t ret = 0;
NPVariant result;
VOID_TO_NPVARIANT(result);
- if (npobj && npobj->_class && npobj->_class->getProperty) {
+ if (npobj && npobj->_class && npclass_check(npobj) && npobj->_class->getProperty) {
D(bug("NPClass::GetProperty(npobj %p, name id %p)\n", npobj, name));
ret = npobj->_class->getProperty(npobj, name, &result);
D(bug(" return: %d\n", ret));
@@ -367,7 +390,10 @@ bool npclass_invoke_GetProperty(NPObject
if (result == NULL)
return false;
VOID_TO_NPVARIANT(*result);
-
+
+ if(!npclass_check(npobj))
+ return false;
+
int error = rpc_method_invoke(g_rpc_connection,
RPC_METHOD_NPCLASS_GET_PROPERTY,
RPC_TYPE_NP_OBJECT, npobj,
@@ -411,7 +437,7 @@ int npclass_handle_SetProperty(rpc_conne
}
uint32_t ret = 0;
- if (npobj && npobj->_class && npobj->_class->setProperty) {
+ if (npobj && npobj->_class && npclass_check(npobj) && npobj->_class->setProperty) {
D(bug("NPClass::SetProperty(npobj %p, name id %p)\n", npobj, name));
ret = npobj->_class->setProperty(npobj, name, &value);
D(bug(" return: %d\n", ret));
@@ -426,6 +452,9 @@ bool npclass_invoke_SetProperty(NPObject
{
if (value == NULL)
return false;
+
+ if(!npclass_check(npobj))
+ return false;
int error = rpc_method_invoke(g_rpc_connection,
RPC_METHOD_NPCLASS_SET_PROPERTY,
@@ -468,7 +497,7 @@ int npclass_handle_RemoveProperty(rpc_co
}
uint32_t ret = 0;
- if (npobj && npobj->_class && npobj->_class->removeProperty) {
+ if (npobj && npobj->_class && npclass_check(npobj) && npobj->_class->removeProperty) {
D(bug("NPClass::RemoveProperty(npobj %p, name id %p)\n", npobj, name));
ret = npobj->_class->removeProperty(npobj, name);
D(bug(" return: %d\n", ret));
@@ -479,6 +508,9 @@ int npclass_handle_RemoveProperty(rpc_co
bool npclass_invoke_RemoveProperty(NPObject *npobj, NPIdentifier name)
{
+ if(!npclass_check(npobj))
+ return false;
+
int error = rpc_method_invoke(g_rpc_connection,
RPC_METHOD_NPCLASS_REMOVE_PROPERTY,
RPC_TYPE_NP_OBJECT, npobj,
@@ -513,6 +545,7 @@ NPObjectInfo *npobject_info_new(NPObject
static uint32_t id;
npobj_info->npobj = npobj;
npobj_info->npobj_id = ++id;
+ npobj_info->valid = 1;
}
return npobj_info;
}
@@ -638,3 +671,14 @@ NPObject *npobject_lookup(uint32_t npobj
{
return g_hash_table_lookup(g_npobject_ids, (void *)(uintptr_t)npobj_id);
}
+
+static void npruntime_deactivate_func(gpointer key, gpointer value, gpointer user_data)
+{
+ NPObjectInfo *p_info = (NPObjectInfo *)value;
+ p_info->valid = 0;
+}
+
+void npruntime_deactivate(void)
+{
+ g_hash_table_foreach(g_npobjects, npruntime_deactivate_func, NULL);
+}
diff -up nspluginwrapper-1.1.0/src/npruntime-impl.h.restart nspluginwrapper-1.1.0/src/npruntime-impl.h
--- nspluginwrapper-1.1.0/src/npruntime-impl.h.restart 2008-06-21 22:13:34.000000000 +0200
+++ nspluginwrapper-1.1.0/src/npruntime-impl.h 2008-07-08 14:10:19.000000000 +0200
@@ -25,6 +25,7 @@
typedef struct {
NPObject *npobj;
uint32_t npobj_id;
+ uint32_t valid;
} NPObjectInfo;
extern NPObjectInfo *npobject_info_new(NPObject *npobj) attribute_hidden;
@@ -63,4 +64,7 @@ extern int npclass_handle_Invalidate(rpc
struct _NPNetscapeFuncs;
extern void npruntime_init_callbacks(struct _NPNetscapeFuncs *mozilla_funcs);
+// Deactivate all NPObject instances
+extern void npruntime_deactivate(void);
+
#endif /* NPRUNTIME_IMPL_H */
diff -up nspluginwrapper-1.1.0/src/npw-wrapper.c.restart nspluginwrapper-1.1.0/src/npw-wrapper.c
--- nspluginwrapper-1.1.0/src/npw-wrapper.c.restart 2008-07-08 14:10:19.000000000 +0200
+++ nspluginwrapper-1.1.0/src/npw-wrapper.c 2008-07-08 14:10:19.000000000 +0200
@@ -107,7 +107,11 @@ typedef struct _StreamInstance {
// Prototypes
static void plugin_init(int is_NP_Initialize);
static void plugin_exit(void);
-static NPError plugin_restart_if_needed(void);
+
+static void plugin_kill(rpc_connection_t *connection);
+static NPError plugin_start(void);
+static NPError plugin_start_if_needed(void);
+static int plugin_killed = 0;
/*
* Notes concerning NSPluginWrapper recovery model.
@@ -126,10 +130,8 @@ static NPError plugin_restart_if_needed(
* connection and thus can fail early/gracefully in subsequent calls
* to NPP_*() functions.
*
- * TODO: make NPRuntime aware of per-plugin connections? This
- * shouldn't matter from the Wrapper side because npruntime requests
- * come from the Viewer side (see NPN_*() handlers). XXX: even with a
- * running script (NPClass handlers)?
+ * All active NPRuntime objects are marked as inactive and
+ * are not processed.
*/
// Minimal time between two plugin restarts in sec
@@ -1361,7 +1363,7 @@ g_NPP_New(NPMIMEType mime_type, NPP inst
return NPERR_INVALID_INSTANCE_ERROR;
// Check if we need to restart the plug-in
- NPError ret = plugin_restart_if_needed();
+ NPError ret = plugin_start_if_needed();
if (ret != NPERR_NO_ERROR)
return ret;
@@ -2870,6 +2872,9 @@ static void plugin_init(int is_NP_Initia
return;
}
+ // Set error handler - stop plugin if there's a connection error
+ rpc_connection_error_callback_set(g_rpc_connection, plugin_kill);
+
g_plugin.initialized = 1 + is_NP_Initialize;
D(bug("--- INIT ---\n"));
}
@@ -2942,17 +2947,39 @@ static void __attribute__((destructor))
}
}
-static NPError plugin_restart(void)
+static void plugin_kill(rpc_connection_t *connection)
{
if (g_plugin.is_wrapper)
- return NPERR_NO_ERROR;
+ return;
- // Shut it down
+ D(bug("plugin_kill, connection %p\n",connection));
+
+ // Kill viewer and plugin
plugin_exit();
+
+ // Clear-up
g_plugin.initialized = 0;
g_plugin.viewer_pid = -1;
g_plugin.is_wrapper = 0;
+ npruntime_deactivate();
+
+ // Set the kill flag
+ plugin_killed = 1;
+}
+
+static NPError plugin_start(void)
+{
+ D(bug("plugin_start\n"));
+
+ if(!plugin_killed) {
+ // Plugin is still active
+ // terminate it before the restart
+ D(bug("plugin_start: plugin_killed = 0!\n"));
+ plugin_kill(g_rpc_connection);
+ }
+ plugin_killed = 0;
+
// And start it again
plugin_init(1);
if (g_plugin.initialized <= 0)
@@ -2961,7 +2988,7 @@ static NPError plugin_restart(void)
return invoke_NP_Initialize(npapi_version);
}
-static NPError plugin_restart_if_needed(void)
+static NPError plugin_start_if_needed(void)
{
if (rpc_status(g_rpc_connection) != RPC_STATUS_ACTIVE) {
static time_t last_restart = 0;
@@ -2971,7 +2998,7 @@ static NPError plugin_restart_if_needed(
last_restart = now;
D(bug("Restart plugins viewer\n"));
- NPError ret = plugin_restart();
+ NPError ret = plugin_start();
D(bug(" return: %d [%s]\n", ret, string_of_NPError(ret)));
return ret;
}
diff -up nspluginwrapper-1.1.0/src/rpc.c.restart nspluginwrapper-1.1.0/src/rpc.c
--- nspluginwrapper-1.1.0/src/rpc.c.restart 2008-07-06 21:54:45.000000000 +0200
+++ nspluginwrapper-1.1.0/src/rpc.c 2008-07-08 14:18:41.000000000 +0200
@@ -427,6 +427,7 @@ struct rpc_connection {
pthread_t server_thread;
rpc_map_t *types;
rpc_map_t *methods;
+ rpc_error_callback_t callback_error;
};
// Increment connection reference count
@@ -446,6 +447,29 @@ void rpc_connection_unref(rpc_connection
}
}
+// Set error callback
+void rpc_connection_error_callback_set(rpc_connection_t *connection,
+ rpc_error_callback_t callback)
+{
+ if (connection == NULL)
+ return;
+ if (connection->callback_error != NULL)
+ return;
+ connection->callback_error = callback;
+}
+
+// Call error callback if the connection is closed
+static void rpc_connection_error_callback_call(rpc_connection_t *connection)
+{
+ if (connection == NULL)
+ return;
+ if (connection->callback_error == NULL)
+ return;
+
+ (connection->callback_error)(connection);
+ connection->callback_error = NULL;
+}
+
// Returns connection status
static inline int _rpc_status(rpc_connection_t *connection)
{
@@ -484,6 +508,11 @@ static inline int rpc_error(rpc_connecti
assert(error < 0);
assert(connection != NULL);
_rpc_set_status(connection, error);
+
+ if(_rpc_status(connection) == RPC_STATUS_CLOSED || _rpc_status(connection) == RPC_STATUS_BROKEN) {
+ rpc_connection_error_callback_call(connection);
+ }
+
return error;
}
@@ -566,6 +595,7 @@ rpc_connection_t *rpc_init_server(const
connection->status = RPC_STATUS_CLOSED;
connection->socket = -1;
connection->server_thread_active = 0;
+ connection->callback_error = NULL;
if ((connection->types = rpc_map_new_full((free))) == NULL) {
rpc_exit(connection);
return NULL;
@@ -623,6 +653,7 @@ rpc_connection_t *rpc_init_client(const
connection->refcnt = 1;
connection->status = RPC_STATUS_CLOSED;
connection->server_socket = -1;
+ connection->callback_error = NULL;
if ((connection->types = rpc_map_new_full((free))) == NULL) {
rpc_exit(connection);
return NULL;
diff -up nspluginwrapper-1.1.0/src/rpc.h.restart nspluginwrapper-1.1.0/src/rpc.h
--- nspluginwrapper-1.1.0/src/rpc.h.restart 2008-06-21 22:13:34.000000000 +0200
+++ nspluginwrapper-1.1.0/src/rpc.h 2008-07-08 14:10:19.000000000 +0200
@@ -122,4 +122,10 @@ extern int rpc_method_send_reply(rpc_con
}
#endif
+// This callback is called when the connection is closed or broken
+typedef int (*rpc_error_callback_t)(rpc_connection_t *connection);
+
+// Set callback for a connection
+void rpc_connection_error_callback_set(rpc_connection_t *connection, rpc_error_callback_t callback);
+
#endif /* RPC_H */
Index: nspluginwrapper.spec
===================================================================
RCS file: /cvs/pkgs/rpms/nspluginwrapper/devel/nspluginwrapper.spec,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- nspluginwrapper.spec 6 May 2008 05:42:11 -0000 1.48
+++ nspluginwrapper.spec 8 Jul 2008 13:17:06 -0000 1.49
@@ -69,33 +69,28 @@
Summary: A compatibility layer for Netscape 4 plugins
Name: nspluginwrapper
-Version: 0.9.91.5
-Release: 28%{?dist}
+Version: 1.1.0
+Release: 1%{?dist}
Source0: %{name}-%{version}%{?svndate:-%{svndate}}.tar.bz2
Source1: %{plugin_config_name}.tar.gz
Source2: plugin-config.sh.in
Source3: %{name}.sh.in
-Patch0: nspluginwrapper-0.9.91.5-rpc-error.patch
-Patch1: nspluginwrapper-0.9.91.5-restart.patch
-Patch2: nspluginwrapper-0.9.91.5-rh.patch
-Patch4: nspluginwrapper-0.9.91.5-runtime-restart.patch
-Patch5: nspluginwrapper-0.9.91.5-fork.patch
-Patch6: nspluginwrapper-0.9.91.5-xulrunner.patch
-Patch7: nspluginwrapper-0.9.91.5-npviewer-gthread.patch
-Patch8: nspluginwrapper-0.9.91.5-shutdown.patch
-Patch9: nspluginwrapper-0.9.91.5-sleep.patch
-Patch10: nspluginwrapper-0.9.91.5-cpp-plugins.patch
+Patch1: nspluginwrapper-1.1.0-build.patch
+Patch2: nspluginwrapper-1.1.0-runtime-restart.patch
+Patch3: nspluginwrapper-1.1.0-fork.patch
+Patch4: nspluginwrapper-0.9.91.5-shutdown.patch
+Patch5: nspluginwrapper-0.9.91.5-sleep.patch
Patch100: plugin-config-setuid.patch
License: GPL
Group: Networking/WWW
Url: http://gwenole.beauchesne.info/projects/nspluginwrapper/
-Provides: %{name} = %{version}-%{release}
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
+Provides: %{name} = %{version}-%{release}
Requires: %{_bindir}/linux32
-BuildRequires: pkgconfig gtk2-devel glib2-devel
-BuildRequires: libXt-devel cairo-devel
Requires: gecko-libs = %{gecko_ver}
Requires: mozilla-filesystem
+BuildRequires: pkgconfig gtk2-devel glib2-devel nspr-devel
+BuildRequires: libX11-devel libXt-devel cairo-devel pango-devel libcurl-devel
BuildRequires: gecko-devel = %{gecko_ver}
ExclusiveArch: i386 x86_64 ppc
@@ -110,16 +105,11 @@
%prep
%setup -q -a 1
-%patch0 -p0
-%patch1 -p0
-%patch2 -p1
-%patch4 -p1
-%patch5 -p1
-%patch6 -p1 -b .xl
-%patch7 -p1 -b .thread
-%patch8 -p1 -b .shutdown
-%patch9 -p1 -b .sleep
-%patch10 -p1 -b .cpplib
+%patch1 -p1 -b .build
+%patch2 -p1 -b .restart
+%patch3 -p1 -b .fork
+%patch4 -p1 -b .shutdown
+%patch5 -p1 -b .sleep
pushd %plugin_config_name
%patch100 -p2
@@ -241,6 +231,9 @@
%config %{_sysconfdir}/sysconfig/%{name}
%changelog
+* Tue Jul 8 2008 Martin Stransky <stransky at redhat.com> 1.1.0-1
+- update to latest upstream version (1.1.0)
+
* Mon May 5 2008 Martin Stransky <stransky at redhat.com> 0.9.91.5-28
- link pluginwrapper with stdc++ lib
Index: sources
===================================================================
RCS file: /cvs/pkgs/rpms/nspluginwrapper/devel/sources,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- sources 26 Feb 2008 12:01:02 -0000 1.9
+++ sources 8 Jul 2008 13:17:06 -0000 1.10
@@ -1,2 +1,2 @@
-052e5fecc36a087d1f7200bd1e44f2f0 nspluginwrapper-0.9.91.5.tar.bz2
0a00e94ba608dfea365851af9deb20dc plugin-config-1.9.tar.gz
+42d043f1b91cc311410c20f36665c6b3 nspluginwrapper-1.1.0.tar.bz2
--- nspluginwrapper-0.9.91.5-cpp-plugins.patch DELETED ---
--- nspluginwrapper-0.9.91.5-fork.patch DELETED ---
--- nspluginwrapper-0.9.91.5-npviewer-gthread.patch DELETED ---
--- nspluginwrapper-0.9.91.5-restart.patch DELETED ---
--- nspluginwrapper-0.9.91.5-rh.patch DELETED ---
--- nspluginwrapper-0.9.91.5-rpc-error.patch DELETED ---
--- nspluginwrapper-0.9.91.5-runtime-restart.patch DELETED ---
--- nspluginwrapper-0.9.91.5-xulrunner.patch DELETED ---
- Previous message (by thread): rpms/libvirt/F-9 libvirt-0.4.4-boot-cdrom.patch, NONE, 1.1 libvirt.spec, 1.88, 1.89
- Next message (by thread): rpms/gyachi/EL-5 .cvsignore, 1.3, 1.4 gyachi.spec, 1.10, 1.11 sources, 1.3, 1.4
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the fedora-extras-commits
mailing list