blob: c64913958fcb3431002f5078ba3c891409377ac7 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <errno.h>
#include <sys/socket.h>
#include <unistd.h>
#include <linux/vm_sockets.h>
#include <cstdlib>
#include <cstring>
#include <iostream>
static constexpr const char LOG_TAG[] = "VsockTest: ";
static constexpr int VSOCK_TEST_PORT = 4455;
static constexpr int VSOCK_TEST_CID = 42;
static constexpr const char VSOCK_TEST_MSG[] = "VsockTestMessage\n";
int VsockServer() {
int fd, ret;
struct sockaddr_vm sa = (struct sockaddr_vm) {
.svm_family = AF_VSOCK,
.svm_port = VSOCK_TEST_PORT,
.svm_cid = VSOCK_TEST_CID,
};
char buf[1024];
size_t buf_used = 0;
fd = socket(AF_VSOCK, SOCK_STREAM, 0);
if (fd < 0) {
std::cerr << "ERROR: socket: " << strerror(errno) << std::endl;
return EXIT_FAILURE;
}
std::cerr << LOG_TAG << "Establishing a vsock connection..." << std::endl;
ret = connect(fd, (struct sockaddr*)&sa, sizeof(sa));
if (ret != 0) {
std::cerr << "ERROR: connect: " << strerror(errno) << std::endl;
close(fd);
return EXIT_FAILURE;
}
std::cerr << LOG_TAG << "Reading message from guest..." << std::endl;
while (true) {
ssize_t n = read(fd, buf + buf_used, sizeof(buf) - buf_used);
if (n == 0) {
break;
} else if (n < 0) {
close(fd);
return EXIT_FAILURE;
}
buf_used += n;
}
close(fd);
std::cerr << LOG_TAG << "Message from guest: " << buf << std::endl;
if ((buf_used == sizeof(VSOCK_TEST_MSG)) &&
memcmp(VSOCK_TEST_MSG, buf, sizeof(VSOCK_TEST_MSG)) == 0) {
std::cerr << LOG_TAG << "Message match" << std::endl;
return EXIT_SUCCESS;
} else {
std::cerr << LOG_TAG << "Message mismatch" << std::endl;
return EXIT_FAILURE;
}
}