Changeset 59488 for trunk


Ignore:
Timestamp:
Oct 15, 2009, 5:51:05 PM (11 years ago)
Author:
sharky@…
Message:

kdelibs4 : improve support for KIO slaves

Location:
trunk/dports/kde/kdelibs4
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/dports/kde/kdelibs4/Portfile

    r59387 r59488  
    77name                kdelibs4
    88version             4.3.2
    9 revision            2
     9revision            3
    1010categories          kde kde4
    1111maintainers         snc sharky
     
    3838                    #port:phonon \
    3939
    40 patchfiles          default-kde4-xdg-menu-prefix.patch \
     40patchfiles          add-bundles-to-path.patch \
     41                    default-kde4-xdg-menu-prefix.patch \
    4142                    dont-use-fdatasync.patch \
    4243                    dont-use-carbon-keyboard.patch \
  • trunk/dports/kde/kdelibs4/files/workaround-kdeinit4-crash.patch

    r59387 r59488  
    11Index: kdelibs-4.3.2/kinit/kinit.cpp
    22===================================================================
    3 --- kdelibs-4.3.2.orig/kinit/kinit.cpp  2009-10-13 07:31:16.000000000 +0200
    4 +++ kdelibs-4.3.2/kinit/kinit.cpp       2009-10-13 07:31:52.000000000 +0200
    5 @@ -489,6 +489,13 @@
     3--- kdelibs-4.3.2.orig/kinit/kinit.cpp  2009-10-14 18:47:04.000000000 +0200
     4+++ kdelibs-4.3.2/kinit/kinit.cpp       2009-10-14 19:10:14.000000000 +0200
     5@@ -489,6 +489,14 @@
    66       init_startup_info( startup_id, name, envc, envs );
    77 #endif
     
    99+  // Don't run this inside the child process, it crashes on OS/X 10.6
    1010+  const QByteArray docPath = QFile::encodeName(KGlobalSettings::documentPath());
     11+  const QString helperpath = s_instance->dirs()->findExe(QString::fromLatin1("kdeinit4_helper"));
    1112+#ifdef Q_WS_MAC
    12 QString bundlepath = s_instance->dirs()->findExe(QFile::decodeName(execpath));
    13 QString argvexe = s_instance->dirs()->findExe(QString::fromLatin1(_name));
     13const QString bundlepath = s_instance->dirs()->findExe(QFile::decodeName(execpath));
     14const QString argvexe = s_instance->dirs()->findExe(QString::fromLatin1(_name));
    1415+#endif
    1516+
     
    1718   d.fork = fork();
    1819   switch(d.fork) {
    19 @@ -513,7 +520,6 @@
     20@@ -513,7 +521,6 @@
    2021      if (cwd && *cwd) {
    2122          (void)chdir(cwd);
     
    2526      }
    2627 
    27 @@ -552,7 +558,6 @@
    28         d.argv = (char **) malloc(sizeof(char *) * (argc+1));
     28@@ -549,10 +556,9 @@
     29      {
     30        int r;
     31        QByteArray procTitle;
     32-       d.argv = (char **) malloc(sizeof(char *) * (argc+1));
     33+       d.argv = (char **) malloc(sizeof(char *) * (argc+2));
    2934        d.argv[0] = (char *) _name;
    3035 #ifdef Q_WS_MAC
     
    3338           QByteArray cstr = argvexe.toLocal8Bit();
    3439           kDebug(7016) << "kdeinit4: launch() setting argv: " << cstr.data();
    35 @@ -628,7 +633,6 @@
     40@@ -628,7 +634,6 @@
    3641 
    3742         QByteArray executable = execpath;
     
    4146            executable = QFile::encodeName(bundlepath);
    4247 #endif
     48@@ -642,25 +647,13 @@
     49         exit(255);
     50      }
     51 
     52-     void * sym = l.resolve( "kdeinitmain");
     53-     if (!sym )
     54-        {
     55-        sym = l.resolve( "kdemain" );
     56-        if ( !sym )
     57-           {
     58-            QString ltdlError = l.errorString();
     59-            fprintf(stderr, "Could not find kdemain: %s\n", qPrintable(ltdlError) );
     60-              QString errorMsg = i18n("Could not find 'kdemain' in '%1'.\n%2",
     61-                                      libpath, ltdlError);
     62-              exitWithErrorMsg(errorMsg);
     63-           }
     64-        }
     65-
     66-     d.result = 0; // Success
     67+     d.result = 2; // Try execing
     68      write(d.fd[1], &d.result, 1);
     69-     close(d.fd[1]);
     70 
     71-     d.func = (int (*)(int, char *[])) sym;
     72+     // We set the close on exec flag.
     73+     // Closing of d.fd[1] indicates that the execvp succeeded!
     74+     fcntl(d.fd[1], F_SETFD, FD_CLOEXEC);
     75+
     76      if (d.debug_wait)
     77      {
     78         fprintf(stderr, "kdeinit4: Suspending process\n"
     79@@ -674,8 +667,18 @@
     80         setup_tty( tty );
     81      }
     82 
     83-     exit( d.func(argc, d.argv)); /* Launch! */
     84+     QByteArray helperexe = QFile::encodeName(helperpath);
     85+     QByteArray libpathbytes = QFile::encodeName(libpath);
     86+     d.argv[argc] = libpathbytes.data();
     87+     d.argv[argc+1] = 0;
     88+
     89+     if (!helperexe.isEmpty())
     90+        execvp(helperexe, d.argv);
     91 
     92+     d.result = 1; // Error
     93+     write(d.fd[1], &d.result, 1);
     94+     close(d.fd[1]);
     95+     exit(255);
     96      break;
     97   }
     98   default:
     99Index: kdelibs-4.3.2/kinit/CMakeLists.txt
     100===================================================================
     101--- kdelibs-4.3.2.orig/kinit/CMakeLists.txt     2009-10-14 18:47:04.000000000 +0200
     102+++ kdelibs-4.3.2/kinit/CMakeLists.txt  2009-10-14 19:10:14.000000000 +0200
     103@@ -53,6 +53,16 @@
     104 
     105 install(TARGETS kdeinit4 ${INSTALL_TARGETS_DEFAULT_ARGS} )
     106 
     107+########### kdeinit4_helper ###############
     108+
     109+set(kdeinit4_helper_SRCS helper.cpp)
     110+
     111+kde4_add_executable(kdeinit4_helper NOGUI ${kdeinit4_helper_SRCS})
     112+
     113+target_link_libraries(kdeinit4_helper ${QT_QTCORE_LIBRARY})
     114+
     115+install(TARGETS kdeinit4_helper DESTINATION ${LIBEXEC_INSTALL_DIR} )
     116+
     117 ########### kwrapper4 ###############
     118 if (WIN32)
     119   set(kwrapper_SRCS kwrapper_win.cpp  )
     120Index: kdelibs-4.3.2/kinit/helper.cpp
     121===================================================================
     122--- /dev/null   1970-01-01 00:00:00.000000000 +0000
     123+++ kdelibs-4.3.2/kinit/helper.cpp      2009-10-14 19:11:06.000000000 +0200
     124@@ -0,0 +1,42 @@
     125+#include <stdio.h>
     126+#include <stdlib.h>
     127+
     128+#include <QFile>
     129+#include <QLibrary>
     130+
     131+typedef int (*handler) (int, char *[]);
     132+
     133+int main(int argc, char *argv[])
     134+{
     135+    if (argc < 2)
     136+    {
     137+        fprintf(stderr, "Too few arguments\n");
     138+        exit(1);
     139+    }
     140+
     141+    QString libpath = QFile::decodeName(argv[argc-1]);
     142+    QLibrary l(libpath);
     143+
     144+    if (!libpath.isEmpty() && (!l.load() || !l.isLoaded()))
     145+    {
     146+        QString ltdlError = l.errorString();
     147+        fprintf(stderr, "Could not open library %s: %s\n", qPrintable(libpath), qPrintable(ltdlError) );
     148+        exit(1);
     149+    }
     150+
     151+    void * sym = l.resolve( "kdeinitmain");
     152+    if (!sym)
     153+    {
     154+        sym = l.resolve( "kdemain" );
     155+        if ( !sym )
     156+        {
     157+            QString ltdlError = l.errorString();
     158+            fprintf(stderr, "Could not find kdemain: %s\n", qPrintable(ltdlError) );
     159+            exit(1);
     160+        }
     161+    }
     162+
     163+    handler func = (int (*)(int, char *[])) sym;
     164+    exit( func(argc - 1, argv)); /* Launch! */
     165+}
     166+
Note: See TracChangeset for help on using the changeset viewer.