diff options
author | Lukas Larsson <[email protected]> | 2017-06-07 09:51:01 +0200 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2017-06-07 09:51:01 +0200 |
commit | 6076b94dd8206806e454b1c6e12ffcd467bc21c5 (patch) | |
tree | c9f0d91c48a72016871cfdc812dd6296ccdd9a77 | |
parent | 106c7b1bd5d845b982796e4ab5d537b2e68c3f1d (diff) | |
parent | 4e38e959a1ecfaa5fa5f3571599a60ab0a88c712 (diff) | |
download | otp-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.c | 16 | ||||
-rw-r--r-- | lib/kernel/test/sendfile_SUITE.erl | 4 |
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) -> |