static int recv_fd(int afdt_fd) { int fd; afdt_error_t err; uint8_t afdt_buf[AFDT_MSGLEN]; uint32_t afdt_len; if (afdt_recv_fd_msg(afdt_fd, afdt_buf, &afdt_len, &fd, &err) < 0) { return -1; } return fd; }
int recv_fd(int afdt_fd) { int fd; afdt_error_t err = AFDT_ERROR_T_INIT; uint32_t afdt_len = 0; errno = 0; if (afdt_recv_fd_msg(afdt_fd, nullptr, &afdt_len, &fd, &err) < 0) { if (errno == 0) { // Set non-empty errno if afdt_send_fd_msg doesn't set one on error errno = EPROTO; } return -1; } return fd; }
static int recv_fd(int afdt_fd) { int fd; afdt_error_t err; uint8_t afdt_buf[AFDT_MSGLEN]; uint32_t afdt_len; errno = 0; if (afdt_recv_fd_msg(afdt_fd, afdt_buf, &afdt_len, &fd, &err) < 0) { if (errno == 0) { // Set non-empty errno if afdt_send_fd_msg doesn't set one on error errno = EPROTO; } return -1; } return fd; }
// libevent callback for a client when the server socket is readable. // Receives the response and calls the response handler. static void client_handle_read(int connfd, short event_type, void* arg) { int ret; struct ev_arg* ev_userdata = arg; struct afdt_error_t err = AFDT_ERROR_T_INIT; err.phase = AFDT_HANDLE_RESPONSE; if (event_type == EV_TIMEOUT) { errno = 0; set_error(&err, AFDT_TIMEOUT, ""); ev_userdata->error_handler(&err, ev_userdata->afdt_userdata); goto drop_conn; } assert(event_type == EV_READ); uint8_t res_buf[AFDT_MSGLEN]; uint32_t res_len = sizeof(res_buf); int got_fd; ret = afdt_recv_fd_msg(connfd, res_buf, &res_len, &got_fd, &err); if (ret < 0) { ev_userdata->error_handler(&err, ev_userdata->afdt_userdata); } else { ev_userdata->response_handler( res_buf, res_len, got_fd, ev_userdata->afdt_userdata); } drop_conn: close(connfd); free(arg); }