ratox

FIFO based tox client
git clone git://git.2f30.org/ratox
Log | Files | Refs | README | LICENSE

commit 0eaf525dfabe2610d4c8e04d5bfdf0ba70f416fd
parent a9d505c68ec181e031728b436d13e6e1dd660718
Author: sin <sin@2f30.org>
Date:   Tue, 16 Sep 2014 13:26:03 +0100

Clean up send_friend_file()

Diffstat:
Mratatox.c | 35+++++++++++++++++++----------------
1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/ratatox.c b/ratatox.c @@ -394,38 +394,41 @@ send_friend_file(struct friend *f) { ssize_t n; - if (f->t.pending == 0) { -again: + while (1) { + /* attempt to transmit the pending buffer */ + if (f->t.pending == 1) { + if (tox_file_send_data(tox, f->fid, f->t.fnum, f->t.buf, f->t.n) == -1) { + /* bad luck - we will try again later */ + break; + } + f->t.pending = 0; + break; + } + /* grab another buffer from the FIFO */ n = read(f->fd[FILE_IN_FIFO], f->t.buf, f->t.chunksz); if (n < 0) { if (errno == EINTR) - goto again; - /* go back to select until the fd is readable */ + continue; + /* go back to select() until the fd is readable */ if (errno == EWOULDBLOCK) - return; + break; perror("read"); exit(EXIT_FAILURE); } + /* we are done */ if (n == 0) { tox_file_send_control(tox, f->fid, 0, f->t.fnum, TOX_FILECONTROL_FINISHED, NULL, 0); f->t.state = TRANSFER_DONE; - return; + break; } + /* store transfer size in case we can't send it right now */ f->t.n = n; if (tox_file_send_data(tox, f->fid, f->t.fnum, f->t.buf, f->t.n) == -1) { - /* remember to resend the last buffer */ + /* ok we will have to send it later, flip state */ f->t.pending = 1; return; } - goto again; - } else { - if (tox_file_send_data(tox, f->fid, f->t.fnum, f->t.buf, f->t.n) == -1) { - /* we might be hitting here too hard, maybe relax()? */ - return; - } - f->t.pending = 0; - goto again; } } @@ -440,7 +443,7 @@ again: if (n < 0) { if (errno == EINTR) goto again; - /* go back to select until the fd is readable */ + /* go back to select() until the fd is readable */ if (errno == EWOULDBLOCK) return; perror("read");