int connectedlink(int nlink) { char buf[400]; struct socketnodes *lkm; int tmpsock; pcontext; tmpsock=datalink(nlink)->outsock; ssnprintf(tmpsock,lngtxt(512),datalink(nlink)->name,socketnode->sock->sport); if (*datalink(nlink)->pass==0) { strmncpy(datalink(nlink)->pass,randstring(15),sizeof(datalink(nlink)->pass)); writelink(nlink); } ssnprintf(tmpsock,lngtxt(513),datalink(nlink)->pass); ssnprintf(tmpsock,lngtxt(514),me,me); #ifdef PARTYCHANNEL ssnprintf(tmpsock,lngtxt(515)); #endif #ifdef INTNET joinintnettolink(nlink); #endif ssnprintf(tmpsock,lngtxt(516)); p_log(LOG_INFO,-1,lngtxt(517), nlink,datalink(nlink)->host,datalink(nlink)->port); return 0x0; }
struct topologyt *gettopology(char *name) { struct topologyt *topo; topo=topology; if(topo==NULL) return 0x0; if(strmcmp(topo->server,name)==1) return topo; maximumdigs=100; strmncpy(digname,name,sizeof(digname)); return digtopology(topo); }
int addtopology(char *from, char *to) { struct topologyt *top,*a,*b; int i; int litype; if(topology==NULL) { topology=(struct topologyt *)pmalloc(sizeof(struct topologyt)); strmncpy(topology->server,me,sizeof(topology->server)); topology->linktype=TP_ROOT; } a=gettopology(from); b=gettopology(to); if(a!=NULL && b!=NULL) return 0x0; if(a==NULL && b==NULL) return 0x0; if(a==NULL) { top=b; litype=TP_LFROM; } else { top=a; litype=TP_LTO; } for(i=0;i<100;i++) { if(top->linked[i]==NULL) { top->linked[i]=(struct topologyt *)pmalloc(sizeof(struct topologyt)); top=top->linked[i]; top->linktype=litype; if(litype==TP_LFROM) strmncpy(top->server,from,sizeof(top->server)); else strmncpy(top->server,to,sizeof(top->server)); return 0x0; } } return 0x0; }
int *displaytopology(int(*displayvia)(char *buffer)) { struct topologyt *topo; char ebuf[60]; int rc; displevel=0; displaytopo=displayvia; topo=topology; if(topo==NULL) return 0x0; maximumdigs=100; strmncpy(ebuf,topo->server,sizeof(ebuf)); rc=(*displaytopo)(ebuf); digdisptopology(topo); return 0x0; }
char *nobreak(char *tobreak) { int smlen; char *pnt; pnt=strchr(tobreak,'\r'); if(pnt==NULL) pnt=strchr(tobreak,'\n'); if(pnt != NULL) { smlen = pnt-tobreak; smlen++; if(smlen > 8191) smlen=8191; strmncpy(nbr,tobreak,smlen); pnt=nbr; } else { pnt=tobreak; } return rtrim(pnt); }
int getini(char *section, char *param,char *inidat) { char ppuf[400]; struct stringarray *wconf; char *po; wconf=conf; memset(value,0x0,sizeof(value)); ap_snprintf(ppuf,sizeof(ppuf),"%s.%s.%s=",inidat,section,param); while (wconf!=NULL) { if(wconf->entry!=NULL) { po = strstr(wconf->entry,ppuf); if (po == wconf->entry) { po = po + strlen(ppuf); strmncpy(value,po,sizeof(value)); return 0x0; /* found, returning */ } } wconf=wconf->next; } /* not found */ return -2; }
void logsslstats(SSL *reference) { char sglobal[1024]; p_log(LOG_INFO,-1, lngtxt(613)); if(reference==NULL) p_log(LOG_INFO,-1,lngtxt(614)); else { if(SSL_get_shared_ciphers(reference,sglobal,1023)==NULL) strmncpy(sglobal,lngtxt(615),sizeof(sglobal)); p_log(LOG_INFO,-1,lngtxt(616),sglobal); } p_log(LOG_INFO,-1, lngtxt(617), SSL_CTX_sess_number(srvctx)+SSL_CTX_sess_number(clnctx)); p_log(LOG_INFO,-1, lngtxt(618), SSL_CTX_sess_connect(srvctx)+SSL_CTX_sess_connect(clnctx)); p_log(LOG_INFO,-1, lngtxt(619), SSL_CTX_sess_connect_good(srvctx)+SSL_CTX_sess_connect_good(clnctx)); #if SSLEAY_VERSION_NUMBER >= 0x0922 p_log(LOG_INFO,-1, lngtxt(620), SSL_CTX_sess_connect_renegotiate(srvctx)+SSL_CTX_sess_connect_renegotiate(clnctx)); #endif p_log(LOG_INFO,-1, lngtxt(621), SSL_CTX_sess_accept(srvctx)+SSL_CTX_sess_accept(clnctx)); p_log(LOG_INFO,-1, lngtxt(622), SSL_CTX_sess_accept_good(srvctx)+SSL_CTX_sess_accept_good(clnctx)); #if SSLEAY_VERSION_NUMBER >= 0x0922 p_log(LOG_INFO,-1, lngtxt(623), SSL_CTX_sess_accept_renegotiate(srvctx)+SSL_CTX_sess_accept_renegotiate(clnctx)); #endif p_log(LOG_INFO,-1, lngtxt(624), SSL_CTX_sess_hits(srvctx)+SSL_CTX_sess_hits(clnctx)); p_log(LOG_INFO,-1, lngtxt(625), SSL_CTX_sess_misses(srvctx)+SSL_CTX_sess_misses(clnctx)); p_log(LOG_INFO,-1, lngtxt(626), SSL_CTX_sess_timeouts(srvctx)+SSL_CTX_sess_timeouts(clnctx)); p_log(LOG_INFO,-1, lngtxt(627)); return; }
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; }
int writeini(char *section, char *param, char *inidat, char *data) { char ppuf[200]; char spuf[200]; char buf[2048]; char *po; int wasinsection; char *data_p; struct stringarray *wconf,*xconf,*sectconf; wconf=conf; data_p = data; if (data_p != NULL) if (strlen(data) == 0) data_p = NULL; wasinsection = 0; ap_snprintf(ppuf,sizeof(ppuf),lngtxt(371),inidat,section,param); ap_snprintf(spuf,sizeof(spuf),lngtxt(372),inidat,section); if(data_p!=NULL) ap_snprintf(buf,sizeof(buf),"%s%s",ppuf,data_p); xconf=conf; sectconf=conf; while (wconf) { if(wconf->entry!=NULL) { po = strstr(wconf->entry,spuf); if (po == wconf->entry) { sectconf=xconf; /* save last entry of section */ wasinsection = 1; /* we had been in the section */ po = strstr(wconf->entry,ppuf); if (po == wconf->entry) { if(data_p==NULL) { if(wconf==conf) { conf=wconf->next; xconf=conf; } else { xconf->next=wconf->next; } free(wconf->entry); free(wconf); wconf=xconf; return 0x0; } else { free(wconf->entry); wconf->entry=(char *)pmalloc(strlen(buf)+2); strmncpy(wconf->entry,buf,strlen(buf)+1); return 0x0; } } } } xconf=wconf; wconf=wconf->next; } if(data_p==NULL) return 0x0; if(wasinsection==0) { xconf->next=(struct stringarray *)pmalloc(sizeof(struct stringarray)); xconf=xconf->next; } else { xconf=sectconf; wconf=(struct stringarray *)pmalloc(sizeof(struct stringarray)); wconf->next=xconf->next; xconf->next=wconf; xconf=wconf; } xconf->entry=(char *)pmalloc(strlen(buf)+2); strmncpy(xconf->entry,buf,strlen(buf)+1); return 0x0; }
int main (int argc, char **argv) { int rc; char *pt; char *bversion; FILE *pidfile,*conffile; if(argc==2) { strmncpy(configfile,argv[1],sizeof(configfile)); } else { strcpy(configfile,"psybnc.conf"); /* rcsid */ } conffile=fopen(configfile,"r"); if(conffile==NULL) { printf("Configuration File %s not found, aborting\nRun 'make menuconfig' for creating a configuration or create the file manually.\n",configfile); /* rcsid */ exit (0x0); } fclose(conffile); readconfig(); rc = getini("SYSTEM","LANGUAGE",INIFILE); /* rcsid */ if(rc!=0) { rc=loadlanguage("english"); /* rcsid */ } else { rc=loadlanguage(value); if(rc<0) rc=loadlanguage("english"); /* rcsid */ } if(rc<0) { printf("Could not load language file, aborting.\n"); /* rcsid */ exit(0x0); } printbanner(); printf(lngtxt(991),configfile); printf(lngtxt(992),langname); ap_snprintf(logfile,sizeof(logfile),lngtxt(993)); rc = getini(lngtxt(994),lngtxt(995),INIFILE); if (rc != 0) { printf("%s", lngtxt(996)); exit (0x0); } listenport = atoi(value); rc = getini(lngtxt(997),"ME",INIFILE); if (rc < 0) { memset(value,0x0,sizeof(value)); } pt=strchr(value,' '); /* shortening bouncername to no spaces */ if(pt) *pt=0; ap_snprintf(me,sizeof(me),"%s",value); rc = getini(lngtxt(998),lngtxt(999),INIFILE); if (rc < 0) { printf("%s", lngtxt(1000)); ap_snprintf(value,sizeof(value),lngtxt(1001)); } ap_snprintf(logfile,sizeof(logfile),"%s",value); oldfile(logfile); /* creating the socket-root */ socketnode=(struct socketnodes *) pmalloc(sizeof(struct usernodes)); socketnode->sock=NULL; socketnode->next=NULL; #ifdef IPV6 /* set the default ipv6 preference for users without a PREFERIPV6 setting */ rc = getini("SYSTEM", "DEFAULTIPV6", INIFILE); if (rc == 0) { defaultipv6 = atoi(value); } #endif /* creating the demon socket */ rc = createlisteners(); if (rc == 0) { printf("%s", lngtxt(1002)); exit (0x0); } /* creating background */ pidfile = fopen(lngtxt(1003),"w"); if(pidfile==NULL) { printf("%s", lngtxt(1004)); exit(0x0); } if(mainlog!=NULL) { fclose(mainlog); mainlog=NULL; } fflush(stdout); pid = fork(); //pid = 0; if (pid < 0) { } if (pid == 0) { rc= errorhandling(); makesalt(); #ifdef HAVE_SSL initSSL(); pcontext; #endif U_CREATE=0; #ifdef PARTYCHANNEL /* partychannel setup */ strmncpy(partytopic,lngtxt(1005),sizeof(partytopic)); partyusers=NULL; #endif /* creating the usernode-root */ usernode=(struct usernodes *) pmalloc(sizeof(struct usernodes)); usernode->uid=0; usernode->user=NULL; usernode->next=NULL; /* creating the newpeer-root */ peernode=(struct peernodes *) pmalloc(sizeof(struct peernodes)); peernode->uid=0; peernode->peer=NULL; peernode->next=NULL; /* creating the datalink-root */ linknode=(struct linknodes *) pmalloc(sizeof(struct linknodes)); linknode->uid=0; linknode->link=NULL; linknode->next=NULL; /* loading the users */ loadusers(); loadlinks(); pcontext; /* loading the hostallows */ hostallows=loadlist(lngtxt(1006),hostallows); } pcontext; if (pid) { bversion=buildversion(); printf(lngtxt(1007),bversion,pid); p_log(LOG_INFO,-1,lngtxt(1008),bversion,pid); fprintf( pidfile,"%d\n",pid); fclose(pidfile); exit (0x0); } pcontext; //#ifndef BLOCKDNS // if(init_dns_core()==0) // { // dns_err(0,1); // } //#endif p_dns_init(); bncmain(); return 0x0; }