blob: 781ce2e5a923431f8f8d5e7c8488b36daa145eea [file] [log] [blame]
// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef STARBOARD_SHARED_POSIX_SOCKET_INTERNAL_H_
#define STARBOARD_SHARED_POSIX_SOCKET_INTERNAL_H_
#include <errno.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include "starboard/common/socket.h"
#include "starboard/shared/internal_only.h"
#include "starboard/socket_waiter.h"
#include "starboard/types.h"
struct SbSocketPrivate {
SbSocketPrivate(SbSocketAddressType address_type,
SbSocketProtocol protocol,
int fd)
: address_type(address_type),
protocol(protocol),
socket_fd(fd),
error(kSbSocketOk),
waiter(kSbSocketWaiterInvalid) {}
~SbSocketPrivate() {}
// The address domain of this socket, IPv4 or IPv6.
SbSocketAddressType address_type;
// The protocol of this socket, UDP or TCP.
SbSocketProtocol protocol;
// The file descriptor for this socket.
int socket_fd;
// The last error that occurred on this socket, or kSbSocketOk.
SbSocketError error;
// The waiter this socket is registered with, or kSbSocketWaiterInvalid.
SbSocketWaiter waiter;
};
namespace starboard {
namespace shared {
namespace posix {
// Translates an errno from a socket call into an SbSocketError.
SbSocketError TranslateSocketErrno(int error);
// Sets a boolean socket option, doing all appropriate checks.
bool SetBooleanSocketOption(SbSocket socket,
int level,
int option_code,
const char* option_name,
bool value);
// Sets an integer socket option, doing all appropriate checks.
bool SetIntegerSocketOption(SbSocket socket,
int level,
int option_code,
const char* option_name,
int value);
// A helper class for converting back and forth from sockaddrs, ugh.
class SockAddr {
public:
SockAddr() : length(sizeof(storage_)) {}
~SockAddr() {}
// Initializes this SockAddr with the given SbSocketAddress, overwriting
// anything any address previously held.
bool FromSbSocketAddress(const SbSocketAddress* address);
// Initializes the given SbSocketAddress with this SockAddr, which must have
// been previously initialized.
bool ToSbSocketAddress(SbSocketAddress* out_address) const;
// Initializes this SockAddr with |sock_addr|, assuming it is appropriately
// sized for its type.
bool FromSockaddr(const struct sockaddr* sock_addr);
// The sockaddr family. We only support INET and INET6.
sa_family_t family() const { return sockaddr()->sa_family; }
struct sockaddr* sockaddr() {
return reinterpret_cast<struct sockaddr*>(&storage_);
}
const struct sockaddr* sockaddr() const {
return reinterpret_cast<const struct sockaddr*>(&storage_);
}
struct sockaddr_in* sockaddr_in() {
return reinterpret_cast<struct sockaddr_in*>(&storage_);
}
const struct sockaddr_in* sockaddr_in() const {
return reinterpret_cast<const struct sockaddr_in*>(&storage_);
}
struct sockaddr_in6* sockaddr_in6() {
return reinterpret_cast<struct sockaddr_in6*>(&storage_);
}
const struct sockaddr_in6* sockaddr_in6() const {
return reinterpret_cast<const struct sockaddr_in6*>(&storage_);
}
// Public on purpose, because it will be handy to be passed directly by
// reference into other functions.
socklen_t length;
private:
struct sockaddr_storage storage_;
};
} // namespace posix
} // namespace shared
} // namespace starboard
#endif // STARBOARD_SHARED_POSIX_SOCKET_INTERNAL_H_