#include #include #include #include #include #include "plumb.h" Plumbmsg* ioplumbrecv(Ioproc *io, int fd) { char *buf; Plumbmsg *m; int n, more; buf = malloc(8192); if(buf == nil) return nil; n = ioread(io, fd, buf, 8192); m = nil; if(n > 0){ m = plumbunpackpartial(buf, n, &more); if(m==nil && more>0){ /* we now know how many more bytes to read for complete message */ buf = realloc(buf, n+more); if(buf == nil) return nil; if(ioreadn(io, fd, buf+n, more) == more) m = plumbunpackpartial(buf, n+more, nil); } } free(buf); return m; }