]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/ofork.c
Fix pathname bug for FCE modified event
[netatalk.git] / etc / afpd / ofork.c
index 10cdfc232b153d4022ecae125e94ea1bc2da3205..3f5a42b01fcf0af851625178910bd54b3d5480c9 100644 (file)
@@ -364,7 +364,7 @@ struct ofork *of_findnameat(int dirfd, struct path *path)
 }
 #endif
 
-void of_dealloc(const AFPObj *obj,  struct ofork *of)
+void of_dealloc(struct ofork *of)
 {
     if (!oforks)
         return;
@@ -378,18 +378,6 @@ void of_dealloc(const AFPObj *obj,  struct ofork *of)
     if ( of->of_ad->ad_refcount <= 0) {
         free( of->of_ad->ad_name );
         free( of->of_ad);
-    } else {/* someone's still using it. just free this user's locks */
-        ad_unlock(of->of_ad, of->of_refnum, of->of_flags & AFPFORK_ERROR ? 0 : 1);
-#ifdef HAVE_FSHARE_T
-        if (obj->options.flags & OPTION_SHARE_RESERV) {
-            fshare_t shmd;
-            shmd.f_id = of->of_refnum;
-            if (AD_DATA_OPEN(of->of_ad))
-                fcntl(ad_data_fileno(of->of_ad), F_UNSHARE, &shmd);
-            if (AD_RSRC_OPEN(of->of_ad))
-                fcntl(ad_reso_fileno(of->of_ad), F_UNSHARE, &shmd);
-        }
-#endif
     }
 
     free( of );
@@ -419,16 +407,32 @@ int of_closefork(const AFPObj *obj, struct ofork *ofork)
 
     /* Somone has used write_fork, we assume file was changed, register it to file change event api */
     if (ofork->of_flags & AFPFORK_MODIFIED) {
-        fce_register_file_modification(ofork);
+        struct dir *dir =  dirlookup(ofork->of_vol, ofork->of_did);
+        bstring forkpath = bformat("%s/%s", bdata(dir->d_fullpath), of_name(ofork));
+        fce_register(FCE_FILE_MODIFY, bdata(forkpath), NULL, fce_file);
+        bdestroy(forkpath);
     }
 
-    of_dealloc(obj, ofork);
+    ad_unlock(ofork->of_ad, ofork->of_refnum, ofork->of_flags & AFPFORK_ERROR ? 0 : 1);
+
+#ifdef HAVE_FSHARE_T
+    if (obj->options.flags & OPTION_SHARE_RESERV) {
+        fshare_t shmd;
+        shmd.f_id = ofork->of_refnum;
+        if (AD_DATA_OPEN(ofork->of_ad))
+            fcntl(ad_data_fileno(ofork->of_ad), F_UNSHARE, &shmd);
+        if (AD_RSRC_OPEN(ofork->of_ad))
+            fcntl(ad_reso_fileno(ofork->of_ad), F_UNSHARE, &shmd);
+    }
+#endif
 
     ret = 0;
     if ( ad_close( ofork->of_ad, adflags | ADFLAGS_SETSHRMD) < 0 ) {
         ret = -1;
     }
 
+    of_dealloc(ofork);
+
     return ret;
 }