1 #include "async.h"
2 
3 #include <stdint.h>
4 #include <errno.h>
5 #include <unistd.h>
6 
7 #define LOG_MODULE "async"
8 #define LOG_ENABLE_DBG 0
9 #include "log.h"
10 
11 enum async_write_status
async_write(int fd,const void * _data,size_t len,size_t * idx)12 async_write(int fd, const void *_data, size_t len, size_t *idx)
13 {
14     const uint8_t *const data = _data;
15     size_t left = len - *idx;
16 
17     while (left > 0) {
18         ssize_t ret = write(fd, &data[*idx], left);
19 
20         if (ret < 0) {
21             if (errno == EAGAIN || errno == EWOULDBLOCK)
22                 return ASYNC_WRITE_REMAIN;
23 
24             return ASYNC_WRITE_ERR;
25         }
26 
27         LOG_DBG("wrote %zd bytes of %zu (%zu left) to FD=%d",
28                 ret, left, left - ret, fd);
29 
30         *idx += ret;
31         left -= ret;
32     }
33 
34     return ASYNC_WRITE_DONE;
35 }
36