15 struct sockaddr_un *sockaddr;
16 socklen_t sockaddrlen;
21 unixsock_connect_internal(
VALUE a)
23 struct unixsock_arg *
arg = (
struct unixsock_arg *)a;
31 struct sockaddr_un sockaddr;
32 socklen_t sockaddrlen;
42 MEMZERO(&sockaddr,
struct sockaddr_un, 1);
43 sockaddr.sun_family = AF_UNIX;
44 if (
sizeof(sockaddr.sun_path) < (
size_t)
RSTRING_LEN(path)) {
49 sockaddrlen = rsock_unix_sockaddr_len(path);
52 status = bind(fd, (
struct sockaddr*)&sockaddr, sockaddrlen);
56 struct unixsock_arg arg;
57 arg.sockaddr = &sockaddr;
58 arg.sockaddrlen = sockaddrlen;
73 if (listen(fd, 5) < 0) {
115 unix_path(
VALUE sock)
121 struct sockaddr_un addr;
122 socklen_t
len = (socklen_t)
sizeof(addr);
123 socklen_t len0 =
len;
124 if (getsockname(fptr->
fd, (
struct sockaddr*)&addr, &len) < 0)
126 if (len0 < len) len = len0;
161 #if defined(HAVE_ST_MSG_CONTROL) && defined(SCM_RIGHTS)
162 #define FD_PASSING_BY_MSG_CONTROL 1
164 #define FD_PASSING_BY_MSG_CONTROL 0
167 #if defined(HAVE_ST_MSG_ACCRIGHTS)
168 #define FD_PASSING_BY_MSG_ACCRIGHTS 1
170 #define FD_PASSING_BY_MSG_ACCRIGHTS 0
178 #if defined(HAVE_SENDMSG) && (FD_PASSING_BY_MSG_CONTROL || FD_PASSING_BY_MSG_ACCRIGHTS)
180 sendmsg_blocking(
void *data)
182 struct iomsg_arg *arg = data;
183 return sendmsg(arg->fd, &arg->msg, 0);
207 struct iomsg_arg arg;
211 #if FD_PASSING_BY_MSG_CONTROL
214 char pad[8+
sizeof(int)+8];
232 arg.msg.msg_name =
NULL;
233 arg.msg.msg_namelen = 0;
237 vec[0].iov_base =
buf;
239 arg.msg.msg_iov = vec;
240 arg.msg.msg_iovlen = 1;
242 #if FD_PASSING_BY_MSG_CONTROL
243 arg.msg.msg_control = (caddr_t)&cmsg;
244 arg.msg.msg_controllen = (socklen_t)CMSG_LEN(
sizeof(
int));
245 arg.msg.msg_flags = 0;
246 MEMZERO((
char*)&cmsg,
char,
sizeof(cmsg));
247 cmsg.hdr.cmsg_len = (socklen_t)CMSG_LEN(
sizeof(
int));
248 cmsg.hdr.cmsg_level = SOL_SOCKET;
249 cmsg.hdr.cmsg_type = SCM_RIGHTS;
250 memcpy(CMSG_DATA(&cmsg.hdr), &fd,
sizeof(
int));
252 arg.msg.msg_accrights = (caddr_t)&fd;
253 arg.msg.msg_accrightslen =
sizeof(fd);
265 #define unix_send_io rb_f_notimplement
268 #if defined(HAVE_RECVMSG) && (FD_PASSING_BY_MSG_CONTROL || FD_PASSING_BY_MSG_ACCRIGHTS)
270 recvmsg_blocking(
void *data)
272 struct iomsg_arg *arg = data;
273 return recvmsg(arg->fd, &arg->msg, 0);
300 struct iomsg_arg arg;
305 #if FD_PASSING_BY_MSG_CONTROL
308 char pad[8+
sizeof(int)+8];
320 arg.msg.msg_name =
NULL;
321 arg.msg.msg_namelen = 0;
323 vec[0].iov_base =
buf;
324 vec[0].iov_len =
sizeof(
buf);
325 arg.msg.msg_iov = vec;
326 arg.msg.msg_iovlen = 1;
328 #if FD_PASSING_BY_MSG_CONTROL
329 arg.msg.msg_control = (caddr_t)&cmsg;
330 arg.msg.msg_controllen = (socklen_t)CMSG_SPACE(
sizeof(
int));
331 arg.msg.msg_flags = 0;
332 cmsg.hdr.cmsg_len = (socklen_t)CMSG_LEN(
sizeof(
int));
333 cmsg.hdr.cmsg_level = SOL_SOCKET;
334 cmsg.hdr.cmsg_type = SCM_RIGHTS;
336 memcpy(CMSG_DATA(&cmsg.hdr), &fd,
sizeof(
int));
338 arg.msg.msg_accrights = (caddr_t)&fd;
339 arg.msg.msg_accrightslen =
sizeof(fd);
349 #if FD_PASSING_BY_MSG_CONTROL
350 if (arg.msg.msg_controllen < (socklen_t)
sizeof(
struct cmsghdr)) {
352 "file descriptor was not passed (msg_controllen=%d smaller than sizeof(struct cmsghdr)=%d)",
353 (
int)arg.msg.msg_controllen, (
int)
sizeof(
struct cmsghdr));
355 if (cmsg.hdr.cmsg_level != SOL_SOCKET) {
357 "file descriptor was not passed (cmsg_level=%d, %d expected)",
358 cmsg.hdr.cmsg_level, SOL_SOCKET);
360 if (cmsg.hdr.cmsg_type != SCM_RIGHTS) {
362 "file descriptor was not passed (cmsg_type=%d, %d expected)",
363 cmsg.hdr.cmsg_type, SCM_RIGHTS);
365 if (arg.msg.msg_controllen < (socklen_t)CMSG_LEN(
sizeof(
int))) {
367 "file descriptor was not passed (msg_controllen=%d smaller than CMSG_LEN(sizeof(int))=%d)",
368 (
int)arg.msg.msg_controllen, (
int)CMSG_LEN(
sizeof(
int)));
370 if ((socklen_t)CMSG_SPACE(
sizeof(
int)) < arg.msg.msg_controllen) {
372 "file descriptor was not passed (msg_controllen=%d bigger than CMSG_SPACE(sizeof(int))=%d)",
373 (
int)arg.msg.msg_controllen, (
int)CMSG_SPACE(
sizeof(
int)));
375 if (cmsg.hdr.cmsg_len != CMSG_LEN(
sizeof(
int))) {
376 rsock_discard_cmsg_resource(&arg.msg, 0);
378 "file descriptor was not passed (cmsg_len=%d, %d expected)",
379 (
int)cmsg.hdr.cmsg_len, (
int)CMSG_LEN(
sizeof(
int)));
382 if (arg.msg.msg_accrightslen !=
sizeof(fd)) {
384 "file descriptor was not passed (accrightslen) : %d != %d",
385 arg.msg.msg_accrightslen, (
int)
sizeof(fd));
389 #if FD_PASSING_BY_MSG_CONTROL
390 memcpy(&fd, CMSG_DATA(&cmsg.hdr),
sizeof(
int));
401 ff_argc = mode ==
Qnil ? 1 : 2;
404 return rb_funcall2(klass, for_fd, ff_argc, ff_argv);
408 #define unix_recv_io rb_f_notimplement
423 unix_addr(
VALUE sock)
426 struct sockaddr_un addr;
427 socklen_t len = (socklen_t)
sizeof addr;
431 if (getsockname(fptr->
fd, (
struct sockaddr*)&addr, &len) < 0)
433 return rsock_unixaddr(&addr, len);
449 unix_peeraddr(
VALUE sock)
452 struct sockaddr_un addr;
453 socklen_t len = (socklen_t)
sizeof addr;
454 socklen_t len0 =
len;
458 if (getpeername(fptr->
fd, (
struct sockaddr*)&addr, &len) < 0)
460 if (len0 < len) len = len0;
461 return rsock_unixaddr(&addr, len);
483 unix_s_socketpair(
int argc,
VALUE *argv,
VALUE klass)
void rsock_init_unixsocket(void)
#define RSTRING_LEN(string)
VALUE rsock_init_unixsock(VALUE sock, VALUE path, int server)
void rb_update_max_fd(int fd)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
int sendmsg(int, const struct msghdr *, int)
VALUE rsock_init_sock(VALUE sock, int fd)
VALUE rb_protect(VALUE(*proc)(VALUE), VALUE data, int *state)
#define RSTRING_PTR(string)
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_obj_is_kind_of(VALUE, VALUE)
int recvmsg(int, struct msghdr *, int)
#define GetOpenFile(obj, fp)
#define MEMZERO(p, type, n)
VALUE rsock_sock_s_socketpair(int argc, VALUE *argv, VALUE klass)
int rsock_socket(int domain, int type, int proto)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
int rb_io_wait_writable(int)
void rb_sys_fail_str(VALUE mesg)
VALUE rb_funcall2(VALUE, ID, int, const VALUE *)
Calls a method.
VALUE rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
unsigned char buf[MIME_BUF_SIZE]
register unsigned int len
void rb_sys_fail(const char *mesg)
void rb_jump_tag(int tag)
int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks)
#define SafeStringValue(v)
VALUE rb_str_new_frozen(VALUE)
#define CONST_ID(var, str)
VALUE rb_obj_freeze(VALUE)
int rb_io_wait_readable(int)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
#define BLOCKING_REGION_FD(func, arg)