} else if(*args == '\\') {
addtobuf(buf, '\\');
}
+ args++;
state = 1;
+ break;
}
}
if(buf != NULL)
{
char *buf;
char *ret;
+ int isfilelist;
- if((peer->transfer->hash != NULL) && isdchash(peer->transfer->hash) && supports(peer, "tthf"))
+ if(!wcscmp(peer->transfer->path, L"files.xml") || !wcscmp(peer->transfer->path, L"files.xml.bz2") || !wcscmp(peer->transfer->path, L"MyList.DcLst"))
+ isfilelist = 1;
+ if(!isfilelist && (peer->transfer->hash != NULL) && isdchash(peer->transfer->hash) && supports(peer, "tthf"))
{
buf = base32encode(peer->transfer->hash->buf, 24);
ret = sprintf2("TTH/%.39s", buf);
struct dchub *hub;
char *buf;
struct fnetnode *cfn;
- int numhubs;
+ int hn1, hn2, hn3;
hub = fn->data;
qstrf(sk, "$MyINFO $ALL %s ", hub->nativenick);
buf = tr(icswcstombs(confgetstr("dc", "desc"), DCCHARSET, "Charset_conv_failure"), "$_|_");
qstrf(sk, "%s", buf);
- numhubs = 0;
+ hn1 = hn2 = hn3 = 0;
for(cfn = fnetnodes; cfn != NULL; cfn = cfn->next)
{
if((cfn->state == FNN_EST) || (cfn->state == FNN_HS))
- numhubs++;
+ {
+ if(cfn->regstatus == FNNS_OP)
+ hn3++;
+ else if(cfn->regstatus == FNNS_REG)
+ hn2++;
+ else
+ hn1++;
+ }
}
- qstrf(sk, "<%s V:%s,M:%c,H:%i/0/0,S:%i>",
+ qstrf(sk, "<%s V:%s,M:%c,H:%i/%i/%i,S:%i>",
DCIDTAG,
DCIDTAGV,
(tcpsock == NULL)?'P':'A',
- numhubs,
+ hn1, hn2, hn3,
confgetint("transfer", "slots")
);
qstrf(sk, "$ $");
} else {
freeargs = 0;
}
- if((newfn = fnetinitconnect(L"dc", args)) != NULL)
+ if((newfn = fnetinitconnect(L"dc", args, NULL)) != NULL)
{
linkfnetnode(newfn);
putfnetnode(newfn);
/* Do nothing for now. */
}
+static void cmd_getpass(struct socket *sk, struct fnetnode *fn, char *cmd, char *args)
+{
+ struct dchub *hub;
+ struct wcspair *arg;
+ char *mbspw;
+
+ hub = fn->data;
+ for(arg = fn->args; arg != NULL; arg = arg->next)
+ {
+ if(!wcscmp(arg->key, L"password"))
+ break;
+ }
+ if((arg == NULL) || ((mbspw = icwcstombs(arg->val, DCCHARSET)) == NULL))
+ {
+ killfnetnode(fn);
+ return;
+ }
+ qstrf(sk, "$MyPass %s|", mbspw);
+ free(mbspw);
+ fn->regstatus = FNNS_REG;
+ hubhandleaction(sk, fn, cmd, args);
+}
+
+static void cmd_logedin(struct socket *sk, struct fnetnode *fn, char *cmd, char *args)
+{
+ struct dchub *hub;
+
+ hub = fn->data;
+ fn->regstatus = FNNS_OP;
+ hubhandleaction(sk, fn, cmd, args);
+}
+
static void cmd_mynick(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
{
struct dcexppeer *expect;
freedcpeer(peer);
return;
}
- requestfile(peer);
+ if(peer->direction == TRNSD_DOWN)
+ requestfile(peer);
} else {
if(peer->wcsname == NULL)
{
{
pushtigertree(&peer->tth, peer->inbuf);
memmove(peer->inbuf, peer->inbuf + 24, peer->inbufdata -= 24);
+ peer->curread += 24;
}
- if((peer->curread += 24) >= peer->totalsize)
+ if(peer->curread >= peer->totalsize)
{
peer->state = PEER_CMD;
synctigertree(&peer->tth);
goto out;
}
startdl(peer);
+ if(peer->inbufdata > 0)
+ {
+ sockpushdata(sk, peer->inbuf, peer->inbufdata);
+ peer->inbufdata = 0;
+ transread(sk, peer);
+ }
} else {
/* We certainly didn't request this...*/
freedcpeer(peer);
return;
}
startdl(peer);
+ if(peer->inbufdata > 0)
+ {
+ sockpushdata(sk, peer->inbuf, peer->inbufdata);
+ peer->inbufdata = 0;
+ transread(sk, peer);
+ }
}
/*
{"$To:", cc(cmd_to)},
{"$SR", cc(cmd_sr)},
{"$UserCommand", cc(cmd_usercommand)},
+ {"$GetPass", cc(cmd_getpass)},
+ {"$LogedIn", cc(cmd_logedin)}, /* sic */
{NULL, NULL}
};
newqcmd(&peer->queue, peer->inbuf);
for(cmd = peercmds; cmd->handler != NULL; cmd++)
{
- if(!memcmp(peer->inbuf, cmd->name, strlen(cmd->name)) && (peer->inbuf[strlen(cmd->name)] == 0))
+ if(!memcmp(peer->inbuf, cmd->name, strlen(cmd->name)) && ((peer->inbuf[strlen(cmd->name)] == ' ') || (peer->inbuf[strlen(cmd->name)] == '|')))
break;
}
+ memmove(peer->inbuf, p, peer->inbufdata -= p - peer->inbuf);
if(cmd->stop)
{
peer->state = PEER_STOP;
break;
}
- memmove(peer->inbuf, p, peer->inbufdata -= p - peer->inbuf);
}
} else if(peer->state == PEER_TTHL) {
handletthl(peer);