public
Description: Phusion Passenger (mod_rails)
Homepage: http://www.modrails.com/
Clone URL: git://github.com/FooBarWidget/passenger.git
Click here to lend your support to: passenger and make a donation at www.pledgie.com !
Port the file descriptor passing fixes to native_support.so.
Hongli Lai (Phusion) (author)
Sat Apr 19 10:09:11 -0700 2008
commit  08760b6a13af477368c0f84b7f63eda6b8049803
tree    8ac88cab9f79b845e348d749038bddc0453fe4f2
parent  28ccf71b950c8f7eaf73b81f4c813495a158a6a7
...
41
42
43
44
45
46
47
48
49
 
50
51
 
 
 
 
 
 
 
 
 
52
53
54
55
56
57
58
59
60
 
 
 
 
 
 
61
62
63
64
65
66
67
68
69
 
 
 
 
70
71
72
...
88
89
90
91
92
93
94
95
 
96
97
 
98
99
100
 
 
 
 
 
 
 
 
101
102
103
104
 
 
 
 
 
 
 
105
106
107
108
109
110
111
112
113
 
 
 
114
115
116
117
118
119
120
121
122
123
 
 
 
 
 
124
125
126
127
 
128
129
130
...
41
42
43
 
 
 
 
44
 
45
46
 
47
48
49
50
51
52
53
54
55
56
57
58
 
 
 
 
 
 
59
60
61
62
63
64
65
 
 
 
 
 
 
 
 
66
67
68
69
70
71
72
...
88
89
90
 
 
 
91
 
92
93
 
94
95
 
 
96
97
98
99
100
101
102
103
104
 
 
 
105
106
107
108
109
110
111
112
113
 
 
 
 
 
 
 
114
115
116
117
118
119
120
121
 
 
 
 
 
122
123
124
125
126
127
128
129
 
130
131
132
133
0
@@ -41,32 +41,32 @@ static VALUE mNativeSupport;
0
 static VALUE
0
 send_fd(VALUE self, VALUE socket_fd, VALUE fd_to_send) {
0
   int fd;
0
- struct msghdr msg;
0
- struct iovec vec[1];
0
- char buf[1];
0
-
0
   struct {
0
- struct cmsghdr hdr;
0
+ struct cmsghdr header;
0
     int fd;
0
- } cmsg;
0
+ } control;
0
+ struct msghdr msg;
0
+ struct iovec vec;
0
+ char dummy[1];
0
+
0
+ control.header.cmsg_len = sizeof(control);
0
+ control.header.cmsg_level = SOL_SOCKET;
0
+ control.header.cmsg_type = SCM_RIGHTS;
0
+ control.fd = NUM2INT(fd_to_send);
0
 
0
   msg.msg_name = NULL;
0
   msg.msg_namelen = 0;
0
-
0
- /* Linux and Solaris doesn't work if msg_iov is NULL. */
0
- buf[0] = '\0';
0
- vec[0].iov_base = buf;
0
- vec[0].iov_len = 1;
0
- msg.msg_iov = vec;
0
+
0
+ /* Linux and Solaris require msg_iov to be non-NULL.. */
0
+ dummy[0] = '\0';
0
+ vec.iov_base = dummy;
0
+ vec.iov_len = sizeof(dummy);
0
+ msg.msg_iov = &vec;
0
   msg.msg_iovlen = 1;
0
-
0
- msg.msg_control = (caddr_t)&cmsg;
0
- msg.msg_controllen = CMSG_SPACE(sizeof(int));
0
- msg.msg_flags = 0;
0
- cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int));
0
- cmsg.hdr.cmsg_level = SOL_SOCKET;
0
- cmsg.hdr.cmsg_type = SCM_RIGHTS;
0
- cmsg.fd = NUM2INT(fd_to_send);
0
+
0
+ msg.msg_control = (caddr_t) &control;
0
+ msg.msg_controllen = sizeof(control);
0
+ msg.msg_flags = 0;
0
   
0
   if (sendmsg(NUM2INT(socket_fd), &msg, 0) == -1) {
0
     rb_sys_fail("sendmsg(2)");
0
@@ -88,43 +88,46 @@ send_fd(VALUE self, VALUE socket_fd, VALUE fd_to_send) {
0
  */
0
 static VALUE
0
 recv_fd(VALUE self, VALUE socket_fd) {
0
- struct msghdr msg;
0
- struct iovec vec[2];
0
- char buf[1];
0
   struct {
0
- struct cmsghdr hdr;
0
+ struct cmsghdr header;
0
     int fd;
0
- } cmsg;
0
+ } control;
0
 
0
- msg.msg_name = NULL;
0
- msg.msg_namelen = 0;
0
+ control.header.cmsg_len = sizeof(control);
0
+ control.header.cmsg_level = SOL_SOCKET;
0
+ control.header.cmsg_type = SCM_RIGHTS;
0
+ control.fd = -1;
0
+
0
+ struct msghdr msg;
0
+ struct iovec vec;
0
+ char dummy[1];
0
 
0
- vec[0].iov_base = buf;
0
- vec[0].iov_len = sizeof(buf);
0
- msg.msg_iov = vec;
0
+ msg.msg_name = NULL;
0
+ msg.msg_namelen = 0;
0
+
0
+ dummy[0] = '\0';
0
+ vec.iov_base = dummy;
0
+ vec.iov_len = sizeof(dummy);
0
+ msg.msg_iov = &vec;
0
   msg.msg_iovlen = 1;
0
 
0
- msg.msg_control = (caddr_t)&cmsg;
0
- msg.msg_controllen = CMSG_SPACE(sizeof(int));
0
- msg.msg_flags = 0;
0
- cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int));
0
- cmsg.hdr.cmsg_level = SOL_SOCKET;
0
- cmsg.hdr.cmsg_type = SCM_RIGHTS;
0
- cmsg.fd = -1;
0
+ msg.msg_control = (caddr_t) &control;
0
+ msg.msg_controllen = sizeof(control);
0
+ msg.msg_flags = 0;
0
 
0
   if (recvmsg(NUM2INT(socket_fd), &msg, 0) == -1) {
0
     rb_sys_fail("Cannot read file descriptor with recvmsg()");
0
     return Qnil;
0
   }
0
-
0
- if (msg.msg_controllen != CMSG_SPACE(sizeof(int))
0
- || cmsg.hdr.cmsg_len != CMSG_SPACE(0) + sizeof(int)
0
- || cmsg.hdr.cmsg_level != SOL_SOCKET
0
- || cmsg.hdr.cmsg_type != SCM_RIGHTS) {
0
+
0
+ if (msg.msg_controllen != sizeof(control)
0
+ || control.header.cmsg_len != sizeof(control)
0
+ || control.header.cmsg_level != SOL_SOCKET
0
+ || control.header.cmsg_type != SCM_RIGHTS) {
0
     rb_sys_fail("No valid file descriptor received.");
0
     return Qnil;
0
   }
0
- return INT2NUM(cmsg.fd);
0
+ return INT2NUM(control.fd);
0
 }
0
 
0
 /*

Comments

    No one has commented yet.