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) {
66 qemu_sigint_handler(signal,info,x);
67 if (signal == SIGTERM)
68 qemu_sigterm_handler(signal,info,x);
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;
110 ouract.sa_mask = act->sa_mask;
111 ouract.sa_flags = act->sa_flags;
113 if (signum == SIGINT)
114 qemu_sigint_handler = act->sa_sigaction;
115 else if (signum == SIGTERM)
116 qemu_sigterm_handler = act->sa_sigaction;
117 else if (signum == SIGHUP)
118 qemu_sighup_handler = act->sa_sigaction;
120 return real_sigaction(signum,&ouract,oldact);
126 return real_sigaction(signum,act,oldact);
135 prefix = getenv(
"QEMU_MEMPATH_PREFIX");
136 if (prefix && strncmp(prefix,pathname,strlen(prefix)) == 0) {
138 files = realloc(files,files_size + 1);
139 files[files_size] = strdup(pathname);
141 if (files_size == 1) {
144 ev = getenv(
"QEMU_NO_CLEANUP");
147 ev = getenv(
"QEMU_USE_ATEXIT");
150 ev = getenv(
"QEMU_USE_SIGOVERRIDE");
152 use_sig_override = 1;
160 else if (use_sig_override) {
164 memset(&act,0,
sizeof(act));
165 memset(&oldact,0,
sizeof(oldact));
167 act.sa_sigaction = sig_override_handler;
168 act.sa_flags = SA_SIGINFO;
171 if (0 && !oldact.sa_sigaction) {
179 qemu_sighandler = oldact.sa_sigaction;
181 if (oldact.sa_sigaction) {
182 act.sa_flags = oldact.sa_flags;
183 act.sa_mask = oldact.sa_mask;
192 real_atexit = dlsym(RTLD_NEXT,
"atexit");
202 real_unlink = dlsym(RTLD_NEXT,
"unlink");
204 return real_unlink(pathname);
211 void *
mmap(
void *addr,
size_t length,
int prot,
int flags,
int fd,off_t offset) {
217 prefix = getenv(
"QEMU_MEMPATH_PREFIX");
222 snprintf(buf,
sizeof(buf),
"/proc/self/fd/%d",fd);
223 if (readlink(buf,rbuf,
sizeof(rbuf)) > 0
224 && strncmp(prefix,rbuf,strlen(prefix)) == 0) {
225 flags &= ~MAP_PRIVATE;
232 real_mmap = dlsym(RTLD_NEXT,
"mmap");
233 return real_mmap(addr,length,prot,flags,fd,offset);
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)
int unlink(const char *pathname)