#include "ircd.h" #include "socket.h" int Parse(struct slist *lhead,Sock shead) { Users tuser; Channels tchan; struct slist head = *lhead; struct sockaddr_in peer; int peer_len; char command[128]; char data[1024]; char temp[1024]; char *tmp; printf("Test: [%s][%i][%i]\n",shead->data,shead->id,shead->b); switch (shead->b) { case 0: { printf("Case 0[%s]\n",shead->data); sprintf(command,"%s",strtok(shead->data," ")); sprintf(data,"%s",strtok(NULL,"\n")); printf("Split: [%s][%s]\n",command,data); if (!strcasecmp(command, "NICK")) { printf("NICK[%s]\n",command); printf("First: [%c]\n",data[0]); if (data[0] == ':') { tmp = data; tmp++; sprintf(data,"%s",tmp); } if (FindNick(head.users,data)) { SendSock(shead->socket,":%s 433 %s :Nickname is already in use.\n", head.cf->servername,data); } else { printf("Nick Avail[%i]\n",shead->type); if (shead->type == 0) { printf("Adding User: [%i]\n",shead->socket); shead->userinfo = AddUser(shead->id,shead->socket,data,&head.users); NickList(head.users); shead->type=1; } else if (shead->type >= 1) { printf("Updating Nick: [%s][%i]\n",shead->userinfo->nick,shead->socket); SendSock(shead->socket,":%s!%s@%s NICK :%s\n", shead->userinfo->nick,shead->userinfo->ident,shead->userinfo->host,data); sprintf(shead->userinfo->nick,data); if (shead->type == 1) { SendLogon(head,shead->userinfo->nick,shead->socket); SendMotd(head,shead); shead->type = 2; } } } } if (!strcasecmp(command,"USER")) { sscanf(data,"%s %s %s :%s\n",shead->userinfo->ident,shead->userinfo->host, shead->userinfo->server,shead->userinfo->name); tmp = shead->userinfo->host; tmp++; sprintf(shead->userinfo->host,"%s",strtok(tmp,"\"")); tmp = shead->userinfo->server; tmp++; peer_len = sizeof(peer); if (getpeername(shead->socket,(struct sockaddr *)&peer,&peer_len) == -1) { perror("getpeername() failed"); } printf("Peer IP Address: [%s]\n",inet_ntoa(peer.sin_addr)); if (GetHost((char *)&shead->userinfo->host,inet_ntoa(peer.sin_addr))) { printf("GetHost Problem\n"); sprintf(shead->userinfo->host,"%s",inet_ntoa(peer.sin_addr)); } printf("Peer Host Name: [%s]\n",shead->userinfo->host); sprintf(shead->userinfo->server,"%s",strtok(tmp,"\"")); printf("Blah ident: [%s]\n",shead->userinfo->ident); if (shead->type == 1) { SendLogon(head,shead->userinfo->nick,shead->socket); SendMotd(head,shead); shead->type = 2; } } if (!strcasecmp(command,"MOTD")) { SendMotd(head,shead); } if (!strcasecmp(command, "QUIT")) { printf("COMMAND: %s\nDATA\n", command,data); printf("USER: %s, has QUIT...\n", shead->userinfo->nick); tuser = FindNick(head.users,shead->userinfo->nick); if (tuser) { printf("USER %s FOUND.\n", shead->userinfo->nick); } else { printf("USER %s NOT FOUND\n", shead->userinfo->nick); } DeleteUser(tuser,shead->userinfo->sid); tuser = FindNick(head.users,shead->userinfo->nick); if (tuser) { printf("USER %s FOUND.\n", shead->userinfo->nick); } else { printf("USER %s NOT FOUND\n", shead->userinfo->nick); } } if (!strcasecmp(command,"PRIVMSG")) { sprintf(command,"%s",strtok(data," ")); if (command[0] == '#') { sprintf(temp,"%s",strtok(NULL,"\n")); tchan = FindChannel(head.channels,command); if (tchan) { printf("Fucker is in a channel [%s][%s]\n",command,temp); ShowChanPrivmsg(tchan,shead,head,temp); } else { SendSock(shead->socket,":%s 401 %s %s :No such nick/channel\n", head.cf->servername,shead->userinfo->nick,command); } } else { tuser = FindNick(head.users,command); if (tuser) { SendSock(tuser->socket,":%s!%s@%s PRIVMSG %s %s\n",shead->userinfo->nick, shead->userinfo->ident,shead->userinfo->host,command,strtok(NULL,"\n")); printf("Priv: [%s][%i]\n",data,tuser->socket); } else { SendSock(shead->socket,":%s 401 %s %s :No such nick/channel\n",head.cf->servername, shead->userinfo->nick,command); } } } if (!strcasecmp(command,"NOTICE")) { sprintf(command,"%s",strtok(data," ")); tuser = FindNick(head.users,command); if (tuser) { sprintf(temp,"%s",strtok(NULL,"\n")); SendSock(tuser->socket,":%s!%s@%s NOTICE %s %s\n", shead->userinfo->nick,shead->userinfo->ident,shead->userinfo->host,command,temp); printf("Priv: [%s][%i]\n",data,tuser->socket); } else { SendSock(shead->socket,":%s 401 %s %s :No such nick/channel\n", head.cf->servername,shead->userinfo->nick,command); } } if (!strcasecmp(command,"WHOIS")) { tuser = FindNick(head.users,data); if (tuser) { SendSock(shead->socket,":%s 311 %s %s %s %s * :%s\n", head.cf->servername,shead->userinfo->nick,tuser->nick,tuser->ident,tuser->host,tuser->name); SendSock(shead->socket,":%s 312 %s %s %s :[serverdesc]\n", head.cf->servername,shead->userinfo->nick,tuser->nick,tuser->server); SendSock(shead->socket,":%s 317 %s %s %i %i :seconds idle, signon time\n", head.cf->servername,shead->userinfo->nick,tuser->nick,tuser->idle,tuser->signon); SendSock(shead->socket,":%s 318 %s %s :End of /WHOIS list.\n", head.cf->servername,shead->userinfo->nick,tuser->nick); } else { SendSock(shead->socket,":%s 401 %s %s :No such nick/channel\n", head.cf->servername,shead->userinfo->nick,data); } } if (!strcasecmp(command,"LIST")) { DoListChannels(head.channels,shead->socket); } if (!strcasecmp(command,"PART")) { printf("Parting Fucken Channel [%s]\n",data); ListChannels(head.channels); tchan = FindChannel(head.channels,strtok(data," ")); printf("Fucken GGGGGG\n"); if (tchan) { printf("Chan Found\n"); if (FindChannelUser(tchan->chanusers,shead->userinfo->nick)) { ShowChanPart(tchan,shead,head,strtok(NULL,"\n")); DeleteChannelUser(&tchan->chanusers,shead->userinfo->nick); DeleteUserChannel(&shead->userinfo->chans,tchan->name); } } else { printf("Chan Not Found\n"); SendSock(shead->socket,"Not There Weeny\n"); } } if (!strcasecmp(command,"JOIN")) { tchan = FindChannel(head.channels,data); if (tchan) { printf("Channel Exists\n"); AddChannelUser(&tchan->chanusers,shead->userinfo->nick,"0"); AddUserChannel(&shead->userinfo->chans,tchan); PrintChannels(shead->userinfo->chans); PrintUsers(tchan->chanusers); } else { printf("New Channel\n"); tchan = AddChannel((struct slist *)&head,data); AddChannelUser(&tchan->chanusers,shead->userinfo->nick,"@"); AddUserChannel(&shead->userinfo->chans,tchan); PrintUsers(tchan->chanusers); PrintChannels(shead->userinfo->chans); } SendSock(shead->socket,":%s!%s@%s JOIN :%s\n",shead->userinfo->nick,shead->userinfo->ident,shead->userinfo->host,data); SendSock(shead->socket,":%s 353 %s = %s :%s\n",head.cf->servername,shead->userinfo->nick,data,CNList(tchan->chanusers)); SendSock(shead->socket,":%s 366 %s %s :End of /NAMES list.\n",head.cf->servername,shead->userinfo->nick,data); ShowChanJoin(tchan,shead,head); } if (!strcasecmp(command, "VERSION")) { SendSock(shead->socket, ":%s 351 %s :%s is running devel-ircd version %s\n", head.cf->servername, shead->userinfo->nick, head.cf->servername, head.cf->version); } if (!strcasecmp(command, "LUSERS")) { SendSock(shead->socket, ":%s 251 %s :There are \002%d\002 users online.\n", head.cf->servername, shead->userinfo->nick, numUsers); } else { printf("Command: [%s]\n",command); } break; } default: { printf("Fucked\n"); break; } } *lhead = head; return(0); } int SendMotd(struct slist head,Sock shead) { char data[1024]; char mfread[512]; FILE *fp; fp = fopen("ircd.motd", "r"); if (!fp) { SendSock(shead->socket,":%s 422 %s :Server under repairs! MOTD File is missing\n", head.cf->servername,shead->userinfo->nick); return(0); } else { SendSock(shead->socket, ":%s 375 %s :- %s Message of the Day - \n", head.cf->servername, shead->userinfo->nick, head.cf->servername); while (!feof(fp)) { if (fgets(mfread, sizeof(mfread), fp)) { if (mfread[0] == '#') continue; SendSock(shead->socket, ":%s 372 %s :%s\n", head.cf->servername, shead->userinfo->nick, mfread); } } SendSock(shead->socket, ":%s 376 %s :-\n End of /MOTD command. \n-\n", head.cf->servername, shead->userinfo->nick, head.cf->servername); SendSock(shead->socket, ":%s NOTICE %s :-\n", head.cf->servername, shead->userinfo->nick); SendSock(shead->socket, ":%s NOTICE %s :- Please be warned this is a development ircd. It is not stable yet. :)\n", head.cf->servername, shead->userinfo->nick); SendSock(shead->socket, ":%s NOTICE %s :-\n", head.cf->servername, shead->userinfo->nick); } fclose(fp); return 1; } int SendLogon(struct slist head,char *nick,int s) { char data[1024]; SendSock(s,":%s 001 %s :Welcome to the %s IRC Network %s\n",head.cf->servername,nick,head.cf->network,nick); SendSock(s,":%s 002 %s :Your host is %s, running version %s\n",head.cf->servername,nick,head.cf->servername,head.cf->version); SendSock(s,":%s 003 %s :This server was put in service on [compile date] at [compile time]\n",head.cf->servername,nick); SendSock(s,":%s 004 %s %s %s cdghkilmnosuw bciklmnopstv\n",head.cf->servername,nick,head.cf->servername,head.cf->version); return(0); }