sendfile 1.1.0 → 1.2.0

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.
Files changed (5) hide show
  1. data/README.textile +13 -17
  2. data/ext/extconf.rb +21 -19
  3. data/ext/sendfile.c +37 -17
  4. data/sendfile.gemspec +3 -5
  5. metadata +26 -49
@@ -1,31 +1,27 @@
1
1
  h1. Ruby sendfile(2) Interface
2
2
 
3
- This module allows Ruby programs to access their OS's native
4
- <code>sendfile(2)</code> system call from any IO object. Your kernel must
5
- export a recognized signature for the <code>sendfile(2)</code> system call
6
- to use this module. Currently, that includes Linux, Solaris
7
- and FreeBSD.
3
+ This module allows Ruby programs to access their OS's native <code>sendfile(2)</code> system call from any IO object. Your kernel must export a recognized signature for the <code>sendfile(2)</code> system call to use this module. Currently, that includes Linux, Solaris and FreeBSD.
8
4
 
9
5
  h2. Installation
10
6
 
11
- Download and install the latest package from the rubyforge.org
12
- RubyGems repository.
7
+ Download and install the latest package from the rubyforge.org RubyGems repository.
13
8
 
14
- $ sudo gem install sendfile
9
+ <code>
10
+ $ gem install sendfile
11
+ </code>
15
12
 
16
- If the tests all pass, you're ready to start using sendfile.
13
+ If the tests all pass, you're ready to start using sendfile!
17
14
 
18
15
  h2. Usage
19
16
 
20
17
  Here's a small example of a use of <code>IO#sendfile</code>.
21
18
 
22
- require 'socket'
23
- require 'rubygems'
24
- require 'sendfile'
25
- s = TCPSocket.new 'yourdomain.com', 5000
26
- File.open 'somefile.txt' { |f| s.sendfile f }
27
- s.close
19
+ bc.. require 'socket'
20
+ require 'rubygems'
21
+ require 'sendfile'
22
+ s = TCPSocket.new 'yourdomain.com', 5000
23
+ File.open 'somefile.txt' { |f| s.sendfile f }
24
+ s.close
28
25
 
29
- See the test scripts for more examples on how to use this
30
- module.
26
+ p. See the test scripts for more examples on how to use this module.
31
27
 
@@ -1,22 +1,22 @@
1
- #
1
+ #
2
2
  # Copyright (c) 2005 Tobias DiPasquale
3
3
  #
4
- # Permission is hereby granted, free of charge, to any person obtaining a
4
+ # Permission is hereby granted, free of charge, to any person obtaining a
5
5
  # copy of this software and associated documentation files (the "Software"),
6
6
  # to deal in the Software without restriction, including without limitation
7
- # the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
- # and/or sell copies of the Software, and to permit persons to whom the
7
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
+ # and/or sell copies of the Software, and to permit persons to whom the
9
9
  # Software is furnished to do so, subject to the following conditions:
10
10
  #
11
- # The above copyright notice and this permission notice shall be included
11
+ # The above copyright notice and this permission notice shall be included
12
12
  # in all copies or substantial portions of the Software.
13
13
  #
14
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
15
  # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17
- # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19
- # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17
+ # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19
+ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20
20
  # DEALINGS IN THE SOFTWARE.
21
21
  #
22
22
 
@@ -28,16 +28,19 @@ require 'mkmf'
28
28
  $config_h = ""
29
29
  case RUBY_PLATFORM
30
30
  when /solaris/
31
- have_header( "sys/sendfile.h")
32
- have_library( "sendfile", "sendfile")
33
- $config_h << "#define RUBY_PLATFORM_SOLARIS"
31
+ have_header( "sys/sendfile.h")
32
+ have_library( "sendfile", "sendfile")
33
+ $config_h << "#define RUBY_PLATFORM_SOLARIS"
34
34
  when /linux/
35
- have_header( "sys/sendfile.h")
36
- have_library( "c", "sendfile")
37
- $config_h << "#define RUBY_PLATFORM_LINUX"
35
+ have_header( "sys/sendfile.h")
36
+ have_library( "c", "sendfile")
37
+ $config_h << "#define RUBY_PLATFORM_LINUX"
38
38
  when /freebsd/
39
- have_library( "c", "sendfile")
40
- $config_h << "#define RUBY_PLATFORM_FREEBSD"
39
+ have_library( "c", "sendfile")
40
+ $config_h << "#define RUBY_PLATFORM_FREEBSD"
41
+ when /darwin/
42
+ have_library( "c", "sendfile")
43
+ $config_h << "#define RUBY_PLATFORM_DARWIN"
41
44
  end
42
45
 
43
46
  File.open( "config.h", "w") do |f|
@@ -51,4 +54,3 @@ end
51
54
 
52
55
  have_func('rb_thread_blocking_region')
