13 #include "../layout/dlist.h"
16 OutBuffer *back, *next;
21 int obc_tryflush(OutBufferChain *ch) {
28 events->cancel_fd(events, ch->fd, OOP_WRITE);
31 if (ch->done_of_head == ob->l) {
32 LIST_UNLINK(ch->obs, ob);
38 r= write(ch->fd, ob->m + ch->done_of_head, ob->l - ch->done_of_head);
40 if (errno==EINTR) continue;
41 if (errno==EWOULDBLOCK) return errno;
42 ch->error(ch,"write",strerror(errno));
46 ch->done_of_head += r;
48 assert(ch->done_of_head <= ob->l);
52 static void *writeable(oop_source *evts, int fd,
53 oop_event evt, void *ch_v) {
54 OutBufferChain *ch= ch_v;
56 assert(evt == OOP_WRITE);
61 static void addlink(OutBufferChain *ch, OutBuffer *ob) {
63 events->on_fd(events, ch->fd, OOP_WRITE, writeable, ch);
64 LIST_LINK_TAIL(ch->obs, ob);
66 if (ob->l>0 && ob->m[ob->l-1]=='\n')
68 if (ch->total > ch->limit) {
70 snprintf(what,sizeof(what)-1,"`%.*s...'", ob->l,ob->m);
71 what[sizeof(what)-1]= 0;
72 ch->error(ch,"buffer limit exceeded",what);
76 void obc_init(OutBufferChain *ch) {
80 if (!ch->limit) ch->limit= 128*1024;
81 r= oop_fd_nonblock(ch->fd, 1);
82 if (r) diee("nonblock(OutBufferChain->fd,1)");
86 void ovprintf(OutBufferChain *ch, const char *fmt, va_list al) {
89 ob= mmalloc(sizeof(*ob));
90 ob->l= vasprintf(&ob->m, fmt, al); if (ob->l <= 0) diem();
94 void oprintf(OutBufferChain *ch, const char *msg, ...) {
101 void voerror(OutBufferChain *ch, const char *fmt, va_list al) {
102 oprintf(ch,"error ");
107 void owrite(OutBufferChain *ch, const char *data, int l) {
109 ob= mmalloc(sizeof(*ob));
112 memcpy(ob->m, data, l);