int erasetranslate(int uid) { struct translatet *lkm; pcontext; lkm=gettranslate(uid); pcontext; if(lkm==NULL) { currentsocket->sock->destructor=NULL; killsocket(currentsocket->sock->syssock); return 0x0; } if(pre!=NULL) pre->next=lkm->next; else translate=lkm->next; free(lkm->translatetext); free(lkm->translatedtext); free(lkm->dest); free(lkm->source); free(lkm->lang); killsocket(lkm->sock); free(lkm); return 0x0; }
int errorlink(int nlink,int errn) { pcontext; p_log(LOG_ERROR,-1,lngtxt(518), nlink,datalink(nlink)->host,datalink(nlink)->port); currentsocket->sock->destructor=NULL; killsocket(datalink(nlink)->outsock); datalink(nlink)->outstate=STD_NOCON; return -1; }
int killedlink(int nlink) { pcontext; p_log(LOG_WARNING,-1,lngtxt(519), nlink,datalink(nlink)->host,datalink(nlink)->port); sysparty(lngtxt(520),datalink(nlink)->iam); killsocket(datalink(nlink)->outsock); datalink(nlink)->outstate=STD_NOCON; removetopology(me,datalink(nlink)->iam,lostlink); return -1; }
int killrelaylink(int nlink) { struct socketnodes *lkm; pcontext; p_log(LOG_WARNING,-1,lngtxt(511),datalink(nlink)->iam); lkm=getpsocketbysock(datalink(nlink)->outsock); if(lkm!=NULL) { lkm->sock->destructor=NULL; killsocket(datalink(nlink)->outsock); } lkm=getpsocketbysock(datalink(nlink)->insock); if(lkm!=NULL) { lkm->sock->destructor=NULL; killsocket(datalink(nlink)->insock); } datalink(nlink)->instate=STD_NOCON; datalink(nlink)->outstate=STD_NOCON; datalink(nlink)->insock=0; datalink(nlink)->outsock=0; return -1; }
int errorrelaylink(int nlink, int errn) { struct socketnodes *lkm; pcontext; p_log(LOG_ERROR,-1,lngtxt(510),datalink(nlink)->iam); lkm=getpsocketbysock(datalink(nlink)->outsock); if(lkm!=NULL) { lkm->sock->errorhandler=NULL; killsocket(datalink(nlink)->outsock); } lkm=getpsocketbysock(datalink(nlink)->insock); if(lkm!=NULL) { lkm->sock->errorhandler=NULL; killsocket(datalink(nlink)->insock); } datalink(nlink)->instate=STD_NOCON; datalink(nlink)->outstate=STD_NOCON; datalink(nlink)->insock=0; datalink(nlink)->outsock=0; return -1; }
int checklinkkill(int nlink,int errn) { int sock; pcontext; if(datalink(nlink)->type==LI_ALLOW) sock=datalink(nlink)->insock; else sock=datalink(nlink)->outsock; sysparty(lngtxt(556),datalink(nlink)->iam); p_log(LOG_WARNING,-1,lngtxt(557),nlink); killsocket(sock); datalink(nlink)->instate=STD_NOCON; datalink(nlink)->outstate=STD_NOCON; datalink(nlink)->insock=0; datalink(nlink)->outsock=0; removetopology(me,datalink(nlink)->iam,lostlink); return 0x0; }
int linkrelay(int npeer, int rootlink) { int tmpsock; struct socketnodes *lkm; char *ho; char vsl[10]; int issl=SSL_OFF; int nlink; int proto=AF_INET; pcontext; vsl[0]=0; #ifdef HAVE_SSL if(strstr(newpeer(npeer)->server,"S=")==newpeer(npeer)->server) { issl=SSL_ON; ho=newpeer(npeer)->server+2; strcpy(vsl,"SSL-"); } else #endif ho=newpeer(npeer)->server; p_log(LOG_INFO,-1,lngtxt(558), vsl, newpeer(npeer)->login, datalink(rootlink)->name, newpeer(npeer)->host, newpeer(npeer)->lnkport, ho, newpeer(npeer)->port, newpeer(npeer)->vhost); lkm=getpsocketbysock(newpeer(npeer)->insock); if(lkm!=NULL) { lkm->sock->flag=SOC_CONN; lkm->sock->param=npeer; lkm->sock->constructor=NULL; lkm->sock->constructed=NULL; lkm->sock->handler=checklinkdata; lkm->sock->errorhandler=errorrelaylink; lkm->sock->destructor=killrelaylink; } tmpsock=createsocket(0,ST_CONNECT,0,SGR_NONE,NULL,linkrelayconnected,errorrelaylink,checklinkdata,killrelaylink,linkrelayremap,proto,issl); tmpsock=connectto(tmpsock,ho,newpeer(npeer)->port,newpeer(npeer)->vhost); if (tmpsock!=0) { nlink=getnewlink(); if (nlink==0) { killsocket(tmpsock); p_log(LOG_ERROR,-1,lngtxt(559)); return -1; } datalink(nlink)->type=LI_RELAY; datalink(nlink)->instate=STD_CONN; datalink(nlink)->insock=newpeer(npeer)->insock; strmncpy(datalink(nlink)->iam,newpeer(npeer)->nick,sizeof(datalink(nlink)->iam)); strmncpy(datalink(nlink)->host,newpeer(npeer)->host,sizeof(datalink(nlink)->host)); strmncpy(datalink(nlink)->pass,newpeer(npeer)->pass,sizeof(datalink(nlink)->pass)); strmncpy(datalink(nlink)->name,newpeer(npeer)->name,sizeof(datalink(nlink)->name)); datalink(nlink)->port=datalink(nlink)->port; datalink(nlink)->outstate=STD_CONN; datalink(nlink)->outsock=tmpsock; if(lkm) lkm->sock->param=nlink; lkm=getpsocketbysock(tmpsock); if(lkm!=NULL) { lkm->sock->flag=SOC_SYN; lkm->sock->param=nlink; } clearpeer(npeer); return 0x0; } p_log(LOG_ERROR,-1,lngtxt(560),newpeer(npeer)->server,newpeer(npeer)->port); killsocket(newpeer(npeer)->insock); return -1; }
int processlink(int nlink, int sock, int state) { struct usernodes *th; struct linknodes *lh; int rc; char *pt,*pt2; #ifdef PARTYCHANNEL int rr = 0; char buf[600] = ""; char buf1[400] = ""; #endif char l; char o[]="->"; char i[]="<-"; char r[]="R "; char sic[500]; int last; pcontext; if (state!=STD_CONN) return 0x0; parse(); pcontext; if (!ifcommand("IAM") && !ifcommand(lngtxt(521))) broadcast(nlink); /* if its the IAM message, it does NOT get broadcasted */ pcontext; pt=strchr(ircto,'@'); #ifdef PARTYCHANNEL if(pt==NULL) pt=strchr(ircto,'*'); #endif pcontext; if (pt!=NULL) { *pt=0; pt++; if (strmcmp(pt,me)!=0 || (*ircto=='*' && strlen(pt)==1)) { pcontext; if (ifcommand(lngtxt(522))) { rc=checkuser(ircto); if (rc==0) { ap_snprintf(ircbuf,sizeof(ircbuf),lngtxt(523),me,ircnick,irchost,ircto); broadcast(0); return 0x0; } #ifdef PARTYCHANNEL ssnprintf(user(rc)->insock,lngtxt(524),ircnick,irchost,user(rc)->nick,irccontent); #else ssnprintf(user(rc)->insock,lngtxt(525),ircnick,irchost,user(rc)->nick,irccontent); #endif return 0x0; } pcontext; if (ifcommand(lngtxt(526))) { if(strstr(irccontent,o)!=NULL || strstr(irccontent,i)!=NULL) /* this is a listlink for the topology */ { pt=strchr(irccontent,'['); if(pt!=NULL) { pt++; pt2=strstr(pt,"]*"); if(pt2!=NULL) { *pt2=0; strmncpy(sic,pt,sizeof(sic)); /* in sic we got the first linker */ pt2++; pt=strstr(pt2,o); if(pt==NULL) pt=strstr(pt2,i); if(pt==NULL) return 0x0; pt2=strchr(pt+3,' '); if(pt2!=NULL) { *pt2=0; if(strstr(pt,o)==pt) { pt+=3; addtopology(sic,pt); } else { pt+=3; addtopology(pt,sic); } return 0x0; } } } } pcontext; #ifdef PARTYCHANNEL if(strstr(ircbuf,lngtxt(527))==ircbuf) { if(*ircto=='*') /* systemrequest */ { pt=strchr(irccontent,']'); if(pt!=NULL) { pt+=2; if(*pt=='*') { pt2=strchr(pt,'('); if (pt2!=NULL) { pt+=2; *pt2=0; ap_snprintf(buf,sizeof(buf),lngtxt(528),pt,irchost); if(partyadd(buf)==1) { ap_snprintf(buf1,sizeof(buf1),"%s%s\r\n",lngtxt(529),PARTYCHAN); ap_snprintf(buf,sizeof(buf),buf1,pt,irchost,pt,irchost); th=usernode; while(th!=NULL) { rc=th->uid; if(user(rc)->instate==STD_CONN && user(rc)->sysmsg==1 && user(rc)->parent==0) { writesock(user(rc)->insock,buf); } th=th->next; } return 0x0; } } } } } } #endif rc=checkuser(ircto); if (rc!=0) { ssnprintf(user(rc)->insock,lngtxt(530),ircnick,user(rc)->nick,irccontent); return 0x0; } } } } pcontext; if (ifcommand("IAM")) { if(*ircnick==0 || strchr(ircnick,' ')!=NULL || strchr(ircnick,'@')!=NULL || strchr(ircnick,'*')!=NULL) { sysparty(lngtxt(531)); killsocket(sock); datalink(nlink)->instate=STD_NOCON; datalink(nlink)->outstate=STD_NOCON; datalink(nlink)->insock=0; datalink(nlink)->outsock=0; clearlink(nlink); eraselinkini(nlink); return 0x0; } strmncpy(datalink(nlink)->iam,ircnick,sizeof(datalink(nlink)->iam)); addtopology(me,datalink(nlink)->iam); writelink(nlink); } pcontext; if (ifcommand(lngtxt(532))) { if (strmcmp(me,ircto)!=0) { p_log(LOG_ERROR,-1,lngtxt(533), nlink,datalink(nlink)->host,datalink(nlink)->port); killsocket(sock); removetopology(me,datalink(nlink)->iam,lostlink); datalink(nlink)->instate=STD_NOCON; datalink(nlink)->outstate=STD_NOCON; datalink(nlink)->insock=0; datalink(nlink)->outsock=0; clearlink(nlink); eraselinkini(nlink); return 0x0; } } pcontext; if (ifcommand(lngtxt(534))) { th=usernode; while (th!=NULL) { rc=th->uid; if ((user(rc)->instate==STD_CONN && user(rc)->parent==0 && user(rc)->sysmsg==1) || rc==1) { strmncpy(sic,irccontent,sizeof(sic)); #ifdef PARTYCHANNEL strmncpy(irccommand,lngtxt(535),sizeof(irccommand)); strmncpy(ircto,PARTYCHAN,sizeof(ircto)); if(strlen(ircto+1)<sizeof(ircto)) strcat(ircto," "); #endif /* keeping being compatible with earlier versions requires this */ if(strlen(ircnick)==6 && strstr(ircnick,lngtxt(536))==ircnick) { #ifdef PARTYCHANNEL if(strstr(irccontent,lngtxt(537))!=NULL) { pt=strstr(irccontent,lngtxt(538)); if(pt!=NULL) { pt+=5; pt2=strchr(pt,' '); if (pt2!=NULL) *pt2=0; strmncpy(ircnick,pt,sizeof(ircnick)); ap_snprintf(buf,sizeof(buf),lngtxt(539),pt,irchost); strcpy(irccommand,"JOIN"); strmncpy(irccontent,PARTYCHAN,sizeof(irccontent)); *ircto=0; if(rr==0) { partyadd(buf); rr=1; } } } if(strstr(irccontent,lngtxt(540))!=NULL) { pt=strstr(irccontent,lngtxt(541)); if(pt!=NULL) { pt+=5; pt2=strchr(pt,' '); if (pt2!=NULL) *pt2=0; strmncpy(ircnick,pt,sizeof(ircnick)); ap_snprintf(buf,sizeof(buf),lngtxt(542),pt,irchost); strcpy(irccommand,"PART"); strmncpy(irccontent,lngtxt(543),sizeof(irccontent)); if(rr==0) { partyremove(buf); rr=1; } } } #endif if(strstr(irccontent,lngtxt(544))==irccontent) { ap_snprintf(ircbuf,sizeof(ircbuf),lngtxt(545),me); broadcast(0); return 0x0; } if(strstr(irccontent,lngtxt(546))==irccontent) { pt=irccontent+11; pt2=strchr(pt,')'); if(pt2!=NULL) *pt2=0; removetopology(irchost,pt,lostlink); if(pt2!=NULL) *pt2=')'; } } #ifdef PARTYCHANNEL ap_snprintf(buf,sizeof(buf),lngtxt(547), ircnick,irchost,ircnick,irchost, irccommand,ircto,irccontent); if(user(rc)->instate==STD_CONN && user(rc)->parent==0 && user(rc)->sysmsg==1) writesock(user(rc)->insock,buf); #endif ap_snprintf(irccontent,sizeof(irccontent),"%s",sic); } th=th->next; } return 0x0; } pcontext; if (ifcommand("BWHO")) { th=usernode; while (th!=NULL) { rc=th->uid;last=0; if (user(rc)->instate!=STD_NOUSE) { if (user(rc)->parent != 0) l='^'; else { l='*';last=1; } if (user(rc)->sysmsg == 0) l='+'; if (*user(rc)->host==0) l=' '; else last=0; if(last==1) ap_snprintf(ircbuf,sizeof(ircbuf),lngtxt(548),me,ircnick,irchost,me,l,user(rc)->login,user(rc)->nick,user(rc)->network,user(rc)->server,user(rc)->user,user(rc)->last); else ap_snprintf(ircbuf,sizeof(ircbuf),lngtxt(549),me,ircnick,irchost,me,l,user(rc)->login,user(rc)->nick,user(rc)->network,user(rc)->server,user(rc)->user); broadcast(0); } th=th->next; } return 0x0; } pcontext; if (ifcommand(lngtxt(550))) { lh=linknode; while (lh!=NULL) { rc=lh->uid; l=' '; if (datalink(rc)->type!=0) { if (datalink(rc)->type==LI_LINK) { pt=o; if (datalink(rc)->outstate==STD_CONN) l='*'; } if (datalink(rc)->type==LI_ALLOW) { if (datalink(rc)->instate==STD_CONN) l='*'; pt=i; } if (datalink(rc)->type==LI_RELAY) { pt=r; l='*';} ap_snprintf(ircbuf,sizeof(ircbuf),lngtxt(551),me,ircnick,irchost,me,l,rc,pt,datalink(rc)->iam,datalink(rc)->host,datalink(rc)->port); broadcast(0); } lh=lh->next; } return 0x0; } pcontext; #ifdef PARTYCHANNEL if (ifcommand(lngtxt(552))) { strmncpy(partytopic,irccontent,sizeof(partytopic)); th=usernode; while (th!=NULL) { rc=th->uid; if (user(rc)->instate==STD_CONN && user(rc)->parent==0) { ap_snprintf(buf1,sizeof(buf1),"%s%s%s",lngtxt(553),PARTYCHAN,lngtxt(554)); ssnprintf(user(rc)->insock,buf1, ircnick,irchost,ircnick,irchost,irccontent); } th=th->next; } } #endif #ifdef INTNET if (ifcommand(lngtxt(555))) { pt=strchr(ircbuf,'\r'); if(pt==NULL) pt=strchr(ircbuf,'\n'); if(pt!=NULL) *pt=0; strmncpy(ircbuf,rtrim(irccontent),sizeof(ircbuf)); internalinbound(0,nlink); } #endif pcontext; return 0x0; }
void usr1_error(int r) { struct socketnodes *lkm,*pre; char *types[4]; char *flags[5]; char *ssle[2]; int noadv; #ifdef HAVE_SSL char ssha[]="HANDSHAKE"; SSL_CIPHER *c; int bits; SSL *reference=NULL; char *cname; #endif types[0]="CONNECT"; types[1]="LISTEN "; types[2]="RESOLVE"; types[3]="UNKNOWN"; flags[0]="NOUSE "; flags[1]="SYN "; flags[2]="CONN "; flags[3]="ERROR "; ssle[0] ="NONE"; ssle[1] =" SSL"; if(nosignals == 1) return; nosignals=1; if(r!=31337) p_log(LOG_INFO,-1,lngtxt(628)); lkm=socketnode; pre=lkm; while(lkm!=NULL) { noadv=0; if(lkm->sock!=NULL) { #ifdef HAVE_SSL if(lkm->sock->ssl==SSL_ON && lkm->sock->sslfd!=NULL) { c=SSL_get_current_cipher(lkm->sock->sslfd); SSL_CIPHER_get_bits(c,&bits); reference=lkm->sock->sslfd; if(bits==0) cname=ssha; else cname=(char *)SSL_CIPHER_get_name(c); p_log(LOG_INFO,-1,lngtxt(629), lkm->sock->syssock,types[lkm->sock->type],lkm->sock->source,lkm->sock->sport,lkm->sock->dest,lkm->sock->dport, flags[lkm->sock->flag],lkm->sock->bytesin,lkm->sock->bytesout,ssle[lkm->sock->ssl],cname,bits,lkm->sock->since); } else p_log(LOG_INFO,-1,lngtxt(630), lkm->sock->syssock,types[lkm->sock->type],lkm->sock->source,lkm->sock->sport,lkm->sock->dest,lkm->sock->dport, flags[lkm->sock->flag],lkm->sock->bytesin,lkm->sock->bytesout,ssle[lkm->sock->ssl],lkm->sock->since); #else p_log(LOG_INFO,-1,lngtxt(631), lkm->sock->syssock,types[lkm->sock->type],lkm->sock->source,lkm->sock->sport,lkm->sock->dest,lkm->sock->dport, flags[lkm->sock->flag],lkm->sock->bytesin,lkm->sock->bytesout,lkm->sock->since); #endif if(lkm->sock->type==SOC_CONN || lkm->sock->flag==SOC_SYN) { if(fcntl(lkm->sock->syssock, F_GETFD,0) <0) { p_log(LOG_WARNING,-1,lngtxt(632),lkm->sock->syssock); killsocket(lkm->sock->syssock); lkm=pre->next; noadv=1; } } } if (noadv==0) { pre=lkm; lkm=lkm->next; } } #ifdef HAVE_SSL logsslstats(reference); #endif if(r!=31337) p_log(LOG_INFO,-1,"Done"); nosignals=0; return; }
int clearuser(int usern) { struct linknodes *nextdcc; struct linknodes *thisdcc; _lastuser=-1; while (user(usern)->ignores!=NULL) user(usern)->ignores=removestring(0,user(usern)->ignores); while (user(usern)->bans!=NULL) user(usern)->bans=removestring(0,user(usern)->bans); while (user(usern)->ops!=NULL) user(usern)->ops=removestring(0,user(usern)->ops); while (user(usern)->aops!=NULL) user(usern)->aops=removestring(0,user(usern)->aops); while (user(usern)->askops!=NULL) user(usern)->askops=removestring(0,user(usern)->askops); while (user(usern)->logs!=NULL) user(usern)->logs=removestring(0,user(usern)->logs); while (user(usern)->keys!=NULL) user(usern)->keys=removestring(0,user(usern)->keys); #ifdef CRYPT while (user(usern)->encrypt!=NULL) user(usern)->encrypt=removestring(0,user(usern)->encrypt); #endif #ifdef TRANSLATE while (user(usern)->translates!=NULL) user(usern)->translates=removestring(0,user(usern)->translates); #endif #ifdef SCRIPTING clearuserscript(usern); #endif removeallchannelsfromuser(usern); nextdcc=user(usern)->dcc; if (nextdcc !=NULL) { thisdcc=nextdcc; if (thisdcc->link !=NULL) { if (thisdcc->link->outstate==STD_CONN) killsocket(thisdcc->link->outsock); if (thisdcc->link!=NULL) free(thisdcc->link); } nextdcc=nextdcc->next; free(thisdcc); } #ifdef TRAFFICLOG if(user(usern)->trafficlog!=NULL) fclose(user(usern)->trafficlog); user(usern)->trafficlog=NULL; #endif memset(user(usern),0x0,sizeof(struct usert)); if (thisuser!=NULL) { /* collecting the garbage */ if (thisuser->user != NULL) { free(thisuser->user); if(thisuser) thisuser->user=NULL; } thisuser=NULL; } return 0x0; }