#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,
#define SWIFT_PORT 8080
#define PACKET_SIZE 4*1024
+#define MAX_IPs 10
#define DIE(s) \
do { \
struct sockaddr_in socketListenerAddr;
} *Swift;
+struct swift_addr {
+ unsigned short N; // e.g. number of s_addr
+ unsigned long s_addr[MAX_IPs]; // i.p. ip list
+};
+
+typedef struct sockSwiftaddr {
+ short sin_family; // e.g. AF_INET
+ unsigned short sin_port; // e.g. htons(3490)
+ struct swift_addr sin_addr; // see struct swift_addr, below
+} *SockSwiftaddr;
+
+struct listsockaddr {
+ unsigned short N;
+ struct sockaddr_in sa[MAX_IPs];
+};
+
Swift socketSwift();
void closeSwift(Swift);
-int recvfromSwift (Swift, void *, size_t, int, struct sockaddr *, socklen_t *);
-int bindSwift(Swift, const struct sockaddr *, socklen_t);
+int recvfromSwift (Swift, void *, size_t, int, struct sockSwiftaddr *, socklen_t *);
+int bindSwift(Swift, const struct sockSwiftaddr *, socklen_t);
#endif