53
56
  create_makefile( "sendfile")
54
-
@@ -3,22 +3,22 @@
3
3
  *
4
4
  * Copyright (c) 2005,2008 Tobias DiPasquale
5
5
  *
6
- * Permission is hereby granted, free of charge, to any person obtaining a
6
+ * Permission is hereby granted, free of charge, to any person obtaining a
7
7
  * copy of this software and associated documentation files (the "Software"),
8
8
  * to deal in the Software without restriction, including without limitation
9
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
- * and/or sell copies of the Software, and to permit persons to whom the
9
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
+ * and/or sell copies of the Software, and to permit persons to whom the
11
11
  * Software is furnished to do so, subject to the following conditions:
12
12
  *
13
- * The above copyright notice and this permission notice shall be included
13
+ * The above copyright notice and this permission notice shall be included
14
14
  * in all copies or substantial portions of the Software.
15
15
  *
16
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17
17
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22
22
  * DEALINGS IN THE SOFTWARE.
23
23
  *
24
24
  * ------------------------------------------------------------------------
@@ -91,6 +91,10 @@ rb_thread_blocking_region(
91
91
  # include <unistd.h>
92
92
  #elif defined(RUBY_PLATFORM_SOLARIS)
93
93
  # include <sys/sendfile.h>
94
+ #elif defined(RUBY_PLATFORM_DARWIN)
95
+ # include <sys/types.h>
96
+ # include <sys/socket.h>
97
+ # include <sys/uio.h>
94
98
  #endif
95
99
 
96
100
  static size_t count_max(off_t count)
@@ -138,7 +142,7 @@ static VALUE nogvl_sendfile(void *data)
138
142
  size_t w = count_max(args->count);
139
143
 
140
144
  rv = sendfile(args->in, args->out, args->off, args->count,
141
- NULL, &written, 0);
145
+ NULL, &written, 0);
142
146
  if (written == 0 && rv == 0) {
143
147
  args->eof = 1;
144
148
  } else {
@@ -148,6 +152,23 @@ static VALUE nogvl_sendfile(void *data)
148
152
 
149
153
  return (VALUE)rv;
150
154
  }
155
+ #elif defined(RUBY_PLATFORM_DARWIN)
156
+ static VALUE nogvl_sendfile(void *data)
157
+ {
158
+ struct sendfile_args *args = data;
159
+ int rv;
160
+ off_t written;
161
+ size_t w = count_max(args->count);
162
+
163
+ rv = sendfile(args->in, args->out, args->off, args->count,
164
+ NULL, 0);
165
+ if (rv == 0)
166
+ args->eof = 1;
167
+ if (rv > 0)
168
+ args->count -= rv;
169
+
170
+ return (VALUE)rv;
171
+ }
151
172
  #else
152
173
  static VALUE nogvl_sendfile(void *data)
153
174
  {
@@ -172,7 +193,7 @@ static off_t sendfile_full(struct sendfile_args *args)
172
193
 
173
194
  while (1) {
174
195
  rv = (ssize_t)rb_thread_blocking_region(nogvl_sendfile, args,
175
- RUBY_UBF_IO, NULL);
196
+ RUBY_UBF_IO, NULL);
176
197
  if (!args->count)
177
198
  break;
178
199
  if (args->eof) {
@@ -201,7 +222,7 @@ static VALUE sendfile_nonblock(struct sendfile_args *args, int try)
201
222
  }
202
223
 
203
224
  rv = (ssize_t)rb_thread_blocking_region(nogvl_sendfile, args,
204
- RUBY_UBF_IO, NULL);
225
+ RUBY_UBF_IO, NULL);
205
226
  if (rv < 0) {
206
227
  if (try && errno == EAGAIN)
207
228
  return sym_wait_writable;
@@ -217,7 +238,7 @@ static VALUE sendfile_nonblock(struct sendfile_args *args, int try)
217
238
  }
218
239
 
