28 static void *(*real_mmap)(
void *addr,
size_t length,
int prot,
int flags,
29 int fd,off_t offset) = NULL;
30 static int (*real_unlink)(
const char *
name) = NULL;
31 static int (*real_atexit)(void (*
function)(void)) = NULL;
32 static int (*real_sigaction)(
int signum,
const struct sigaction *act,
35 static char **files = NULL;
36 static unsigned int files_size = 0;
38 static void (*qemu_sigint_handler)(
int signo,siginfo_t *siginfo,
void *c) = NULL;
39 static void (*qemu_sigterm_handler)(
int signo,siginfo_t *siginfo,
void *c) = NULL;
40 static void (*qemu_sighup_handler)(
int signo,siginfo_t *siginfo,
void *c) = NULL;
42 static int use_atexit = 0;
43 static int use_sig_override = 1;
44 static int no_cleanup = 0;
49 for (i = 0; i < files_size; ++
i) {
50 real_unlink(files[i]);
63 static void sig_override_handler(
int signal,siginfo_t *info,
void *x) {
65 if (signal == SIGINT && qemu_sigint_handler)
66 qemu_sigint_handler(signal,info,x);
67 if (signal == SIGTERM && qemu_sigterm_handler)
68 qemu_sigterm_handler(signal,info,x);
69 if (signal == SIGHUP && qemu_sighup_handler)
70 qemu_sighup_handler(signal,info,x);;
82 real_sigaction = dlsym(RTLD_NEXT,
"sigaction");
84 ev = getenv(
"QEMU_NO_CLEANUP");
90 ev = getenv(
"QEMU_USE_ATEXIT");
95 ev = getenv(
"QEMU_USE_SIGOVERRIDE");
107 if (signum == SIGINT || signum == SIGTERM || signum == SIGHUP) {
108 memset(&ouract,0,
sizeof(ouract));
109 ouract.sa_sigaction = sig_override_handler;
111 ouract.sa_mask = act->sa_mask;
112 ouract.sa_flags = act->sa_flags;
114 if (signum == SIGINT)
115 qemu_sigint_handler = act->sa_sigaction;
116 else if (signum == SIGTERM)
117 qemu_sigterm_handler = act->sa_sigaction;
118 else if (signum == SIGHUP)
119 qemu_sighup_handler = act->sa_sigaction;
122 return real_sigaction(signum,&ouract,oldact);
128 return real_sigaction(signum,act,oldact);
137 prefix = getenv(
"QEMU_MEMPATH_PREFIX");
138 if (prefix && strncmp(prefix,pathname,strlen(prefix)) == 0) {
140 files =
realloc(files,files_size + 1);
141 files[files_size] = strdup(pathname);
143 if (files_size == 1) {
146 ev = getenv(
"QEMU_NO_CLEANUP");
149 ev = getenv(
"QEMU_USE_ATEXIT");
152 ev = getenv(
"QEMU_USE_SIGOVERRIDE");
154 use_sig_override = 1;
162 else if (use_sig_override) {
166 memset(&act,0,
sizeof(act));
167 memset(&oldact,0,
sizeof(oldact));
169 act.sa_sigaction = sig_override_handler;
170 act.sa_flags = SA_SIGINFO;
173 if (0 && !oldact.sa_sigaction) {
181 qemu_sighandler = oldact.sa_sigaction;
183 if (oldact.sa_sigaction) {
184 act.sa_flags = oldact.sa_flags;
185 act.sa_mask = oldact.sa_mask;
194 real_atexit = dlsym(RTLD_NEXT,
"atexit");
204 real_unlink = dlsym(RTLD_NEXT,
"unlink");
206 return real_unlink(pathname);
213 void *
mmap(
void *addr,
size_t length,
int prot,
int flags,
int fd,off_t offset) {
219 prefix = getenv(
"QEMU_MEMPATH_PREFIX");
224 snprintf(buf,
sizeof(buf),
"/proc/self/fd/%d",fd);
225 if (readlink(buf,rbuf,
sizeof(rbuf)) > 0
226 && strncmp(prefix,rbuf,strlen(prefix)) == 0) {
227 flags &= ~MAP_PRIVATE;
234 real_mmap = dlsym(RTLD_NEXT,
"mmap");
235 return real_mmap(addr,length,prot,flags,fd,offset);
static uint64_t unsigned int i
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)
void * mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
void * realloc(void *ptr, size_t size)
int unlink(const char *pathname)