X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=dccp_send.c;h=02e60f44c680a0406826a3439543b1b389bbb456;hb=c568930c77d134f09c7a0aa59cb0622ae35fb7cb;hp=fd0cbf12f1d5ea3899636b1deaa0c62b5f95d5e9;hpb=c8862b9e246b4ef6ff1fe103946e18cf2537ecde;p=paraslash.git diff --git a/dccp_send.c b/dccp_send.c index fd0cbf12..02e60f44 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -63,23 +63,24 @@ static void dccp_pre_select( int *max_fileno, fd_set *rfds, static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) { struct dccp_client *dc; - int ret; + int ret, fd; - if (!FD_ISSET(listen_fd, rfds)) + if (listen_fd < 0 || !FD_ISSET(listen_fd, rfds)) return; ret = para_accept(listen_fd, NULL, 0); if (ret < 0) { PARA_ERROR_LOG("%s\n", para_strerror(-ret)); return; } + fd = ret; /* * Bypass unused CCID paths: the sender does not receive application data * from the client; by shutting down this unused communication path we can * reduce processing costs a bit. See analogous comment in dccp_recv.c. */ - if (shutdown(ret, SHUT_RD) < 0) { + if (shutdown(fd, SHUT_RD) < 0) { PARA_ERROR_LOG("shutdown(SHUT_RD): %s\n", strerror(errno)); - return; + goto err; } dc = para_calloc(sizeof(struct dccp_client)); dc->fd = ret; @@ -89,6 +90,9 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) add_close_on_fork_list(dc->fd); mark_fd_nonblocking(dc->fd); dc->cq = cq_new(DCCP_MAX_PENDING_BYTES); + return; +err: + close(fd); } static int dccp_open(void) @@ -98,8 +102,12 @@ static int dccp_open(void) if (ret < 0) return ret; listen_fd = ret; + ret = mark_fd_nonblocking(listen_fd); + if (ret < 0) { + PARA_EMERG_LOG("%s\n", para_strerror(-ret)); + exit(EXIT_FAILURE); + } add_close_on_fork_list(listen_fd); - mark_fd_nonblocking(listen_fd); return 1; } @@ -262,9 +270,6 @@ void dccp_send_init(struct sender *s) s->client_cmds[SENDER_DELETE] = NULL; self = s; ret = dccp_open(); - if (ret < 0) { + if (ret < 0) PARA_ERROR_LOG("%s\n", para_strerror(-ret)); - s->status = SENDER_OFF; - } else - s->status = SENDER_ON; }