1
0
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:
Stefan Metzmacher 2009-11-04 19:03:41 +01:00
parent 4a19adadcc
commit edbf2caa6f
3 changed files with 87 additions and 5 deletions

View File

@ -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,

View File

@ -201,11 +201,11 @@ struct tsocket_address_bsd {
} u;
};
static int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
struct sockaddr *sa,
socklen_t sa_socklen,
struct tsocket_address **_addr,
const char *location)
int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
struct sockaddr *sa,
size_t sa_socklen,
struct tsocket_address **_addr,
const char *location)
{
struct tsocket_address *addr;
struct tsocket_address_bsd *bsda;
@ -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,

View File

@ -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