+/*!
+ * Get resofork length for adouble:ea
+ */
+static int ad_reso_size(const char *path, int adflags, struct adouble *ad)
+{
+ EC_INIT;
+ struct stat st;
+
+ 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, O_RDONLY) );
+ opened = 1;
+ }
+ 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));
+ EC_ZERO( lstat(rfpath, &st));
+ if (st.st_size > ADEDOFF_RFORK_OSX)
+ ad->ad_rlen = st.st_size - ADEDOFF_RFORK_OSX;
+ else
+ ad->ad_rlen = 0;
+#endif
+
+ 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;
+}