/*
(c) 2007 Christopher Olsen
$Id$
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "tuved.h"
int podzGetData(myConnections_t *userConnection) {
writeLog(2,"Getting Data\n");
memset(&userConnection->data,0x0,1024);
userConnection->recLen = sReadSocket(userConnection->fd,&userConnection->data,1024);
if (userConnection->recLen == 0)
return(-1);
userConnection->userInfo.pong = time(NULL);
writeLog(3,"Got: [%i][%s]\n",userConnection->recLen,userConnection->data);
if (userConnection->recLen == 1) {
writeLog(2,"[%i][%c]\n",userConnection->data[0],userConnection->data[0]);
while(1);
}
podzProcessData(userConnection);
return(0x0);
}
int podzSendAll(char *output,int fd) {
myConnections_t *tmpConnection = 0x0;
for (tmpConnection = connections;tmpConnection != 0x0;tmpConnection = tmpConnection->next) {
if (tmpConnection->fd != fd)
sSendData(tmpConnection,output);
}
return(0x0);
}
int podzProcessData(myConnections_t *userConnection) {
char *chan = 0x0;
char *nick = 0x0;
char *cmd = 0x0;
char *msg = 0x0;
char *data = 0x0;
char *tok_last = 0x0;
char output[1024];
char buffer[1024];
memset(&output,0x0,1024);
memset(&buffer,0x0,1024);
cmd = userConnection->data;
if (cmd[userConnection->recLen - 1] == '\n')
cmd[userConnection->recLen - 1] = '\0';
if (cmd[userConnection->recLen - 2] == 13)
cmd[userConnection->recLen - 2] = '\0';
if (strstr(userConnection->data," ")) {
cmd = strtok_r(userConnection->data," ",&tok_last);
data = strtok_r(NULL,"\n",&tok_last);
writeLog(2,"DATA[%s:%s]\n",cmd,data);
tok_last = 0x0;
}
else {
writeLog(2,"DATA[%s]\n",cmd);
}
if (!strcasecmp(cmd,"ident")) {
writeLog(2,"(ident)\n");
sprintf(userConnection->userInfo.username,data); //strtok_r(data,":",&tok_last));
userConnection->userInfo.uid = time(NULL); //atoi(strtok_r(NULL,"\n",&tok_last));
userConnection->userInfo.ident = 0x1;
}
else if (!strcasecmp(cmd,"join")) {
tuveChanJoin(data,userConnection);
}
else if (strcasecmp(cmd,"<policy-file-request/>") == 0x0) {
sprintf(output,"<?xml version=\"1.0\"?>\n<cross-domain-policy>\n<allow-access-from domain=\"*\" to-ports=\"*\" />\n</cross-domain-policy>\n");
send(userConnection->fd,output,strlen(output)+1,MSG_NOSIGNAL);
writeLog(2,"Send CROSSDOMAIN\n");
}
else if (userConnection->userInfo.ident != 0x1) {
sSendData(userConnection,"Please Auth");
}
else if (strcasecmp(cmd,"PONG!") == 0x0) {
writeLog(2,"(PONG! :NULL)\n");
userConnection->userInfo.pfailed = 0x0;
}
else if (strcasecmp(cmd,"chanmsg") == 0x0) {
msg = strtok_r(data,":",&tok_last);
sprintf(output,"CHANMSG:%s:%s:%s\n",userConnection->userInfo.username,msg,strtok_r(NULL,"\n",&tok_last));
tuveSendAllInChan(msg,userConnection,output);
}
else if (strcasecmp(cmd,"topic") == 0x0) {
msg = strtok_r(data,":",&tok_last);
tuveSetTopic(userConnection,msg,strtok_r(NULL,"\n",&tok_last));
}
else if (strcasecmp(cmd,"NICK") == 0x0) {
sprintf(output,"NICK:%s:%s\n",userConnection->userInfo.username,data);
sprintf(userConnection->userInfo.username,data);
tuveSendAllInUsersChans(userConnection,output);
}
else if (strcasecmp(cmd,"KICK") == 0x0) {
tok_last = 0x0;
chan = strtok_r(data,":",&tok_last);
nick = strtok_r(NULL,":",&tok_last);
msg = strtok_r(NULL,"\n",&tok_last);
sprintf(output,"CHANMSG:TUveD:%s:%s Has Been Kick By %s, Reason: %s\n",chan,nick,userConnection->userInfo.username,msg);
tuveSendAllInChan(chan,0x0,output);
}
else if (strcasecmp(cmd,"GETPOS") == 0x0) {
sprintf(output,"GETPOS\n");
if (data != 0x0)
tuveSendAllInChan(data,userConnection,output);
}
else if (strcasecmp(cmd,"CURPOS") == 0x0) {
tok_last = 0x0;
chan = strtok_r(data,":",&tok_last);
msg = strtok_r(NULL,":",&tok_last);
nick = strtok_r(NULL,"\n",&tok_last);
if ((nick != 0x0) && (msg != 0x0)) {
sprintf(output,"CURPOS:%s:%s:%s\n",chan,msg,nick);
tuveSendAllInChan(chan,userConnection,output);
writeLog(1,"%s Has Sent CURPOS\n",userConnection->userInfo.username);
}
}
else {
sSendData(userConnection,"invalid command\n");
writeLog(1,"Invalid CMD: [%s]\n",cmd);
}
return(0x0);
}