static void cli_read_cb(int sd, short type, void *arg) { struct cli *cli = arg; uint32_t cmdlen; uint8_t *msg = NULL; if (read_fully(sd, &cmdlen, sizeof(cmdlen)) != 0) goto error; msg = btpd_malloc(cmdlen); if (read_fully(sd, msg, cmdlen) != 0) goto error; if (!(benc_validate(msg, cmdlen) == 0 && benc_islst(msg) && benc_first(msg) != NULL && benc_isstr(benc_first(msg)))) goto error; if (cmd_dispatch(cli, msg) != 0) goto error; free(msg); return; error: btpd_ev_del(&cli->read); close(cli->sd); free(cli); if (msg != NULL) free(msg); }
static void nc_write_cb(int sd, short type, void *arg) { struct nameconn *nc = arg; int error; socklen_t errsiz = sizeof(int); if (getsockopt(nc->sd, SOL_SOCKET, SO_ERROR, &error, &errsiz) < 0) btpd_err("getsockopt error (%s).\r\n", strerror(errno)); if (error == 0) { btpd_ev_del(&nc->write_ev); nc_done(nc, 0); } else { btpd_ev_del(&nc->write_ev); closesocket(nc->sd); nc->ai_cur = nc->ai_cur->ai_next; nc_connect(nc); } }
void btpd_name_connect_cancel(struct nameconn *nc) { if (nc->state == NC_AI) btpd_addrinfo_cancel(nc->ai_handle); else { btpd_ev_del(&nc->write_ev); closesocket(nc->sd); } nc_free(nc); }
static void httptr_free(struct httptr_req *treq) { if (treq->sd != -1) { btpd_ev_del(&treq->ioev); close(treq->sd); } btpd_timer_del(&treq->timer); iobuf_free(&treq->buf); free(treq); }
void ipc_shutdown(void) { btpd_ev_del(&m_cli_incoming); close(m_listen_sd); }