int http_parse_line(struct http_response *head, char *buf) { int old_errno = errno; if (strmcmp(buf, "Content-Length:") == 0) { errno = 0; head->content_length = strtol(buf + 16, NULL, 10); if (errno != 0) return -1; errno = old_errno; } else if (strmcmp(buf, "Content-Encoding:") == 0) { if (strstr(buf, "compress") != NULL) head->content_encoding = HTTP_CONT_ENC_COMPRESS; if (strstr(buf, "deflate") != NULL) head->content_encoding = HTTP_CONT_ENC_DEFLATE; if (strstr(buf, "gzip") != NULL) head->content_encoding = HTTP_CONT_ENC_GZIP; } else if (strmcmp(buf, "Transfer-Encoding:") == 0) { if (strstr(buf, "chunked") != NULL) head->transfer_encoding = HTTP_TRANS_ENC_CHUNKED; } return 0; }
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); }
struct topologyt *digtopology(struct topologyt *topo) { struct topologyt *dig; int i; if(strmcmp(topo->server,digname)==1) return topo; maximumdigs--; if(maximumdigs==0) return NULL; for(i=0;i<100;i++) { if(topo->linked[i]!=NULL) { dig=digtopology(topo->linked[i]); if(dig!=NULL) return dig; } } return NULL; }
int getlink(int peern) { int i=1; char *ho; pcontext; while (i<=MAXCONN) { ho=datalink(i)->host; if(strstr(datalink(i)->host,"S=")==datalink(i)->host) ho+=2; if (strmcmp(ho,newpeer(peern)->host)) { if (datalink(i)->port==newpeer(peern)->lnkport) return i; } i++; } return 0x0; }
/* Given a buffer holding an acpi file, searches for the given key in it, * and returns the numeric value. 0 is returned on failure. */ inline int scan_acpi_num (const char *buf, const char *key) { char *ptr; int ret = 0; do { ptr = strchr(buf, '\n'); if (!strmcmp(buf, key)) { if ((ptr = strchr(buf, '='))) { sscanf(ptr + 1, "%d", &ret); return ret; } else { return 0; } } if (ptr) ptr++; buf = ptr; } while (buf != NULL); return 0; }
/* Given a buffer holding an acpi file, searches for the given key in it, * and returns its value in a statically allocated string. */ inline char *scan_acpi_value (const char *buf, const char *key) { char *ptr; static char ret[256]; do { ptr = strchr(buf, '\n'); if (!strmcmp(buf, key)) { if ((ptr = strchr(buf, '='))) { if (sscanf(ptr + 1, "%255s", ret) == 1) { return ret; } else { return NULL; } } else { return NULL; } } if (ptr) ptr++; buf = ptr; } while (buf != NULL); return NULL; }
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; }