Support minislots properly.
authorfredrik <fredrik@959494ce-11ee-0310-bf91-de5d638817bd>
Thu, 10 Nov 2005 14:35:46 +0000 (14:35 +0000)
committerfredrik <fredrik@959494ce-11ee-0310-bf91-de5d638817bd>
Thu, 10 Nov 2005 14:35:46 +0000 (14:35 +0000)
git-svn-id: svn+ssh://svn.dolda2000.com/srv/svn/repos/src/doldaconnect@508 959494ce-11ee-0310-bf91-de5d638817bd

daemon/fnet-dc.c

index df04b59..a7188b1 100644 (file)
@@ -1778,15 +1778,10 @@ static void cmd_get(struct socket *sk, struct dcpeer *peer, char *cmd, char *arg
     } else if(fd >= 0) {
        if((buf2 = icsmbstowcs(args, DCCHARSET, NULL)) != NULL)
            transfersetpath(peer->transfer, buf2);
+       peer->transfer->flags.b.minislot = 1;
     }
     if(fd < 0)
     {
-       if(slotsleft() < 1)
-       {
-           qstr(sk, "$MaxedOut|");
-           freedcpeer(peer);
-           return;
-       }
        if((node = resdcpath(args, DCCHARSET, '\\')) == NULL)
        {
            qstrf(sk, "$Error File not in share|");
@@ -1814,6 +1809,13 @@ static void cmd_get(struct socket *sk, struct dcpeer *peer, char *cmd, char *arg
        freedcpeer(peer);
        return;
     }
+    if(sb.st_size < 65536)
+       peer->transfer->flags.b.minislot = 1;
+    if(!peer->transfer->flags.b.minislot && (slotsleft() < 1)) {
+       qstr(sk, "$MaxedOut|");
+       freedcpeer(peer);
+       return;
+    }
     if((offset != 0) && (lseek(fd, offset, SEEK_SET) < 0))
     {
        close(fd);
@@ -1917,14 +1919,10 @@ static void cmd_getblock(struct socket *sk, struct dcpeer *peer, char *cmd, char
     } else if(fd >= 0) {
        if((buf2 = icsmbstowcs(args, charset, NULL)) != NULL)
            transfersetpath(peer->transfer, buf2);
+       peer->transfer->flags.b.minislot = 1;
     }
     if(fd < 0)
     {
-       if(slotsleft() < 1)
-       {
-           qstr(sk, "$MaxedOut|");
-           return;
-       }
        if((node = resdcpath(p, charset, '\\')) == NULL)
        {
            qstr(sk, "$Error File not in cache|");
@@ -1949,6 +1947,12 @@ static void cmd_getblock(struct socket *sk, struct dcpeer *peer, char *cmd, char
        qstr(sk, "$Error|");
        return;
     }
+    if(sb.st_size < 65536)
+       peer->transfer->flags.b.minislot = 1;
+    if(!peer->transfer->flags.b.minislot && (slotsleft() < 1)) {
+       qstr(sk, "$MaxedOut|");
+       return;
+    }
     if((start != 0) && ((start >= sb.st_size) || (lseek(fd, start, SEEK_SET) < 0)))
     {
        close(fd);
@@ -2001,14 +2005,10 @@ static void cmd_adcget(struct socket *sk, struct dcpeer *peer, char *cmd, char *
     } else if(fd >= 0) {
        if((wbuf = icsmbstowcs(argv[1], "UTF-8", NULL)) != NULL)
            transfersetpath(peer->transfer, wbuf);
+       peer->transfer->flags.b.minislot = 1;
     }
     if(fd < 0)
     {
-       if(slotsleft() < 1)
-       {
-           qstr(sk, "$MaxedOut|");
-           goto out;
-       }
        if(!strncmp(argv[1], "TTH/", 4))
        {
            if((node = findbytth(argv[1] + 4)) == NULL)
@@ -2048,6 +2048,12 @@ static void cmd_adcget(struct socket *sk, struct dcpeer *peer, char *cmd, char *
            qstr(sk, "$Error|");
            goto out;
        }
+       if(sb.st_size < 65536)
+           peer->transfer->flags.b.minislot = 1;
+       if(!peer->transfer->flags.b.minislot && (slotsleft() < 1)) {
+           qstr(sk, "$MaxedOut|");
+           goto out;
+       }
        if((start != 0) && ((start >= sb.st_size) || (lseek(fd, start, SEEK_SET) < 0)))
        {
            qstr(sk, "$Error Offset out of range|");