tests: Lookup extended stat/lstat in mocks

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>
This commit is contained in:
Roman Bolshakov 2019-08-21 19:13:20 +03:00 committed by Daniel P. Berrangé
parent 740f181c47
commit d6b17edd51
2 changed files with 18 additions and 0 deletions

View File

@ -288,3 +288,13 @@
abort(); \ abort(); \
} \ } \
} while (0) } 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)

View File

@ -138,7 +138,11 @@ static void virMockStatInit(void)
debug = getenv("VIR_MOCK_STAT_DEBUG"); debug = getenv("VIR_MOCK_STAT_DEBUG");
#ifdef MOCK_STAT #ifdef MOCK_STAT
# ifdef __APPLE__
VIR_MOCK_REAL_INIT_ALIASED(stat, "stat$INODE64");
# else
VIR_MOCK_REAL_INIT(stat); VIR_MOCK_REAL_INIT(stat);
# endif
fdebug("real stat %p\n", real_stat); fdebug("real stat %p\n", real_stat);
#endif #endif
#ifdef MOCK_STAT64 #ifdef MOCK_STAT64
@ -154,7 +158,11 @@ static void virMockStatInit(void)
fdebug("real __xstat64 %p\n", real___xstat64); fdebug("real __xstat64 %p\n", real___xstat64);
#endif #endif
#ifdef MOCK_LSTAT #ifdef MOCK_LSTAT
# ifdef __APPLE__
VIR_MOCK_REAL_INIT_ALIASED(stat, "lstat$INODE64");
# else
VIR_MOCK_REAL_INIT(lstat); VIR_MOCK_REAL_INIT(lstat);
# endif
fdebug("real lstat %p\n", real_lstat); fdebug("real lstat %p\n", real_lstat);
#endif #endif
#ifdef MOCK_LSTAT64 #ifdef MOCK_LSTAT64