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