aboutsummaryrefslogtreecommitdiffstats
path: root/src/libtipidee/tipidee_fcgi_put.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2026-07-04 04:03:12 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2026-07-04 04:03:12 +0000
commit24daa5813f277023f7b8453338870369bf00a3ca (patch)
treefc19981595bd9be15daef821c0b5259c4f4907cb /src/libtipidee/tipidee_fcgi_put.c
parent45808dbc6dc1b90fa512add692252bc15760a214 (diff)
downloadtipidee-24daa5813f277023f7b8453338870369bf00a3ca.tar.gz
Implement FastCGI, initial version
Diffstat (limited to 'src/libtipidee/tipidee_fcgi_put.c')
-rw-r--r--src/libtipidee/tipidee_fcgi_put.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/libtipidee/tipidee_fcgi_put.c b/src/libtipidee/tipidee_fcgi_put.c
new file mode 100644
index 0000000..0f4b493
--- /dev/null
+++ b/src/libtipidee/tipidee_fcgi_put.c
@@ -0,0 +1,34 @@
+/* ISC license. */
+
+#include <stdint.h>
+
+#include <skalibs/uint16.h>
+#include <skalibs/buffer.h>
+#include <skalibs/unix-timed.h>
+
+#include <tipidee/fcgi.h>
+
+static uint16_t putit (tipidee_fcgi *fc, uint8_t rectype, char const *s, uint16_t len, tain *stamp)
+{
+ char hdr[8] = { 1, (char)rectype, fc->id >> 8, fc->id & 0xff, 0, 0, 0, 0 } ;
+ uint16_t w ;
+ uint16_pack_big(hdr + 4, len) ;
+ w = buffer_timed_put(&fc->b, hdr, 8, &fc->deadline, stamp) ;
+ if (w < 8) return 0 ;
+ return buffer_timed_put(&fc->b, s, len, &fc->deadline, stamp) ;
+}
+
+size_t tipidee_fcgi_put (tipidee_fcgi *fc, uint8_t rectype, char const *s, size_t len, tain *stamp)
+{
+ size_t w = 0 ;
+ while (len > 0xffffu)
+ {
+ uint16_t r = putit(fc, rectype, s, 0xffffu, stamp) ;
+ w += r ;
+ if (r < 0xffffu) return w ;
+ s += 0xffff ;
+ len -= 0xffff ;
+ }
+ w += putit(fc, rectype, s, len, stamp) ;
+ return w ;
+}