diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-03-22 06:57:51 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-03-22 06:57:51 +0000 |
| commit | bfdd8182f9a098d400c83fd43c70cbb2ccc94264 (patch) | |
| tree | 7f784190087e8dd2ada6f67dfe64e1348c6a114a /src/tipideed/stream.c | |
| parent | 9cd4e0d1902ebb196ebd53ed7ee88e6689d801b7 (diff) | |
| download | tipidee-bfdd8182f9a098d400c83fd43c70cbb2ccc94264.tar.gz | |
Implement autochunk
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/tipideed/stream.c')
| -rw-r--r-- | src/tipideed/stream.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/tipideed/stream.c b/src/tipideed/stream.c index 7323c93..c391631 100644 --- a/src/tipideed/stream.c +++ b/src/tipideed/stream.c @@ -117,6 +117,7 @@ void stream_infinite (int fd, char const *fn) r = timed_readv_g(fd, v, 2, &deadline) ; if (r == -1) strerr_diefu2sys(111, "read from resource ", fn) ; if (!r) break ; + buffer_wseek(buffer_1, r) ; tain_add_g(&deadline, &g.writetto) ; if (!buffer_timed_flush_g(buffer_1, &deadline)) strerr_diefu1sys(111, "write to stdout") ; @@ -125,9 +126,40 @@ void stream_infinite (int fd, char const *fn) #endif - +#include <skalibs/types.h> #include <skalibs/buffer.h> void stream_autochunk (buffer *b, char const *fn) { + tain deadline ; + struct iovec v[2] ; + size_t len, w ; + char fmt[SIZE_XFMT] ; + + for (;;) + { + ssize_t r = buffer_len(b) ; + if (!r) + { + tain_add_g(&deadline, &g.cgitto) ; + r = buffer_timed_fill_g(b, &deadline) ; + if (r == -1) strerr_diefu2sys(111, "read from resource ", fn) ; + if (!r) break ; + } + + tain_add_g(&deadline, &g.writetto) ; + len = size_xfmt(fmt, r) ; + if (buffer_timed_put_g(buffer_1, fmt, len, &deadline) < r + || buffer_timed_put_g(buffer_1, "\r\n", 2, &deadline) < 2) strerr_diefu1sys(111, "write to stdout") ; + buffer_wpeek(b, v) ; + w = buffer_timed_putv_g(buffer_1, v, 2, &deadline) ; + buffer_wseek(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") ; + } + + tain_add_g(&deadline, &g.writetto) ; + if (buffer_timed_put_g(buffer_1, "0\r\n\r\n", 5, &deadline) < 5 + || !buffer_timed_flush_g(buffer_1, &deadline)) strerr_diefu1sys(111, "write to stdout") ; } |
