Fix addresses, get dill, etc.

This commit is contained in:
Tobe O 2019-04-30 21:33:46 -04:00
parent 61fdef1df9
commit 8a1b95c352
11 changed files with 185 additions and 33 deletions

View file

@ -14,6 +14,13 @@ clean:
find . -type f -name '*.obj' -delete find . -type f -name '*.obj' -delete
find . -type f -name '*.so' -delete find . -type f -name '*.so' -delete
find . -type f -name '*.dylib' -delete find . -type f -name '*.dylib' -delete
find . -type f -name '*.dill' -delete
%-run: % example/main.dart
dart example/main.dill
example/main.dill: ./**/*.dart
dart --snapshot="$@" example/main.dart
mac: libangel_wings.dylib mac: libangel_wings.dylib

BIN
example/main.dill Normal file

Binary file not shown.

View file

@ -39,6 +39,8 @@ Dart_NativeFunction ResolveName(Dart_Handle name, int argc, bool *auto_setup_sco
result = Dart_WingsSocket_bindIPv4; result = Dart_WingsSocket_bindIPv4;
if (strcmp("Dart_WingsSocket_bindIPv6", cname) == 0) if (strcmp("Dart_WingsSocket_bindIPv6", cname) == 0)
result = Dart_WingsSocket_bindIPv6; result = Dart_WingsSocket_bindIPv6;
if (strcmp("Dart_WingsSocket_getAddress", cname) == 0)
result = Dart_WingsSocket_getAddress;
if (strcmp("Dart_WingsSocket_getPort", cname) == 0) if (strcmp("Dart_WingsSocket_getPort", cname) == 0)
result = Dart_WingsSocket_getPort; result = Dart_WingsSocket_getPort;
if (strcmp("Dart_WingsSocket_write", cname) == 0) if (strcmp("Dart_WingsSocket_write", cname) == 0)

View file

@ -8,8 +8,10 @@
Dart_NativeFunction ResolveName(Dart_Handle name, int argc, bool *auto_setup_scope); Dart_NativeFunction ResolveName(Dart_Handle name, int argc, bool *auto_setup_scope);
Dart_Handle HandleError(Dart_Handle handle); Dart_Handle HandleError(Dart_Handle handle);
void wingsThrowError(const char *msg, const char *lib = "dart:core", const char *name = "StateError", int n = -1);
void Dart_WingsSocket_bindIPv4(Dart_NativeArguments arguments); void Dart_WingsSocket_bindIPv4(Dart_NativeArguments arguments);
void Dart_WingsSocket_bindIPv6(Dart_NativeArguments arguments); void Dart_WingsSocket_bindIPv6(Dart_NativeArguments arguments);
void Dart_WingsSocket_getAddress(Dart_NativeArguments arguments);
void Dart_WingsSocket_getPort(Dart_NativeArguments arguments); void Dart_WingsSocket_getPort(Dart_NativeArguments arguments);
void Dart_WingsSocket_write(Dart_NativeArguments arguments); void Dart_WingsSocket_write(Dart_NativeArguments arguments);
void Dart_WingsSocket_closeDescriptor(Dart_NativeArguments arguments); void Dart_WingsSocket_closeDescriptor(Dart_NativeArguments arguments);

View file

@ -1,3 +1,4 @@
#include <vector>
#include "angel_wings.h" #include "angel_wings.h"
#include "wings_socket.h" #include "wings_socket.h"
using namespace wings; using namespace wings;
@ -10,20 +11,22 @@ WingsSocket *wingsBindNewSocket(Dart_NativeArguments arguments, const WingsSocke
void wingsReturnBound(Dart_NativeArguments arguments, WingsSocket *socket); void wingsReturnBound(Dart_NativeArguments arguments, WingsSocket *socket);
void Dart_WingsSocket_bindIPv4(Dart_NativeArguments arguments) void Dart_WingsSocket_bind(sa_family_t af, Dart_NativeArguments arguments)
{ {
WingsSocketInfo info; WingsSocketInfo info;
getWingsSocketInfo(arguments, &info); getWingsSocketInfo(arguments, &info);
WingsSocket *socket = wingsFindSocket(arguments, info, AF_INET); WingsSocket *socket = wingsFindSocket(arguments, info, af);
wingsReturnBound(arguments, socket); wingsReturnBound(arguments, socket);
} }
void Dart_WingsSocket_bindIPv4(Dart_NativeArguments arguments)
{
Dart_WingsSocket_bind(AF_INET, arguments);
}
void Dart_WingsSocket_bindIPv6(Dart_NativeArguments arguments) void Dart_WingsSocket_bindIPv6(Dart_NativeArguments arguments)
{ {
WingsSocketInfo info; Dart_WingsSocket_bind(AF_INET6, arguments);
getWingsSocketInfo(arguments, &info);
WingsSocket *socket = wingsFindSocket(arguments, info, AF_INET6);
wingsReturnBound(arguments, socket);
} }
void wingsReturnBound(Dart_NativeArguments arguments, WingsSocket *socket) void wingsReturnBound(Dart_NativeArguments arguments, WingsSocket *socket)
@ -36,18 +39,6 @@ void wingsReturnBound(Dart_NativeArguments arguments, WingsSocket *socket)
Dart_SetReturnValue(arguments, ptrHandle); Dart_SetReturnValue(arguments, ptrHandle);
} }
void wingsThrowStateError(const char *msg)
{
Dart_Handle msgHandle = Dart_NewStringFromCString(msg);
Dart_Handle emptyHandle = Dart_NewStringFromCString("");
Dart_Handle stateErrorHandle = Dart_NewStringFromCString("StateError");
Dart_Handle dartCoreHandle = Dart_NewStringFromCString("dart:core");
Dart_Handle dartCore = Dart_LookupLibrary(dartCoreHandle);
Dart_Handle stateError = Dart_GetType(dartCore, stateErrorHandle, 0, nullptr);
Dart_Handle errHandle = Dart_New(stateError, emptyHandle, 1, &msgHandle);
Dart_ThrowException(errHandle);
}
WingsSocket *wingsFindSocket(Dart_NativeArguments arguments, const WingsSocketInfo &info, int af) WingsSocket *wingsFindSocket(Dart_NativeArguments arguments, const WingsSocketInfo &info, int af)
{ {
// Find an existing server, if any. // Find an existing server, if any.
@ -76,7 +67,7 @@ WingsSocket *wingsBindNewSocket(Dart_NativeArguments arguments, const WingsSocke
if (sock < 0) if (sock < 0)
{ {
wingsThrowStateError("Failed to create socket."); wingsThrowError("Failed to create socket.");
return nullptr; return nullptr;
} }
@ -85,7 +76,7 @@ WingsSocket *wingsBindNewSocket(Dart_NativeArguments arguments, const WingsSocke
if (ret < 0) if (ret < 0)
{ {
wingsThrowStateError("Cannot reuse address for socket."); wingsThrowError("Cannot reuse address for socket.");
return nullptr; return nullptr;
} }
@ -116,23 +107,23 @@ WingsSocket *wingsBindNewSocket(Dart_NativeArguments arguments, const WingsSocke
if (ret < 0) if (ret < 0)
{ {
wingsThrowStateError("Failed to bind socket."); wingsThrowError("Failed to bind socket.");
return nullptr; return nullptr;
} }
if (listen(sock, SOMAXCONN) < 0) if (listen(sock, SOMAXCONN) < 0)
{ {
wingsThrowStateError("Failed to set SOMAXCONN on bound socket."); wingsThrowError("Failed to set SOMAXCONN on bound socket.");
return nullptr; return nullptr;
} }
if (listen(sock, (int)info.backlog) < 0) if (listen(sock, (int)info.backlog) < 0)
{ {
wingsThrowStateError("Failed to set backlog on bound socket."); wingsThrowError("Failed to set backlog on bound socket.");
return nullptr; return nullptr;
} }
auto *out = new WingsSocket(sock, info); auto *out = new WingsSocket(af, sock, info);
globalSocketList.push_back(out); globalSocketList.push_back(out);
return out; return out;
} }
@ -152,3 +143,24 @@ void getWingsSocketInfo(Dart_NativeArguments arguments, WingsSocketInfo *info)
HandleError(Dart_IntegerToUint64(backlogHandle, &info->backlog)); HandleError(Dart_IntegerToUint64(backlogHandle, &info->backlog));
HandleError(Dart_BooleanValue(v6OnlyHandle, &info->v6Only)); HandleError(Dart_BooleanValue(v6OnlyHandle, &info->v6Only));
} }
void wingsThrowError(const char *msg, const char *lib, const char *name, int n)
{
Dart_Handle msgHandle = Dart_NewStringFromCString(msg);
Dart_Handle emptyHandle = Dart_NewStringFromCString("");
Dart_Handle stateErrorHandle = Dart_NewStringFromCString(name);
Dart_Handle dartCoreHandle = Dart_NewStringFromCString(lib);
Dart_Handle dartCore = Dart_LookupLibrary(dartCoreHandle);
Dart_Handle stateError = Dart_GetType(dartCore, stateErrorHandle, 0, nullptr);
std::vector<Dart_Handle> args;
args.push_back(msgHandle);
if (n > -1)
{
args.push_back(Dart_NewInteger(n));
}
Dart_Handle errHandle = Dart_New(stateError, emptyHandle, args.size(), args.data());
Dart_ThrowException(errHandle);
}

Binary file not shown.

View file

@ -1,4 +1,5 @@
#include <dart_native_api.h> #include <dart_native_api.h>
#include <iostream>
#include "angel_wings.h" #include "angel_wings.h"
#include "wings_socket.h" #include "wings_socket.h"
using namespace wings; using namespace wings;
@ -13,15 +14,125 @@ void Dart_WingsSocket_listen(Dart_NativeArguments arguments)
socket->start(arguments); socket->start(arguments);
} }
void Dart_WingsSocket_getPort(Dart_NativeArguments arguments) struct wingsSockName
{
sa_family_t family;
sockaddr_in v4;
sockaddr_in6 v6;
struct sockaddr *ptr() const
{
if (family == AF_INET6)
{
return (sockaddr *)&v6;
}
else
{
return (sockaddr *)&v4;
}
}
void *addrPtr() const
{
if (family == AF_INET6)
{
return (void *)&v6.sin6_addr;
}
else
{
return (void *)&v4.sin_addr;
}
}
socklen_t length() const
{
if (family == AF_INET6)
{
return sizeof(v6);
}
else
{
return sizeof(v4);
}
}
};
void wingsThrowOSError()
{
wingsThrowError(strerror(errno), "dart:io", "OSError", errno);
}
bool wingsReadSocket(Dart_NativeArguments arguments, wingsSockName *out)
{ {
uint64_t ptr; uint64_t ptr;
Dart_Handle pointerHandle = Dart_GetNativeArgument(arguments, 0); Dart_Handle pointerHandle = Dart_GetNativeArgument(arguments, 0);
HandleError(Dart_IntegerToUint64(pointerHandle, &ptr)); HandleError(Dart_IntegerToUint64(pointerHandle, &ptr));
auto *socket = (WingsSocket *)ptr; auto *socket = (WingsSocket *)ptr;
auto outHandle = Dart_NewIntegerFromUint64(socket->getInfo().port); int fd = socket->getFD();
socklen_t len;
out->family = socket->getFamily();
len = out->length();
int result;
// result = connect(fd, out->ptr(), len);
// if (result < 0)
// {
// wingsThrowOSError();
// return false;
// }
result = getsockname(fd, out->ptr(), &len);
if (result == -1)
{
wingsThrowOSError();
return false;
}
return true;
}
void Dart_WingsSocket_getAddress(Dart_NativeArguments arguments)
{
wingsSockName sock;
if (wingsReadSocket(arguments, &sock))
{
char addrBuf[INET6_ADDRSTRLEN + 1] = {0};
auto *result = inet_ntop(sock.family, sock.addrPtr(), addrBuf, sock.length());
if (result == NULL)
{
wingsThrowOSError();
}
Dart_Handle outHandle = Dart_NewStringFromCString(addrBuf);
Dart_SetReturnValue(arguments, outHandle); Dart_SetReturnValue(arguments, outHandle);
}
}
void Dart_WingsSocket_getPort(Dart_NativeArguments arguments)
{
wingsSockName sock;
if (wingsReadSocket(arguments, &sock))
{
Dart_Handle outHandle;
if (sock.family == AF_INET6)
{
outHandle = Dart_NewIntegerFromUint64(ntohs(sock.v6.sin6_port));
}
else
{
outHandle = Dart_NewIntegerFromUint64(ntohs(sock.v4.sin_port));
}
Dart_SetReturnValue(arguments, outHandle);
}
} }
void Dart_WingsSocket_write(Dart_NativeArguments arguments) void Dart_WingsSocket_write(Dart_NativeArguments arguments)

