Skip to content

Commit

Permalink
libbnetapi: Extend socket classes.
Browse files Browse the repository at this point in the history
B{Abstract,Datagram,Secure}Socket:
- Add functionality to listen for and accept new connections, thus allowing
  one to use the socket classes for server functionality as well.

BSecureSocket:
- Adjust to take into account differences between how SSL needs to be called
  when accepting an incoming connection vs initiating an outbound one.
  The handshake on the accepted connection stills fails for unknown reasons
  at the moment though.

Note that these changes break the ABI, and thus any packages making use of
them directly will need a rebuild.
  • Loading branch information
anevilyak committed Apr 29, 2016
1 parent 9503c26 commit c9dd7d0
Show file tree
Hide file tree
Showing 9 changed files with 198 additions and 23 deletions.
14 changes: 11 additions & 3 deletions headers/os/net/AbstractSocket.h
@@ -1,5 +1,5 @@
/*
* Copyright 2011, Haiku, Inc. All Rights Reserved.
* Copyright 2011-2016, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _ABSTRACT_SOCKET_H
Expand All @@ -20,8 +20,12 @@ class BAbstractSocket : public BDataIO {

status_t InitCheck() const;

virtual status_t Bind(const BNetworkAddress& local) = 0;
virtual status_t Bind(const BNetworkAddress& local, bool reuseAddr) = 0;
virtual bool IsBound() const;
virtual bool IsListening() const;

virtual status_t Listen(int backlog = 10);
virtual status_t Accept(BAbstractSocket*& _socket) = 0;

virtual status_t Connect(const BNetworkAddress& peer,
bigtime_t timeout = B_INFINITE_TIMEOUT) = 0;
Expand All @@ -44,9 +48,12 @@ class BAbstractSocket : public BDataIO {
int Socket() const;

protected:
status_t Bind(const BNetworkAddress& local, int type);
status_t Bind(const BNetworkAddress& local,
bool reuseAddr, int type);
status_t Connect(const BNetworkAddress& peer, int type,
bigtime_t timeout = B_INFINITE_TIMEOUT);
status_t AcceptNext(int& _acceptedSocket,
BNetworkAddress& _peer);

private:
status_t _OpenIfNeeded(int family, int type);
Expand All @@ -60,6 +67,7 @@ class BAbstractSocket : public BDataIO {
BNetworkAddress fPeer;
bool fIsBound;
bool fIsConnected;
bool fIsListening;
};


Expand Down
5 changes: 4 additions & 1 deletion headers/os/net/DatagramSocket.h
Expand Up @@ -17,10 +17,13 @@ class BDatagramSocket : public BAbstractSocket {
BDatagramSocket(const BDatagramSocket& other);
virtual ~BDatagramSocket();

virtual status_t Bind(const BNetworkAddress& peer);
virtual status_t Bind(const BNetworkAddress& peer,
bool reuseAddr = true);
virtual status_t Connect(const BNetworkAddress& peer,
bigtime_t timeout = B_INFINITE_TIMEOUT);

virtual status_t Accept(BAbstractSocket*& _socket);

status_t SetBroadcast(bool broadcast);
void SetPeer(const BNetworkAddress& peer);

Expand Down
8 changes: 6 additions & 2 deletions headers/os/net/SecureSocket.h
@@ -1,5 +1,5 @@
/*
* Copyright 2011-2015, Haiku, Inc. All Rights Reserved.
* Copyright 2011-2016, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _SECURE_SOCKET_H
Expand Down Expand Up @@ -27,6 +27,8 @@ class BSecureSocket : public BSocket {

// BSocket implementation

virtual status_t Accept(BAbstractSocket*& _socket);

virtual status_t Connect(const BNetworkAddress& peer,
bigtime_t timeout = B_INFINITE_TIMEOUT);
virtual void Disconnect();
Expand All @@ -40,7 +42,9 @@ class BSecureSocket : public BSocket {
virtual ssize_t Write(const void* buffer, size_t size);

protected:
status_t _Setup();
status_t _SetupCommon();
status_t _SetupConnect();
status_t _SetupAccept();

private:
friend class BCertificate;
Expand Down
11 changes: 7 additions & 4 deletions headers/os/net/Socket.h
@@ -1,5 +1,5 @@
/*
* Copyright 2011, Haiku, Inc. All Rights Reserved.
* Copyright 2011-2016, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _SOCKET_H
Expand All @@ -17,7 +17,11 @@ class BSocket : public BAbstractSocket {
BSocket(const BSocket& other);
virtual ~BSocket();

virtual status_t Bind(const BNetworkAddress& peer);
virtual status_t Bind(const BNetworkAddress& peer,
bool reuseAddr = true);

virtual status_t Accept(BAbstractSocket*& _socket);

virtual status_t Connect(const BNetworkAddress& peer,
bigtime_t timeout = B_INFINITE_TIMEOUT);

Expand All @@ -26,8 +30,7 @@ class BSocket : public BAbstractSocket {
virtual ssize_t Read(void* buffer, size_t size);
virtual ssize_t Write(const void* buffer, size_t size);

private:
friend class BServerSocket;
protected:

void _SetTo(int fd, const BNetworkAddress& local,
const BNetworkAddress& peer);
Expand Down
56 changes: 52 additions & 4 deletions src/kits/network/libnetapi/AbstractSocket.cpp
@@ -1,5 +1,6 @@
/*
* Copyright 2011, Axel Dörfler, axeld@pinc-software.de.
* Copyright 2016, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/

Expand All @@ -25,7 +26,8 @@ BAbstractSocket::BAbstractSocket()
fInitStatus(B_NO_INIT),
fSocket(-1),
fIsBound(false),
fIsConnected(false)
fIsConnected(false),
fIsListening(false)
{
}

Expand All @@ -35,7 +37,8 @@ BAbstractSocket::BAbstractSocket(const BAbstractSocket& other)
fInitStatus(other.fInitStatus),
fLocal(other.fLocal),
fPeer(other.fPeer),
fIsConnected(other.fIsConnected)
fIsConnected(other.fIsConnected),
fIsListening(other.fIsListening)
{
fSocket = dup(other.fSocket);
if (fSocket < 0)
Expand Down Expand Up @@ -63,13 +66,34 @@ BAbstractSocket::IsBound() const
}


bool
BAbstractSocket::IsListening() const
{
return fIsListening;
}


bool
BAbstractSocket::IsConnected() const
{
return fIsConnected;
}


status_t
BAbstractSocket::Listen(int backlog)
{
if (!fIsBound)
return B_NO_INIT;

if (listen(Socket(), backlog) != 0)
return fInitStatus = errno;

fIsListening = true;
return B_OK;
}


void
BAbstractSocket::Disconnect()
{
Expand Down Expand Up @@ -163,12 +187,20 @@ BAbstractSocket::Socket() const


status_t
BAbstractSocket::Bind(const BNetworkAddress& local, int type)
BAbstractSocket::Bind(const BNetworkAddress& local, bool reuseAddr, int type)
{
fInitStatus = _OpenIfNeeded(local.Family(), type);
if (fInitStatus != B_OK)
return fInitStatus;

if (reuseAddr) {
int value = 1;
if (setsockopt(Socket(), SOL_SOCKET, SO_REUSEADDR, &value,
sizeof(value)) != 0) {
return fInitStatus = errno;
}
}

if (bind(fSocket, local, local.Length()) != 0)
return fInitStatus = errno;

Expand All @@ -191,7 +223,7 @@ BAbstractSocket::Connect(const BNetworkAddress& peer, int type,
if (fInitStatus == B_OK && !IsBound()) {
BNetworkAddress local;
local.SetToWildcard(peer.Family());
fInitStatus = Bind(local);
fInitStatus = Bind(local, true);
}
if (fInitStatus != B_OK)
return fInitStatus;
Expand All @@ -214,6 +246,22 @@ BAbstractSocket::Connect(const BNetworkAddress& peer, int type,
}


status_t
BAbstractSocket::AcceptNext(int& _acceptedSocket, BNetworkAddress& _peer)
{
sockaddr_storage source;
socklen_t sourceLength = sizeof(sockaddr_storage);

int fd = accept(fSocket, (sockaddr*)&source, &sourceLength);
if (fd < 0)
return fd;

_peer.SetTo(source);
_acceptedSocket = fd;
return B_OK;
}


// #pragma mark - private


Expand Down
11 changes: 9 additions & 2 deletions src/kits/network/libnetapi/DatagramSocket.cpp
Expand Up @@ -39,9 +39,16 @@ BDatagramSocket::~BDatagramSocket()


status_t
BDatagramSocket::Bind(const BNetworkAddress& local)
BDatagramSocket::Bind(const BNetworkAddress& local, bool reuseAddr)
{
return BAbstractSocket::Bind(local, SOCK_DGRAM);
return BAbstractSocket::Bind(local, reuseAddr, SOCK_DGRAM);
}


status_t
BDatagramSocket::Accept(BAbstractSocket*& _socket)
{
return B_NOT_SUPPORTED;
}


Expand Down
2 changes: 1 addition & 1 deletion src/kits/network/libnetapi/ProxySecureSocket.cpp
Expand Up @@ -70,7 +70,7 @@ BProxySecureSocket::Connect(const BNetworkAddress& peer, bigtime_t timeout)
if (httpStatus < 200 || httpStatus > 299)
return B_BAD_VALUE;

return _Setup();
return _SetupConnect();
}


0 comments on commit c9dd7d0

Please sign in to comment.