Merge branch 'master' into socket
[doldaconnect.git] / daemon / fnet-dc.c
index 5123c80..828e6d0 100644 (file)
@@ -141,7 +141,7 @@ struct dcpeer
 static struct fnet dcnet;
 static struct transferiface dctransfer;
 static struct socket *udpsock = NULL;
-static struct socket *tcpsock = NULL;
+static struct lport *tcpsock = NULL;
 static struct dcpeer *peers = NULL;
 int numdcpeers = 0;
 static struct dcexppeer *expected = NULL;
@@ -1145,7 +1145,7 @@ static void cmd_search(struct socket *sk, struct fnetnode *fn, char *cmd, char *
            goto out;
        prefix = sprintf2("$SR %s ", hub->nativenick);
        infix = sprintf2(" %i/%i\005", slotsleft(), confgetint("transfer", "slots"));
-       postfix = sprintf2(" (%s)\005%s|", formataddress(hub->sk->remote, hub->sk->remotelen), args + 4);
+       postfix = sprintf2(" (%s)\005%s|", formatsockpeer(hub->sk), args + 4);
        dsk = sk;
        getsock(dsk);
     } else {
@@ -1158,8 +1158,8 @@ static void cmd_search(struct socket *sk, struct fnetnode *fn, char *cmd, char *
        addr.sin_port = htons(atoi(p2));
        prefix = sprintf2("$SR %s ", hub->nativenick);
        infix = sprintf2(" %i/%i\005", slotsleft(), confgetint("transfer", "slots"));
-       postfix = sprintf2(" (%s)|", formataddress(hub->sk->remote, hub->sk->remotelen));
-       netdgramconn(dsk = netdupsock(udpsock), (struct sockaddr *)&addr, sizeof(addr));
+       postfix = sprintf2(" (%s)|", formatsockpeer(hub->sk));
+       dsk = netdgramconn(udpsock, (struct sockaddr *)&addr, sizeof(addr));
     }
     
     minsize = maxsize = -1;
@@ -1351,7 +1351,7 @@ static void sendctm(struct socket *sk, char *nick)
     
     if(tcpsock == NULL)
        return;
-    if(sockgetremotename2(tcpsock, sk, &addr, &addrlen) < 0)
+    if(lstgetremotename2(tcpsock, sk, &addr, &addrlen) < 0)
        return;
     if(addr->sa_family == AF_INET)
        qstrf(sk, "$ConnectToMe %s %s|", nick, formataddress(addr, addrlen));
@@ -2295,7 +2295,6 @@ static void cmd_adcsnd(struct socket *sk, struct dcpeer *peer, char *cmd, char *
        {
            sockpushdata(sk, peer->inbuf, peer->inbufdata);
            peer->inbufdata = 0;
-           transread(sk, peer);
        }
     } else {
        /* We certainly didn't request this...*/
@@ -2328,7 +2327,6 @@ static void cmd_sending(struct socket *sk, struct dcpeer *peer, char *cmd, char
     {
        sockpushdata(sk, peer->inbuf, peer->inbufdata);
        peer->inbufdata = 0;
-       transread(sk, peer);
     }
 }
 
@@ -2694,7 +2692,7 @@ static void dctransgotdata(struct transfer *transfer, struct dcpeer *peer)
     
     if((peer->state == PEER_TRNS) || (peer->state == PEER_SYNC))
     {
-       if(sockqueuesize(peer->sk) < 65536)
+       if(sockqueueleft(peer->sk) > 0)
        {
            if((buf = transfergetdata(transfer, &bufsize)) != NULL)
            {
@@ -2765,18 +2763,14 @@ static void dctransendofdata(struct transfer *transfer, struct dcpeer *peer)
     dctransgotdata(transfer, peer);
 }
 
-static void dcwantdata(struct transfer *transfer, struct dcpeer *peer)
-{
-    if(transferdatasize(transfer) < 65536)
-       peer->sk->ignread = 0;
-}
-
 static void transread(struct socket *sk, struct dcpeer *peer)
 {
     void *buf;
     size_t bufsize;
     struct transfer *transfer;
     
+    if(transferdatasize(peer->transfer) < 0)
+       return;
     if((buf = sockgetinbuf(sk, &bufsize)) == NULL)
        return;
     if(peer->transfer == NULL)
@@ -2794,8 +2788,12 @@ static void transread(struct socket *sk, struct dcpeer *peer)
        transferendofdata(transfer);
        return;
     }
-    if(transferdatasize(peer->transfer) > 65535)
-       sk->ignread = 1;
+}
+
+static void dcwantdata(struct transfer *transfer, struct dcpeer *peer)
+{
+    if(transferdatasize(transfer) > 0)
+       transread(peer->sk, peer);
 }
 
 static void transerr(struct socket *sk, int err, struct dcpeer *peer)
@@ -2829,6 +2827,7 @@ static void udpread(struct socket *sk, void *data)
     size_t buflen, hashlen;
     char *nick, *filename, *hubname;
     struct sockaddr_in hubaddr;
+    struct sockaddr *addrbuf;
     off_t size;
     int slots;
     struct fnetnode *fn, *myfn;
@@ -2948,13 +2947,15 @@ static void udpread(struct socket *sk, void *data)
        {
            for(fn = fnetnodes; fn != NULL; fn = fn->next)
            {
-               if((fn->fnet == &dcnet) && ((hub = fn->data) != NULL))
+               if((fn->fnet == &dcnet) && ((hub = fn->data) != NULL) && !sockpeeraddr(hub->sk, &addrbuf, NULL))
                {
-                   if((hub->sk != NULL) && addreq(hub->sk->remote, (struct sockaddr *)&hubaddr))
+                   if((hub->sk != NULL) && addreq(addrbuf, (struct sockaddr *)&hubaddr))
                    {
                        myfn = fn;
+                       free(addrbuf);
                        break;
                    }
+                   free(addrbuf);
                }
            }
        }
@@ -2993,6 +2994,8 @@ static void hubread(struct socket *sk, struct fnetnode *fn)
     char *p, *p2;
     
     hub = (struct dchub *)fn->data;
+    if(hub->queue.size > 1000)
+       return;
     if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
        return;
     if(hub->inbufdata > 500000) /* Discard possible malicious data */
@@ -3016,8 +3019,6 @@ static void hubread(struct socket *sk, struct fnetnode *fn)
        p = p2;
     }
     memmove(hub->inbuf, p, hub->inbufdata -= p - hub->inbuf);
-    if(hub->queue.size > 1000)
-       sk->ignread = 1;
 }
 
 static void huberr(struct socket *sk, int err, struct fnetnode *fn)
@@ -3205,7 +3206,7 @@ static void hubkill(struct fnetnode *fn)
     struct dchub *hub;
     
     hub = (struct dchub *)fn->data;
-    hub->sk->close = 1;
+    closesock(hub->sk);
 }
 
 static struct transferiface dctransfer =
