1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <signal.h>
#ifndef ANDROID
#include <aio.h>
#else
#include <errno.h>
#endif
#include "wrappedlibs.h"
#include "debug.h"
#include "wrapper.h"
#include "bridge.h"
#include "librarian/library_private.h"
#include "x64emu.h"
#include "emu/x64emu_private.h"
#include "callback.h"
#include "librarian.h"
#include "box64context.h"
#include "emu/x64emu_private.h"
#undef aio_suspend
#undef aio_return
#undef aio_write
#undef aio_read
#undef aio_error
#undef clock_gettime
const char* librtName = "librt.so.1";
#define LIBNAME librt
#include "generated/wrappedlibrttypes.h"
#include "wrappercallback.h"
#define SUPER() \
GO(0) \
GO(1) \
GO(2) \
GO(3)
// sigev_notify
#define GO(A) \
static uintptr_t my_sigev_notify_fct_##A = 0; \
static void my_sigev_notify_##A(void* sigval) \
{ \
RunFunctionFmt(my_sigev_notify_fct_##A, "p", sigval);\
}
SUPER()
#undef GO
static void* findsigev_notifyFct(void* fct)
{
if(!fct) return fct;
if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
#define GO(A) if(my_sigev_notify_fct_##A == (uintptr_t)fct) return my_sigev_notify_##A;
SUPER()
#undef GO
#define GO(A) if(my_sigev_notify_fct_##A == 0) {my_sigev_notify_fct_##A = (uintptr_t)fct; return my_sigev_notify_##A; }
SUPER()
#undef GO
printf_log(LOG_NONE, "Warning, no more slot for libpng12 sigev_notify callback\n");
return NULL;
}
#undef SUPER
EXPORT int my_timer_create(x64emu_t* emu, uint32_t clockid, void* sevp, timer_t* timerid)
{
(void)emu;
struct sigevent sevent;
memcpy(&sevent, sevp, sizeof(sevent));
if(sevent.sigev_notify == SIGEV_THREAD) {
sevent.sigev_notify_function = findsigev_notifyFct(sevent.sigev_notify_function);
}
return timer_create(clockid, &sevent, timerid);
}
#ifndef ANDROID
EXPORT int my_aio_cancel(x64emu_t emu, int fd, struct aiocb* aiocbp)
{
if(aiocbp && aiocbp->aio_sigevent.sigev_notify == SIGEV_THREAD)
aiocbp->aio_sigevent.sigev_notify_function = findsigev_notifyFct(aiocbp->aio_sigevent.sigev_notify_function);
return my->aio_cancel(fd, aiocbp);
}
EXPORT int my_aio_read(x64emu_t emu, struct aiocb* aiocbp)
{
if(aiocbp && aiocbp->aio_sigevent.sigev_notify == SIGEV_THREAD)
aiocbp->aio_sigevent.sigev_notify_function = findsigev_notifyFct(aiocbp->aio_sigevent.sigev_notify_function);
return my->aio_read(aiocbp);
}
EXPORT int my_aio_read64(x64emu_t emu, struct aiocb* aiocbp)
{
if(aiocbp && aiocbp->aio_sigevent.sigev_notify == SIGEV_THREAD)
aiocbp->aio_sigevent.sigev_notify_function = findsigev_notifyFct(aiocbp->aio_sigevent.sigev_notify_function);
return my->aio_read64(aiocbp);
}
EXPORT int my_aio_write(x64emu_t emu, struct aiocb* aiocbp)
{
if(aiocbp && aiocbp->aio_sigevent.sigev_notify == SIGEV_THREAD)
aiocbp->aio_sigevent.sigev_notify_function = findsigev_notifyFct(aiocbp->aio_sigevent.sigev_notify_function);
return my->aio_write(aiocbp);
}
EXPORT int my_aio_write64(x64emu_t emu, struct aiocb* aiocbp)
{
if(aiocbp && aiocbp->aio_sigevent.sigev_notify == SIGEV_THREAD)
aiocbp->aio_sigevent.sigev_notify_function = findsigev_notifyFct(aiocbp->aio_sigevent.sigev_notify_function);
return my->aio_write64(aiocbp);
}
EXPORT int my_lio_listio(x64emu_t* emu, int mode, struct aiocb* list[], int nent, struct sigevent* sig)
{
struct sigevent sevent;
if(sig) {
memcpy(&sevent, sig, sizeof(sevent));
if(sevent.sigev_notify == SIGEV_THREAD)
sevent.sigev_notify_function = findsigev_notifyFct(sevent.sigev_notify_function);
}
return my->lio_listio(mode, list, nent, sig?(&sevent):sig);
}
#else
EXPORT int my_aio_cancel(x64emu_t emu, int fd, void* aiocbp)
{
errno = ENOSYS;
return -1;
}
EXPORT int my_aio_read(x64emu_t emu, void* aiocbp)
{
errno = ENOSYS;
return -1;
}
EXPORT int my_aio_read64(x64emu_t emu, void* aiocbp)
{
errno = ENOSYS;
return -1;
}
EXPORT int my_aio_write(x64emu_t emu, void* aiocbp)
{
errno = ENOSYS;
return -1;
}
EXPORT int my_aio_write64(x64emu_t emu, void* aiocbp)
{
errno = ENOSYS;
return -1;
}
EXPORT int my_lio_listio(x64emu_t* emu, int mode, void* list[], int nent, struct sigevent* sig)
{
errno = ENOSYS;
return -1;
}
#endif
#ifdef STATICBUILD
#include <mqueue.h>
#include <sys/mman.h>
extern int __mq_open_2(const char*, int);
#endif
#define PRE_INIT\
if(1) \
lib->w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); \
else
#include "wrappedlib_init.h"
|