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; }
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; }