From 6817a8f0c4f649168a43fc347179771600a908fc Mon Sep 17 00:00:00 2001 From: Andre Date: Fri, 24 Mar 2006 20:05:34 +0100 Subject: [PATCH 1/1] kill duplicate write_ok() use the generic inline function from send.h instead and shutdown the connection if an error occured in write_ok(). --- dccp_send.c | 18 ++++++++++++++++-- http_send.c | 19 +------------------ send.h | 14 +++++++++----- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/dccp_send.c b/dccp_send.c index 5478c1d1..c7805f73 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -122,7 +122,12 @@ static void dccp_send(__unused struct audio_format *af, 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); @@ -130,10 +135,19 @@ static void dccp_send(__unused struct audio_format *af, 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); diff --git a/http_send.c b/http_send.c index c574ba3c..73d2fb0d 100644 --- a/http_send.c +++ b/http_send.c @@ -178,23 +178,6 @@ static int queue_packet(struct http_client *hc, const char *buf, size_t len) 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; @@ -205,7 +188,7 @@ static int send_queued_packets(struct http_client *hc) 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; diff --git a/send.h b/send.h index 75c13731..3aebb160 100644 --- a/send.h +++ b/send.h @@ -85,9 +85,16 @@ struct sender { 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; @@ -98,8 +105,5 @@ again: ret = select(fd + 1, NULL, &wfds, NULL, &tv); if (ret < 0 && errno == EINTR) goto again; - if (ret < 0) - ret = 0; return ret; } - -- 2.39.2