ioq_init(&res->recv, 1024);
flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags|O_NONBLOCK);
+ flags = fcntl(fd, F_GETFD);
+ fcntl(fd, F_SETFD, flags|FD_CLOEXEC);
engine->add(res);
return res;
}
static void
ioset_try_write(struct io_fd *fd) {
int res;
- unsigned int req = ioq_get_avail(&fd->send);
+ unsigned int req;
+
+ req = ioq_get_avail(&fd->send);
res = write(fd->fd, fd->send.buf+fd->send.get, req);
if (res < 0) {
switch (errno) {
active_fd = NULL;
if (fdp->destroy_cb)
fdp->destroy_cb(fdp);
- if (fdp->send.get != fdp->send.put) {
+ if (fdp->send.get != fdp->send.put && (os_close & 2)) {
int flags;
flags = fcntl(fdp->fd, F_GETFL);
}
free(fdp->send.buf);
free(fdp->recv.buf);
- if (os_close)
+ if (os_close & 1)
close(fdp->fd);
engine->remove(fdp);
free(fdp);