fdpass 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/fdpass.c +1 -0
- data/ext/fdpass.h +6 -0
- data/ext/fdpass_fd.c +65 -0
- data/ext/fdpass_server.c +4 -1
- metadata +5 -4
data/ext/fdpass.c
CHANGED
data/ext/fdpass.h
CHANGED
@@ -26,6 +26,11 @@ struct fdpass_socket {
|
|
26
26
|
VALUE path;
|
27
27
|
};
|
28
28
|
|
29
|
+
struct fdpass_fd {
|
30
|
+
int fd;
|
31
|
+
int closed;
|
32
|
+
};
|
33
|
+
|
29
34
|
#define Check_Socket(p) do { \
|
30
35
|
if ((p)->sock < 0 || (p)->closed || NIL_P((p)->path)) { \
|
31
36
|
rb_raise(rb_eFDPassError, "Invalid socket"); \
|
@@ -35,5 +40,6 @@ struct fdpass_socket {
|
|
35
40
|
|
36
41
|
void Init_fdpass_server();
|
37
42
|
void Init_fdpass_client();
|
43
|
+
void Init_fdpass_fd();
|
38
44
|
|
39
45
|
#endif // __FDPASS_H__
|
data/ext/fdpass_fd.c
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
#include "fdpass.h"
|
2
|
+
|
3
|
+
extern VALUE rb_mFDPass;
|
4
|
+
VALUE rb_cFDPassFD;
|
5
|
+
|
6
|
+
static void fdpass_fd_free(struct fdpass_fd *p) {
|
7
|
+
if (!p->closed && p->fd >= 0) {
|
8
|
+
close(p->fd);
|
9
|
+
}
|
10
|
+
|
11
|
+
xfree(p);
|
12
|
+
}
|
13
|
+
|
14
|
+
static VALUE fdpass_fd_alloc(VALUE klass) {
|
15
|
+
struct fdpass_fd *p = ALLOC(struct fdpass_fd);
|
16
|
+
p->fd = -1;
|
17
|
+
p->closed = 1;
|
18
|
+
return Data_Wrap_Struct(klass, 0, fdpass_fd_free, p);
|
19
|
+
}
|
20
|
+
|
21
|
+
static VALUE rd_fdpass_fd_close(VALUE self) {
|
22
|
+
struct fdpass_fd *p;
|
23
|
+
|
24
|
+
Data_Get_Struct(self, struct fdpass_fd, p);
|
25
|
+
|
26
|
+
if (!p->closed && p->fd >= 0) {
|
27
|
+
close(p->fd);
|
28
|
+
p->fd = -1;
|
29
|
+
p->closed = 1;
|
30
|
+
}
|
31
|
+
|
32
|
+
return Qnil;
|
33
|
+
}
|
34
|
+
|
35
|
+
static VALUE rd_fdpass_fd_is_closed(VALUE self) {
|
36
|
+
struct fdpass_fd *p;
|
37
|
+
Data_Get_Struct(self, struct fdpass_fd, p);
|
38
|
+
return p->closed ? Qtrue : Qfalse;
|
39
|
+
}
|
40
|
+
|
41
|
+
static VALUE rd_fdpass_fd_to_int(VALUE self) {
|
42
|
+
struct fdpass_fd *p;
|
43
|
+
Data_Get_Struct(self, struct fdpass_fd, p);
|
44
|
+
return INT2FIX(p->fd);
|
45
|
+
}
|
46
|
+
|
47
|
+
static VALUE rd_fdpass_fd_initialize(VALUE self, VALUE fd) {
|
48
|
+
struct fdpass_fd *p;
|
49
|
+
|
50
|
+
Data_Get_Struct(self, struct fdpass_fd, p);
|
51
|
+
|
52
|
+
p->fd = NUM2INT(fd);
|
53
|
+
p->closed = 0;
|
54
|
+
|
55
|
+
return Qnil;
|
56
|
+
}
|
57
|
+
|
58
|
+
void Init_fdpass_fd() {
|
59
|
+
rb_cFDPassFD = rb_define_class_under(rb_mFDPass, "FD", rb_cObject);
|
60
|
+
rb_define_alloc_func(rb_cFDPassFD, fdpass_fd_alloc);
|
61
|
+
rb_define_private_method(rb_cFDPassFD, "initialize", rd_fdpass_fd_initialize, 1);
|
62
|
+
rb_define_method(rb_cFDPassFD, "close", rd_fdpass_fd_close, 0);
|
63
|
+
rb_define_method(rb_cFDPassFD, "closed?", rd_fdpass_fd_is_closed, 0);
|
64
|
+
rb_define_method(rb_cFDPassFD, "to_int", rd_fdpass_fd_to_int, 0);
|
65
|
+
}
|
data/ext/fdpass_server.c
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
extern VALUE rb_mFDPass;
|
4
4
|
extern VALUE rb_eFDPassError;
|
5
|
+
extern VALUE rb_cFDPassFD;
|
5
6
|
VALUE rb_cFDPassServer;
|
6
7
|
|
7
8
|
static void unlink_socket(struct fdpass_socket *p) {
|
@@ -106,6 +107,7 @@ static VALUE rb_fdpass_server_recv(VALUE self) {
|
|
106
107
|
int *cmsg_data;
|
107
108
|
struct iovec iov;
|
108
109
|
char iov_data[1];
|
110
|
+
VALUE fd;
|
109
111
|
|
110
112
|
Data_Get_Struct(self, struct fdpass_socket, p);
|
111
113
|
Check_Socket(p);
|
@@ -127,7 +129,8 @@ static VALUE rb_fdpass_server_recv(VALUE self) {
|
|
127
129
|
cmsg = CMSG_FIRSTHDR(&msg);
|
128
130
|
cmsg_data = (int *) CMSG_DATA(cmsg);
|
129
131
|
|
130
|
-
|
132
|
+
fd = INT2NUM(*cmsg_data);
|
133
|
+
return rb_class_new_instance(1, &fd, rb_cFDPassFD);
|
131
134
|
}
|
132
135
|
|
133
136
|
void Init_fdpass_server() {
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fdpass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- winebarrel
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-09 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -29,6 +29,7 @@ extra_rdoc_files: []
|
|
29
29
|
|
30
30
|
files:
|
31
31
|
- ext/fdpass_client.c
|
32
|
+
- ext/fdpass_fd.c
|
32
33
|
- ext/fdpass_server.c
|
33
34
|
- ext/fdpass.c
|
34
35
|
- ext/fdpass.h
|