aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-03-23 02:43:26 +0000
committerLaurent Bercot <ska@appnovation.com>2025-03-23 02:43:26 +0000
commitbab82183d71e476a3420fbf518ab10cd16264dd7 (patch)
tree57efdc9e2a93d669b10efa76f88e0aec90d0cdf8 /src
parentaddf2dac3a838fccfb027d114debdd2d9685d7fe (diff)
downloadtipidee-bab82183d71e476a3420fbf518ab10cd16264dd7.tar.gz
Fix several stream bugs
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src')
-rw-r--r--src/tipideed/cgi.c2
-rw-r--r--src/tipideed/stream.c9
2 files changed, 8 insertions, 3 deletions
diff --git a/src/tipideed/cgi.c b/src/tipideed/cgi.c
index 36d9ee2..21e21db 100644
--- a/src/tipideed/cgi.c
+++ b/src/tipideed/cgi.c
@@ -377,6 +377,8 @@ static inline int do_cgi (tipidee_rql *rql, char const *docroot, char const *con
if (buffer_timed_putv_g(buffer_1, v, 2, &deadline) < len)
strerr_diefu1sys(111, "write to stdout") ;
buffer_rseek(&b, len) ;
+ if (!buffer_timed_flush_g(buffer_1, &deadline))
+ strerr_diefu1sys(111, "write to stdout") ;
stream_infinite(x[0].fd, argv[0]) ;
}
diff --git a/src/tipideed/stream.c b/src/tipideed/stream.c
index 80f73ab..b28dbd0 100644
--- a/src/tipideed/stream.c
+++ b/src/tipideed/stream.c
@@ -57,6 +57,8 @@ void stream_infinite (int fd, char const *fn)
{
ssize_t r ;
+ if (ndelay_off(fd) == -1 || ndelay_off(1) == -1) strerr_diefu1sys(111, "set fds blocking") ;
+
/* only works when fd is a pipe, which is the case for cgi; fcgi/scgi will need refactoring */
/* XXX: ignores timeouts, but this is just TOO GOOD to pass up */
/* no really, it is just optimal in 99.9% of cases, it is WORTH IT */
@@ -66,6 +68,7 @@ void stream_infinite (int fd, char const *fn)
/* You WISH you had written that line of code */
if (r == -1) strerr_diefu3sys(111, "splice from ", fn, " to stdout") ;
+ if (ndelay_on(1) == -1) strerr_diefu1sys(111, "set stdout nonblocking again") ;
}
#else
@@ -148,11 +151,11 @@ void stream_autochunk (buffer *b, char const *fn)
tain_add_g(&deadline, &g.writetto) ;
len = size_xfmt(fmt, r) ;
- if (buffer_timed_put_g(buffer_1, fmt, len, &deadline) < r
+ if (buffer_timed_put_g(buffer_1, fmt, len, &deadline) < len
|| buffer_timed_put_g(buffer_1, "\r\n", 2, &deadline) < 2) strerr_diefu1sys(111, "write to stdout") ;
- buffer_wpeek(b, v) ;
+ buffer_rpeek(b, v) ;
w = buffer_timed_putv_g(buffer_1, v, 2, &deadline) ;
- buffer_wseek(b, w) ;
+ buffer_rseek(b, w) ;
if (w < r
|| buffer_timed_put_g(buffer_1, "\r\n", 2, &deadline) < 2
|| !buffer_timed_flush_g(buffer_1, &deadline)) strerr_diefu1sys(111, "write to stdout") ;