{
struct private_dccp_recv_data *pdd;
struct dccp_recv_args_info *conf = rn->conf;
- int ret = makesock(AF_UNSPEC, IPPROTO_DCCP, 0, conf->host_arg, conf->port_arg);
+ int fd, ret = makesock(AF_UNSPEC, IPPROTO_DCCP, 0, conf->host_arg,
+ conf->port_arg);
if (ret < 0)
return ret;
+ fd = ret;
/*
* Disable unused CCIDs: the receiver does not send any application
* data to the server. By shutting down this unused path we reduce
* internal processing costs, as the unused CCIDs (in the kernel) are
* then bypassed.
*/
- if (shutdown(ret, SHUT_WR) < 0)
- return -ERRNO_TO_PARA_ERROR(errno);
+ if (shutdown(fd, SHUT_WR) < 0) {
+ ret = -ERRNO_TO_PARA_ERROR(errno);
+ goto err;
+ }
rn->buf = para_calloc(DCCP_BUFSIZE);
rn->private_data = pdd = para_calloc(sizeof(struct private_dccp_recv_data));
pdd->fd = ret;
mark_fd_nonblocking(pdd->fd);
return 1;
+err:
+ close(fd);
+ return ret;
}
static void dccp_shutdown(void)