URI: 
       tHandle partial writes - ratox - FIFO based tox client
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit e020b1e9369fc6aaf9f600ab5b1bf93c1235e503
   DIR parent 04d2c71dcd1aff729fcf59c720245aa270a02815
  HTML Author: sin <sin@2f30.org>
       Date:   Wed, 24 Sep 2014 15:43:11 +0100
       
       Handle partial writes
       
       Diffstat:
         M ratox.c                             |      19 ++++++++++++-------
       
       1 file changed, 12 insertions(+), 7 deletions(-)
       ---
   DIR diff --git a/ratox.c b/ratox.c
       t@@ -535,6 +535,7 @@ static void
        cbfiledata(Tox *m, int32_t fid, uint8_t fnum, const uint8_t *data, uint16_t len, void *udata)
        {
                struct friend *f;
       +        uint16_t wrote = 0;
                ssize_t n;
        
                TAILQ_FOREACH(f, &friendhead, entry)
       t@@ -543,13 +544,17 @@ cbfiledata(Tox *m, int32_t fid, uint8_t fnum, const uint8_t *data, uint16_t len,
                if (!f)
                        return;
        
       -again:
       -        n = write(f->fd[FFILE_OUT], data, len);
       -        if (n < 0) {
       -                if (errno == EPIPE)
       -                        cancelrxtransfer(f);
       -                if (errno == EWOULDBLOCK)
       -                        goto again;
       +        while (len > 0) {
       +                n = write(f->fd[FFILE_OUT], &data[wrote], len);
       +                if (n < 0) {
       +                        if (errno == EPIPE)
       +                                cancelrxtransfer(f);
       +                        if (errno == EWOULDBLOCK)
       +                                continue;
       +                } else if (n == 0)
       +                        break;
       +                wrote += n;
       +                len -= n;
                }
        }