Skip to content

Commit

Permalink
Fix #2629, #2295: posix sockaddr_storage now implements specification (
Browse files Browse the repository at this point in the history
…#2630)

* Fix #2629: posix sockaddr_storage now implements specification

* Fixup after attempted rebase; change block comment style
  • Loading branch information
LeeTibbert committed Jul 14, 2022
1 parent b8a9782 commit 54a9ddd
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 7 deletions.
3 changes: 3 additions & 0 deletions posixlib/src/main/resources/scala-native/sys/socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ _Static_assert(offsetof(struct scalanative_sockaddr, sa_data) == 2,
_Static_assert(offsetof(struct scalanative_sockaddr, sa_data) ==
offsetof(struct sockaddr, sa_data),
"offset mismatch: sockaddr sa_data");

_Static_assert(sizeof(struct sockaddr_storage) == 128,
"unexpected size for sockaddr_storage");
#endif
#endif

Expand Down
25 changes: 20 additions & 5 deletions posixlib/src/main/resources/scala-native/sys/socket_conversions.c
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
#include "../netinet/in.h"
#include "socket_conversions.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifndef _WIN32
#include <sys/socket.h>
#endif

_Static_assert(sizeof(struct scalanative_sockaddr_storage) ==
sizeof(struct sockaddr_storage),
"Unexpected size: scalanative_storage sa_family");

int scalanative_convert_sockaddr_in(struct scalanative_sockaddr_in *in,
struct sockaddr_in **out, socklen_t *size) {
struct sockaddr_in *s =
Expand Down Expand Up @@ -36,11 +42,18 @@ int scalanative_convert_sockaddr_in6(struct scalanative_sockaddr_in6 *in,
int scalanative_convert_sockaddr_storage(
struct scalanative_sockaddr_storage *in, struct sockaddr_storage **out,
socklen_t *size) {
struct sockaddr_storage *s =
(struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage));
*size = sizeof(struct sockaddr_storage);
s->ss_family = in->ss_family;

assert(*size <= sizeof(struct sockaddr_storage));

void *s = calloc(1, sizeof(struct sockaddr_storage));

assert(s != NULL);

memcpy(s, in, *size);

*out = s;
*size = sizeof(struct sockaddr_storage);

return 0;
}

Expand Down Expand Up @@ -100,8 +113,10 @@ int scalanative_convert_scalanative_sockaddr_in6(
int scalanative_convert_scalanative_sockaddr_storage(
struct sockaddr_storage *in, struct scalanative_sockaddr_storage *out,
socklen_t *size) {

*size = sizeof(struct scalanative_sockaddr_storage);
out->ss_family = in->ss_family;
memcpy(out, in, *size);

return 0;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ struct scalanative_sockaddr {

struct scalanative_sockaddr_storage {
scalanative_sa_family_t ss_family;
unsigned short __opaquePadTo32;
unsigned int __opaquePadTo64;
unsigned long long __opaqueAlignStructure[15];
};

int scalanative_convert_sockaddr_in(struct scalanative_sockaddr_in *in,
Expand Down
15 changes: 14 additions & 1 deletion posixlib/src/main/scala/scala/scalanative/posix/sys/socket.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,27 @@ object socket {
type socklen_t = CUnsignedInt

type sa_family_t = CUnsignedShort

type _14 = Nat.Digit2[Nat._1, Nat._4]

type sockaddr = CStruct2[
sa_family_t, // sa_family
CArray[CChar, _14] // sa_data, size = 14 in OS X and Linux
]

type sockaddr_storage = CStruct1[sa_family_t] // ss_family
/* The declaration of sockaddr_storage should yield 128 bytes.
* Code in socket.c checks that OS sockaddr_storage is that size.
* If/when changing, keep the two in correspondence.
*/

type _15 = Nat.Digit2[Nat._1, Nat._5]

type sockaddr_storage = CStruct4[
sa_family_t, // ss_family
CUnsignedShort, // __opaquePadTo32
CUnsignedInt, // opaque, __opaquePadTo64
CArray[CUnsignedLongLong, _15] // __opaqueAlignStructure to 8 bytes
]

type msghdr = CStruct7[
Ptr[Byte], // msg_name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,23 @@ class TagTest {

type socklen_t = CUnsignedInt
type sa_family_t = CUnsignedShort

type _14 = Nat.Digit2[Nat._1, Nat._4]

type sockaddr = CStruct2[
sa_family_t, // sa_family
CArray[CChar, _14] // sa_data, size = 14 in OS X and Linux
]
type sockaddr_storage = CStruct1[sa_family_t] // ss_family

type _15 = Nat.Digit2[Nat._1, Nat._5]

type sockaddr_storage = CStruct4[
sa_family_t, // ss_family
CUnsignedShort, // opaque, __padTo32
CUnsignedInt, // opaque, __padTo64
CArray[CUnsignedLongLong, _15] // opaque, align structure to 8 bytes
]

type msghdr = CStruct7[
Ptr[Byte], // msg_name
socklen_t, // msg_namelen
Expand Down

0 comments on commit 54a9ddd

Please sign in to comment.