Revision 30faaf70
b/compatfd.c | ||
---|---|---|
26 | 26 |
static void *sigwait_compat(void *opaque) |
27 | 27 |
{ |
28 | 28 |
struct sigfd_compat_info *info = opaque; |
29 |
int err; |
|
30 | 29 |
sigset_t all; |
31 | 30 |
|
32 | 31 |
sigfillset(&all); |
33 | 32 |
sigprocmask(SIG_BLOCK, &all, NULL); |
34 | 33 |
|
35 |
do { |
|
36 |
siginfo_t siginfo; |
|
34 |
while (1) { |
|
35 |
int sig; |
|
36 |
int err; |
|
37 | 37 |
|
38 |
err = sigwaitinfo(&info->mask, &siginfo); |
|
39 |
if (err == -1 && errno == EINTR) { |
|
40 |
err = 0; |
|
41 |
continue; |
|
42 |
} |
|
43 |
|
|
44 |
if (err > 0) { |
|
45 |
char buffer[128]; |
|
38 |
err = sigwait(&info->mask, &sig); |
|
39 |
if (err != 0) { |
|
40 |
if (errno == EINTR) { |
|
41 |
continue; |
|
42 |
} else { |
|
43 |
return NULL; |
|
44 |
} |
|
45 |
} else { |
|
46 |
struct qemu_signalfd_siginfo buffer; |
|
46 | 47 |
size_t offset = 0; |
47 | 48 |
|
48 |
memcpy(buffer, &err, sizeof(err)); |
|
49 |
memset(&buffer, 0, sizeof(buffer)); |
|
50 |
buffer.ssi_signo = sig; |
|
51 |
|
|
49 | 52 |
while (offset < sizeof(buffer)) { |
50 | 53 |
ssize_t len; |
51 | 54 |
|
52 |
len = write(info->fd, buffer + offset, |
|
55 |
len = write(info->fd, (char *)&buffer + offset,
|
|
53 | 56 |
sizeof(buffer) - offset); |
54 | 57 |
if (len == -1 && errno == EINTR) |
55 | 58 |
continue; |
56 | 59 |
|
57 | 60 |
if (len <= 0) { |
58 |
err = -1; |
|
59 |
break; |
|
61 |
return NULL; |
|
60 | 62 |
} |
61 | 63 |
|
62 | 64 |
offset += len; |
63 | 65 |
} |
64 | 66 |
} |
65 |
} while (err >= 0); |
|
66 |
|
|
67 |
return NULL; |
|
67 |
} |
|
68 | 68 |
} |
69 | 69 |
|
70 | 70 |
static int qemu_signalfd_compat(const sigset_t *mask) |
Also available in: Unified diff