void net_collect(char * tags) { gettimeofday(&tv2, NULL); char data[16] = ""; perfstat_id_t name; perfstat_netinterface_t *ub; int nnetinterface, i; nnetinterface = perfstat_netinterface(NULL, NULL, sizeof(perfstat_netinterface_t), 0); ub = malloc(sizeof(perfstat_netinterface_t) * nnetinterface); strcpy(name.name, ""); if (perfstat_netinterface(&name, ub, sizeof(perfstat_netinterface_t), nnetinterface) >= 0) { for (i = 0; i < nnetinterface; i++) { /* IN */ char * tagsin = mktag(tags, sin, ub[i].name); /* bytes */ sprintf(data, "%8llu", ub[i].ibytes); sendCollectedData(tv2.tv_sec, "proc.net.bytes", data, tagsin); /* errors */ sprintf(data, "%8llu", ub[i].ierrors); sendCollectedData(tv2.tv_sec, "proc.net.errs", data, tagsin); free(tagsin); /* OUT */ char * tagsout = mktag(tags, sout, ub[i].name); /* bytes */ sprintf(data, "%8llu", ub[i].obytes); sendCollectedData(tv2.tv_sec, "proc.net.bytes", data, tagsout); /* errors */ sprintf(data, "%8llu", ub[i].oerrors); sendCollectedData(tv2.tv_sec, "proc.net.errs", data, tagsout); free(tagsout); } } free(ub); }
int render_line(int buf, int uline) { if(bufs[buf].lpt[uline]) { int pline; for(pline=0;pline<bufs[buf].lpl[uline];pline++) free(bufs[buf].lpt[uline][pline]); free(bufs[buf].lpt[uline]); } if( // this is quite a complicated conditional, so I've split it up. It handles conference mode, quiet mode and debug mode (bufs[buf].conf&&( (bufs[buf].lm[uline]==JOIN) ||(bufs[buf].lm[uline]==PART) ||(bufs[buf].lm[uline]==NICK) ||(bufs[buf].lm[uline]==MODE) ||(bufs[buf].lm[uline]==QUIT) ) ) || (quiet&&(bufs[buf].lq[uline]==QUIET)) || (!debug&&(bufs[buf].lq[uline]==DEBUG)) ) { bufs[buf].lpt[uline]=NULL; bufs[buf].lpl[uline]=0; return(0); } char *tag=strdup(bufs[buf].ltag[uline]?bufs[buf].ltag[uline]:""); bool mergetype=((bufs[buf].lm[uline]==JOIN)&&*tag)||(bufs[buf].lm[uline]==PART)||(bufs[buf].lm[uline]==QUIT); bool merged=false; if(merge&&(bufs[buf].type==CHANNEL)&&mergetype) { int prevline=uline; while(1) { if(--prevline<0) { prevline+=bufs[buf].nlines; if(!bufs[buf].filled) break; } if(fabs(difftime(bufs[buf].ts[prevline], bufs[buf].ts[uline]))>5) break; if(bufs[buf].lm[prevline]==bufs[buf].lm[uline]) { if((bufs[buf].lm[uline]==QUIT)&&strcmp(bufs[buf].lt[uline], bufs[buf].lt[prevline])) break; const char *ltag=bufs[buf].ltag[prevline]; if(!ltag) ltag=""; if((bufs[buf].lm[uline]==JOIN)&&!*ltag) break; size_t nlen=strlen(tag)+strlen(ltag)+2; char *ntag=malloc(nlen); snprintf(ntag, nlen, "%s=%s", ltag, tag); free(tag); tag=ntag; int pline; for(pline=0;pline<bufs[buf].lpl[prevline];pline++) free(bufs[buf].lpt[prevline][pline]); free(bufs[buf].lpt[prevline]); bufs[buf].lpt[prevline]=NULL; bufs[buf].lpl[prevline]=0; merged=true; continue; } break; } } char *message=strdup(bufs[buf].lt[uline]); char *proc;size_t l,i; init_char(&proc, &l, &i); char stamp[STAMP_LEN]; timestamp(stamp, bufs[buf].ts[uline]); colour c={.fore=7, .back=0, .hi=false, .ul=false}; switch(bufs[buf].lm[uline]) { case MSG: { c=c_msg[bufs[buf].ls[uline]?0:1]; char mk[6]="<%s> "; if(show_prefix&&bufs[buf].lp[uline]) { mk[0]=mk[3]=bufs[buf].lp[uline]; } crush(&tag, maxnlen); char *ntag=mktag(mk, tag); free(tag); tag=ntag; } break; case NOTICE: { c=c_notice[bufs[buf].ls[uline]?0:1]; if(*tag) { crush(&tag, maxnlen); char *ntag=mktag("(%s) ", tag); free(tag); tag=ntag; } } break; case PREFORMAT: c=c_notice[bufs[buf].ls[uline]?0:1]; break; case ACT: { c=c_actn[bufs[buf].ls[uline]?0:1]; crush(&tag, maxnlen); char *ntag=mktag("* %s ", tag); free(tag); tag=ntag; } break; case JOIN: c=c_join[bufs[buf].ls[uline]?0:1]; if(tag&&*tag) { free(message); const char *bn=bufs[buf].bname; if(!bn) bn="the channel"; size_t l=16+strlen(bn); message=malloc(l); if(merged) snprintf(message, l, "have joined %s", bufs[buf].bname); else snprintf(message, l, "has joined %s", bufs[buf].bname); } goto eqtag; case PART: c=c_part[bufs[buf].ls[uline]?0:1]; if(tag&&*tag) { free(message); const char *bn=bufs[buf].bname; if(!bn) bn="the channel"; size_t l=16+strlen(bn); message=malloc(l); if(merged) snprintf(message, l, "have left %s", bufs[buf].bname); else snprintf(message, l, "has left %s", bufs[buf].bname); } goto eqtag; case QUIT: c=c_quit[bufs[buf].ls[uline]?0:1]; if(tag&&*tag) { const char *bn=bufs[buf].bname; if(!bn) bn="the channel"; size_t l=16+strlen(bn)+strlen(message); char *nmessage=malloc(l); if(merged) snprintf(nmessage, l, "have left %s (%s)", bufs[buf].bname, message); else snprintf(nmessage, l, "has left %s (%s)", bufs[buf].bname, message); free(message); message=nmessage; } goto eqtag; case QUIT_PREFORMAT: c=c_quit[bufs[buf].ls[uline]?0:1]; break; case NICK: { c=c_nick[bufs[buf].ls[uline]?0:1]; eqtag: if(!merge) crush(&tag, maxnlen); char *ntag=mktag("=%s= ", tag); free(tag); tag=ntag; } break; case MODE: c=c_nick[bufs[buf].ls[uline]?0:1]; break; case STA: c=c_status; break; case ERR: c=c_err; break; case UNK: c=c_unk; break; case UNK_NOTICE: c=c_unk; if(*tag) { crush(&tag, maxnlen); char *ntag=mktag("(%s) ", tag); free(tag); tag=ntag; } break; case UNN: c=c_unn; break; default: break; } int x=wordline(stamp, 0, &proc, &l, &i, c); x=wordline(tag, indent?x:0, &proc, &l, &i, c); free(tag); wordline(message, indent?x:0, &proc, &l, &i, c); free(message); bufs[buf].lpl[uline]=0; bufs[buf].lpt[uline]=NULL; bufs[buf].lpc[uline]=c; char *curr=strtok(proc, "\n"); while(curr) { int pline=bufs[buf].lpl[uline]++; char **nlpt=realloc(bufs[buf].lpt[uline], bufs[buf].lpl[uline]*sizeof(char *)); if(!nlpt) { add_to_buffer(0, ERR, NORMAL, 0, false, "realloc failed; buffer may be corrupted", "render_buffer: "); free(proc); return(1); } (bufs[buf].lpt[uline]=nlpt)[pline]=strdup(curr); curr=strtok(NULL, "\n"); } free(proc); return(0); } void in_update(iline inp) { height=max(height, 5); // anything less than this is /silly/ width=max(width, 30); // widths less than 30 break things, and are /also silly/ resetcol(); locate(height-1, 1); // tab strip int mbw = (width-1)/nbufs; if(mbw>1) { int b; for(b=0;b<nbufs;b++) { colour c={7, hilite_tabstrip?5:0, false, false}; setcolour(c); putchar(' '); // (status) {server} [channel] <user> char brack[2]={'!', '!'}; switch(bufs[b].type) { case STATUS: brack[0]='(';brack[1]=')'; break; case SERVER: brack[0]='{';brack[1]='}'; break; case CHANNEL: brack[0]='[';brack[1]=']'; break; case PRIVATE: brack[0]='<';brack[1]='>'; break; } if(b==cbuf) { c.back=2; // green c.hi=true; } else if(b==bufs[cbuf].server) { c.back=4; // blue c.ul=true; } if(bufs[b].hi_alert%2) { c.fore=6; // cyan c.hi=true; } else if(bufs[b].alert) { c.fore=1; // red c.hi=true; } if((!LIVE(b)) && (c.fore!=6)) { c.fore=3; // yellow c.hi=true; } setcolour(c); putchar(brack[0]); if(mbw>3) { char *tab=strdup(bufs[b].bname); if(bufs[b].type==SERVER) { scrush(&tab, mbw-3); } else { crush(&tab, mbw-3); } printf("%s", tab); free(tab); } if(mbw>2) putchar(brack[1]); c.fore=7; c.back=hilite_tabstrip?5:0; c.hi=c.ul=false; setcolour(c); } } else { setcolour((colour){.fore=0, .back=1, .hi=true, .ul=false}); printf("buf %u [0 to %u]", cbuf, nbufs-1); }