int afdt_create_client( const char* fname, struct event_base* eb, const uint8_t* request, uint32_t request_length, afdt_response_handler_t response_handler, afdt_error_handler_t error_handler, const struct timeval* timeout, void* userdata) { int ret; struct afdt_error_t err = AFDT_ERROR_T_INIT; err.phase = AFDT_CREATE_CLIENT; struct ev_arg* ev_userdata = malloc(sizeof(*ev_userdata)); if (ev_userdata == NULL) { set_error(&err, AFDT_MALLOC, ""); error_handler(&err, userdata); return -1; } ev_userdata->eb = eb; ev_userdata->request_handler = NULL; ev_userdata->response_handler = response_handler; ev_userdata->post_handler = NULL; ev_userdata->error_handler = error_handler; ev_userdata->afdt_userdata = userdata; ret = afdt_connect(fname, &err); if (ret < 0) { goto socket_failed; } int connfd = ret; ret = afdt_send_plain_msg(connfd, request, request_length, &err); if (ret < 0) { goto write_failed; } enum afdt_operation err_op = AFDT_NO_OPERATION; event_set(&ev_userdata->ev, connfd, EV_READ, client_handle_read, ev_userdata); ret = event_bsa(eb, &ev_userdata->ev, timeout, &err_op); if (ret < 0) { set_error(&err, err_op, ""); goto event_failed; } return 0; int errno_save; write_failed: event_failed: errno_save = errno; close(connfd); errno = errno_save; socket_failed: error_handler(&err, userdata); free(ev_userdata); return ret; }
static void send_raw(int afdt_fd, const void* data, uint32_t len) { afdt_error_t err = AFDT_ERROR_T_INIT; while (len > 0) { auto l = std::min<uint32_t>(len, AFDT_MSGLEN); if (afdt_send_plain_msg(afdt_fd, (uint8_t*)data, l, &err) < 0) { throw Exception("Failed in afdt_send: %s", err.message && err.message[0] ? err.message : folly::errnoStr(errno).c_str()); } len -= l; data = (char*)data + l; } }