Пример #1
0
INTERPOSE (recvfrom, ssize_t, int sockfd, void *buf, size_t len,
           int flags, struct sockaddr * src_addr, socklen_t * addrlen)
{
  ssize_t ret;
  v4v_addr_t peer = { 0 };

  CHECK_INTERPOSE (recvfrom);

  if (!is_our_fd (sockfd))
    return orig_recvfrom (sockfd, buf, len, flags, src_addr, addrlen);

  ret = v4v_recvfrom (sockfd, buf, len, flags, &peer);

  if (is_our_af (sockfd))
    {
      v4v_map_v4va_to_sxenv4v (src_addr, addrlen, &peer);
    }
  else
    {
      v4v_map_v4va_to_sin (src_addr, addrlen, &peer);
    }

  return ret;
}
Пример #2
0
int main(int const argc, char const* const* argv)
{
    openlog(NULL, LOG_NDELAY, LOG_DAEMON);

    PT_LOG("starting %s\n", argv[0]);

    memset(&g_hs, 0, sizeof(g_hs));

    if (argc != 3) {
        PT_LOG("wrong syntax: should be %s <target_id> <stubdom_id>", argv[0]);
        return -1;
    }

    g_hs.stubdom_id = atoi(argv[2]);

    if (g_hs.stubdom_id <= 0) {
        PT_LOG("bad stubdom id (%d)", g_hs.stubdom_id);
        return -1;
    }

    signal(SIGINT, signal_handler);

    if (init_helper_state(&g_hs) != 0) {
        PT_LOG("failed to init helper!\n");
        return -1;
    }

    while (!pending_exit) {
        int ret;
        uint8_t io_buf[MAX_V4V_MSG_SIZE] = {0,};

        PT_DEBUG("wait for command from stubdom (%d)", g_hs.stubdom_id);

        /* updates global remote_addr on per-packet basis */
        ret = v4v_recvfrom(g_hs.v4v_fd, io_buf, sizeof(io_buf),
                           0, &g_hs.remote_addr);

        if (ret < 0) {
            PT_LOG("v4v_recvfrom failed!\n");
            break;
        }

        switch (io_buf[0]) {
            case ATAPI_PTV4V_OPEN:
                PT_LOG("ATAPI_PTV4V_OPEN\n");
                ret = atapi_ptv4v_open(&g_hs, io_buf, ret);
                break;
            case ATAPI_PTV4V_SG_IO:
                PT_DEBUG("ATAPI_PTV4V_SG_IO\n");
                ret = atapi_ptv4v_sg_io(&g_hs, io_buf, ret);
                break;
            case ATAPI_PTV4V_SG_GET_RESERVED_SIZE:
                PT_LOG("ATAPI_PTV4V_SG_GET_RESERVED_SIZE\n");
                ret = atapi_ptv4v_sg_get_reserved_size(&g_hs, io_buf, ret);
                break;
            case ATAPI_PTV4V_ACQUIRE_LOCK:
                PT_LOG("ATAPI_PTV4V_ACQUIRE_LOCK\n");
                ret = atapi_ptv4v_acquire_lock(&g_hs, io_buf, ret);
                break;
            case ATAPI_PTV4V_RELEASE_LOCK:
                PT_LOG("ATAPI_PTV4V_RELEASE_LOCK\n");
                ret = atapi_ptv4v_release_lock(&g_hs, io_buf, ret);
                break;
            default:
                PT_LOG("bad command = %d", io_buf[0]);
                ret = -1;
                break;
        }

        if (ret < 0) {
            PT_LOG("command failed!\n");
            break;
        }
    }

    PT_LOG("exiting...\n");
    exit_cleanup(0);
    return 0;
}