static void rb_helper_write_sendq(rb_fde_t *F, void *helper_ptr) { rb_helper *helper = helper_ptr; int retlen; if(rb_linebuf_len(&helper->sendq) > 0) { while((retlen = rb_linebuf_flush(F, &helper->sendq)) > 0) ; if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno))) { rb_helper_restart(helper); return; } } if(rb_linebuf_len(&helper->sendq) > 0) rb_setselect(helper->ofd, RB_SELECT_WRITE, rb_helper_write_sendq, helper); }
static void rb_helper_read_cb(rb_fde_t *F, void *data) { rb_helper *helper = (rb_helper *)data; char buf[4096]; ssize_t length; if(helper == NULL) return; while((length = rb_read(helper->ifd, buf, sizeof(buf))) > 0) { rb_linebuf_parse(helper->recvq, buf, (size_t)length, 0); helper->read_cb(helper); } if(length == 0 || (length < 0 && !rb_ignore_errno(errno))) { rb_helper_restart(helper); return; } rb_setselect(helper->ifd, RB_SELECT_READ, rb_helper_read_cb, helper); }