First step for using multiple recvs from mptp.
[swifty.git] / src / libswift / swift.h
index 00275a1..723cf15 100644 (file)
@@ -65,7 +65,7 @@
 #include "hashtree.h"
 #include "avgspeed.h"
 #include "availability.h"
-
+#include "../kernel/mptp.h"
 
 namespace swift {
 
@@ -86,10 +86,10 @@ namespace swift {
 
 /** IPv4 address, just a nice wrapping around struct sockaddr_in. */
     struct Address {
-       struct sockaddr_in  addr;
+       struct sockaddr_mptp *addr;
        static uint32_t LOCALHOST;
        void set_port (uint16_t port) {
-           addr.sin_port = htons(port);
+           addr->dests[0].port = htons(port);
        }
        void set_port (const char* port_str) {
            int p;
@@ -97,17 +97,22 @@ namespace swift {
                set_port(p);
        }
        void set_ipv4 (uint32_t ipv4) {
-           addr.sin_addr.s_addr = htonl(ipv4);
+           addr->dests[0].addr = htonl(ipv4);
        }
        void set_ipv4 (const char* ipv4_str) ;
        //{    inet_aton(ipv4_str,&(addr.sin_addr));    }
        void clear () {
-           memset(&addr,0,sizeof(struct sockaddr_in));
-           addr.sin_family = AF_INET;
+               addr = (struct sockaddr_mptp *)calloc(1, sizeof(struct sockaddr_mptp) + sizeof(struct mptp_dest));
+               addr->count = 1;
        }
        Address() {
            clear();
        }
+       Address(const Address &b) {
+           clear();
+               addr->dests[0].addr = b.addr->dests[0].addr;
+               addr->dests[0].port = b.addr->dests[0].port;
+       }
        Address(const char* ip, uint16_t port)  {
            clear();
            set_ipv4(ip);
@@ -124,14 +129,29 @@ namespace swift {
            set_ipv4(ipv4addr);
            set_port(port);
        }
-       Address(const struct sockaddr_in& address) : addr(address) {}
-       uint32_t ipv4 () const { return ntohl(addr.sin_addr.s_addr); }
-       uint16_t port () const { return ntohs(addr.sin_port); }
-       operator sockaddr_in () const {return addr;}
+       Address(const struct sockaddr_in& address) {
+               clear();
+               addr->dests[0].addr = address.sin_addr.s_addr;
+               addr->dests[0].port = address.sin_port;
+       }
+       ~Address(){
+               free(addr);
+       }
+       uint32_t ipv4 () const { return ntohl(addr->dests[0].addr); }
+       uint16_t port () const { return ntohs(addr->dests[0].port); }
+       Address& operator = (const Address& b) {
+               if (this != &b) {
+                       free(addr);
+                       clear();
+                       addr->dests[0].addr = b.addr->dests[0].addr;
+                       addr->dests[0].port = b.addr->dests[0].port;
+               }
+               return *this;
+       }
        bool operator == (const Address& b) const {
-           return addr.sin_family==b.addr.sin_family &&
-               addr.sin_port==b.addr.sin_port &&
-               addr.sin_addr.s_addr==b.addr.sin_addr.s_addr;
+           return addr->count == b.addr->count &&
+               addr->dests[0].port==b.addr->dests[0].port &&
+               addr->dests[0].addr==b.addr->dests[0].addr;
        }
        const char* str () const {
                // Arno, 2011-10-04: not thread safe, replace.
@@ -474,8 +494,8 @@ namespace swift {
         static void LibeventSendCallback(int fd, short event, void *arg);
         static void LibeventReceiveCallback(int fd, short event, void *arg);
         static void RecvDatagram (evutil_socket_t socket); // Called by LibeventReceiveCallback
-           static int RecvFrom(evutil_socket_t sock, Address& addr, struct evbuffer *evb); // Called by RecvDatagram
-           static int SendTo(evutil_socket_t sock, const Address& addr, struct evbuffer *evb); // Called by Channel::Send()
+           static int RecvFrom(evutil_socket_t sock, Address& addr, struct evbuffer **evb); // Called by RecvDatagram
+           static int SendTo(evutil_socket_t sock, const Address& addr, struct evbuffer **evb); // Called by Channel::Send()
            static evutil_socket_t Bind(Address address, sckrwecb_t callbacks=sckrwecb_t());
            static Address BoundAddress(evutil_socket_t sock);
            static evutil_socket_t default_socket()