Piotr Caban : server: Handle more inotify mask values.
Alexandre Julliard
julliard at winehq.org
Fri Dec 17 11:30:48 CST 2010
Module: wine
Branch: master
Commit: f4e64a442f4f0b875db3791611bb57eee04a3b49
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f4e64a442f4f0b875db3791611bb57eee04a3b49
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Dec 16 12:23:04 2010 +0100
server: Handle more inotify mask values.
---
server/change.c | 43 ++++++++++++++++++-------------------------
1 files changed, 18 insertions(+), 25 deletions(-)
diff --git a/server/change.c b/server/change.c
index 0dd7d29..2bdc444 100644
--- a/server/change.c
+++ b/server/change.c
@@ -94,6 +94,8 @@ struct inotify_event {
#define IN_DELETE 0x00000200
#define IN_DELETE_SELF 0x00000400
+#define IN_ISDIR 0x40000000
+
static inline int inotify_init( void )
{
int ret;
@@ -664,6 +666,11 @@ static unsigned int filter_from_event( struct inotify_event *ie )
if (ie->mask & IN_CREATE)
filter |= FILE_NOTIFY_CHANGE_CREATION;
+ if (ie->mask & IN_ISDIR)
+ filter &= ~FILE_NOTIFY_CHANGE_FILE_NAME;
+ else
+ filter &= ~FILE_NOTIFY_CHANGE_DIR_NAME;
+
return filter;
}
@@ -719,30 +726,22 @@ static char *inode_get_path( struct inode *inode, int sz )
return path;
}
-static int inode_check_dir( struct inode *parent, const char *name )
+static void inode_check_dir( struct inode *parent, const char *name )
{
char *path;
unsigned int filter;
struct inode *inode;
struct stat st;
- int wd = -1, r = -1;
+ int wd = -1;
path = inode_get_path( parent, strlen(name) );
if (!path)
- return r;
+ return;
strcat( path, name );
- r = stat( path, &st );
- if (r < 0) goto end;
-
- if (!S_ISDIR(st.st_mode))
- {
- r = 0;
+ if (stat( path, &st ) < 0)
goto end;
- }
-
- r = 1;
filter = filter_from_inode( parent, 1 );
if (!filter)
@@ -760,7 +759,6 @@ static int inode_check_dir( struct inode *parent, const char *name )
end:
free( path );
- return r;
}
static int prepend( char **path, const char *segment )
@@ -808,22 +806,17 @@ static void inotify_notify_all( struct inotify_event *ie )
if (ie->mask & IN_CREATE)
{
- switch (inode_check_dir( inode, ie->name ))
- {
- case 1:
- filter &= ~FILE_NOTIFY_CHANGE_FILE_NAME;
- break;
- case 0:
- filter &= ~FILE_NOTIFY_CHANGE_DIR_NAME;
- break;
- default:
- break;
- /* Maybe the file disappeared before we could check it? */
- }
+ if (ie->mask & IN_ISDIR)
+ inode_check_dir( inode, ie->name );
+
action = FILE_ACTION_ADDED;
}
else if (ie->mask & IN_DELETE)
action = FILE_ACTION_REMOVED;
+ else if (ie->mask & IN_MOVED_FROM)
+ action = FILE_ACTION_RENAMED_OLD_NAME;
+ else if (ie->mask & IN_MOVED_TO)
+ action = FILE_ACTION_RENAMED_NEW_NAME;
else
action = FILE_ACTION_MODIFIED;
More information about the wine-cvs
mailing list