aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Larsson <[email protected]>2017-06-07 09:51:01 +0200
committerLukas Larsson <[email protected]>2017-06-07 09:51:01 +0200
commit6076b94dd8206806e454b1c6e12ffcd467bc21c5 (patch)
treec9f0d91c48a72016871cfdc812dd6296ccdd9a77
parent106c7b1bd5d845b982796e4ab5d537b2e68c3f1d (diff)
parent4e38e959a1ecfaa5fa5f3571599a60ab0a88c712 (diff)
downloadotp-6076b94dd8206806e454b1c6e12ffcd467bc21c5.tar.gz
otp-6076b94dd8206806e454b1c6e12ffcd467bc21c5.tar.bz2
otp-6076b94dd8206806e454b1c6e12ffcd467bc21c5.zip
Merge branch 'lukas/erts/sendfile_sunos_fix/OTP-14424'
* lukas/erts/sendfile_sunos_fix/OTP-14424: erts: Fix sendfile closeduring scenario on sunos
-rw-r--r--erts/emulator/drivers/unix/unix_efile.c16
-rw-r--r--lib/kernel/test/sendfile_SUITE.erl4
2 files changed, 12 insertions, 8 deletions
diff --git a/erts/emulator/drivers/unix/unix_efile.c b/erts/emulator/drivers/unix/unix_efile.c
index 0acc2432a7..f8341f788a 100644
--- a/erts/emulator/drivers/unix/unix_efile.c
+++ b/erts/emulator/drivers/unix/unix_efile.c
@@ -969,17 +969,21 @@ efile_sendfile(Efile_error* errInfo, int in_fd, int out_fd,
fdrec.sfv_len = SENDFILE_CHUNK_SIZE;
else
fdrec.sfv_len = *nbytes;
+
retval = sendfilev(out_fd, &fdrec, 1, &len);
- /* Sometimes sendfilev can return -1 and still send data.
- When that happens we just pretend that no error happend. */
- if (retval != -1 || errno == EAGAIN || errno == EINTR ||
- len != 0) {
+ if (retval == -1 && errno == EINVAL) {
+ /* On some solaris versions (I've seen it on SunOS 5.10),
+ using a sfv_len larger then a filesize will result in
+ a -1 && errno == EINVAL return. We translate this so
+ a successful send of the data.*/
+ retval = len;
+ }
+
+ if (retval != -1 || errno == EAGAIN || errno == EINTR) {
*offset += len;
*nbytes -= len;
written += len;
- if (errno != EAGAIN && errno != EINTR && len != 0)
- retval = len;
}
} while (len == SENDFILE_CHUNK_SIZE);
#elif defined(__DARWIN__)
diff --git a/lib/kernel/test/sendfile_SUITE.erl b/lib/kernel/test/sendfile_SUITE.erl
index 2673c38494..e839959623 100644
--- a/lib/kernel/test/sendfile_SUITE.erl
+++ b/lib/kernel/test/sendfile_SUITE.erl
@@ -100,13 +100,13 @@ init_per_testcase(TC,Config) when TC == t_sendfile_recvduring;
%% Check if sendfile is supported on this platform
case catch sendfile_send(Send) of
ok ->
- Config;
+ init_per_testcase(t_sendfile, Config);
Error ->
ct:log("Error: ~p",[Error]),
{skip,"Not supported"}
end;
init_per_testcase(_Tc,Config) ->
- Config.
+ Config ++ [{sendfile_opts,[{use_threads,false}]}].
t_sendfile_small(Config) when is_list(Config) ->