On Tuesday 27 February 2007 10:46, Alexander Klauer wrote:
1. Kile tries to create a FIFO and when this fails, it creates a regular
file instead:
[snip]
The regular file messes up the usual select/pipe semantics. It would be
better (as a short term solution) to show the user a clean error message
instead, something like Sorry, but this functionality is unavailable
because the file system of your home directory does not support FIFOs.
Hello Alexander,
attached is a patch which should stop kile from making bullshit if there are
no FIFOs.
It would be nice if you could try the patch, because I don't have an openafs
filesystem here.
Or if I could get access to an openafs filesystem I can try it myself.
Thanks
Thomas
Index: kilelyxserver.cpp
===
--- kilelyxserver.cpp (Revision 637808)
+++ kilelyxserver.cpp (Arbeitskopie)
@@ -17,6 +17,7 @@
#include sys/types.h
#include stdlib.h //getenv
#include unistd.h //read
+#include fcntl.h
#include kilelyxserver.h
#include kileactions.h
@@ -70,7 +71,7 @@ bool KileLyxServer::start()
kdDebug() Created notifier for (*it)-name() endl;
}
else
-kdDebug() No notifier created fro (*it)-name() endl;
+kdDebug() No notifier created for (*it)-name() endl;
++it;
}
m_running=true;
@@ -81,43 +82,61 @@ bool KileLyxServer::start()
bool KileLyxServer::openPipes()
{
+ kdDebug() ===bool KileLyxServer::openPipes()=== endl;
+
bool opened = false;
QFileInfo info;
QFile *file;
+ struct stat buf;
+ struct stat *stats = buf;
+ mode_t perms = S_IRUSR | S_IWUSR | S_IRGRP| S_IROTH;
for (uint i=0; i m_pipes.count(); ++i)
{
info.setFile(m_pipes[i]);
- if ( ! info.exists() )
+ if ( !info.exists() )
{
- mode_t perms = S_IRUSR | S_IWUSR | S_IRGRP| S_IROTH;
//create the dir first
if ( ! QFileInfo(info.dirPath(true)).exists() )
-if (mkdir(QFile::encodeName( info.dirPath() ), perms | S_IXUSR) == -1)
- perror( Could not create directory for pipe );
+if ( mkdir(QFile::encodeName( info.dirPath() ), perms | S_IXUSR) == -1 )
+{
+ kdError() Could not create directory for pipe endl;
+ continue;
+}
else
kdDebug() Created directory info.dirPath() endl;
- if (mkfifo(QFile::encodeName( m_pipes[i] ), perms) == -1)
- perror( Could not create pipe );
+ if ( mkfifo(QFile::encodeName( m_pipes[i] ), perms) != 0 )
+ {
+kdError() Could not create pipe: m_pipes[i] endl;
+continue;
+ }
else
-kdDebug() Created pipe m_pipes[i] endl;
+kdDebug() Created pipe: m_pipes[i] endl;
}
file = new QFile(info.absFilePath());
- if (!file-open(IO_ReadWrite))
+ info.refresh();
+ if( info.exists() file-open(IO_ReadWrite) ) // in that order we don't create the file if it does not exist
{
- kdError() Could not open info.absFilePath() endl;
+ kdDebug() Opened file: info.absFilePath() endl;
+ fstat(file-handle(),stats);
+ if( !S_ISFIFO(stats-st_mode) )
+ {
+kdError() The file we just created is not a FIFO, perhaps we are on some strange filesystem!? endl;
+file-close();
+continue;
}
else
- {
- kdDebug() Opened info.absFilePath() endl;
+ { // everything is correct :)
m_pipeIn.append(file);
m_file.insert(file-handle(),file);
opened=true;
}
}
-
+ else
+ kdError() Could not open info.absFilePath() endl;
+ }
return opened;
}