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