socket_helper 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 822a9459f5cb9c1ecc2d1095b4fec9a99a6c4c20
4
+ data.tar.gz: db2fe8c8ac41a291312f41b0699111f52c2d134e
5
+ SHA512:
6
+ metadata.gz: 5aca37c5fec6a0e5d0a261b5152f256fb058b17f0fa91bd2b4591a1f7ec1fd6e94b48e78ccf16e947a8af73462008a3477f1bd1d160e7d31ce36f3424ebb9af2
7
+ data.tar.gz: 69bcb96529be2ec4f6d40c05a7c5a04896b7182d36bb3af9f5d7933a695635b722b31342e4b7397e4293ae85185559fa518778a457d1737eee1d938481a26255
@@ -0,0 +1,7 @@
1
+ # rake-compiler
2
+ require 'rake' unless defined? Rake
3
+
4
+ gem 'rake-compiler', '>= 0.7.5'
5
+ require "rake/extensiontask"
6
+
7
+ Rake::ExtensionTask.new('socket_helper')
@@ -0,0 +1,7 @@
1
+ require 'mkmf'
2
+
3
+ $CFLAGS << " -Wall "
4
+
5
+ extension_name = 'socket_helper'
6
+ dir_config(extension_name)
7
+ create_makefile(extension_name)
@@ -0,0 +1,88 @@
1
+ #include <ruby.h>
2
+ #include <ruby/io.h>
3
+ #include <sys/socket.h>
4
+
5
+ extern VALUE rb_thread_io_blocking_region(rb_blocking_function_t *func, void *data1, int fd);
6
+ #define BLOCKING_REGION_FD(func, arg) (long)rb_thread_io_blocking_region((func), (arg), (arg)->fd)
7
+
8
+ struct recv_args {
9
+ VALUE buffer;
10
+ int fd, flags;
11
+ long pos;
12
+ };
13
+
14
+ static VALUE
15
+ recv_loop(void *data)
16
+ {
17
+ struct recv_args *arg = data;
18
+ ssize_t ret;
19
+
20
+ ret = recv(arg->fd,
21
+ RSTRING_PTR(arg->buffer) + arg->pos,
22
+ RSTRING_LEN(arg->buffer) - arg->pos,
23
+ arg->flags
24
+ );
25
+
26
+ if (ret < 0)
27
+ return (VALUE)ret;
28
+
29
+ arg->pos += ret;
30
+ return (VALUE)ret;
31
+ }
32
+
33
+ static VALUE
34
+ rb_socket_read_in_full(int argc, VALUE *argv, VALUE self)
35
+ {
36
+ rb_io_t *fptr;
37
+ VALUE rb_sock, rb_buffer, rb_klass;
38
+ struct recv_args arg;
39
+ long buflen;
40
+
41
+ VALUE len, flg;
42
+ rb_scan_args(argc, argv, "21", &rb_sock, &len, &flg);
43
+
44
+ if (flg == Qnil)
45
+ arg.flags = 0;
46
+ else
47
+ arg.flags = NUM2INT(flg);
48
+
49
+ buflen = NUM2INT(len);
50
+
51
+ GetOpenFile(rb_sock, fptr);
52
+ if (rb_io_read_pending(fptr)) {
53
+ rb_raise(rb_eIOError, "recv for buffered IO");
54
+ }
55
+
56
+ arg.fd = fptr->fd;
57
+ arg.pos = 0;
58
+ arg.buffer = rb_buffer = rb_tainted_str_new(0, buflen);
59
+
60
+ rb_klass = RBASIC(rb_buffer)->klass;
61
+ rb_obj_hide(rb_buffer);
62
+
63
+ while (arg.pos < buflen) {
64
+ long slen;
65
+
66
+ rb_io_check_closed(fptr);
67
+ slen = BLOCKING_REGION_FD(recv_loop, &arg);
68
+
69
+ if (!slen)
70
+ break;
71
+
72
+ if (slen < 0 && !rb_io_wait_readable(fptr->fd))
73
+ rb_sys_fail("recv(2)");
74
+ }
75
+
76
+ rb_obj_reveal(rb_buffer, rb_klass);
77
+ if (arg.pos < buflen)
78
+ rb_raise(rb_eRuntimeError, "connection closed");
79
+
80
+ rb_obj_taint(rb_buffer);
81
+ return rb_buffer;
82
+ }
83
+
84
+ void Init_socket_helper(void)
85
+ {
86
+ VALUE rb_mSocketHelper = rb_define_module("SocketHelper");
87
+ rb_define_module_function(rb_mSocketHelper, "read_in_full", rb_socket_read_in_full, -1);
88
+ }
@@ -0,0 +1,17 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'socket_helper'
3
+ s.version = '0.1.0'
4
+ s.authors = ["Vicent Marti"]
5
+ s.date = Time.now.utc.strftime("%Y-%m-%d")
6
+ s.email = %q{tanoku@gmail.com}
7
+ s.extensions = ["ext/socket_helper/extconf.rb"]
8
+ s.files = `git ls-files`.split("\n")
9
+ s.homepage = %q{http://github.com/vmg/socket_helper}
10
+ s.rdoc_options = ["--charset=UTF-8"]
11
+ s.require_paths = ["lib"]
12
+ s.rubygems_version = %q{1.4.2}
13
+ s.summary = %q{A thing for sockets}
14
+
15
+ # tests
16
+ s.add_development_dependency 'rake-compiler', ">= 0.7.5"
17
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: socket_helper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Vicent Marti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake-compiler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.5
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.5
27
+ description:
28
+ email: tanoku@gmail.com
29
+ executables: []
30
+ extensions:
31
+ - ext/socket_helper/extconf.rb
32
+ extra_rdoc_files: []
33
+ files:
34
+ - Rakefile
35
+ - ext/socket_helper/extconf.rb
36
+ - ext/socket_helper/socket_helper.c
37
+ - socket_helper.gemspec
38
+ homepage: http://github.com/vmg/socket_helper
39
+ licenses: []
40
+ metadata: {}
41
+ post_install_message:
42
+ rdoc_options:
43
+ - "--charset=UTF-8"
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 2.2.2
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: A thing for sockets
62
+ test_files: []