--- sbbs/src/sbbs3/xtrn_sec.cpp 2018/04/24 16:41:23 1.1.1.1 +++ sbbs/src/sbbs3/xtrn_sec.cpp 2018/04/24 16:43:23 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet external program/door section and drop file routines */ -/* $Id: xtrn_sec.cpp,v 1.1.1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: xtrn_sec.cpp,v 1.1.1.2 2018/04/24 16:43:23 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2010 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -70,7 +70,7 @@ int sbbs_t::xtrn_sec() while(online) { for(i=0,usrxsecs=0;iar,&useron)) + if(chk_ar(cfg.xtrnsec[i]->ar,&useron,&client)) usrxsec[usrxsecs++]=i; if(!usrxsecs) { bputs(text[NoXtrnPrograms]); @@ -100,7 +100,7 @@ int sbbs_t::xtrn_sec() else xsec=0; - while(!chk_ar(cfg.xtrnsec[xsec]->ar,&useron)) + while(!chk_ar(cfg.xtrnsec[xsec]->ar,&useron,&client)) xsec++; if(xsec>=cfg.total_xtrnsecs) { @@ -116,7 +116,7 @@ int sbbs_t::xtrn_sec() continue; if(cfg.xtrn[i]->event && cfg.xtrn[i]->misc&EVENTONLY) continue; - if(!chk_ar(cfg.xtrn[i]->ar,&useron)) + if(!chk_ar(cfg.xtrn[i]->ar,&useron,&client)) continue; usrxtrn[usrxtrns++]=i; } @@ -193,7 +193,7 @@ int sbbs_t::xtrn_sec() } -char *hungupstr="\1n\1h%s\1n hung up on \1h%s\1n %s\r\n"; +const char *hungupstr="\1n\1h%s\1n hung up on \1h%s\1n %s\r\n"; /****************************************************************************/ /* Convert C string to pascal string */ @@ -299,9 +299,11 @@ void sbbs_t::xtrndat(char *name, char *d { char str[1024],tmp2[128],c,*p; char tmp[512]; - int i,file; - ushort w; - long l; + /* TODO: 16-bit i */ + int16_t i; + int file; + uint16_t w; + int32_t l; struct tm tm; struct tm tl; stats_t stats; @@ -370,7 +372,7 @@ void sbbs_t::xtrndat(char *name, char *d ,useron.level /* User main level */ ,useron.level /* User transfer level */ ,useron.birth /* User birthday */ - ,useron.sex /* User sex (M/F) */ + ,useron.sex ? useron.sex : '?' /* User sex (M/F) */ ,useron.number /* User number */ ,useron.phone); /* User phone number */ lfexpand(str,misc); @@ -378,7 +380,7 @@ void sbbs_t::xtrndat(char *name, char *d sprintf(str,"%u\n%u\n%x\n%lu\n%s\n%s\n" "%s\n%s\n%s\n%s\n%s\n%s\n%lu\n" - ,misc&IO_INTS ? 0:cfg.com_port /* Com port or 0 if !FOSSIL */ + ,misc&(XTRN_STDIO|XTRN_CONIO) ? 0:cfg.com_port /* Com port or 0 if !FOSSIL */ ,cfg.com_irq /* Com IRQ */ ,cfg.com_base /* Com base in hex */ ,dte_rate /* Com rate */ @@ -400,7 +402,7 @@ void sbbs_t::xtrndat(char *name, char *d write(file,str,strlen(str)); /* Total external programs */ for(i=0;iar,&useron)) + if(SYSOP || chk_ar(cfg.xtrn[i]->ar,&useron,&client)) strcpy(str,cfg.xtrn[i]->name); else str[0]=0; /* Blank if no access */ @@ -439,7 +441,7 @@ void sbbs_t::xtrndat(char *name, char *d ,temp_dir ,cfg.sys_id ,cfg.node_misc - ,misc&IO_INTS ? INVALID_SOCKET : client_socket_dup + ,misc&(XTRN_STDIO|XTRN_CONIO) ? INVALID_SOCKET : client_socket_dup ); lfexpand(str,misc); write(file,str,strlen(str)); @@ -466,7 +468,7 @@ void sbbs_t::xtrndat(char *name, char *d ,useron.name /* User real name */ ,nulstr /* User call sign */ ,getage(&cfg,useron.birth) /* User age */ - ,useron.sex); /* User sex (M/F) */ + ,useron.sex ? useron.sex : '?'); /* User sex (M/F) */ strupr(str); lfexpand(str,misc); write(file,str,strlen(str)); @@ -522,7 +524,7 @@ void sbbs_t::xtrndat(char *name, char *d #if 0 if(misc&XTRN_NATIVE) { - if(misc&IO_INTS) { + if(misc&(XTRN_STDIO|XTRN_CONIO)) { strcpy(str,"COM0:STDIO\n"); } else { @@ -702,17 +704,17 @@ void sbbs_t::xtrndat(char *name, char *d return; } w=(WORD)dte_rate; - write(file,&w,sizeof(short)); /* BaudRate */ + write(file,&w,sizeof(w)); /* BaudRate */ /* SysInfo */ getstats(&cfg,0,&stats); - write(file,&stats.logons,sizeof(long)); /* CallCount */ + write(file,&stats.logons,sizeof(stats.logons)); /* CallCount */ write(file,nulstr,36); /* LastCallerName */ write(file,nulstr,36); /* LastCallerAlias */ write(file,nulstr,92); /* ExtraSpace */ /* TimeLogInfo */ write(file,nulstr,9); /* StartDate */ - write(file,nulstr,24*sizeof(short)); /* BusyPerHour */ - write(file,nulstr,7*sizeof(short)); /* BusyPerDay */ + write(file,nulstr,24*sizeof(int16_t)); /* BusyPerHour */ + write(file,nulstr,7*sizeof(int16_t)); /* BusyPerDay */ /* UserInfo */ str2pas(name,str); /* Name */ write(file,str,36); @@ -739,33 +741,33 @@ void sbbs_t::xtrndat(char *name, char *d write(file,&c,1); /* Attrib */ write(file,&useron.flags1,4); /* Flags */ w=0; - write(file,&w,sizeof(short)); /* Credit */ - write(file,&w,sizeof(short)); /* Pending */ - write(file,&useron.posts,sizeof(short));/* TimesPosted */ - write(file,&w,sizeof(short)); /* HighMsgRead */ + write(file,&w,sizeof(w)); /* Credit */ + write(file,&w,sizeof(w)); /* Pending */ + write(file,&useron.posts,sizeof(useron.posts));/* TimesPosted */ + write(file,&w,sizeof(w)); /* HighMsgRead */ w=useron.level; - write(file,&w,sizeof(short)); /* SecLvl */ + write(file,&w,sizeof(w)); /* SecLvl */ w=0; - write(file,&w,sizeof(short)); /* Times */ - write(file,&useron.uls,sizeof(short)); /* Ups */ - write(file,&useron.dls,sizeof(short)); /* Downs */ + write(file,&w,sizeof(w)); /* Times */ + write(file,&useron.uls,sizeof(useron.uls)); /* Ups */ + write(file,&useron.dls,sizeof(useron.dls)); /* Downs */ w=(ushort)(useron.ulb/1024UL); - write(file,&w,sizeof(short)); /* UpK */ + write(file,&w,sizeof(w)); /* UpK */ w=(ushort)(useron.dlb/1024UL); - write(file,&w,sizeof(short)); /* DownK */ + write(file,&w,sizeof(w)); /* DownK */ w=(ushort)(logon_dlb/1024UL); - write(file,&w,sizeof(short)); /* TodayK */ + write(file,&w,sizeof(w)); /* TodayK */ w=0; - write(file,&w,sizeof(short)); /* Elapsed */ - write(file,&w,sizeof(short)); /* Len */ - write(file,&w,sizeof(short)); /* CombinedPtr */ - write(file,&w,sizeof(short)); /* AliasPtr */ + write(file,&w,sizeof(w)); /* Elapsed */ + write(file,&w,sizeof(w)); /* Len */ + write(file,&w,sizeof(w)); /* CombinedPtr */ + write(file,&w,sizeof(w)); /* AliasPtr */ l=0; - write(file,&l,sizeof(long)); /* Birthday (as a long?) */ + write(file,&l,sizeof(l)); /* Birthday (as a long?) */ /* EventInfo */ c=0; write(file,&c,sizeof(char)); /* Status */ - write(file,&l /* sys_eventtime */,sizeof(long)); /* RunTime */ + write(file,&l /* sys_eventtime */,sizeof(l)); /* RunTime */ write(file,&c,sizeof(char)); /* ErrorLevel */ c='\xff'; write(file,&c,sizeof(char)); /* Days */ @@ -776,7 +778,7 @@ void sbbs_t::xtrndat(char *name, char *d l=0; else l=cfg.event[0]->last; - write(file,&l,sizeof(long)); /* LastTimeRun */ + write(file,&l,sizeof(l)); /* LastTimeRun */ memset(str,0,40); write(file,str,7); /* Spare */ @@ -791,10 +793,10 @@ void sbbs_t::xtrndat(char *name, char *d unixtodstr(&cfg,logontime,tmp); str2pas(tmp,str); write(file,str,9); /* LoginDate */ - write(file,&cfg.level_timepercall[useron.level],sizeof(short)); /* TmLimit */ - write(file,&logontime,sizeof(long)); /* LoginSec */ - write(file,&useron.cdt,sizeof(long)); /* Credit */ - write(file,&useron.number,sizeof(short)); /* UserRecNum */ + write(file,&cfg.level_timepercall[useron.level],sizeof(int16_t)); /* TmLimit */ + write(file,&logontime,sizeof(logontime)); /* LoginSec */ + write(file,&useron.cdt,sizeof(useron.cdt)); /* Credit */ + write(file,&useron.number,sizeof(useron.number)); /* UserRecNum */ write(file,&i,2); /* ReadThru */ write(file,&i,2); /* PageTimes */ write(file,&i,2); /* DownLimit */ @@ -815,7 +817,7 @@ void sbbs_t::xtrndat(char *name, char *d write(file,&c,1); /* GraphicsMode */ c=useron.xedit ? 1:0; write(file,&c,1); /* ExternEdit */ - i=rows; + i=(int16_t)rows; write(file,&i,2); /* ScreenLength */ c=1; write(file,&c,1); /* MNP_Connect */ @@ -1006,7 +1008,7 @@ void sbbs_t::xtrndat(char *name, char *d sprintf(str,"%-25.25s",name); /* User's full name */ write(file,str,25); - i=(tleft/60); + i=(int16_t)(tleft/60); write(file,&i,2); /* Minutes remaining */ write(file,&cfg.node_num,1); /* Node number */ @@ -1311,10 +1313,11 @@ void sbbs_t::xtrndat(char *name, char *d return; } - sprintf(str,"%d\n%d\n38400\n%s%c\n%d\n%s\n%s\n%d\n%ld\n" + sprintf(str,"%d\n%d\n%u\n%s%c\n%d\n%s\n%s\n%d\n%ld\n" "%d\n%d\n" - ,misc&IO_INTS ? 0 /* Local */ : 2 /* Telnet */ - ,misc&IO_INTS ? INVALID_SOCKET : client_socket_dup + ,misc&(XTRN_STDIO|XTRN_CONIO) ? 0 /* Local */ : 2 /* Telnet */ + ,misc&(XTRN_STDIO|XTRN_CONIO) ? INVALID_SOCKET : client_socket_dup + ,dte_rate ,VERSION_NOTICE,REVISION ,useron.number ,useron.name @@ -1341,7 +1344,8 @@ void sbbs_t::moduserdat(uint xtrnnum) { char str[256],path[256],c,startup[128]; char tmp[512]; - uint i; + /* TODO: I don't really like a 16-bit i */ + uint16_t i; long mod; int file; FILE * stream; @@ -1358,7 +1362,7 @@ void sbbs_t::moduserdat(uint xtrnnum) lseek(file,373,SEEK_SET); read(file,&i,2); /* SecLvl */ if(irun_ar,&useron) - || !chk_ar(cfg.xtrnsec[cfg.xtrn[xtrnnum]->sec]->ar,&useron)) { + if(!chk_ar(cfg.xtrn[xtrnnum]->run_ar,&useron,&client) + || !chk_ar(cfg.xtrnsec[cfg.xtrn[xtrnnum]->sec]->ar,&useron,&client)) { bputs(text[CantRunThatProgram]); return(false); } @@ -1613,7 +1617,7 @@ bool sbbs_t::exec_xtrn(uint xtrnnum) c=cfg.sys_nodes+1; } else if(node.misc&NODE_ANON) - SAFECOPY(str,"UNKNOWN USER"); + SAFECOPY(str,text[UNKNOWN_USER]); else username(&cfg,node.useron,str); bprintf(text[UserRunningXtrn],str @@ -1681,7 +1685,7 @@ bool sbbs_t::exec_xtrn(uint xtrnnum) else SAFECOPY(name,useron.alias); - gettimeleft(); + gettimeleft(cfg.xtrn[xtrnnum]->misc&XTRN_CHKTIME ? true:false); tleft=timeleft+(cfg.xtrn[xtrnnum]->textra*60); if(cfg.xtrn[xtrnnum]->maxtime && tleft>(cfg.xtrn[xtrnnum]->maxtime*60)) tleft=(cfg.xtrn[xtrnnum]->maxtime*60); @@ -1710,8 +1714,10 @@ bool sbbs_t::exec_xtrn(uint xtrnnum) mode=0; if(cfg.xtrn[xtrnnum]->misc&XTRN_SH) mode|=EX_SH; - if(cfg.xtrn[xtrnnum]->misc&IO_INTS) - mode|=(EX_OUTR|EX_INR|EX_OUTL); + if(cfg.xtrn[xtrnnum]->misc&XTRN_STDIO) + mode|=EX_STDIO; + else if(cfg.xtrn[xtrnnum]->misc&XTRN_CONIO) + mode|=EX_CONIO; mode|=(cfg.xtrn[xtrnnum]->misc&(XTRN_CHKTIME|XTRN_NATIVE|XTRN_NOECHO|WWIVCOLOR)); if(cfg.xtrn[xtrnnum]->misc&MODUSERDAT) { /* Delete MODUSER.DAT */ sprintf(str,"%sMODUSER.DAT",dropdir); /* if for some weird */ @@ -1729,7 +1735,7 @@ bool sbbs_t::exec_xtrn(uint xtrnnum) starttime+=end-start; if(cfg.xtrn[xtrnnum]->clean[0]) { external(cmdstr(cfg.xtrn[xtrnnum]->clean,path,nulstr,NULL) - ,mode&~EX_INR, cfg.xtrn[xtrnnum]->path); + ,mode&~(EX_STDIN|EX_CONIO), cfg.xtrn[xtrnnum]->path); } /* Re-open the logfile */ if(logfile_fp==NULL) { @@ -1756,8 +1762,8 @@ bool sbbs_t::exec_xtrn(uint xtrnnum) } getnodedat(cfg.node_num,&thisnode,0); now=time(NULL); - sprintf(str,hungupstr,useron.alias,cfg.xtrn[thisnode.aux-1]->name - ,timestr(&now)); + sprintf(str,hungupstr,useron.alias,thisnode.aux ? cfg.xtrn[thisnode.aux-1]->name : "External Program" + ,timestr(now)); write(file,str,strlen(str)); close(file); } @@ -1783,8 +1789,8 @@ bool sbbs_t::user_event(user_event_t eve for(i=0;ievent!=event) continue; - if(!chk_ar(cfg.xtrn[i]->ar,&useron) - || !chk_ar(cfg.xtrnsec[cfg.xtrn[i]->sec]->ar,&useron)) + if(!chk_ar(cfg.xtrn[i]->ar,&useron,&client) + || !chk_ar(cfg.xtrnsec[cfg.xtrn[i]->sec]->ar,&useron,&client)) continue; success=exec_xtrn(i); }