Modify sockaddr -> sockSwiftaddr
authorBogdan Drutu <bogdandrutu@gmail.com>
Thu, 30 Dec 2010 08:43:12 +0000 (10:43 +0200)
committerRazvan Deaconescu <razvan.deaconescu@cs.pub.ro>
Sat, 2 Apr 2011 07:27:23 +0000 (10:27 +0300)
src/lib_swift.c
src/lib_swift.h

index 1ddd024..01a838b 100644 (file)
 
 #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, 
index 47967ad..8611c80 100644 (file)
@@ -3,6 +3,7 @@
 
 #define SWIFT_PORT             8080
 #define PACKET_SIZE            4*1024
+#define MAX_IPs                        10
 
 #define DIE(s) \
        do { \
@@ -31,11 +32,27 @@ typedef struct swift {
        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