Class: FDPass::Client

Inherits:
Object
  • Object
show all
Defined in:
ext/fdpass_client.c

Instance Method Summary collapse

Instance Method Details

#closeObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'ext/fdpass_client.c', line 27

static VALUE rd_fdpass_client_close(VALUE self) {
  struct fdpass_socket *p;

  Data_Get_Struct(self, struct fdpass_socket, p);

  if (!p->closed) {
    close(p->sock);
    p->sock = -1;
    p->closed = 1;
    p->path = Qnil;
  }

  return Qnil;
}

#closed?Boolean



42
43
44
45
46
# File 'ext/fdpass_client.c', line 42

static VALUE rd_fdpass_client_is_closed(VALUE self) {
  struct fdpass_socket *p;
  Data_Get_Struct(self, struct fdpass_socket, p);
  return p->closed ? Qtrue : Qfalse;
}

#send(fd) ⇒ Object



81
82
83
84
85
86
87
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
# File 'ext/fdpass_client.c', line 81

static VALUE rb_fdpass_client_send(VALUE self, VALUE fd) {
  struct fdpass_socket *p;
  struct msghdr msg = { 0 };
  struct cmsghdr *cmsg;
  char cmsgbuf[CMSG_SPACE(sizeof(int))];
  int ifd, *cmsg_data;
  struct iovec iov;

  ifd = NUM2INT(fd);

  Data_Get_Struct(self, struct fdpass_socket, p);
  Check_Socket(p);

  iov.iov_base = "\0";
  iov.iov_len = 1;

  msg.msg_name = NULL;
  msg.msg_namelen = 0;
  msg.msg_iov = &iov;
  msg.msg_iovlen = 1;
  msg.msg_control = cmsgbuf;
  msg.msg_controllen = sizeof(cmsgbuf);

  cmsg = CMSG_FIRSTHDR(&msg);
  cmsg->cmsg_len = CMSG_LEN(sizeof(int));
  cmsg->cmsg_level = SOL_SOCKET;
  cmsg->cmsg_type = SCM_RIGHTS;

  cmsg_data = (int *) CMSG_DATA(cmsg);
  *cmsg_data = ifd;
  msg.msg_controllen = cmsg->cmsg_len;
  
  if (sendmsg(p->sock, &msg, 0) < 0) { 
    rb_raise(rb_eFDPassError, "%s", strerror(errno));
  }

  return Qnil;
}