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
@@ -90,65 +90,65 @@ int OFileNotification::start( const QString& path, bool sshot, OFileNotification
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 ) );
}
@@ -270,50 +270,51 @@ void OFileNotification::__signalHandler( int sig, siginfo_t *si, void *data )
}
#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" );
}
}
}