sendfile 0.9.2 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|