]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/adouble/ad_open.c
Fix ad_reso_size once more...
[netatalk.git] / libatalk / adouble / ad_open.c
index 2e2d686c358df16d7420ba5081617f97575fab1d..72250de8034caca1cacf9422870e0ad2ee0f87a6 100644 (file)
@@ -1045,14 +1045,18 @@ static int ad_reso_size(const char *path, int adflags, struct adouble *ad)
     LOG(log_debug, logtype_default, "ad_reso_size(\"%s\")", path);
 
 #ifdef HAVE_EAFD
-    int opened = 0;
-    int eafd = ad_reso_fileno(ad);
-    if (eafd == -1) {
-        EC_NEG1( eafd = sys_getxattrfd(path, AD_EA_RESO, O_RDONLY) );
-        opened = 1;
+    ssize_t easz;
+
+    if (ad_reso_fileno(ad) != -1) {
+        EC_NEG1( fstat(ad_reso_fileno(ad), &st) );
+        ad->ad_rlen = st.st_size;
+    } else if (ad_meta_fileno(ad) != -1) {
+        EC_NEG1( easz = sys_fgetxattr(ad_meta_fileno(ad), AD_EA_RESO, NULL, 0) );
+        ad->ad_rlen = easz;
+    } else {
+        EC_FAIL;
     }
-    EC_NEG1( rlen = fstat(eafd, &st) );
-    ad->ad_rlen = st.st_size;
+
 #else
     const char *rfpath;
     EC_NULL_LOG( rfpath = ad->ad_ops->ad_path(path, adflags));
@@ -1066,10 +1070,6 @@ static int ad_reso_size(const char *path, int adflags, struct adouble *ad)
     LOG(log_debug, logtype_default, "ad_reso_size(\"%s\"): size: %zd", path, ad->ad_rlen);
 
 EC_CLEANUP:
-#ifdef HAVE_EAFD
-    if (opened)
-        close(eafd);
-#endif
     if (ret != 0)
         ad->ad_rlen = 0;
     EC_EXIT;
@@ -1114,11 +1114,16 @@ static int ad_open_rf(const char *path, int adflags, int mode, struct adouble *a
         goto EC_CLEANUP;
     }
 #ifdef HAVE_EAFD
-    if ((ad_reso_fileno(ad) = sys_getxattrfd(path, oflags)) == -1) {
-        if (!(adflags & ADFLAGS_CREATE))
+    if (ad_meta_fileno(ad) == -1)
+        EC_FAIL;
+    if ((ad_reso_fileno(ad) = sys_getxattrfd(ad_meta_fileno(ad), AD_EA_RESO, oflags)) == -1) {
+        if (!(adflags & ADFLAGS_CREATE)) {
+            errno = ENOENT;
             EC_FAIL;
+        }
         oflags |= O_CREAT;
-        EC_NEG1_LOG( ad_reso_fileno(ad) = sys_getxattrfd(path, oflags, 0666) ); 
+        EC_NEG1_LOG( ad_reso_fileno(ad) = sys_getxattrfd(ad_meta_fileno(ad),
+                                                         AD_EA_RESO, oflags, 0666) ); 
     }
 #else
     EC_NULL_LOG( rfpath = ad->ad_ops->ad_path(path, adflags) );
@@ -1603,10 +1608,10 @@ int ad_refresh(const char *path, struct adouble *ad)
         if (AD_RSRC_OPEN(ad)) {
             if (ad_reso_fileno(ad) == -1)
                 return -1;
-            ssize_t len;
-            if ((len = fstat(ad_reso_fileno(ad))) == -1)
+            struct stat st;
+            if (fstat(ad_reso_fileno(ad), &st) == -1)
                 return -1;
-            ad->ad_rlen = len;
+            ad->ad_rlen = st.st_size;
         }
 #else
         if (AD_META_OPEN(ad)) {