@@ -3234,6 +3235,10 @@ static void peerread(struct socket *sk, struct dcpeer *peer)
     size_t datalen, cnlen;
     struct command *cmd;
 
+    if(peer->state == PEER_CMD) {
+       if((peer->queue.size > 50) || (peer->inbufdata > 65536))
+           return;
+    }
     if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
        return;
     sizebuf2(peer->inbuf, peer->inbufdata + datalen, 1);
@@ -3259,16 +3264,11 @@ static void peerread(struct socket *sk, struct dcpeer *peer)
            {
                peer->state = PEER_STOP;
                break;
-           } else {
-               if(peer->queue.size > 50)
-                   sk->ignread = 1;
            }
        }
     } else if(peer->state == PEER_TTHL) {
        handletthl(peer);
     }
-    if(peer->inbufdata > 500000)
-       sk->ignread = 1;
 }
 
 static void peererror(struct socket *sk, int err, struct dcpeer *peer)
@@ -3302,7 +3302,7 @@ static void peerconnect(struct socket *sk, int err, struct fnetnode *fn)
     sendpeerlock(peer);
 }
 
-static void peeraccept(struct socket *sk, struct socket *newsk, void *data)
+static void peeraccept(struct lport *lp, struct socket *newsk, void *data)
 {
     struct dcpeer *peer;
     
@@ -3772,7 +3772,7 @@ static int run(void)
            quota--;
        }
        if(hub->queue.size < 1000)
-           hub->sk->ignread = 0;
+           hubread(hub->sk, fn);
        if(quota < 1)
            break;
     }
@@ -3791,7 +3791,7 @@ static int run(void)
            quota--;
        }
        if((peer->queue.size < 50) && (peer->inbufdata < 500000))
-           peer->sk->ignread = 0;
+           peerread(peer->sk, peer);
        if(quota < 1)
            break;
     }
@@ -3834,7 +3834,7 @@ static int updateudpport(struct configvar *var, void *uudata)
 static int updatetcpport(struct configvar *var, void *uudata)
 {
     struct sockaddr_in addr;
-    struct socket *newsock;
+    struct lport *newsock;
     
     memset(&addr, 0, sizeof(addr));
     addr.sin_family = AF_INET;
@@ -3842,7 +3842,7 @@ static int updatetcpport(struct configvar *var, void *uudata)
     if((newsock = netcslisten(SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), peeraccept, NULL)) == NULL)
        flog(LOG_INFO, "could not listen to a remote address, going into passive mode");
     if(tcpsock != NULL)
-       putsock(tcpsock);
+       closelport(tcpsock);
     tcpsock = newsock;
     return(0);
 }
@@ -3857,7 +3857,7 @@ static int init(int hup)
        if(udpsock != NULL)
            putsock(udpsock);
        if(tcpsock != NULL)
-           putsock(tcpsock);
+           closelport(tcpsock);
        addr.sin_family = AF_INET;
        memset(&addr.sin_addr, 0, sizeof(addr.sin_addr));
        addr.sin_port = htons(confgetint("dc", "udpport"));