+/* -----------------------------------
+ * return only metadata but try very hard
+*/
+int ad_metadata(const char *name, int flags, struct adouble *adp)
+{
+ uid_t uid;
+ int ret, err;
+
+ if ((ret = ad_open(name, ADFLAGS_HF | (flags), O_RDONLY, 0, adp)) < 0 && errno == EACCES) {
+ uid = geteuid();
+ if (seteuid(0)) {
+ LOG(log_error, logtype_default, "ad_metadata(%s): seteuid failed %s", name, strerror(errno));
+ errno = EACCES;
+ return -1;
+ }
+ /* we are root open read only */
+ ret = ad_open(name, ADFLAGS_HF|ADFLAGS_RDONLY|(flags), O_RDONLY, 0, adp);
+ err = errno;
+ if ( seteuid(uid) < 0) {
+ LOG(log_error, logtype_default, "ad_metadata: can't seteuid back");
+ exit(EXITERR_SYS);
+ }
+ errno = err;
+ }
+ return ret;
+}
+