diff options
Diffstat (limited to 'monitor_fdpass.c')
-rw-r--r-- | monitor_fdpass.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/monitor_fdpass.c b/monitor_fdpass.c index 9f8e9cd55..52d133647 100644 --- a/monitor_fdpass.c +++ b/monitor_fdpass.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #ifdef HAVE_SYS_UN_H | 32 | #ifdef HAVE_SYS_UN_H |
33 | #include <sys/un.h> | 33 | #include <sys/un.h> |
34 | #endif | 34 | #endif |
35 | #include <sys/utsname.h> | ||
35 | 36 | ||
36 | #include <errno.h> | 37 | #include <errno.h> |
37 | #include <string.h> | 38 | #include <string.h> |
@@ -40,6 +41,29 @@ | |||
40 | #include "log.h" | 41 | #include "log.h" |
41 | #include "monitor_fdpass.h" | 42 | #include "monitor_fdpass.h" |
42 | 43 | ||
44 | static int | ||
45 | cmsg_type_is_broken(void) | ||
46 | { | ||
47 | static int broken_cmsg_type = -1; | ||
48 | |||
49 | if (broken_cmsg_type != -1) | ||
50 | return broken_cmsg_type; | ||
51 | else { | ||
52 | struct utsname uts; | ||
53 | /* If uname() fails, play safe and assume that cmsg_type | ||
54 | * isn't broken. | ||
55 | */ | ||
56 | if (!uname(&uts) && | ||
57 | strcmp(uts.sysname, "Linux") == 0 && | ||
58 | strncmp(uts.release, "2.0.", 4) == 0) | ||
59 | broken_cmsg_type = 1; | ||
60 | else | ||
61 | broken_cmsg_type = 0; | ||
62 | } | ||
63 | |||
64 | return broken_cmsg_type; | ||
65 | } | ||
66 | |||
43 | void | 67 | void |
44 | mm_send_fd(int sock, int fd) | 68 | mm_send_fd(int sock, int fd) |
45 | { | 69 | { |
@@ -124,11 +148,9 @@ mm_receive_fd(int sock) | |||
124 | cmsg = CMSG_FIRSTHDR(&msg); | 148 | cmsg = CMSG_FIRSTHDR(&msg); |
125 | if (cmsg == NULL) | 149 | if (cmsg == NULL) |
126 | fatal("%s: no message header", __func__); | 150 | fatal("%s: no message header", __func__); |
127 | #ifndef BROKEN_CMSG_TYPE | 151 | if (!cmsg_type_is_broken() && cmsg->cmsg_type != SCM_RIGHTS) |
128 | if (cmsg->cmsg_type != SCM_RIGHTS) | ||
129 | fatal("%s: expected type %d got %d", __func__, | 152 | fatal("%s: expected type %d got %d", __func__, |
130 | SCM_RIGHTS, cmsg->cmsg_type); | 153 | SCM_RIGHTS, cmsg->cmsg_type); |
131 | #endif | ||
132 | fd = (*(int *)CMSG_DATA(cmsg)); | 154 | fd = (*(int *)CMSG_DATA(cmsg)); |
133 | #endif | 155 | #endif |
134 | return fd; | 156 | return fd; |