} 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);
} 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);