void chatlog_done() { FILE *chatlog=NULL; time_t tt;struct tm *t; char str[MAX_STRING]={0}; write_log("Chat closed"); if(rcpos)chatlog_write("\n",1); if(mcpos)chatlog_write("\n",0); if(cfgs(CFG_CHATLOG))chatlog=fopen(ccs,"at"); tt=time(NULL);t=localtime(&tt); strftime(str,MAX_STRING-1,"\n[--- Chat closed at %d %b %y %H:%M:%S ---]\n\n",t); if(chatlog){fwrite(str,strlen(str),1,chatlog);fclose(chatlog);} if(lemail)fwrite(str,strlen(str),1,lemail); if(cpkt) { if(cfgi(CFG_RECODEPKTS))recode_to_remote(str); strtr(str,'\n','\r'); fwrite(str,strlen(str)-1,1,cpkt); closeqpkt(cpkt,adr); snprintf(str,MAX_STRING-1,"%s/%s",cfgs(CFG_INBOUND),basename(pktname)); if(rename(pktname,str))write_log("can't rename %s to %s: %s",pktname,str,strerror(errno)); else chmod(str,cfgi(CFG_DEFPERM)); } if(lemail) { fclose(lemail); snprintf(str,MAX_STRING-1,"mail -s chatlog %s < /tmp/qlemail.%04lx",cfgs(CFG_CHATTOEMAIL),(long)getpid()); execsh(str); lunlink(strrchr(str,'<')+1); } }
void flexecute(flist_t *fl) { char cmt='~',str[MAX_STRING],*q; FILE *f; int rem=0; DEBUG(('S',2,"Execute file: '%s', sendas: '%s', kill: '%c' fromLO: %s, offset: %d", fl->tosend,fl->sendas?fl->sendas:"(null)",fl->kill,fl->lo?"yes":"no",fl->loff)); if(fl->lo) { if(fl->loff<0) { fseek(fl->lo,0L,SEEK_SET); while(fgets(str,MAX_STRING,fl->lo)) if(*str!='~'&&*str!='\n'&&*str!='\r')rem++; fclose(fl->lo);fl->lo=NULL; if(!rem)lunlink(fl->tosend); } else if(fl->sendas) { switch(fl->kill) { case '^': lunlink(fl->tosend);break; case '#': f=fopen(fl->tosend,"w"); if(f)fclose(f); else write_log("can't truncate %s: %s",fl->tosend,strerror(errno)); break; } fseek(fl->lo,fl->loff,SEEK_SET); fwrite(&cmt,1,1,fl->lo); xfree(fl->sendas); } } else if(fl->sendas) { switch(fl->kill) { case '^': lunlink(fl->tosend);break; case '#': if((f=fopen(fl->tosend,"w")))fclose(f); else write_log("can't truncate %s: %s",fl->tosend,strerror(errno)); } xfree(fl->sendas); if(cfgi(CFG_RMBOXES)) { q=strrchr(fl->tosend,'/'); if(q&&q!=fl->tosend) { *q=0; rmdir(fl->tosend); *q='/'; } } } }
void tty_unlock(char *port) { int pid; FILE *f; char *p,lckname[MAX_PATH]; DEBUG(('M',4,"tty_unlock")); if(!(p=strrchr(port,'/')))p=port; else p++; snprintf(lckname,MAX_PATH,"%s/LCK..%s",cfgs(CFG_LOCKDIR),p); if((f=fopen(lckname,"r"))) { fscanf(f,"%d",&pid); fclose(f); } if(pid==getpid())lunlink(lckname); }
void flkill(flist_t **l,int rc) { flist_t *t; DEBUG(('S',1,"Kill filelist")); while(*l) { DEBUG(('S',2,"Kill file: '%s', sendas: '%s', kill: '%c', type: %d, fromLO: %s, offset: %d", (*l)->tosend,(*l)->sendas?(*l)->sendas:"(null)",(*l)->kill,(*l)->type,(*l)->lo?"yes":"no",(*l)->loff)); if((*l)->lo&&(*l)->loff<0) { fseek((*l)->lo,0L,SEEK_END); fclose((*l)->lo); } if((*l)->type==IS_REQ&&rc&&!(*l)->sendas)lunlink((*l)->tosend); xfree((*l)->sendas); xfree((*l)->tosend); t=(*l)->next; xfree(*l); *l=t; } }
int tty_isfree(char *port,char *nodial) { int pid; FILE *f; struct stat s; char lckname[MAX_PATH]; snprintf(lckname,MAX_PATH,"%s.%s",nodial,port); if(!stat(lckname,&s)) return 0; snprintf(lckname,MAX_PATH,"%s/LCK..%s",cfgs(CFG_LOCKDIR),port); if((f=fopen(lckname,"r"))) { fscanf(f,"%d",&pid); fclose(f); if(kill(pid,0)&&(errno==ESRCH)) { lunlink(lckname); return 1; } return 0; } return 1; }
RETSIGTYPE sigerr(int sig) { signal(sig,SIG_DFL); aso_done(); write_log("got SIG%s signal",sigs[sig]); if(cfgs(CFG_PIDFILE))if(getpid()==islocked(ccs))lunlink(ccs); IFPerl(perl_done(1)); log_done(); tty_close(); qqreset();sline("");title(""); cls_close(ssock); cls_shutd(lins_sock); cls_shutd(uis_sock); switch(sig) { case SIGSEGV: case SIGFPE: case SIGBUS: case SIGABRT: abort(); default: exit(1); } }
int freq_ifextrp(slist_t *reqs) { FILE *f, *g, *r; char s[MAX_PATH], fn[MAX_PATH], sfn[MAX_PATH], *ss; char priv = 'a', *p, *sprt = "UNPROTEC", *slst = "UNLIS"; int got = 0, wz = cfgs( CFG_EXTRP ) ? 1 : 0, kil; long tpid = (long) getpid(); ftnaddr_t *ma = akamatch( &rnode->addrs->addr, cfgal( CFG_ADDRESS )); DEBUG(('R',1,"Freq received")); if ( rnode->options & O_LST ) { priv = 'l'; slst += 2; } if( rnode->options & O_PWD ) { priv = 'p'; sprt += 2; } snprintf( fn, MAX_PATH, "/tmp/qreq.%04lx", tpid ); if( !( f = fopen( fn, "wt" ))) { write_log( "can't open '%s' for writing: %s", fn, strerror( errno )); return 0; } while( reqs ) { if ( cfgs( CFG_MAPIN ) && strchr( ccs, 'r' )) recode_to_local( reqs->str ); DEBUG(('R',1,"requested '%s'", reqs->str)); fprintf( f, "%s\n", reqs->str ); reqs = reqs->next; } fclose( f ); if(!wz) { falist_t *ra; snprintf(sfn,MAX_PATH,"/tmp/qsrif.%04lx",tpid); if(!(r=fopen(sfn,"wt"))){write_log("can't open '%s' for writing: %s",sfn,strerror(errno));return 0;} fprintf(r,"SessionType %s\n",bink?"OTHER":"EMSI"); fprintf(r,"Sysop %s\n",rnode->sysop); for(ra=rnode->addrs;ra;ra=ra->next)fprintf(r,"AKA %s\n",ftnaddrtoa(&ra->addr)); if(!is_ip)fprintf(r,"Baud %d\n",rnode->realspeed); fprintf(r,"Time -1\n"); fprintf(r,"RemoteStatus %sTED\n",sprt); fprintf(r,"SystemStatus %sTED\n",slst); fprintf(r,"RequestList /tmp/qreq.%04lx\n",tpid); fprintf(r,"ResponseList /tmp/qfls.%04lx\n",tpid); fprintf(r,"Location %s\n",rnode->place); if(rnode->phone&&*rnode->phone)fprintf(r,"Phone %s\n",rnode->phone); if(rnode->options&O_PWD)fprintf(r,"Password %s\n",rnode->pwd); fprintf(r,"Mailer %s\n",rnode->mailer); fprintf(r,"Site %s\n",rnode->name); if(!is_ip&&(ss=getenv("CALLER_ID"))&&strcasecmp(ss,"none")&&strlen(ss)>3)fprintf(r,"CallerID %s\n",ss); fprintf(r,"OurAKA %s\n",ftnaddrtoa(ma)); fprintf(r,"TRANX %08lu\n",time(NULL)); fclose(r); snprintf(s,MAX_PATH,"%s %s",cfgs(CFG_SRIFRP),sfn); } else snprintf(s,MAX_PATH,"%s -wazoo -%c -s%d %s /tmp/qreq.%04lx /tmp/qfls.%04lx /tmp/qrep.%04lx", cfgs(CFG_EXTRP),priv,rnode->realspeed,ftnaddrtoa(&rnode->addrs->addr),tpid,tpid,tpid); write_log("exec '%s' returned rc=%d",s,execsh(s)); lunlink(fn);lunlink(sfn); snprintf(fn,MAX_PATH,"/tmp/qfls.%04lx",tpid); if(!(f=fopen(fn,"rt"))) { snprintf(fn,MAX_PATH,"/tmp/qrep.%04lx",tpid); lunlink(fn); snprintf(fn,MAX_PATH,"/tmp/qfls.%04lx",tpid); lunlink(fn); write_log("can't open '%s' for reading",fn); return 0; } while(fgets(s,MAX_PATH-1,f)) { if(*s=='\n'||*s=='\r'||*s==' '||!*s)continue; ss=s;kil=0;got=1; if(*s=='='||*s=='-'){ss++;kil=1;} else if(*s=='+')ss++; p=ss+strlen(ss)-1; while(*p=='\r'||*p=='\n')*p--=0; p=strrchr(ss,' '); if(p)*p++=0;else p=ss; DEBUG(('R',1,"sending '%s' as '%s'%s",ss,qbasename((p!=ss)?p:ss),kil?" and kill":"")); addflist(&fl,xstrdup(ss),xstrdup(qbasename((p!=ss)?p:ss)),kil?'^':' ',0,NULL,0); } fclose(f);lunlink(fn); snprintf(fn,MAX_PATH,"/tmp/qrep.%04lx",tpid); if(!(f=fopen(fn,"rt"))&&wz)write_log("can't open '%s' for reading",fn); snprintf(fn,MAX_PATH,"/tmp/qpkt.%04lx%02x",tpid,++freq_pktcount); g=openpktmsg(ma,&rnode->addrs->addr,cfgs(CFG_FREQFROM),rnode->sysop,cfgs(CFG_FREQSUBJ),NULL,fn,1); if(!g) { write_log("can't open '%s' for writing: %s",fn,strerror(errno)); if(f)fclose(f); freq_pktcount--; } if(f&&g) { while(fgets(s,MAX_PATH-1,f)) { p=s+strlen(s)-1; while(*p=='\r'||*p=='\n')*p--=0; if(cfgi(CFG_RECODEPKTS))recode_to_remote(s); fputs(s,g);fputc('\r',g); } fclose(f); closeqpkt(g,ma); snprintf(s,MAX_PATH,"/tmp/qpkt.%04lx%02x",tpid,freq_pktcount); p=xstrdup(s); snprintf(s,MAX_PATH,"%08lx.pkt",sequencer()); addflist(&fl,p,xstrdup(s),'^',0,NULL,1); } snprintf(fn,MAX_PATH,"/tmp/qrep.%04lx",tpid); lunlink(fn); return got; }