sendfile 0.9.2 → 0.9.3
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/ChangeLog +6 -0
- data/LICENSE +1 -1
- data/ext/sendfile.c +27 -31
- data/sendfile.gemspec +3 -3
- metadata +41 -33
data/ChangeLog
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
* sendfile 0.9.3 - 2008.11.30 <toby@cbcg.net>
|
2
|
+
|
3
|
+
- Included sys/stat.h regardless of platform to fix compilation on
|
4
|
+
OS X 10.5 (credit: Damon Morda <dmorda@andrew.cmu.edu>)
|
5
|
+
- Source formatting clean-up
|
6
|
+
|
1
7
|
* sendfile 0.9.2 - 2006.03.27 <toby@cbcg.net>
|
2
8
|
|
3
9
|
- Fixed typo: s/rv_sys_fail/rb_sys_fail
|
data/LICENSE
CHANGED
data/ext/sendfile.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* ------------------------------------------------------------------------
|
3
3
|
*
|
4
|
-
* Copyright (c) 2005 Tobias DiPasquale
|
4
|
+
* Copyright (c) 2005,2008 Tobias DiPasquale
|
5
5
|
*
|
6
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"),
|
@@ -31,6 +31,8 @@
|
|
31
31
|
*
|
32
32
|
* $Id: sendfile.c,v 1.4 2006/03/27 19:14:53 codeslinger Exp $
|
33
33
|
*/
|
34
|
+
#include <sys/stat.h>
|
35
|
+
#include <sys/types.h>
|
34
36
|
#include "ruby.h"
|
35
37
|
#include "rubyio.h"
|
36
38
|
#include "rubysig.h"
|
@@ -38,59 +40,53 @@
|
|
38
40
|
|
39
41
|
#if defined(RUBY_PLATFORM_FREEBSD)
|
40
42
|
# include <sys/socket.h>
|
41
|
-
# include <sys/stat.h>
|
42
|
-
# include <sys/types.h>
|
43
43
|
# include <sys/uio.h>
|
44
44
|
#elif defined(RUBY_PLATFORM_LINUX)
|
45
45
|
# include <sys/sendfile.h>
|
46
|
-
# include <sys/stat.h>
|
47
|
-
# include <sys/types.h>
|
48
46
|
# include <unistd.h>
|
49
47
|
#elif defined(RUBY_PLATFORM_SOLARIS)
|
50
48
|
# include <sys/sendfile.h>
|
51
|
-
# include <sys/stat.h>
|
52
|
-
# include <sys/types.h>
|
53
49
|
#endif
|
54
50
|
|
55
51
|
#define SENDFILE_PAUSE_SEC 0
|
56
52
|
#define SENDFILE_PAUSE_USEC 500
|
57
53
|
|
58
54
|
#if defined(RUBY_PLATFORM_FREEBSD)
|
59
|
-
static off_t __sendfile(
|
55
|
+
static off_t __sendfile(int out, int in, off_t off, size_t count, struct timeval *tv)
|
60
56
|
{
|
61
57
|
int rv;
|
62
58
|
off_t written, initial = off;
|
63
59
|
|
64
60
|
while (1) {
|
65
61
|
TRAP_BEG;
|
66
|
-
rv = sendfile(
|
62
|
+
rv = sendfile(in, out, off, count, NULL, &written, 0);
|
67
63
|
TRAP_END;
|
68
64
|
off += written;
|
69
65
|
count -= written;
|
70
66
|
if (rv < 0 && errno != EAGAIN)
|
71
|
-
rb_sys_fail(
|
67
|
+
rb_sys_fail("sendfile");
|
72
68
|
if (!rv)
|
73
69
|
break;
|
74
|
-
rb_thread_select(
|
70
|
+
rb_thread_select(0, NULL, NULL, NULL, tv);
|
75
71
|
}
|
76
72
|
return off - initial;
|
77
73
|
}
|
78
74
|
#else
|
79
|
-
static size_t __sendfile(
|
75
|
+
static size_t __sendfile(int out, int in, off_t off, size_t count, struct timeval *tv)
|
80
76
|
{
|
81
77
|
ssize_t rv, remaining = count;
|
82
78
|
|
83
79
|
while (1) {
|
84
80
|
TRAP_BEG;
|
85
|
-
rv = sendfile(
|
81
|
+
rv = sendfile(out, in, &off, remaining);
|
86
82
|
TRAP_END;
|
87
83
|
if (rv < 0 && errno != EAGAIN)
|
88
|
-
rb_sys_fail(
|
84
|
+
rb_sys_fail("sendfile");
|
89
85
|
if (rv > 0)
|
90
86
|
remaining -= rv;
|
91
87
|
if (!remaining)
|
92
88
|
break;
|
93
|
-
rb_thread_select(
|
89
|
+
rb_thread_select(0, NULL, NULL, NULL, tv);
|
94
90
|
}
|
95
91
|
return count;
|
96
92
|
}
|
@@ -110,7 +106,7 @@ static size_t __sendfile( int out, int in, off_t off, size_t count, struct timev
|
|
110
106
|
* exception on error. (check man sendfile(2) on your platform for
|
111
107
|
* information on what errors could result and how to handle them)
|
112
108
|
*/
|
113
|
-
static VALUE rb_io_sendfile(
|
109
|
+
static VALUE rb_io_sendfile(int argc, VALUE *argv, VALUE self)
|
114
110
|
{
|
115
111
|
int i, o;
|
116
112
|
size_t c;
|
@@ -120,42 +116,42 @@ static VALUE rb_io_sendfile( int argc, VALUE *argv, VALUE self)
|
|
120
116
|
struct timeval _sendfile_sleep;
|
121
117
|
|
122
118
|
/* get fds for files involved to pass to sendfile(2) */
|
123
|
-
rb_scan_args(
|
124
|
-
if (TYPE(
|
125
|
-
rb_raise(
|
126
|
-
GetOpenFile(
|
127
|
-
GetOpenFile(
|
128
|
-
o = fileno(
|
129
|
-
i = fileno(
|
119
|
+
rb_scan_args(argc, argv, "12", &in, &offset, &count);
|
120
|
+
if (TYPE(in) != T_FILE)
|
121
|
+
rb_raise(rb_eArgError, "invalid first argument\n");
|
122
|
+
GetOpenFile(self, optr);
|
123
|
+
GetOpenFile(in, iptr);
|
124
|
+
o = fileno(optr->f);
|
125
|
+
i = fileno(iptr->f);
|
130
126
|
|
131
127
|
_sendfile_sleep.tv_sec = SENDFILE_PAUSE_SEC;
|
132
128
|
_sendfile_sleep.tv_usec = SENDFILE_PAUSE_USEC;
|
133
129
|
|
134
130
|
/* determine offset and count parameters */
|
135
|
-
off = (NIL_P(
|
136
|
-
if (NIL_P(
|
131
|
+
off = (NIL_P(offset)) ? 0 : NUM2ULONG(offset);
|
132
|
+
if (NIL_P(count)) {
|
137
133
|
/* FreeBSD's sendfile() can take 0 as an indication to send
|
138
134
|
* until end of file, but Linux and Solaris can't, and anyway
|
139
135
|
* we need the file size to ensure we send it all in the case
|
140
136
|
* of a non-blocking fd */
|
141
137
|
struct stat s;
|
142
|
-
if (fstat(
|
143
|
-
rb_sys_fail(
|
138
|
+
if (fstat(i, &s) == -1)
|
139
|
+
rb_sys_fail("sendfile");
|
144
140
|
c = s.st_size;
|
145
141
|
c -= off;
|
146
142
|
} else {
|
147
|
-
c = NUM2ULONG(
|
143
|
+
c = NUM2ULONG(count);
|
148
144
|
}
|
149
145
|
|
150
146
|
/* now send the file */
|
151
|
-
return INT2FIX(
|
147
|
+
return INT2FIX(__sendfile(o, i, off, c, &_sendfile_sleep));
|
152
148
|
}
|
153
149
|
|
154
150
|
/* Interface to the UNIX sendfile(2) system call. Should work on FreeBSD,
|
155
151
|
* Linux and Solaris systems that support the sendfile(2) system call.
|
156
152
|
*/
|
157
|
-
void Init_sendfile(
|
153
|
+
void Init_sendfile(void)
|
158
154
|
{
|
159
|
-
rb_define_method(
|
155
|
+
rb_define_method(rb_cIO, "sendfile", rb_io_sendfile, -1);
|
160
156
|
}
|
161
157
|
|
data/sendfile.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
spec = Gem::Specification.new do |gs|
|
4
4
|
gs.name = 'sendfile'
|
5
|
-
gs.version = '0.9.
|
5
|
+
gs.version = '0.9.3'
|
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
|
@@ -14,12 +14,12 @@ EOF
|
|
14
14
|
gs.rubyforge_project = 'ruby-sendfile'
|
15
15
|
|
16
16
|
gs.autorequire = 'sendfile'
|
17
|
-
gs.files = File.read(
|
17
|
+
gs.files = File.read('FILES').split($/)
|
18
18
|
gs.test_files = Dir.glob 'test/test_*.rb'
|
19
19
|
gs.extensions << 'ext/extconf.rb'
|
20
20
|
|
21
21
|
gs.has_rdoc = true
|
22
|
-
gs.extra_rdoc_files = %w(
|
22
|
+
gs.extra_rdoc_files = %w(README)
|
23
23
|
gs.required_ruby_version = '>= 1.8.0'
|
24
24
|
end
|
25
25
|
|
metadata
CHANGED
@@ -1,32 +1,26 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.8.11
|
3
|
-
specification_version: 1
|
4
2
|
name: sendfile
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.9.
|
7
|
-
date: 2006-03-27 00:00:00 -05:00
|
8
|
-
summary: Ruby interface to sendfile(2) system call
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: toby@cbcg.net
|
12
|
-
homepage:
|
13
|
-
rubyforge_project: ruby-sendfile
|
14
|
-
description: Allows Ruby programs to access sendfile(2) functionality on any IO object. Works on Linux, Solaris and FreeBSD with blocking and non-blocking sockets.
|
15
|
-
autorequire: sendfile
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 1.8.0
|
24
|
-
version:
|
4
|
+
version: 0.9.3
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
6
|
authors:
|
29
7
|
- Toby DiPasquale
|
8
|
+
autorequire: sendfile
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-11-30 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Allows Ruby programs to access sendfile(2) functionality on any IO object. Works on Linux, Solaris and FreeBSD with blocking and non-blocking sockets.
|
17
|
+
email: toby@cbcg.net
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions:
|
21
|
+
- ext/extconf.rb
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
30
24
|
files:
|
31
25
|
- FILES
|
32
26
|
- README
|
@@ -38,17 +32,31 @@ files:
|
|
38
32
|
- test/large.gz
|
39
33
|
- test/small
|
40
34
|
- sendfile.gemspec
|
41
|
-
|
42
|
-
|
35
|
+
has_rdoc: true
|
36
|
+
homepage:
|
37
|
+
post_install_message:
|
43
38
|
rdoc_options: []
|
44
39
|
|
45
|
-
|
46
|
-
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
-
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.8.0
|
47
|
+
version:
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: "0"
|
53
|
+
version:
|
51
54
|
requirements: []
|
52
55
|
|
53
|
-
|
54
|
-
|
56
|
+
rubyforge_project: ruby-sendfile
|
57
|
+
rubygems_version: 1.3.0
|
58
|
+
signing_key:
|
59
|
+
specification_version: 2
|
60
|
+
summary: Ruby interface to sendfile(2) system call
|
61
|
+
test_files:
|
62
|
+
- test/test_sendfile.rb
|