Author: eelco
Date: Sun Apr  1 15:21:30 2012
New Revision: 33519
URL: https://nixos.org/websvn/nix/?rev=33519&sc=1

Log:
* With a nice bit of hackery, get the Google Talk plugin to work.  Yay
  for proprietary software.  Tested with Firefox and Chrome.

Added:
   
nixpkgs/trunk/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/preload.c
Modified:
   
nixpkgs/trunk/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/default.nix
   nixpkgs/trunk/pkgs/top-level/all-packages.nix

Modified: 
nixpkgs/trunk/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/default.nix
==============================================================================
--- 
nixpkgs/trunk/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/default.nix
  Sun Apr  1 14:33:23 2012        (r33518)
+++ 
nixpkgs/trunk/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/default.nix
  Sun Apr  1 15:21:30 2012        (r33519)
@@ -1,18 +1,18 @@
-{ stdenv, fetchurl, rpm, cpio, pkgsi686Linux, mesa, xorg, cairo
-, libpng, gtk, glib, fontconfig, freetype, curl
+{ stdenv, fetchurl, rpm, cpio, mesa, xorg, cairo
+, libpng12, gtk, glib, gdk_pixbuf, fontconfig, freetype, curl
+, dbus_glib, alsaLib, pulseaudio, udev
 }:
 
 with stdenv.lib;
 
 let
 
-  rpathNative = makeLibraryPath
-    [ stdenv.gcc.gcc
-      mesa
+  rpathPlugin = makeLibraryPath
+    [ mesa
       xorg.libXt
       xorg.libX11
       cairo
-      libpng
+      libpng12
       gtk
       glib
       fontconfig
@@ -20,32 +20,33 @@
       curl
     ];
 
-  rpath32 = makeLibraryPath
-    [ pkgsi686Linux.gdk_pixbuf
-      pkgsi686Linux.glib
-      pkgsi686Linux.gtk
-      pkgsi686Linux.xorg.libX11
-      pkgsi686Linux.xorg.libXcomposite
-      pkgsi686Linux.xorg.libXfixes
-      pkgsi686Linux.xorg.libXrender
-      pkgsi686Linux.xorg.libXrandr
-      pkgsi686Linux.gcc.gcc
-      pkgsi686Linux.alsaLib
-      pkgsi686Linux.pulseaudio
-      pkgsi686Linux.dbus_glib
-      pkgsi686Linux.udev
+  rpathProgram = makeLibraryPath
+    [ gdk_pixbuf
+      glib
+      gtk
+      xorg.libX11
+      xorg.libXcomposite
+      xorg.libXfixes
+      xorg.libXrender
+      xorg.libXrandr
+      stdenv.gcc.gcc
+      alsaLib
+      pulseaudio
+      dbus_glib
+      udev
+      curl
     ];
 
 in
 
 stdenv.mkDerivation {
-  name = "google-talk-plugin-2.107.0";
+  name = "google-talk-plugin-2.8.5.0";
 
   src =
     if stdenv.system == "x86_64-linux" then
       fetchurl {
         url = 
"http://dl.google.com/linux/direct/google-talkplugin_current_x86_64.rpm";;
-        sha256 = "1jdcnz4iwnjmrr5xyqgam1yd0dc2vyd9iij5imnir4r88l5fc9wh";
+        sha256 = "15909wnhspjci0fspvh5j87v1xl7dfix36zrpvk6fpc3m0vys0nh";
       }
     else
       throw "Google Talk does not support your platform.";
@@ -59,14 +60,15 @@
 
   installPhase =
     ''
-      mkdir -p $out/lib/mozilla/plugins
-      cp opt/google/talkplugin/libnp*.so $out/lib/mozilla/plugins/
+      plugins=$out/lib/mozilla/plugins
+      mkdir -p $plugins
+      cp opt/google/talkplugin/libnp*.so $plugins
 
-      patchelf --set-rpath "${makeLibraryPath [ stdenv.gcc.gcc 
]}:${stdenv.gcc.gcc}/lib64" \
-        $out/lib/mozilla/plugins/libnpgoogletalk64.so
+      patchelf --set-rpath "${makeLibraryPath [ stdenv.gcc.gcc xorg.libX11 
]}:${stdenv.gcc.gcc}/lib64" \
+        $plugins/libnpgoogletalk.so
 
