8
static int do_read(int sock, void *buf, int len) {
11
err = read(sock, buf, len);
18
rl_warn("read(%d, %p, %d): %d (%s)", sock, buf, len,
19
errno, strerror(errno));
26
int rlbuf_read(int sock, struct rl_buffer *buf) {
30
rl_warn("rlbuf_read called with NULL buf");
35
if(buf->head >= buf->tail) {
36
size = buf->size - buf->head - !buf->tail;
38
if((err = do_read(sock, buf->data + buf->head, size)) < 0)
48
if(buf->tail && (buf->head < buf->tail)) {
51
err = do_read(sock, buf->data, size);
61
static int do_write(int sock, void *buf, int len) {
64
err = write(sock, buf, len);
71
rl_warn("write(%d, %p, %d): %d (%s)", sock, buf, len,
72
errno, strerror(errno));
80
int rlbuf_write(int sock, struct rl_buffer *buf) {
84
rl_warn("rlbuf_write called with NULL buf");
89
if(buf->head == buf->tail)
91
if(buf->head > buf->tail)
92
size = buf->head - buf->tail;
94
size = buf->size - buf->tail;
96
if((err = do_write(sock, buf->data + buf->tail, size)) < 0)
102
if(buf->tail == buf->size)
105
if(buf->tail < buf->head) {
106
size = buf->head - buf->tail;
107
err = do_write(sock, buf->data + buf->tail, size);
116
int rlbuf_copy(int sock, struct rl_buffer *buf, int offset) {
120
rl_warn("rlbuf_write called with NULL buf");
125
if(buf->head == buf->tail)
127
if(buf->head > buf->tail)
128
size = buf->head - buf->tail;
130
size = buf->size - buf->tail;
136
if((err = do_write(sock, buf->data + buf->tail + offset, size)) < 0)
145
if(buf->tail > buf->head) {
146
size = buf->head - offset;
149
err = do_write(sock, buf->data + offset, size);
157
void rlbuf_init(struct rl_buffer **buf, int size) {
159
*buf = malloc(sizeof(**buf));
161
rl_fatal(EX_SOFTWARE, "ABORT - Can't allocate memory");
162
memset(*buf, 0, sizeof(**buf));
164
(*buf)->head = (*buf)->tail = 0;
172
(*buf)->data = malloc(size);
174
rl_fatal(EX_SOFTWARE, "ABORT - Can't allocate memory");