This commit is contained in:
Baptiste Wicht 2016-09-17 19:24:58 +02:00
parent 19c9d44690
commit 09c6002bc1

View File

@ -8,11 +8,13 @@
#include "tlib/net.hpp" #include "tlib/net.hpp"
#include "tlib/malloc.hpp" #include "tlib/malloc.hpp"
tlib::packet::packet() : fd(0), payload(nullptr), index(0) { tlib::packet::packet()
: fd(0), payload(nullptr), index(0) {
//Nothing else to init //Nothing else to init
} }
tlib::packet::packet(packet&& rhs) : fd(rhs.fd), payload(rhs.payload), index(rhs.index) { tlib::packet::packet(packet&& rhs)
: fd(rhs.fd), payload(rhs.payload), index(rhs.index) {
rhs.payload = nullptr; rhs.payload = nullptr;
} }
@ -21,10 +23,10 @@ tlib::packet& tlib::packet::operator=(packet&& rhs) {
this->fd = rhs.fd; this->fd = rhs.fd;
this->payload = rhs.payload; this->payload = rhs.payload;
this->index = rhs.index; this->index = rhs.index;
rhs.payload = nullptr; rhs.payload = nullptr;
} }
return *this; return *this;
} }
@ -40,7 +42,7 @@ std::expected<size_t> tlib::socket_open(socket_domain domain, socket_type type,
: [fd] "=m"(fd) : [fd] "=m"(fd)
: [domain] "g"(static_cast<size_t>(domain)), [type] "g"(static_cast<size_t>(type)), [protocol] "g"(static_cast<size_t>(protocol)) : [domain] "g"(static_cast<size_t>(domain)), [type] "g"(static_cast<size_t>(type)), [protocol] "g"(static_cast<size_t>(protocol))
: "rax", "rbx", "rcx", "rdx"); : "rax", "rbx", "rcx", "rdx");
if (fd < 0) { if (fd < 0) {
return std::make_expected_from_error<size_t, size_t>(-fd); return std::make_expected_from_error<size_t, size_t>(-fd);
} else { } else {
@ -57,14 +59,14 @@ void tlib::socket_close(size_t fd) {
std::expected<tlib::packet> tlib::prepare_packet(size_t socket_fd, void* desc) { std::expected<tlib::packet> tlib::prepare_packet(size_t socket_fd, void* desc) {
auto buffer = malloc(2048); auto buffer = malloc(2048);
int64_t fd; int64_t fd;
uint64_t index; uint64_t index;
asm volatile("mov rax, 0x3002; mov rbx, %[socket]; mov rcx, %[desc]; mov rdx, %[buffer]; int 50; mov %[fd], rax; mov %[index], rbx;" asm volatile("mov rax, 0x3002; mov rbx, %[socket]; mov rcx, %[desc]; mov rdx, %[buffer]; int 50; mov %[fd], rax; mov %[index], rbx;"
: [fd] "=m"(fd), [index] "=m"(index) : [fd] "=m"(fd), [index] "=m"(index)
: [socket] "g"(socket_fd), [desc] "g"(reinterpret_cast<size_t>(desc)), [buffer] "g"(reinterpret_cast<size_t>(buffer)) : [socket] "g"(socket_fd), [desc] "g"(reinterpret_cast<size_t>(desc)), [buffer] "g"(reinterpret_cast<size_t>(buffer))
: "rax", "rbx", "rcx", "rdx"); : "rax", "rbx", "rcx", "rdx");
if (fd < 0) { if (fd < 0) {
free(buffer); free(buffer);
return std::make_expected_from_error<tlib::packet, size_t>(-fd); return std::make_expected_from_error<tlib::packet, size_t>(-fd);
@ -79,13 +81,13 @@ std::expected<tlib::packet> tlib::prepare_packet(size_t socket_fd, void* desc) {
std::expected<void> tlib::finalize_packet(size_t socket_fd, const tlib::packet& p) { std::expected<void> tlib::finalize_packet(size_t socket_fd, const tlib::packet& p) {
auto packet_fd = p.fd; auto packet_fd = p.fd;
int64_t code; int64_t code;
asm volatile("mov rax, 0x3003; mov rbx, %[socket]; mov rcx, %[packet]; int 50; mov %[code], rax" asm volatile("mov rax, 0x3003; mov rbx, %[socket]; mov rcx, %[packet]; int 50; mov %[code], rax"
: [code] "=m"(code) : [code] "=m"(code)
: [socket] "g"(socket_fd), [packet] "g"(packet_fd) : [socket] "g"(socket_fd), [packet] "g"(packet_fd)
: "rax", "rbx", "rcx"); : "rax", "rbx", "rcx");
if (code < 0) { if (code < 0) {
return std::make_expected_from_error<void, size_t>(-code); return std::make_expected_from_error<void, size_t>(-code);
} else { } else {
@ -99,7 +101,7 @@ std::expected<void> tlib::listen(size_t socket_fd, bool l) {
: [code] "=m"(code) : [code] "=m"(code)
: [socket] "g"(socket_fd), [listen] "g"(size_t(l)) : [socket] "g"(socket_fd), [listen] "g"(size_t(l))
: "rax", "rbx", "rcx"); : "rax", "rbx", "rcx");
if (code < 0) { if (code < 0) {
return std::make_expected_from_error<void, size_t>(-code); return std::make_expected_from_error<void, size_t>(-code);
} else { } else {
@ -113,7 +115,7 @@ std::expected<size_t> tlib::client_bind(size_t socket_fd) {
: [code] "=m"(code) : [code] "=m"(code)
: [socket] "g"(socket_fd) : [socket] "g"(socket_fd)
: "rax", "rbx", "rcx"); : "rax", "rbx", "rcx");
if (code < 0) { if (code < 0) {
return std::make_unexpected<size_t, size_t>(-code); return std::make_unexpected<size_t, size_t>(-code);
} else { } else {
@ -125,9 +127,9 @@ std::expected<size_t> tlib::connect(size_t socket_fd, tlib::ip::address server,
int64_t code; int64_t code;
asm volatile("mov rax, 0x3008; mov rbx, %[socket]; mov rcx, %[ip]; mov rdx, %[port]; int 50; mov %[code], rax" asm volatile("mov rax, 0x3008; mov rbx, %[socket]; mov rcx, %[ip]; mov rdx, %[port]; int 50; mov %[code], rax"
: [code] "=m"(code) : [code] "=m"(code)
: [socket] "g" (socket_fd), [ip] "g" (size_t(server.raw_address)), [port] "g" (port) : [socket] "g"(socket_fd), [ip] "g"(size_t(server.raw_address)), [port] "g"(port)
: "rax", "rbx", "rcx", "rdx"); : "rax", "rbx", "rcx", "rdx");
if (code < 0) { if (code < 0) {
return std::make_unexpected<size_t, size_t>(-code); return std::make_unexpected<size_t, size_t>(-code);
} else { } else {
@ -139,9 +141,9 @@ std::expected<void> tlib::disconnect(size_t socket_fd) {
int64_t code; int64_t code;
asm volatile("mov rax, 0x3009; mov rbx, %[socket]; int 50; mov %[code], rax" asm volatile("mov rax, 0x3009; mov rbx, %[socket]; int 50; mov %[code], rax"
: [code] "=m"(code) : [code] "=m"(code)
: [socket] "g" (socket_fd) : [socket] "g"(socket_fd)
: "rax", "rbx"); : "rax", "rbx");
if (code < 0) { if (code < 0) {
return std::make_unexpected<void, size_t>(-code); return std::make_unexpected<void, size_t>(-code);
} else { } else {
@ -151,14 +153,14 @@ std::expected<void> tlib::disconnect(size_t socket_fd) {
std::expected<tlib::packet> tlib::wait_for_packet(size_t socket_fd) { std::expected<tlib::packet> tlib::wait_for_packet(size_t socket_fd) {
auto buffer = malloc(2048); auto buffer = malloc(2048);
int64_t code; int64_t code;
uint64_t payload; uint64_t payload;
asm volatile("mov rax, 0x3005; mov rbx, %[socket]; mov rcx, %[buffer]; int 50; mov %[code], rax; mov %[payload], rbx;" asm volatile("mov rax, 0x3005; mov rbx, %[socket]; mov rcx, %[buffer]; int 50; mov %[code], rax; mov %[payload], rbx;"
: [payload] "=m"(payload), [code] "=m"(code) : [payload] "=m"(payload), [code] "=m"(code)
: [socket] "g"(socket_fd), [buffer] "g"(reinterpret_cast<size_t>(buffer)) : [socket] "g"(socket_fd), [buffer] "g"(reinterpret_cast<size_t>(buffer))
: "rax", "rbx", "rcx"); : "rax", "rbx", "rcx");
if (code < 0) { if (code < 0) {
free(buffer); free(buffer);
return std::make_expected_from_error<packet, size_t>(-code); return std::make_expected_from_error<packet, size_t>(-code);
@ -172,14 +174,14 @@ std::expected<tlib::packet> tlib::wait_for_packet(size_t socket_fd) {
std::expected<tlib::packet> tlib::wait_for_packet(size_t socket_fd, size_t ms) { std::expected<tlib::packet> tlib::wait_for_packet(size_t socket_fd, size_t ms) {
auto buffer = malloc(2048); auto buffer = malloc(2048);
int64_t code; int64_t code;
uint64_t payload; uint64_t payload;
asm volatile("mov rax, 0x3006; mov rbx, %[socket]; mov rcx, %[buffer]; mov rdx, %[ms]; int 50; mov %[code], rax; mov %[payload], rbx;" asm volatile("mov rax, 0x3006; mov rbx, %[socket]; mov rcx, %[buffer]; mov rdx, %[ms]; int 50; mov %[code], rax; mov %[payload], rbx;"
: [payload] "=m"(payload), [code] "=m"(code) : [payload] "=m"(payload), [code] "=m"(code)
: [socket] "g"(socket_fd), [buffer] "g"(reinterpret_cast<size_t>(buffer)), [ms] "g"(ms) : [socket] "g"(socket_fd), [buffer] "g"(reinterpret_cast<size_t>(buffer)), [ms] "g"(ms)
: "rax", "rbx", "rcx"); : "rax", "rbx", "rcx");
if (code < 0) { if (code < 0) {
free(buffer); free(buffer);
return std::make_expected_from_error<packet, size_t>(-code); return std::make_expected_from_error<packet, size_t>(-code);
@ -192,23 +194,23 @@ std::expected<tlib::packet> tlib::wait_for_packet(size_t socket_fd, size_t ms) {
} }
tlib::socket::socket(socket_domain domain, socket_type type, socket_protocol protocol) tlib::socket::socket(socket_domain domain, socket_type type, socket_protocol protocol)
: domain(domain), type(type), protocol(protocol), fd(0), error_code(0) { : domain(domain), type(type), protocol(protocol), fd(0), error_code(0) {
auto open_status = tlib::socket_open(domain, type, protocol); auto open_status = tlib::socket_open(domain, type, protocol);
if (open_status.valid()) { if (open_status.valid()) {
fd = *open_status; fd = *open_status;
} else { } else {
error_code = open_status.error(); error_code = open_status.error();
} }
local_port = 0; local_port = 0;
} }
tlib::socket::~socket() { tlib::socket::~socket() {
if(connected()){ if (connected()) {
disconnect(); disconnect();
} }
if (fd) { if (fd) {
tlib::socket_close(fd); tlib::socket_close(fd);
} }
@ -242,7 +244,7 @@ void tlib::socket::listen(bool l) {
if (!good() || !open()) { if (!good() || !open()) {
return; return;
} }
auto status = tlib::listen(fd, l); auto status = tlib::listen(fd, l);
if (!status) { if (!status) {
error_code = status.error(); error_code = status.error();
@ -253,12 +255,12 @@ void tlib::socket::client_bind() {
if (!good() || !open()) { if (!good() || !open()) {
return; return;
} }
auto status = tlib::client_bind(fd); auto status = tlib::client_bind(fd);
if (!status) { if (!status) {
error_code = status.error(); error_code = status.error();
} }
local_port = *status; local_port = *status;
} }
@ -266,7 +268,7 @@ void tlib::socket::connect(tlib::ip::address server, size_t port) {
if (!good() || !open()) { if (!good() || !open()) {
return; return;
} }
auto status = tlib::connect(fd, server, port); auto status = tlib::connect(fd, server, port);
if (status) { if (status) {
_connected = true; _connected = true;
@ -280,14 +282,14 @@ void tlib::socket::disconnect() {
if (!good() || !open()) { if (!good() || !open()) {
return; return;
} }
if(!connected()){ if (!connected()) {
return; return;
} }
auto status = tlib::disconnect(fd); auto status = tlib::disconnect(fd);
if(status){ if (status) {
_connected = false; _connected = false;
} else { } else {
error_code = status.error(); error_code = status.error();
@ -298,9 +300,9 @@ tlib::packet tlib::socket::prepare_packet(void* desc) {
if (!good() || !open()) { if (!good() || !open()) {
return tlib::packet(); return tlib::packet();
} }
auto packet = tlib::prepare_packet(fd, desc); auto packet = tlib::prepare_packet(fd, desc);
if (!packet) { if (!packet) {
error_code = packet.error(); error_code = packet.error();
return tlib::packet(); return tlib::packet();
@ -313,7 +315,7 @@ void tlib::socket::finalize_packet(const tlib::packet& p) {
if (!good() || !open()) { if (!good() || !open()) {
return; return;
} }
auto status = tlib::finalize_packet(fd, p); auto status = tlib::finalize_packet(fd, p);
if (!status) { if (!status) {
error_code = status.error(); error_code = status.error();
@ -324,9 +326,9 @@ tlib::packet tlib::socket::wait_for_packet() {
if (!good() || !open()) { if (!good() || !open()) {
return tlib::packet(); return tlib::packet();
} }
auto p = tlib::wait_for_packet(fd); auto p = tlib::wait_for_packet(fd);
if (!p) { if (!p) {
error_code = p.error(); error_code = p.error();
return tlib::packet(); return tlib::packet();
@ -339,9 +341,9 @@ tlib::packet tlib::socket::wait_for_packet(size_t ms) {
if (!good() || !open()) { if (!good() || !open()) {
return tlib::packet(); return tlib::packet();
} }
auto p = tlib::wait_for_packet(fd, ms); auto p = tlib::wait_for_packet(fd, ms);
if (!p) { if (!p) {
error_code = p.error(); error_code = p.error();
return tlib::packet(); return tlib::packet();