summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamey Sharp <jamey@minilop.net>2006-09-15 01:51:05 -0700
committerJamey Sharp <jamey@minilop.net>2006-09-21 15:35:01 -0700
commit2c8b5994b3fbba343199ef555594a32e29d8bcee (patch)
tree2c10b6567936765119190e429b09fbef650e397c
parent79e3227022ae3d66f9f3806d231fdeec2a06cc6b (diff)
Shut down the connection in all "fatal" error cases.
-rw-r--r--src/xcb_conn.c6
-rw-r--r--src/xcb_in.c18
-rw-r--r--src/xcb_out.c9
3 files changed, 32 insertions, 1 deletions
diff --git a/src/xcb_conn.c b/src/xcb_conn.c
index 29d91f4..de1f6e4 100644
--- a/src/xcb_conn.c
+++ b/src/xcb_conn.c
@@ -156,7 +156,10 @@ static int write_vec(XCBConnection *c, struct iovec **vector, int *count)
if(n < 0 && errno == EAGAIN)
return 1;
if(n <= 0)
+ {
+ _xcb_conn_shutdown(c);
return 0;
+ }
for(; *count; --*count, ++*vector)
{
@@ -280,7 +283,10 @@ int _xcb_conn_wait(XCBConnection *c, pthread_cond_t *cond, struct iovec **vector
ret = select(c->fd + 1, &rfds, &wfds, 0, 0);
} while (ret == -1 && errno == EINTR);
if (ret < 0)
+ {
+ _xcb_conn_shutdown(c);
ret = 0;
+ }
pthread_mutex_lock(&c->iolock);
if(ret)
diff --git a/src/xcb_in.c b/src/xcb_in.c
index d8b608a..2ac1e52 100644
--- a/src/xcb_in.c
+++ b/src/xcb_in.c
@@ -142,7 +142,10 @@ static int read_packet(XCBConnection *c)
buf = malloc(length + (genrep.response_type == XCBReply ? 0 : sizeof(CARD32)));
if(!buf)
+ {
+ _xcb_conn_shutdown(c);
return 0;
+ }
if(_xcb_in_read_block(c, buf, length) <= 0)
{
free(buf);
@@ -164,7 +167,10 @@ static int read_packet(XCBConnection *c)
reader_list *reader;
struct reply_list *cur = malloc(sizeof(struct reply_list));
if(!cur)
+ {
+ _xcb_conn_shutdown(c);
return 0;
+ }
cur->reply = buf;
cur->next = 0;
*c->in.current_reply_tail = cur;
@@ -187,6 +193,7 @@ static int read_packet(XCBConnection *c)
event = malloc(sizeof(struct event_list));
if(!event)
{
+ _xcb_conn_shutdown(c);
free(buf);
return 0;
}
@@ -486,7 +493,10 @@ int _xcb_in_expect_reply(XCBConnection *c, unsigned int request, enum workaround
pending_reply *pend = malloc(sizeof(pending_reply));
assert(workaround != WORKAROUND_NONE || flags != 0);
if(!pend)
+ {
+ _xcb_conn_shutdown(c);
return 0;
+ }
pend->request = request;
pend->workaround = workaround;
pend->flags = flags;
@@ -503,7 +513,10 @@ int _xcb_in_read(XCBConnection *c)
c->in.queue_len += n;
while(read_packet(c))
/* empty */;
- return (n > 0) || (n < 0 && errno == EAGAIN);
+ if((n > 0) || (n < 0 && errno == EAGAIN))
+ return 1;
+ _xcb_conn_shutdown(c);
+ return 0;
}
int _xcb_in_read_block(XCBConnection *c, void *buf, int len)
@@ -520,7 +533,10 @@ int _xcb_in_read_block(XCBConnection *c, void *buf, int len)
{
int ret = read_block(c->fd, (char *) buf + done, len - done);
if(ret <= 0)
+ {
+ _xcb_conn_shutdown(c);
return ret;
+ }
}
return len;
diff --git a/src/xcb_out.c b/src/xcb_out.c
index 91f7ea1..1b68215 100644
--- a/src/xcb_out.c
+++ b/src/xcb_out.c
@@ -112,7 +112,10 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c
{
const XCBQueryExtensionRep *extension = XCBGetExtensionData(c, req->ext);
if(!(extension && extension->present))
+ {
+ _xcb_conn_shutdown(c);
return 0;
+ }
((CARD8 *) vector[0].iov_base)[0] = extension->major_opcode;
((CARD8 *) vector[0].iov_base)[1] = req->opcode;
}
@@ -139,7 +142,10 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c
longlen = 0;
}
else if(longlen > XCBGetMaximumRequestLength(c))
+ {
+ _xcb_conn_shutdown(c);
return 0; /* server can't take this; maybe need BIGREQUESTS? */
+ }
/* set the length field. */
((CARD16 *) vector[0].iov_base)[1] = shortlen;
@@ -197,7 +203,10 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c
}
if(!write_block(c, vector, veclen))
+ {
+ _xcb_conn_shutdown(c);
request = 0;
+ }
pthread_mutex_unlock(&c->iolock);
return request;
}