macOS syscall interface (/usr/lib/system/libsystem_kernel.dylib) has
three kinds of stat but only one of them can be used to fill
"struct stat": stat$INODE64.
virmockstathelpers looks up regular stat instead of stat$INODE64. That
causes a failure in qemufirmwaretest because "struct stat" is laid out
differently from the values returned by stat.
Introduce VIR_MOCK_REAL_INIT_ALIASED that can be used to lookup
stat$INODE64 and lstat$INODE64 and use it to setup real functions on
macOS.
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
abort(); \
} \
} while (0)
+
+#define VIR_MOCK_REAL_INIT_ALIASED(name, alias) \
+ do { \
+ if (real_##name == NULL && \
+ !(real_##name = dlsym(RTLD_NEXT, \
+ alias))) { \
+ fprintf(stderr, "Missing symbol '" alias "'\n"); \
+ abort(); \
+ } \
+ } while (0)
debug = getenv("VIR_MOCK_STAT_DEBUG");
#ifdef MOCK_STAT
+# ifdef __APPLE__
+ VIR_MOCK_REAL_INIT_ALIASED(stat, "stat$INODE64");
+# else
VIR_MOCK_REAL_INIT(stat);
+# endif
fdebug("real stat %p\n", real_stat);
#endif
#ifdef MOCK_STAT64
fdebug("real __xstat64 %p\n", real___xstat64);
#endif
#ifdef MOCK_LSTAT
+# ifdef __APPLE__
+ VIR_MOCK_REAL_INIT_ALIASED(stat, "lstat$INODE64");
+# else
VIR_MOCK_REAL_INIT(lstat);
+# endif
fdebug("real lstat %p\n", real_lstat);
#endif
#ifdef MOCK_LSTAT64