[SCM] Akonadi packaging branch, master, updated. debian/1.5.1-1-7-gb208733

Modestas Vainius modax at alioth.debian.org
Sat Apr 30 10:23:33 UTC 2011


The following commit has been merged in the master branch:
commit 3e3b5945f462de2d92078819a847c9fd452f542b
Author: Modestas Vainius <modax at debian.org>
Date:   Sat Apr 30 12:29:37 2011 +0300

    Fix akonadi-server socket location when HOME is on network fs.
    
    Add patch 04_socket_location.diff to allow akonadi-server to run when HOME is
    mounted to the network filesystem (Closes: #545139). Thanks to Ansgar Burchardt
    for the patch.
---
 debian/changelog                       |    3 +
 debian/patches/04_socket_location.diff |  251 ++++++++++++++++++++++++++++++++
 debian/patches/series                  |    1 +
 3 files changed, 255 insertions(+), 0 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 77ed308..4602c5c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,8 @@
 akonadi (1.3.1-4) UNRELEASED; urgency=low
 
+  * Add patch 04_socket_location.diff to allow akonadi-server to run when HOME
+    is mounted to the network filesystem (Closes: #545139). Thanks to Ansgar
+    Burchardt for the patch.
 
  -- Modestas Vainius <modax at debian.org>  Sat, 30 Apr 2011 12:21:29 +0300
 
diff --git a/debian/patches/04_socket_location.diff b/debian/patches/04_socket_location.diff
new file mode 100644
index 0000000..9a91331
--- /dev/null
+++ b/debian/patches/04_socket_location.diff
@@ -0,0 +1,251 @@
+From: Ansgar Burchardt <ansgar at debian.org>
+Date: Mon, 29 Nov 2010 12:40:18 +0100
+Subject: Move sockets away from $HOME
+Bug-Debian: http://bugs.debian.org/545139
+Bug: https://bugs.kde.org/show_bug.cgi?id=179006
+
+Move directories used for sockets to /tmp, using a symlink (that includes the
+hostname) to remember where it is located.
+
+Based on upstream commit e4affdfc2922efc10b647939fd4e068c02e256eb,
+includes the fix 1fa22c55fd98f29321b943605466ef4d4640de53 as well.
+
+--- akonadi-1.3.1.orig/server/CMakeLists.txt
++++ akonadi-1.3.1/server/CMakeLists.txt
+@@ -59,6 +59,7 @@
+ set(libakonadiprivate_SRCS
+   ${AKONADI_SHARED_SOURCES}
+   src/akonadi.cpp
++  src/socketdir.cpp
+   src/akonadiconnection.cpp
+   src/handler.cpp
+   src/handlerhelper.cpp
+--- akonadi-1.3.1.orig/server/src/akonadi.cpp
++++ akonadi-1.3.1/server/src/akonadi.cpp
+@@ -34,6 +34,7 @@
+ #include "debuginterface.h"
+ #include "storage/itemretrievalthread.h"
+ #include "preprocessormanager.h"
++#include "socketdir.h"
+ 
+ #include "libs/xdgbasedirs_p.h"
+ #include "libs/protocol_p.h"
+@@ -84,13 +85,7 @@
+     connectionSettings.setValue( QLatin1String( "Data/Method" ), QLatin1String( "NamedPipe" ) );
+     connectionSettings.setValue( QLatin1String( "Data/NamedPipe" ), namedPipe );
+ #else
+-    const QString defaultSocketDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi" ) );
+-    QString socketDir = settings.value( QLatin1String( "Connection/SocketDirectory" ), defaultSocketDir ).toString();
+-    if ( socketDir[0] != QLatin1Char( '/' ) ) {
+-      QDir::home().mkdir( socketDir );
+-      socketDir = QDir::homePath() + QLatin1Char( '/' ) + socketDir;
+-    }
+-
++    QString socketDir = preferredSocketDirectory( XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi" ) ) );
+     const QString socketFile = socketDir + QLatin1String( "/akonadiserver.socket" );
+     unlink( socketFile.toUtf8().constData() );
+     if ( !listen( socketFile ) )
+@@ -202,8 +197,7 @@
+ 
+ #ifndef Q_OS_WIN
+     QSettings connectionSettings( connectionSettingsFile, QSettings::IniFormat );
+-    const QString defaultSocketDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi" ) );
+-    const QString socketDir = settings.value( QLatin1String( "Connection/SocketDirectory" ), defaultSocketDir ).toString();
++    const QString socketDir = preferredSocketDirectory( XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi" ) ) );
+ 
+     if ( !QDir::home().remove( socketDir + QLatin1String( "/akonadiserver.socket" ) ) )
+         akError() << "Failed to remove Unix socket";
+@@ -261,7 +255,7 @@
+ void AkonadiServer::startPostgresqlDatabaseProcess()
+ {
+   const QString dataDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_data" ) );
+-  const QString socketDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_misc" ) );
++  const QString socketDir = preferredSocketDirectory( XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_misc" ) ) );
+ 
+   if ( !QFile::exists( QString::fromLatin1( "%1/PG_VERSION" ).arg( dataDir ) ) ) {
+     // postgre data directory not initialized yet, so call initdb on it
+@@ -371,7 +365,7 @@
+ 
+   const QString dataDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_data" ) );
+   const QString akDir   = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/" ) );
+-  const QString miscDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_misc" ) );
++  const QString miscDir = preferredSocketDirectory( XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_misc" ) ) );
+   const QString fileDataDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/file_db_data" ) );
+ 
+   // generate config file
+--- /dev/null
++++ akonadi-1.3.1/server/src/socketdir.cpp
+@@ -0,0 +1,127 @@
++#include "socketdir.h"
++
++#include "libs/xdgbasedirs_p.h"
++
++#include <QtCore/QDebug>
++#include <QtCore/QDir>
++#include <QtCore/QFileInfo>
++#include <QtCore/QSettings>
++#include <QtNetwork/QHostInfo>
++
++#include <cerrno>
++#include <cstdlib>
++#include <pwd.h>
++#include <sys/types.h>
++#include <unistd.h>
++
++static QString akonadiSocketDirectory();
++static bool checkSocketDirectory( const QString &path );
++static bool createSocketDirectory( const QString &link, const QString &tmpl );
++
++using namespace Akonadi;
++
++QString Akonadi::preferredSocketDirectory( const QString &defaultDirectory )
++{
++  const QString serverConfigFile = XdgBaseDirs::akonadiServerConfigFile( XdgBaseDirs::ReadWrite );
++  const QSettings serverSettings( serverConfigFile, QSettings::IniFormat );
++
++#if defined(Q_OS_WINCE) || defined(Q_OS_WIN)
++  const QString socketDir = serverSettings.value( QLatin1String( "Connection/SocketDirectory" ), defaultDirectory ).toString();
++#else
++  QString socketDir = defaultDirectory;
++  if ( !serverSettings.contains( QLatin1String( "Connection/SocketDirectory" ) ) ) {
++    // if no socket directory is defined, use the symlinked from /tmp
++    socketDir = akonadiSocketDirectory();
++
++    if ( socketDir.isEmpty() ) // if that does not work, fall back on default
++      socketDir = defaultDirectory;
++  } else {
++    socketDir = serverSettings.value( QLatin1String( "Connection/SocketDirectory" ), defaultDirectory ).toString();
++  }
++
++  const QString userName = QString::fromLocal8Bit( qgetenv( "USER" ) );
++  if ( socketDir.contains( QLatin1String( "$USER" ) ) && !userName.isEmpty() )
++    socketDir.replace( QLatin1String( "$USER" ), userName );
++
++  if ( socketDir[0] != QLatin1Char( '/' ) ) {
++    QDir::home().mkdir( socketDir );
++    socketDir = QDir::homePath() + QLatin1Char( '/' ) + socketDir;
++  }
++
++  QFileInfo dirInfo( socketDir );
++  if ( !dirInfo.exists() )
++    QDir::home().mkpath( dirInfo.absoluteFilePath() );
++#endif
++  return socketDir;
++}
++
++QString akonadiSocketDirectory()
++{
++  const QString hostname = QHostInfo::localHostName();
++
++  if ( hostname.isEmpty() ) {
++    qCritical() << "QHostInfo::localHostName() failed";
++    return QString();
++  }
++
++  const uid_t uid = getuid();
++  const struct passwd *pw_ent = getpwuid( uid );
++  if ( !pw_ent ) {
++    qCritical() << "Could not get passwd entry for user id" << uid;
++    return QString();
++  }
++
++  const QString link = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi" ) ) + QLatin1Char( '/' ) + QLatin1String( "socket-" ) + hostname;
++  const QString tmpl = QLatin1String( "akonadi-" ) + QLatin1String( pw_ent->pw_name ) + QLatin1String( ".XXXXXX" );
++
++  if ( checkSocketDirectory( link ) )
++    return link;
++
++  if ( createSocketDirectory( link, tmpl ) )
++    return link;
++
++  qCritical() << "Could not create socket directory for Akonadi.";
++  return QString();
++}
++
++static bool checkSocketDirectory( const QString &path )
++{
++  QFileInfo info( path );
++
++  if ( !info.exists() )
++    return false;
++
++  if ( info.isSymLink() )
++    info = QFileInfo( info.symLinkTarget() );
++
++  if ( !info.isDir() )
++    return false;
++
++  if ( info.ownerId() != getuid() )
++    return false;
++
++  return true;
++}
++
++static bool createSocketDirectory( const QString &link, const QString &tmpl )
++{
++  QString directory = QString::fromLatin1( "%1%2%3" ).arg( QDir::tempPath() ).arg( QDir::separator() ).arg( tmpl );
++
++  QByteArray directoryString = directory.toLocal8Bit().data();
++
++  if ( !mkdtemp( directoryString.data() ) ) {
++    qCritical() << "Creating socket directory with template" << directoryString << "failed:" << strerror( errno );
++    return false;
++  }
++
++  directory = QString::fromLocal8Bit( directoryString );
++
++  QFile::remove( link );
++
++  if ( !QFile::link( directory, link ) ) {
++    qCritical() << "Creating symlink from" << directory << "to" << link << "failed";
++    return false;
++  }
++
++  return true;
++}
+--- /dev/null
++++ akonadi-1.3.1/server/src/socketdir.h
+@@ -0,0 +1,10 @@
++#ifndef AKONADI_SOCKETDIR_H
++#define AKONADI_SOCKETDIR_H
++
++#include <QtCore/QString>
++
++namespace Akonadi {
++  QString preferredSocketDirectory(const QString &defaultDirectory);
++}
++
++#endif
+--- akonadi-1.3.1.orig/server/src/storage/dbconfig.cpp
++++ akonadi-1.3.1/server/src/storage/dbconfig.cpp
+@@ -20,6 +20,7 @@
+ #include "dbconfig.h"
+ #include "akdebug.h"
+ #include "../../libs/xdgbasedirs_p.h"
++#include "../socketdir.h"
+ 
+ #include <QDir>
+ #include <QFile>
+@@ -97,11 +98,11 @@
+         if ( !mysqladminPath.isEmpty() ) {
+           defaultCleanShutdownCommand = QString::fromLatin1("%1 shutdown --socket=%2/mysql.socket")
+                                             .arg(mysqladminPath)
+-                                            .arg(XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_misc" ) ) );
++                                            .arg( preferredSocketDirectory( XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_misc" ) ) ) );
+         }
+         mInternalServer = settings.value( QLatin1String("QMYSQL/StartServer"), defaultInternalServer ).toBool();
+         if ( mInternalServer ) {
+-          const QString miscDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_misc" ) );
++          const QString miscDir = preferredSocketDirectory( XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/db_misc" ) ) );
+           defaultOptions = QString::fromLatin1( "UNIX_SOCKET=%1/mysql.socket" ).arg( miscDir );
+         }
+       } else if ( mDriverName == QLatin1String("QMYSQL_EMBEDDED") ) {
+@@ -142,7 +143,7 @@
+ 
+       // verify settings and apply permanent changes (written out below)
+       if ( mDriverName == QLatin1String( "QMYSQL" ) ) {
+-        if ( mInternalServer && mConnectionOptions.isEmpty() )
++        if ( mInternalServer /* && mConnectionOptions.isEmpty() */ )
+           mConnectionOptions = defaultOptions;
+         if ( mInternalServer && (mServerPath.isEmpty() || !QFile::exists(mServerPath) ) )
+           mServerPath = defaultServerPath;
diff --git a/debian/patches/series b/debian/patches/series
index cabdcbb..00bf889 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,4 @@
 01_x11_not_required.diff
 02_hardcode_debian_mysqld_path.diff
 03_disable_usr_lib_install_rpath.diff
+04_socket_location.diff

-- 
Akonadi packaging



More information about the pkg-kde-commits mailing list