]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/adouble/ad_flush.c
Allow opening symlinks r/w, but don't actually allow writing. Fixes test426
[netatalk.git] / libatalk / adouble / ad_flush.c
index c35001196e742bfacdc5e03da9e173251daf9acb..5d99227a6fec5b6835319dc2bf81544c08756816 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: ad_flush.c,v 1.11 2009-09-14 10:04:16 franklahm Exp $
+ * $Id: ad_flush.c,v 1.14 2010-03-30 12:55:26 franklahm Exp $
  *
  * Copyright (c) 1990,1991 Regents of The University of Michigan.
  * All Rights Reserved.
@@ -168,8 +168,7 @@ int  ad_rebuild_sfm_header(struct adouble *ad)
 }
 
 
-int ad_flush( ad )
-    struct adouble  *ad;
+int ad_flush( struct adouble *ad)
 {
     int len;
 
@@ -195,16 +194,19 @@ int ad_flush( ad )
 }
 
 /* use refcounts so that we don't have to re-establish fcntl locks. */
-int ad_close( ad, adflags )
-    struct adouble  *ad;
-    int         adflags;
+int ad_close( struct adouble *ad, int adflags)
 {
     int         err = 0;
 
-    if (( adflags & ADFLAGS_DF ) && ad_data_fileno(ad) != -1 &&
-        !(--ad->ad_data_fork.adf_refcount)) {
-        if ( close( ad_data_fileno(ad) ) < 0 ) {
-            err = -1;
+    if ((adflags & ADFLAGS_DF)
+        && ad_data_fileno(ad) >= 0
+        && --ad->ad_data_fork.adf_refcount == 0) {
+        if (ad->ad_data_fork.adf_syml !=0) {
+            free(ad->ad_data_fork.adf_syml);
+            ad->ad_data_fork.adf_syml = 0;
+        } else {
+            if ( close( ad_data_fileno(ad) ) < 0 )
+                err = -1;
         }
         ad_data_fileno(ad) = -1;
         adf_lock_free(&ad->ad_data_fork);