-      patchelf --set-rpath 
"$out/libexec/google/talkplugin/lib:${rpathNative}:${stdenv.gcc.gcc}/lib64" \
-        $out/lib/mozilla/plugins/libnpgtpo3dautoplugin.so
+      patchelf --set-rpath 
"$out/libexec/google/talkplugin/lib:${rpathPlugin}:${stdenv.gcc.gcc}/lib64" \
+        $plugins/libnpgtpo3dautoplugin.so
 
       mkdir -p $out/libexec/google/talkplugin
       cp opt/google/talkplugin/GoogleTalkPlugin $out/libexec/google/talkplugin/
@@ -74,10 +76,20 @@
       mkdir -p $out/libexec/google/talkplugin/lib
       cp opt/google/talkplugin/lib/libCg* $out/libexec/google/talkplugin/lib/
 
+      patchelf --set-rpath "$out/libexec/google/talkplugin/lib" \
+        $out/libexec/google/talkplugin/lib/libCgGL.so 
+
       patchelf \
-        --set-interpreter ${pkgsi686Linux.glibc}/lib/ld-linux*.so.2 \
-        --set-rpath ${rpath32} \
+        --set-interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \
+        --set-rpath "${rpathProgram}:${stdenv.gcc.gcc}/lib64" \
         $out/libexec/google/talkplugin/GoogleTalkPlugin
+
+      # Generate an LD_PRELOAD wrapper to redirect execvp() calls to
+      # /opt/../GoogleTalkPlugin.
+      preload=$out/libexec/google/talkplugin/libpreload.so
+      mkdir -p $(dirname $preload)
+      gcc -shared ${./preload.c} -o $preload -ldl -DOUT=\"$out\" -fPIC
+      echo $preload > $plugins/extra-ld-preload
     '';
 
   dontStrip = true;
@@ -88,5 +100,6 @@
   meta = {
     homepage = http://www.google.com/chat/video/;
     license = "unfree";
+    maintainers = [ stdenv.lib.maintainers.eelco ];
   };
 }

Added: 
nixpkgs/trunk/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/preload.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ 
nixpkgs/trunk/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/preload.c
    Sun Apr  1 15:21:30 2012        (r33519)
@@ -0,0 +1,32 @@
+/* Google Talk Plugin executes a helper program in /opt.  This
+   LD_PRELOAD library intercepts execvp() calls to redirect them to
+   the corresponding location in $out. */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <limits.h>
+
+char origDir [] = "/opt/google/talkplugin/GoogleTalkPlugin";
+char realDir [] = OUT "/libexec/google/talkplugin/GoogleTalkPlugin";
+
+const char * rewrite(const char * path, char * buf)
+{
+    if (strncmp(path, origDir, sizeof(origDir) - 1) != 0) return path;
+    if (snprintf(buf, PATH_MAX, "%s%s", realDir, path + sizeof(origDir) - 1) 
>= PATH_MAX)
+        abort();
+    return buf;
+}
+
+int execvp(const char * path, char * const argv[])
+{
+    fprintf(stderr, "foo %s\n", path);
+    int (*_execvp) (const char *, char * const argv[]) = dlsym(RTLD_NEXT, 
"execvp");
+    char buf[PATH_MAX];
+    return _execvp(rewrite(path, buf), argv);
+}

Modified: nixpkgs/trunk/pkgs/top-level/all-packages.nix
==============================================================================
--- nixpkgs/trunk/pkgs/top-level/all-packages.nix       Sun Apr  1 14:33:23 
2012        (r33518)
+++ nixpkgs/trunk/pkgs/top-level/all-packages.nix       Sun Apr  1 15:21:30 
2012        (r33519)
@@ -6854,9 +6854,7 @@
 
   googleearth = callPackage_i686 ../applications/misc/googleearth { };
 
-  google_talk_plugin = callPackage 
../applications/networking/browsers/mozilla-plugins/google-talk-plugin {
-    inherit pkgsi686Linux;
-  };
+  google_talk_plugin = callPackage 
../applications/networking/browsers/mozilla-plugins/google-talk-plugin { };
 
   gosmore = builderDefsPackage ../applications/misc/gosmore {
     inherit fetchsvn curl pkgconfig libxml2 gtk;
_______________________________________________
nix-commits mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-commits

Reply via email to