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