Пример #1
0
int close(int fd)
{
    int ret;
    struct fdtab_entry *e = fdtab_get(fd);
    if (e->type == FDTAB_TYPE_AVAILABLE) {
        return -1;
    }

    if (e->type == FDTAB_TYPE_LWIP_SOCKET) {
        if(e->inherited) {
            // Perform shallow close on lwip so that it will not terminate
            // the TCP session
            printf("close: Inherited socket, not closing completely\n");
            ret = 0;
        } else {
            ret = lwip_close(e->fd);
            if(ret < 0) {
                POSIXCOMPAT_DEBUG("[%d]error in lwip_close\n",
                        disp_get_domain_id());
                return -1;
            }
        }
        fdtab_free(fd);
    } else {
        ret = vfsfd_close(fd);
    }

    return ret;
}
Пример #2
0
int close(int fd)
{
    int ret;
    struct fdtab_entry *e = fdtab_get(fd);
    if (e->type == FDTAB_TYPE_AVAILABLE) {
        return -1;
    }

    // Might need to remove from epoll list
    if(e->epoll_fd != -1) {
        ret = epoll_ctl(e->epoll_fd, EPOLL_CTL_DEL, fd, NULL);
        assert(ret == 0);
    }

    switch(e->type) {
    case FDTAB_TYPE_LWIP_SOCKET:
        if (e->inherited) {
            // Perform shallow close on lwip so that it will not terminate
            // the TCP session
            printf("close: Inherited socket, not closing completely\n");
            ret = 0;
        } else {
            ret = lwip_close(e->fd);
            if(ret < 0) {
                POSIXCOMPAT_DEBUG("[%d]error in lwip_close\n",
                                  disp_get_domain_id());
                return -1;
            }
        }
        fdtab_free(fd);
        break;

    case FDTAB_TYPE_PTM:
        ret = ptm_close(fd);
        break;

    case FDTAB_TYPE_PTS:
        ret = pts_close(fd);
        break;

    default:
        ret = vfsfd_close(fd);
    }

    return ret;
}