1/*
2 * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef UNIX_STREAM_ENDPOINT_H
6#define UNIX_STREAM_ENDPOINT_H
7
8#include <sys/stat.h>
9
10#include <Referenceable.h>
11
12#include <util/DoublyLinkedList.h>
13#include <util/OpenHashTable.h>
14
15#include "unix.h"
16#include "UnixEndpoint.h"
17
18class UnixStreamEndpoint;
19class UnixFifo;
20
21
22enum class unix_stream_endpoint_state {
23	NotConnected,
24	Listening,
25	Connected,
26	Closed
27};
28
29
30typedef AutoLocker<UnixStreamEndpoint> UnixStreamEndpointLocker;
31
32
33class UnixStreamEndpoint : public UnixEndpoint, public BReferenceable {
34public:
35								UnixStreamEndpoint(net_socket* socket);
36	virtual						~UnixStreamEndpoint() override;
37
38			status_t			Init() override;
39			void				Uninit() override;
40
41			status_t			Open() override;
42			status_t			Close() override;
43			status_t			Free() override;
44
45			status_t			Bind(const struct sockaddr* _address) override;
46			status_t			Unbind() override;
47			status_t			Listen(int backlog) override;
48			status_t			Connect(const struct sockaddr* address) override;
49			status_t			Accept(net_socket** _acceptedSocket) override;
50
51			ssize_t				Send(const iovec* vecs, size_t vecCount,
52									ancillary_data_container* ancillaryData,
53									const struct sockaddr* address,
54									socklen_t addressLength, int flags) override;
55			ssize_t				Receive(const iovec* vecs, size_t vecCount,
56									ancillary_data_container** _ancillaryData,
57									struct sockaddr* _address,
58									socklen_t* _addressLength, int flags) override;
59
60			ssize_t				Sendable() override;
61			ssize_t				Receivable() override;
62
63			status_t			SetReceiveBufferSize(size_t size) override;
64			status_t			GetPeerCredentials(ucred* credentials) override;
65
66			status_t			Shutdown(int direction) override;
67
68	bool IsBound() const
69	{
70		return !fIsChild && fAddress.IsValid();
71	}
72
73private:
74			void				_Spawn(UnixStreamEndpoint* connectingEndpoint,
75									UnixStreamEndpoint* listeningEndpoint, UnixFifo* fifo);
76			void				_Disconnect();
77			status_t			_LockConnectedEndpoints(UnixStreamEndpointLocker& locker,
78									UnixStreamEndpointLocker& peerLocker);
79
80			status_t			_Unbind();
81
82			void				_UnsetReceiveFifo();
83			void				_StopListening();
84
85private:
86	UnixStreamEndpoint*			fPeerEndpoint;
87	UnixFifo*					fReceiveFifo;
88	unix_stream_endpoint_state	fState;
89	sem_id						fAcceptSemaphore;
90	ucred						fCredentials;
91	bool						fIsChild;
92	bool						fWasConnected;
93};
94
95#endif	// UNIX_STREAM_ENDPOINT_H
96