View file

@ -11,7 +11,8 @@ bool WingsSocketInfo::operator==(const WingsSocketInfo &other) const
port == other.port; port == other.port;
} }
WingsSocket::WingsSocket(int sockfd, const WingsSocketInfo &info) : sockfd(sockfd), info(info) WingsSocket::WingsSocket(sa_family_t family, int sockfd, const WingsSocketInfo &info)
: sockfd(sockfd), info(info), family(family)
{ {
refCount = 0; refCount = 0;
workerThread = nullptr; workerThread = nullptr;
@ -28,6 +29,16 @@ const WingsSocketInfo &WingsSocket::getInfo() const
return info; return info;
} }
int WingsSocket::getFD() const
{
return sockfd;
}
sa_family_t WingsSocket::getFamily() const
{
return family;
}
void WingsSocket::start(Dart_NativeArguments arguments) void WingsSocket::start(Dart_NativeArguments arguments)
{ {
// if (workerThread == nullptr) // if (workerThread == nullptr)
@ -71,12 +82,12 @@ void WingsSocket::threadCallback(Dart_Port dest_port_id,
if (addr.sa_family == AF_INET6) if (addr.sa_family == AF_INET6)
{ {
auto as6 = (sockaddr_in6*) &addr; auto as6 = (sockaddr_in6 *)&addr;
inet_ntop(addr.sa_family, &(as6->sin6_addr), addrBuf, len); inet_ntop(addr.sa_family, &(as6->sin6_addr), addrBuf, len);
} }
else else
{ {
auto as4 = (sockaddr_in*) &addr; auto as4 = (sockaddr_in *)&addr;
inet_ntop(AF_INET, &(as4->sin_addr), addrBuf, len); inet_ntop(AF_INET, &(as4->sin_addr), addrBuf, len);
} }

View file

@ -20,6 +20,9 @@ int bindWingsIPv6ServerSocket(
bool v6Only, bool v6Only,
SendPort sendPort) native 'Dart_WingsSocket_bindIPV6'; SendPort sendPort) native 'Dart_WingsSocket_bindIPV6';
String getWingsServerSocketAddress(int pointer)
native 'Dart_WingsSocket_getAddress';
int getWingsServerSocketPort(int pointer) native 'Dart_WingsSocket_getPort'; int getWingsServerSocketPort(int pointer) native 'Dart_WingsSocket_getPort';
void writeToNativeSocket(int fd, Uint8List data) void writeToNativeSocket(int fd, Uint8List data)
@ -92,14 +95,15 @@ class WingsSocket extends Stream<WingsClientSocket> {
addr.address, port, shared, backlog, v6Only, recv.sendPort); addr.address, port, shared, backlog, v6Only, recv.sendPort);
} }
return WingsSocket._(ptr, recv).._address = addr; return WingsSocket._(ptr, recv); //.._address = addr;
} catch (e) { } catch (e) {
recv.close(); recv.close();
rethrow; rethrow;
} }
} }
InternetAddress get address => _address; InternetAddress get address =>
_address ??= InternetAddress(getWingsServerSocketAddress(_pointer));
int get port => _port ??= getWingsServerSocketPort(_pointer); int get port => _port ??= getWingsServerSocketPort(_pointer);

View file

@ -28,16 +28,19 @@ struct WingsSocketInfo
class WingsSocket class WingsSocket
{ {
public: public:
explicit WingsSocket(int sockfd, const WingsSocketInfo &info); WingsSocket(sa_family_t family, int sockfd, const WingsSocketInfo &info);
void incrRef(Dart_Port port); void incrRef(Dart_Port port);
const WingsSocketInfo &getInfo() const; const WingsSocketInfo &getInfo() const;
void start(Dart_NativeArguments arguments); void start(Dart_NativeArguments arguments);
int getFD() const;
sa_family_t getFamily() const;
private: private:
static void threadCallback(Dart_Port dest_port_id, Dart_CObject *message); static void threadCallback(Dart_Port dest_port_id, Dart_CObject *message);
WingsSocketInfo info; WingsSocketInfo info;
int sockfd; int sockfd;
int refCount; int refCount;
sa_family_t family;
std::unique_ptr<std::thread> workerThread; std::unique_ptr<std::thread> workerThread;
std::vector<Dart_Port> sendPorts; std::vector<Dart_Port> sendPorts;
}; };

Binary file not shown.