예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
// 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);
}