Marg_connect(const struct vev *e, int what) { struct vsb *vsb; struct m_addr *ma; assert(e == M_conn); (void)what; M_fd = VTCP_connected(M_fd); if (M_fd < 0) { MGT_complain(C_INFO, "Could not connect to CLI-master: %m"); ma = VTAILQ_FIRST(&m_addr_list); AN(ma); VTAILQ_REMOVE(&m_addr_list, ma, list); VTAILQ_INSERT_TAIL(&m_addr_list, ma, list); if (M_poll < 10) M_poll++; return (1); } vsb = sock_id("master", M_fd); mgt_cli_setup(M_fd, M_fd, 0, VSB_data(vsb), Marg_closer, NULL); VSB_destroy(&vsb); M_poll = 1; return (1); }
static int Marg_poker(const struct vev *e, int what) { struct vsb *vsb; int s, k; socklen_t l; (void)what; /* XXX: ??? */ if (e == M_conn) { /* Our connect(2) returned, check result */ l = sizeof k; AZ(getsockopt(M_fd, SOL_SOCKET, SO_ERROR, &k, &l)); if (k) { errno = k; syslog(LOG_INFO, "Could not connect to CLI-master: %m"); (void)close(M_fd); M_fd = -1; /* Try next address */ if (++M_nxt >= M_nta) { M_nxt = 0; if (M_poll < 10) M_poll *= 2; } return (1); } vsb = sock_id("master", M_fd); mgt_cli_setup(M_fd, M_fd, 0, VSB_data(vsb), Marg_closer, NULL); VSB_delete(vsb); M_poll = 1; return (1); } assert(e == M_poker); M_poker->timeout = M_poll; /* XXX nasty ? */ if (M_fd >= 0) return (0); /* Try to connect asynchronously */ s = VSS_connect(M_ta[M_nxt], 1); if (s < 0) return (0); mgt_got_fd(s); M_conn = vev_new(); AN(M_conn); M_conn->callback = Marg_poker; M_conn->name = "-M connector"; M_conn->fd_flags = EV_WR; M_conn->fd = s; M_fd = s; AZ(vev_add(mgt_evb, M_conn)); return (0); }
static int telnet_accept(const struct vev *ev, int what) { struct vsb *vsb; struct sockaddr_storage addr; socklen_t addrlen; int i; (void)what; addrlen = sizeof addr; i = accept(ev->fd, (void *)&addr, &addrlen); if (i < 0 && errno == EBADF) return (1); if (i < 0) return (0); MCH_TrackHighFd(i); vsb = sock_id("telnet", i); mgt_cli_setup(i, i, 0, VSB_data(vsb), NULL, NULL); VSB_destroy(&vsb); return (0); }
static int telnet_accept(const struct vev *ev, int what) { struct vsb *vsb; struct sockaddr_storage addr; socklen_t addrlen; struct telnet *tn; int i; (void)what; addrlen = sizeof addr; i = accept(ev->fd, (void *)&addr, &addrlen); if (i < 0 && errno == EBADF) return (1); if (i < 0) return (0); mgt_got_fd(i); tn = telnet_new(i); vsb = sock_id("telnet", i); mgt_cli_setup(i, i, 0, VSB_data(vsb), telnet_close, tn); VSB_delete(vsb); return (0); }