mirror of
https://github.com/samba-team/samba.git
synced 2025-02-02 09:47:23 +03:00
tsocket: add tsocket_address_bsd_sockaddr() and tsocket_address_bsd_from_sockaddr()
metze
This commit is contained in:
parent
4a19adadcc
commit
edbf2caa6f
@ -179,6 +179,21 @@ int _tstream_unix_socketpair(TALLOC_CTX *mem_ctx1,
|
||||
_tstream_unix_socketpair(mem_ctx1, stream1, mem_ctx2, stream2, \
|
||||
__location__)
|
||||
|
||||
struct sockaddr;
|
||||
|
||||
int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
|
||||
struct sockaddr *sa,
|
||||
size_t sa_socklen,
|
||||
struct tsocket_address **_addr,
|
||||
const char *location);
|
||||
#define tsocket_address_bsd_from_sockaddr(mem_ctx, sa, sa_socklen, _addr) \
|
||||
_tsocket_address_bsd_from_sockaddr(mem_ctx, sa, sa_socklen, _addr, \
|
||||
__location__)
|
||||
|
||||
ssize_t tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
|
||||
struct sockaddr *sa,
|
||||
size_t sa_socklen);
|
||||
|
||||
int _tstream_bsd_existing_socket(TALLOC_CTX *mem_ctx,
|
||||
int fd,
|
||||
struct tstream_context **_stream,
|
||||
|
@ -201,9 +201,9 @@ struct tsocket_address_bsd {
|
||||
} u;
|
||||
};
|
||||
|
||||
static int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
|
||||
int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
|
||||
struct sockaddr *sa,
|
||||
socklen_t sa_socklen,
|
||||
size_t sa_socklen,
|
||||
struct tsocket_address **_addr,
|
||||
const char *location)
|
||||
{
|
||||
@ -259,6 +259,50 @@ static int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
|
||||
struct sockaddr *sa,
|
||||
size_t sa_socklen)
|
||||
{
|
||||
struct tsocket_address_bsd *bsda = talloc_get_type(addr->private_data,
|
||||
struct tsocket_address_bsd);
|
||||
ssize_t rlen = 0;
|
||||
|
||||
if (!bsda) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (bsda->u.sa.sa_family) {
|
||||
case AF_UNIX:
|
||||
rlen = sizeof(struct sockaddr_un);
|
||||
break;
|
||||
case AF_INET:
|
||||
rlen = sizeof(struct sockaddr_in);
|
||||
break;
|
||||
#ifdef HAVE_IPV6
|
||||
case AF_INET6:
|
||||
rlen = sizeof(struct sockaddr_in6);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sa_socklen < rlen) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sa_socklen > sizeof(struct sockaddr_storage)) {
|
||||
memset(sa, 0, sa_socklen);
|
||||
sa_socklen = sizeof(struct sockaddr_storage);
|
||||
}
|
||||
|
||||
memcpy(sa, &bsda->u.ss, sa_socklen);
|
||||
return rlen;
|
||||
}
|
||||
|
||||
int _tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx,
|
||||
const char *fam,
|
||||
const char *addr,
|
||||
|
@ -421,6 +421,29 @@ int tstream_unix_socketpair(TALLOC_CTX *mem_ctx1,
|
||||
TALLOC_CTX *mem_ctx2,
|
||||
struct tstream_context **stream2);
|
||||
|
||||
In some situations it's needed to create a tsocket_address from
|
||||
a given 'struct sockaddr'. You can use tsocket_address_bsd_from_sockaddr()
|
||||
for that. This should only be used if really needed, because of
|
||||
already existing fixed APIs. Only AF_INET, AF_INET6 and AF_UNIX
|
||||
sockets are allowed. The function returns -1 and set errno on error.
|
||||
Otherwise it returns 0.
|
||||
|
||||
int tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
|
||||
struct sockaddr *sa,
|
||||
socklen_t sa_socklen,
|
||||
struct tsocket_address **addr);
|
||||
|
||||
In some situations it's needed to get a 'struct a tsocket_address from
|
||||
a given 'struct sockaddr'. You can use tsocket_address_bsd_from_sockaddr()
|
||||
for that. This should only be used if really needed, because of
|
||||
already existing fixed APIs. Only AF_INET, AF_INET6 and AF_UNIX
|
||||
sockets are allowed. The function returns -1 and set errno on error.
|
||||
Otherwise it returns 0.
|
||||
|
||||
int tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
|
||||
struct sockaddr *sa,
|
||||
socklen_t *sa_socklen);
|
||||
|
||||
In some situations it's needed to wrap existing file descriptors
|
||||
into the tstream abstraction. You can use tstream_bsd_existing_socket()
|
||||
for that. But you should read the tsocket_bsd.c code and unterstand it
|
||||
|
Loading…
x
Reference in New Issue
Block a user