blob: f81db2ad366b08bd27c4ef099ca239e8835ca8a7 [file] [log] [blame]
/*
* Copyright 2022 Young Mei
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifdef __ZEPHYR__
#include <zephyr/kernel.h>
#endif
#include <cstdio>
#include <cstdlib>
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/protocol/TCompactProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/transport/TSSLServerSocket.h>
#include <thrift/transport/TSSLSocket.h>
#include <thrift/transport/TServerSocket.h>
#include "Hello.h"
#include "HelloHandler.h"
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
#ifndef IS_ENABLED
#define IS_ENABLED(flag) flag
#endif
#ifndef CONFIG_THRIFT_COMPACT_PROTOCOL
#define CONFIG_THRIFT_COMPACT_PROTOCOL 0
#endif
#ifndef CONFIG_THRIFT_SSL_SOCKET
#define CONFIG_THRIFT_SSL_SOCKET 0
#endif
#ifdef __ZEPHYR__
int main(void)
#else
int main(int argc, char **argv)
#endif
{
std::string my_addr;
#ifdef __ZEPHYR__
my_addr = CONFIG_NET_CONFIG_MY_IPV4_ADDR;
#else
if (IS_ENABLED(CONFIG_THRIFT_SSL_SOCKET)) {
if (argc != 5) {
printf("usage: %s <ip> <native-cert.pem> <native-key.pem> "
"<qemu-cert.pem>\n",
argv[0]);
return EXIT_FAILURE;
}
} else {
if (argc != 2) {
printf("usage: %s <ip>\n", argv[0]);
return EXIT_FAILURE;
}
}
my_addr = std::string(argv[1]);
#endif
const int port = 4242;
std::shared_ptr<TServerTransport> serverTransport;
std::shared_ptr<TTransportFactory> transportFactory;
std::shared_ptr<TProtocolFactory> protocolFactory;
std::shared_ptr<HelloHandler> handler(new HelloHandler());
std::shared_ptr<TProcessor> processor(new HelloProcessor(handler));
if (IS_ENABLED(CONFIG_THRIFT_SSL_SOCKET)) {
std::shared_ptr<TSSLSocketFactory> socketFactory(new TSSLSocketFactory());
socketFactory->server(true);
#ifdef __ZEPHYR__
static const char qemu_cert_pem[] = {
#include "qemu_cert.pem.inc"
};
static const char qemu_key_pem[] = {
#include "qemu_key.pem.inc"
};
static const char native_cert_pem[] = {
#include "native_cert.pem.inc"
};
socketFactory->loadCertificateFromBuffer(qemu_cert_pem);
socketFactory->loadPrivateKeyFromBuffer(qemu_key_pem);
socketFactory->loadTrustedCertificatesFromBuffer(native_cert_pem);
#else
socketFactory->loadCertificate(argv[2]);
socketFactory->loadPrivateKey(argv[3]);
socketFactory->loadTrustedCertificates(argv[4]);
#endif
serverTransport =
std::make_shared<TSSLServerSocket>("0.0.0.0", port, socketFactory);
} else {
serverTransport = std::make_shared<TServerSocket>(my_addr, port);
}
transportFactory = std::make_shared<TBufferedTransportFactory>();
if (IS_ENABLED(CONFIG_THRIFT_COMPACT_PROTOCOL)) {
protocolFactory = std::make_shared<TCompactProtocolFactory>();
} else {
protocolFactory = std::make_shared<TBinaryProtocolFactory>();
}
TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
try {
server.serve();
} catch (std::exception &e) {
printf("caught exception: %s\n", e.what());
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}