219
240
  static void convert_args(int argc, VALUE *argv, VALUE self,
220
- struct sendfile_args *args)
241
+ struct sendfile_args *args)
221
242
  {
222
243
  VALUE in, offset, count;
223
244
 
@@ -232,7 +253,7 @@ static void convert_args(int argc, VALUE *argv, VALUE self,
232
253
  args->off = (NIL_P(offset)) ? 0 : NUM2OFFT(offset);
233
254
  if (NIL_P(count)) {
234
255
  /* FreeBSD's sendfile() can take 0 as an indication to send
235
- * until end of file, but Linux and Solaris can't, and anyway
256
+ * until end of file, but Linux and Solaris can't, and anyway
236
257
  * we need the file size to ensure we send it all in the case
237
258
  * of a non-blocking fd */
238
259
  struct stat s;
@@ -299,7 +320,7 @@ static VALUE rb_io_sendfile_nonblock(int argc, VALUE *argv, VALUE self)
299
320
 
300
321
  /* call-seq:
301
322
  * writeIO.trysendfile(readIO, offset=0, count=nil) => integer, nil, or
302
- * :wait_writable
323
+ * :wait_writable
303
324
  *
304
325
  * Transfers count bytes starting at offset from readIO directly to writeIO
305
326
  * without copying (i.e. invoking the kernel to do it for you).
@@ -338,7 +359,6 @@ void Init_sendfile(void)
338
359
  sym_wait_writable = ID2SYM(rb_intern("wait_writable"));
339
360
  rb_define_method(rb_cIO, "sendfile", rb_io_sendfile, -1);
340
361
  rb_define_method(rb_cIO, "sendfile_nonblock",
341
- rb_io_sendfile_nonblock, -1);
362
+ rb_io_sendfile_nonblock, -1);
342
363
  rb_define_method(rb_cIO, "trysendfile", rb_io_trysendfile, -1);
343
364
  }
344
-
@@ -2,22 +2,20 @@
2
2
 
3
3
  spec = Gem::Specification.new do |gs|
4
4
  gs.name = 'sendfile'
5
- gs.version = '1.1.0'
5
+ gs.version = '1.2.0'
6
6
  gs.summary = 'Ruby interface to sendfile(2) system call'
7
7
  gs.description = <<-EOF
8
8
  Allows Ruby programs to access sendfile(2) functionality on
9
- any IO object. Works on Linux, Solaris and FreeBSD with
9
+ any IO object. Works on Linux, Solaris, FreeBSD and Darwin with
10
10
  blocking and non-blocking sockets.
11
11
  EOF
12
12
  gs.author = 'Toby DiPasquale'
13
13
  gs.email = 'toby@cbcg.net'
14
+ gs.homepage = 'https://github.com/codeslinger/sendfile'
14
15
  gs.rubyforge_project = 'ruby-sendfile'
15
-
16
- gs.autorequire = 'sendfile'
17
16
  gs.files = File.read('FILES').split($/)
18
17
  gs.test_files = Dir.glob 'test/test_*.rb'
19
18
  gs.extensions << 'ext/extconf.rb'
20
-
21
19
  gs.has_rdoc = true
22
20
  gs.extra_rdoc_files = %w(README.textile)
23
21
  gs.required_ruby_version = '>= 1.8.0'
metadata CHANGED
@@ -1,37 +1,26 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sendfile
3
- version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease: false
6
- segments:
7
- - 1
8
- - 1
9
- - 0
10
- version: 1.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Toby DiPasquale
14
- autorequire: sendfile
9
+ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-03-05 00:00:00 -05:00
19
- default_executable:
12
+ date: 2013-06-30 00:00:00.000000000 Z
20
13
  dependencies: []
21
-
22
- description: |
23
- Allows Ruby programs to access sendfile(2) functionality on
24
- any IO object. Works on Linux, Solaris and FreeBSD with
25
- blocking and non-blocking sockets.
26
-
14
+ description: ! "Allows Ruby programs to access sendfile(2) functionality on \nany
15
+ IO object. Works on Linux, Solaris, FreeBSD and Darwin with\nblocking and non-blocking
16
+ sockets.\n"
27
17
  email: toby@cbcg.net
28
18
  executables: []
29
-
30
- extensions:
19
+ extensions:
31
20
  - ext/extconf.rb
32
- extra_rdoc_files:
21
+ extra_rdoc_files:
33
22
  - README.textile
34
- files:
23
+ files:
35
24
  - FILES
36
25
  - README.textile
37
26
  - LICENSE
@@ -42,41 +31,29 @@ files:
42
31
  - test/large.gz
43
32
  - test/small
44
33
  - sendfile.gemspec
45
- has_rdoc: true
46
- homepage:
34
+ homepage: https://github.com/codeslinger/sendfile
47
35
  licenses: []
48
-
49
36
  post_install_message:
50
37
  rdoc_options: []
51
-
52
- require_paths:
38
+ require_paths:
53
39
  - lib
54
- required_ruby_version: !ruby/object:Gem::Requirement
40
+ required_ruby_version: !ruby/object:Gem::Requirement
55
41
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 55
60
- segments:
61
- - 1
62
- - 8
63
- - 0
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
64
45
  version: 1.8.0
65
- required_rubygems_version: !ruby/object:Gem::Requirement
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
47
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
74
52
  requirements: []
75
-
76
53
  rubyforge_project: ruby-sendfile
77
- rubygems_version: 1.3.7
54
+ rubygems_version: 1.8.23
78
55
  signing_key:
79
56
  specification_version: 3
80
57
  summary: Ruby interface to sendfile(2) system call
81
- test_files:
58
+ test_files:
82
59
  - test/test_sendfile.rb