summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/ofilenotify.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/libopie2/opiecore/ofilenotify.cpp b/libopie2/opiecore/ofilenotify.cpp
index 5f2a1cc..b576c4f 100644
--- a/libopie2/opiecore/ofilenotify.cpp
+++ b/libopie2/opiecore/ofilenotify.cpp
@@ -74,97 +74,97 @@ int OFileNotification::start( const QString& path, bool sshot, OFileNotification
{
_path = QString::null;
_fd = 0;
if ( _active ) stop();
QString dirpath;
// check if path exists and whether it is a file or a directory, if it exists at all
int result = ::stat( (const char*) path, &_stat );
if ( !(type & Create) && result == -1 )
{
qWarning( "OFileNotification::start(): Can't stat '%s': %s.", (const char*) path, strerror( errno ) );
return -1;
}
// if it is not a directory, we need to find out in which directory the file is
bool isDirectory = S_ISDIR( _stat.st_mode );
if ( !isDirectory )
{
int slashpos;
slashpos = path.findRev( '/' );
if ( slashpos > 0 )
{
_path = path;
dirpath = path.left( slashpos );
}
}
else /* isDirectory */
{
qWarning( "FIXME FIXME FIXME = Directory Notification Not Yet Implemented!" );
_path = path;
dirpath = path;
assert( 0 );
}
int fd = ::open( (const char*) dirpath, O_RDONLY );
if ( fd != -1 )
{
if ( notification_list.isEmpty() )
{
OFileNotification::registerSignalHandler();
}
result = ::fcntl( fd, F_SETSIG, SIGRTMIN );
if ( result == -1 )
{
qWarning( "OFileNotification::start(): Can't subscribe to '%s': %s.", (const char*) dirpath, strerror( errno ) );
return -1;
}
- if ( !sshot ) (int) type |= (int) Multi;
+ if ( !sshot ) type = static_cast<OFileNotificationType>( (int) type | (int) Multi );
result = ::fcntl( fd, F_NOTIFY, type );
if ( result == -1 )
{
qWarning( "OFileNotification::start(): Can't subscribe to '%s': %s.", (const char*) dirpath, strerror( errno ) );
return -1;
}
qDebug( "OFileNotification::start(): Subscribed for changes to %s (fd = %d, mask = 0x%0x)", (const char*) dirpath, fd, type );
notification_list.insert( fd, this );
_type = type;
_fd = fd;
_active = true;
::memset( &_stat, 0, sizeof _stat );
::stat( _path, &_stat );
return fd;
}
else
{
qWarning( "OFileNotification::start(): Error with path '%s': %s.", (const char*) dirpath, strerror( errno ) );
return -1;
}
}
void OFileNotification::stop()
{
if ( !_active ) return;
int result = ::fcntl( _fd, F_NOTIFY, 0 );
if ( result == -1 )
{
qWarning( "OFileNotification::stop(): Can't remove subscription to '%s': %s.", (const char*) _path, strerror( errno ) );
}
else
{
::close( _fd );
_type = Single;
_path = QString::null;
_fd = 0;
_active = false;
}
}
OFileNotificationType OFileNotification::type() const
{
return _type;
}
@@ -254,66 +254,67 @@ void OFileNotification::__signalHandler( int sig, siginfo_t *si, void *data )
OFileNotification* fn = notification_list[fd];
if ( fn )
{
// check if it really was the file (dnotify triggers on directory granularity, not file granularity)
if ( !fn->activate() )
{
qDebug( "OFileNotification::__signalHandler(): false alarm ;) Restarting the trigger (if it was single)..." );
if ( !(fn->type() & Multi ) )
{
int result = ::fcntl( fn->fileno(), F_NOTIFY, fn->type() );
if ( result == -1 )
{
qWarning( "OFileNotification::__signalHandler(): Can't restart the trigger: %s.", strerror( errno ) );
}
}
return;
}
#if 1
if ( !(fn->type() & Multi) )
{
qDebug( "OFileNotification::__signalHandler(): '%d' was singleShot. Removing from list.", fd );
notification_list.remove( fd );
if ( notification_list.isEmpty() )
{
OFileNotification::unregisterSignalHandler();
}
}
#endif
}
else
{
qWarning( "OFileNotification::__signalHandler(): D'oh! Called without fd in notification_list. Race condition?" );
}
}
bool OFileNotification::registerSignalHandler()
{
struct sigaction act;
act.sa_sigaction = OFileNotification::__signalHandler;
::sigemptyset( &act.sa_mask );
act.sa_flags = SA_SIGINFO;
if ( ::sigaction( SIGRTMIN, &act, NULL ) == -1 )
{
qWarning( "OFileNotification::registerSignalHandler(): couldn't register signal handler: %s", strerror( errno ) );
return false;
}
qDebug( "OFileNotification::registerSignalHandler(): done" );
+ return true;
}
void OFileNotification::unregisterSignalHandler()
{
struct sigaction act;
act.sa_sigaction = ( void (*)(int, siginfo_t*, void*) ) SIG_DFL;
::sigemptyset( &act.sa_mask );
if ( ::sigaction( SIGRTMIN, &act, NULL ) == -1 )
{
qWarning( "OFileNotification::unregisterSignalHandler(): couldn't deregister signal handler: %s", strerror( errno ) );
}
qDebug( "OFileNotification::unregisterSignalHandler(): done" );
}
}
}