summaryrefslogtreecommitdiff
Unidiff
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
74{ 74{
75 _path = QString::null; 75 _path = QString::null;
76 _fd = 0; 76 _fd = 0;
77 if ( _active ) stop(); 77 if ( _active ) stop();
78 QString dirpath; 78 QString dirpath;
79 79
80 // check if path exists and whether it is a file or a directory, if it exists at all 80 // check if path exists and whether it is a file or a directory, if it exists at all
81 int result = ::stat( (const char*) path, &_stat ); 81 int result = ::stat( (const char*) path, &_stat );
82 if ( !(type & Create) && result == -1 ) 82 if ( !(type & Create) && result == -1 )
83 { 83 {
84 qWarning( "OFileNotification::start(): Can't stat '%s': %s.", (const char*) path, strerror( errno ) ); 84 qWarning( "OFileNotification::start(): Can't stat '%s': %s.", (const char*) path, strerror( errno ) );
85 return -1; 85 return -1;
86 } 86 }
87 87
88 // if it is not a directory, we need to find out in which directory the file is 88 // if it is not a directory, we need to find out in which directory the file is
89 bool isDirectory = S_ISDIR( _stat.st_mode ); 89 bool isDirectory = S_ISDIR( _stat.st_mode );
90 if ( !isDirectory ) 90 if ( !isDirectory )
91 { 91 {
92 int slashpos; 92 int slashpos;
93 slashpos = path.findRev( '/' ); 93 slashpos = path.findRev( '/' );
94 if ( slashpos > 0 ) 94 if ( slashpos > 0 )
95 { 95 {
96 _path = path; 96 _path = path;
97 dirpath = path.left( slashpos ); 97 dirpath = path.left( slashpos );
98 } 98 }
99 } 99 }
100 else /* isDirectory */ 100 else /* isDirectory */
101 { 101 {
102 qWarning( "FIXME FIXME FIXME = Directory Notification Not Yet Implemented!" ); 102 qWarning( "FIXME FIXME FIXME = Directory Notification Not Yet Implemented!" );
103 _path = path; 103 _path = path;
104 dirpath = path; 104 dirpath = path;
105 assert( 0 ); 105 assert( 0 );
106 } 106 }
107 107
108 int fd = ::open( (const char*) dirpath, O_RDONLY ); 108 int fd = ::open( (const char*) dirpath, O_RDONLY );
109 if ( fd != -1 ) 109 if ( fd != -1 )
110 { 110 {
111 if ( notification_list.isEmpty() ) 111 if ( notification_list.isEmpty() )
112 { 112 {
113 OFileNotification::registerSignalHandler(); 113 OFileNotification::registerSignalHandler();
114 } 114 }
115 115
116 result = ::fcntl( fd, F_SETSIG, SIGRTMIN ); 116 result = ::fcntl( fd, F_SETSIG, SIGRTMIN );
117 if ( result == -1 ) 117 if ( result == -1 )
118 { 118 {
119 qWarning( "OFileNotification::start(): Can't subscribe to '%s': %s.", (const char*) dirpath, strerror( errno ) ); 119 qWarning( "OFileNotification::start(): Can't subscribe to '%s': %s.", (const char*) dirpath, strerror( errno ) );
120 return -1; 120 return -1;
121 } 121 }
122 if ( !sshot ) (int) type |= (int) Multi; 122 if ( !sshot ) type = static_cast<OFileNotificationType>( (int) type | (int) Multi );
123 result = ::fcntl( fd, F_NOTIFY, type ); 123 result = ::fcntl( fd, F_NOTIFY, type );
124 if ( result == -1 ) 124 if ( result == -1 )
125 { 125 {
126 qWarning( "OFileNotification::start(): Can't subscribe to '%s': %s.", (const char*) dirpath, strerror( errno ) ); 126 qWarning( "OFileNotification::start(): Can't subscribe to '%s': %s.", (const char*) dirpath, strerror( errno ) );
127 return -1; 127 return -1;
128 } 128 }
129 qDebug( "OFileNotification::start(): Subscribed for changes to %s (fd = %d, mask = 0x%0x)", (const char*) dirpath, fd, type ); 129 qDebug( "OFileNotification::start(): Subscribed for changes to %s (fd = %d, mask = 0x%0x)", (const char*) dirpath, fd, type );
130 notification_list.insert( fd, this ); 130 notification_list.insert( fd, this );
131 _type = type; 131 _type = type;
132 _fd = fd; 132 _fd = fd;
133 _active = true; 133 _active = true;
134 ::memset( &_stat, 0, sizeof _stat ); 134 ::memset( &_stat, 0, sizeof _stat );
135 ::stat( _path, &_stat ); 135 ::stat( _path, &_stat );
136 return fd; 136 return fd;
137 } 137 }
138 else 138 else
139 { 139 {
140 qWarning( "OFileNotification::start(): Error with path '%s': %s.", (const char*) dirpath, strerror( errno ) ); 140 qWarning( "OFileNotification::start(): Error with path '%s': %s.", (const char*) dirpath, strerror( errno ) );
141 return -1; 141 return -1;
142 } 142 }
143} 143}
144 144
145 145
146void OFileNotification::stop() 146void OFileNotification::stop()
147{ 147{
148 if ( !_active ) return; 148 if ( !_active ) return;
149 149
150 int result = ::fcntl( _fd, F_NOTIFY, 0 ); 150 int result = ::fcntl( _fd, F_NOTIFY, 0 );
151 if ( result == -1 ) 151 if ( result == -1 )
152 { 152 {
153 qWarning( "OFileNotification::stop(): Can't remove subscription to '%s': %s.", (const char*) _path, strerror( errno ) ); 153 qWarning( "OFileNotification::stop(): Can't remove subscription to '%s': %s.", (const char*) _path, strerror( errno ) );
154 } 154 }
155 else 155 else
156 { 156 {
157 ::close( _fd ); 157 ::close( _fd );
158 _type = Single; 158 _type = Single;
159 _path = QString::null; 159 _path = QString::null;
160 _fd = 0; 160 _fd = 0;
161 _active = false; 161 _active = false;
162 } 162 }
163} 163}
164 164
165 165
166OFileNotificationType OFileNotification::type() const 166OFileNotificationType OFileNotification::type() const
167{ 167{
168 return _type; 168 return _type;
169} 169}
170 170
@@ -254,66 +254,67 @@ void OFileNotification::__signalHandler( int sig, siginfo_t *si, void *data )
254 OFileNotification* fn = notification_list[fd]; 254 OFileNotification* fn = notification_list[fd];
255 if ( fn ) 255 if ( fn )
256 { 256 {
257 // check if it really was the file (dnotify triggers on directory granularity, not file granularity) 257 // check if it really was the file (dnotify triggers on directory granularity, not file granularity)
258 if ( !fn->activate() ) 258 if ( !fn->activate() )
259 { 259 {
260 qDebug( "OFileNotification::__signalHandler(): false alarm ;) Restarting the trigger (if it was single)..." ); 260 qDebug( "OFileNotification::__signalHandler(): false alarm ;) Restarting the trigger (if it was single)..." );
261 if ( !(fn->type() & Multi ) ) 261 if ( !(fn->type() & Multi ) )
262 { 262 {
263 int result = ::fcntl( fn->fileno(), F_NOTIFY, fn->type() ); 263 int result = ::fcntl( fn->fileno(), F_NOTIFY, fn->type() );
264 if ( result == -1 ) 264 if ( result == -1 )
265 { 265 {
266 qWarning( "OFileNotification::__signalHandler(): Can't restart the trigger: %s.", strerror( errno ) ); 266 qWarning( "OFileNotification::__signalHandler(): Can't restart the trigger: %s.", strerror( errno ) );
267 } 267 }
268 } 268 }
269 return; 269 return;
270 } 270 }
271 #if 1 271 #if 1
272 if ( !(fn->type() & Multi) ) 272 if ( !(fn->type() & Multi) )
273 { 273 {
274 qDebug( "OFileNotification::__signalHandler(): '%d' was singleShot. Removing from list.", fd ); 274 qDebug( "OFileNotification::__signalHandler(): '%d' was singleShot. Removing from list.", fd );
275 notification_list.remove( fd ); 275 notification_list.remove( fd );
276 if ( notification_list.isEmpty() ) 276 if ( notification_list.isEmpty() )
277 { 277 {
278 OFileNotification::unregisterSignalHandler(); 278 OFileNotification::unregisterSignalHandler();
279 } 279 }
280 } 280 }
281 #endif 281 #endif
282 } 282 }
283 else 283 else
284 { 284 {
285 qWarning( "OFileNotification::__signalHandler(): D'oh! Called without fd in notification_list. Race condition?" ); 285 qWarning( "OFileNotification::__signalHandler(): D'oh! Called without fd in notification_list. Race condition?" );
286 } 286 }
287} 287}
288 288
289 289
290bool OFileNotification::registerSignalHandler() 290bool OFileNotification::registerSignalHandler()
291{ 291{
292 struct sigaction act; 292 struct sigaction act;
293 act.sa_sigaction = OFileNotification::__signalHandler; 293 act.sa_sigaction = OFileNotification::__signalHandler;
294 ::sigemptyset( &act.sa_mask ); 294 ::sigemptyset( &act.sa_mask );
295 act.sa_flags = SA_SIGINFO; 295 act.sa_flags = SA_SIGINFO;
296 if ( ::sigaction( SIGRTMIN, &act, NULL ) == -1 ) 296 if ( ::sigaction( SIGRTMIN, &act, NULL ) == -1 )
297 { 297 {
298 qWarning( "OFileNotification::registerSignalHandler(): couldn't register signal handler: %s", strerror( errno ) ); 298 qWarning( "OFileNotification::registerSignalHandler(): couldn't register signal handler: %s", strerror( errno ) );
299 return false; 299 return false;
300 } 300 }
301 qDebug( "OFileNotification::registerSignalHandler(): done" ); 301 qDebug( "OFileNotification::registerSignalHandler(): done" );
302 return true;
302} 303}
303 304
304 305
305void OFileNotification::unregisterSignalHandler() 306void OFileNotification::unregisterSignalHandler()
306{ 307{
307 struct sigaction act; 308 struct sigaction act;
308 act.sa_sigaction = ( void (*)(int, siginfo_t*, void*) ) SIG_DFL; 309 act.sa_sigaction = ( void (*)(int, siginfo_t*, void*) ) SIG_DFL;
309 ::sigemptyset( &act.sa_mask ); 310 ::sigemptyset( &act.sa_mask );
310 if ( ::sigaction( SIGRTMIN, &act, NULL ) == -1 ) 311 if ( ::sigaction( SIGRTMIN, &act, NULL ) == -1 )
311 { 312 {
312 qWarning( "OFileNotification::unregisterSignalHandler(): couldn't deregister signal handler: %s", strerror( errno ) ); 313 qWarning( "OFileNotification::unregisterSignalHandler(): couldn't deregister signal handler: %s", strerror( errno ) );
313 } 314 }
314 qDebug( "OFileNotification::unregisterSignalHandler(): done" ); 315 qDebug( "OFileNotification::unregisterSignalHandler(): done" );
315} 316}
316 317
317 318
318} 319}
319} 320}