const char * wait_status_string (struct context *c, struct gc_arena *gc) { struct buffer out = alloc_buf_gc (64, gc); buf_printf (&out, "I/O WAIT %s|%s|%s|%s %s", tun_stat (c->c1.tuntap, EVENT_READ, gc), tun_stat (c->c1.tuntap, EVENT_WRITE, gc), socket_stat (c->c2.link_socket, EVENT_READ, gc), socket_stat (c->c2.link_socket, EVENT_WRITE, gc), tv_string (&c->c2.timeval, gc)); return BSTR (&out); }
/* * 扫描 socket */ static int socket_scan(void *ctx, file_t *file, int flags) { privinfo_t *priv = ctx; int ret; int readable; int writeable; int error; if (priv == NULL) { seterrno(EINVAL); return -1; } extern int socket_stat(int sock_fd, int *readable, int *writeable, int *error); ret = socket_stat(priv->sock_fd, &readable, &writeable, &error); if (ret < 0) { seterrno(EINVAL); return -1; } ret = 0; if (readable && flags & VFS_FILE_READABLE) { ret |= VFS_FILE_READABLE; } if (writeable && flags & VFS_FILE_WRITEABLE) { ret |= VFS_FILE_WRITEABLE; } if (error && flags & VFS_FILE_ERROR) { ret |= VFS_FILE_ERROR; } return ret; }