summaryrefslogtreecommitdiffstats
path: root/lem/io/stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'lem/io/stream.c')
-rw-r--r--lem/io/stream.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/lem/io/stream.c b/lem/io/stream.c
index 0056233..cfbc1ed 100644
--- a/lem/io/stream.c
+++ b/lem/io/stream.c
@@ -211,9 +211,10 @@ stream__write(lua_State *T, struct stream *s)
int err;
while ((bytes = write(s->w.fd, s->out, s->out_len)) > 0) {
+ lem_debug("wrote %ld bytes to fd %d", bytes, s->w.fd);
s->out += bytes;
s->out_len -= bytes;
- if (s->out_len == 0) {
+ while (s->out_len == 0) {
if (s->idx == lua_gettop(T)) {
lua_pushboolean(T, 1);
return 1;
@@ -222,6 +223,7 @@ stream__write(lua_State *T, struct stream *s)
}
}
err = errno;
+ lem_debug("wrote %ld bytes to fd %d", bytes, s->w.fd);
if (bytes < 0 && (err == EAGAIN || err == EINTR))
return 0;
@@ -263,14 +265,18 @@ stream_write(lua_State *T)
struct stream *s;
const char *out;
size_t out_len;
+ int idx;
int i;
int top;
int ret;
luaL_checktype(T, 1, LUA_TUSERDATA);
- out = luaL_checklstring(T, 2, &out_len);
top = lua_gettop(T);
- for (i = 3; i <= top; i++)
+ idx = 1;
+ do {
+ out = luaL_checklstring(T, ++idx, &out_len);
+ } while (out_len == 0 && idx <= top);
+ for (i = idx+1; i <= top; i++)
(void)luaL_checkstring(T, i);
s = lua_touserdata(T, 1);
@@ -278,10 +284,14 @@ stream_write(lua_State *T)
return io_closed(T);
if (s->w.data != NULL)
return io_busy(T);
+ if (idx > top) {
+ lua_pushboolean(T, 1);
+ return 1;
+ }
s->out = out;
s->out_len = out_len;
- s->idx = 2;
+ s->idx = idx;
ret = stream__write(T, s);
if (ret > 0)
return ret;