From mboxrd@z Thu Jan 1 00:00:00 1970 From: pcaulfield@sourceware.org Date: 14 Sep 2006 13:01:08 -0000 Subject: [Cluster-devel] cluster/cman/daemon daemon.c Message-ID: <20060914130108.29764.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: pcaulfield at sourceware.org 2006-09-14 13:01:06 Modified files: cman/daemon : daemon.c Log message: Cope with short writes to the cman socket. bz#206093 Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/daemon/daemon.c.diff?cvsroot=cluster&r1=1.31&r2=1.32 --- cluster/cman/daemon/daemon.c 2006/08/17 13:22:39 1.31 +++ cluster/cman/daemon/daemon.c 2006/09/14 13:01:06 1.32 @@ -44,6 +44,7 @@ struct queued_reply { struct list list; + int offset; char buf[1]; }; @@ -66,7 +67,8 @@ P_DAEMON("sending reply %x to fd %d\n", msg->command, con->fd); ret = send(con->fd, (char *)msg, msg->length, MSG_DONTWAIT); - if (ret == -1 && errno == EAGAIN) { + if ((ret > 0 && ret != msg->length) || + (ret == -1 && errno == EAGAIN)) { /* Queue it */ struct queued_reply *qm = malloc(sizeof(struct queued_reply) + msg->length); if (!qm) @@ -75,6 +77,10 @@ return -1; } memcpy(qm->buf, msg, msg->length); + if (ret > 0) + qm->offset = ret; + else + qm->offset = 0; list_add(&con->write_msgs, &qm->list); P_DAEMON("queued last message\n"); poll_dispatch_modify(ais_poll_handle, con->fd, POLLIN | POLLOUT, process_client); @@ -108,14 +114,16 @@ list_iterate_safe(qmh, tmp, &con->write_msgs) { qm = list_item(qmh, struct queued_reply); msg = (struct sock_header *)qm->buf; - ret = send(con->fd, qm->buf, msg->length, MSG_DONTWAIT); - if (ret == msg->length) + ret = send(con->fd, qm->buf + qm->offset, msg->length - qm->offset, MSG_DONTWAIT); + if (ret == msg->length - qm->offset) { list_del(&qm->list); free(qm); } else { + if (ret > 0) + qm->offset += ret; break; } }