return;
list_for_each_entry_safe(dc, tmp, &clients, node) {
- if (!_write_ok(dc->fd))
+ ret = write_ok(dc->fd);
+ if (ret < 0) {
+ dccp_shutdown_client(dc);
+ continue;
+ }
+ if (!ret)
continue;
if (!dc->header_sent && af->get_header_info && current_chunk) {
header_buf = af->get_header_info(&header_len);
continue; /* header not yet available */
ret = write(dc->fd, header_buf, header_len);
if (ret != header_len) {
+ int err = errno;
+ PARA_ERROR_LOG("header write: %d/%d (%s)\n",
+ ret, header_len, ret < 0?
+ strerror(err) : "");
+ dccp_shutdown_client(dc);
+ continue;
+ }
+ ret = write_ok(dc->fd);
+ if (ret < 0) {
dccp_shutdown_client(dc);
continue;
}
- if (!_write_ok(dc->fd))
+ if (!ret)
continue;
}
// PARA_DEBUG_LOG("writing %d bytes to fd %d\n", len, dc->fd);
return 1;
}
-static int write_ok(int fd)
-{
- struct timeval tv = {0, 0};
- fd_set wfds;
- int ret;
-again:
- FD_ZERO(&wfds);
- FD_SET(fd, &wfds);
- ret = select(fd + 1, NULL, &wfds, NULL, &tv);
- if (ret < 0 && errno == EINTR)
- goto again;
- if (ret < 0)
- ret = -E_WRITE_OK;
- return ret;
-}
-
-
static int send_queued_packets(struct http_client *hc)
{
int ret;
list_for_each_entry_safe(qp, tmp, &hc->packet_queue, node) {
ret = write_ok(hc->fd);
if (ret <= 0)
- return ret;
+ return ret? -E_WRITE_OK : 0;
ret = write(hc->fd, qp->packet, qp->len);
if (ret < 0)
return ret;
int (*client_cmds[NUM_SENDER_CMDS])(struct sender_command_data*);
};
+/**
+ * check a file descriptor for writability
+ *
+ * \param fd the file desctiptor
+ *
+ * \return positive if fd is ready for writing, zero if it isn't, negative if
+ * an error occured.
+ */
-
-static inline int _write_ok(int fd)
+static inline int write_ok(int fd)
{
struct timeval tv = {0, 0};
fd_set wfds;
ret = select(fd + 1, NULL, &wfds, NULL, &tv);
if (ret < 0 && errno == EINTR)
goto again;
- if (ret < 0)
- ret = 0;
return ret;
}
-