#include "lib_swift.h"
-ssize_t recvfrom(int s, void *buf, size_t len, int flags,
- struct sockaddr *from, socklen_t *fromlen);
+struct sockSwiftaddr transformFromAddrToSwift(struct listsockaddr lsa)
+{
+ struct sockSwiftaddr ssa;
+ int i;
+
+ for (i = 0; i < lsa.N; i++)
+ {
+ ssa.sin_addr.s_addr[i] = lsa.sa[i].sin_addr.s_addr;
+ }
+
+ return ssa;
+}
+
+struct listsockaddr transformFromSwiftToAddr(struct sockSwiftaddr ssa)
+{
+ struct listsockaddr lsa;
+ int i;
+
+ lsa.N = ssa.sin_addr.N;
+
+ for ( i = 0; i < lsa.N; i++) {
+ lsa.sa[i].sin_family = ssa.sin_family;
+ lsa.sa[i].sin_port = ssa.sin_port;
+ lsa.sa[i].sin_addr.s_addr = ssa.sin_addr.s_addr[i];
+ }
+
+ return lsa;
+}
-int recvfromSwift (Swift s, void *buf, size_t len, int flags,
- struct sockaddr * __restrict__ from, socklen_t *fromlen)
+int listenfromSwift (Swift s, void *buf, size_t len, int flags,
+ struct sockSwiftaddr * __restrict__ from, socklen_t *fromlen)
{
- struct sockaddr_in si_other;
- socklen_t slen=sizeof(si_other);
+ struct sockaddr s_other;
+ struct listsockaddr lsa;
+ socklen_t slen=sizeof(s_other);
Dprintf("wait to receive messages");
- return recvfrom(s->socketListener, buf, len, flags,
- from, &slen);
+
+ int rec = recvfrom(s->socketListener, buf, len, flags,
+ (struct sockaddr * __restrict__)&s_other, &slen);
+
+ // fill listsockaddr
+ memcpy(&lsa.sa[0], &s_other, sizeof(s_other));
+ lsa.N = 1;
+
+ *from = transformFromAddrToSwift(lsa);
+
+ return rec;
}
-int bindSwift(Swift s, const struct sockaddr *my_addr, socklen_t addrlen)
+int bindSwift(Swift s, const struct sockSwiftaddr *my_addr, socklen_t addrlen)
{
Dprintf("bind swift socket");
return bind(s->socketListener,