- ret = write_all(ut->fd, buf, &written);
- if (ret < 0)
- return udp_delete_target(ut, "send error");
- if (written != len)
- PARA_WARNING_LOG("short write %zu/%zu\n", written, len);
+ if (!ret) { /* still data left in the queue */
+ ret = cq_enqueue(ut->cq, buf, len);
+ if (ret < 0) {
+ udp_delete_target(ut, para_strerror(-ret));
+ continue;
+ }
+ }
+ ret = write_nonblock(ut->fd, buf, len, 0);
+ if (ret < 0) {
+ udp_delete_target(ut, para_strerror(-ret));
+ continue;
+ }
+ if (ret != len) {
+ ret = cq_enqueue(ut->cq, buf + ret, len - ret);
+ if (ret < 0) {
+ udp_delete_target(ut, para_strerror(-ret));
+ continue;
+ }
+ }