int brute_cvsroot(void) { int i, ret = 0; char * rbuf; info("Bruteforcing cvsroot...\n"); for (i = 0; CVSROOTS[i].name; i++) { nopen(host, port); nprintf(CVS_VERIF, CVSROOTS[i].name, DUMMY, scramble(DUMMY)); info("Trying CVSROOT = %s\t", CVSROOTS[i].name); rbuf = flush_sock(); nclose(); if (!rbuf || strstr(rbuf, CVS_BAD_REP)) info(BAD_TRIP); else if (strstr(rbuf, CVS_AUTH_FAILED) || strstr(rbuf, CVS_AUTH_SUCCESS) || strstr(rbuf, CVS_NO_USER)) { info(GOOD_TRIP); CVSROOTS[i].id = i; root = CVSROOTS[i].name; if (user && pass) { free(rbuf); return (1); } ret++; } else printf(BAD_TRIP); free(rbuf); } return (ret); }
void getnodemsg() { char str[81], *buf; int file; ulong length; nodesync(); sprintf(str,"message.%d",node_num); if(flength(str)<1L) /* v1.02 fix */ return; if((file=nopen(str,O_RDWR))==-1) { bprintf("Couldn't open %s\r\n",str); return; } length=filelength(file); if((buf=malloc(length+1L))==NULL) { close(file); bprintf("\7\r\ngetnodemsg: Error allocating %lu bytes of memory for %\r\n" ,length+1L,str); return; } buf[read(file,buf,length)]=0; chsize(file,0); close(file); if(!symbols) strip_symbols(buf); bputs(buf); free(buf); }
void sbbs_t::read_sif_dat(char *siffile, char *datfile) { char *buf; int file; long length; if((file=nopen(datfile,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,datfile,O_RDONLY); return; } length=filelength(file); if(!length) { close(file); return; } if((buf=(char *)malloc(length))==NULL) { close(file); errormsg(WHERE,ERR_ALLOC,datfile,length); return; } read(file,buf,length); close(file); sof(siffile,buf,length); free(buf); }
int DLLCALL update_uldate(scfg_t* cfg, file_t* f) { char str[MAX_PATH+1],fname[13]; int i,file; long l,length; /*******************/ /* Update IXB File */ /*******************/ SAFEPRINTF2(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); if((file=nopen(str,O_RDWR))==-1) return(errno); length=(long)filelength(file); if(length%F_IXBSIZE) { close(file); return(-1); } SAFECOPY(fname,f->name); for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ fname[i]=fname[i+1]; for(l=0;l<length;l+=F_IXBSIZE) { read(file,str,F_IXBSIZE); /* Look for the filename in the IXB file */ str[11]=0; if(!stricmp(fname,str)) break; } if(l>=length) { close(file); return(-2); } lseek(file,l+14,SEEK_SET); write(file,&f->dateuled,4); close(file); /*******************************************/ /* Update last upload date/time stamp file */ /*******************************************/ SAFEPRINTF2(str,"%s%s.dab",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); if((file=nopen(str,O_WRONLY|O_CREAT))==-1) return(errno); write(file,&f->dateuled,4); close(file); return(0); }
int do_auth(void) { char * your_mind; nopen(host, port); nprintf(CVS_LOGIN, root, user, scramble(pass)); your_mind = flush_sock(); if (!strstr(your_mind, CVS_AUTH_SUCCESS)) QUIT(ERR_AUTHFAILED); free(your_mind); nprintf(CVS_SEND_ROOT, root); }
void putnodemsg(char *msg, uint nodenumber) { char str[81]; int file; sprintf(str,"message.%d",nodenumber); if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { bprintf("\r\n\7putnodemsg: error opening/creating %s\r\n",str); return; } write(file,msg,strlen(msg)); close(file); }
void sbbs_t::openfile(file_t* f) { char str1[256],str2[4],str3[4],ch; int file; /************************************/ /* Increment open count in dat file */ /************************************/ sprintf(str1,"%s%s.dat",cfg.dir[f->dir]->data_dir,cfg.dir[f->dir]->code); if((file=nopen(str1,O_RDWR))==-1) { errormsg(WHERE,ERR_OPEN,str1,O_RDWR); return; } lseek(file,f->datoffset+F_OPENCOUNT,SEEK_SET); if(read(file,str2,3)!=3) { close(file); errormsg(WHERE,ERR_READ,str1,3); return; } str2[3]=0; ultoa(atoi(str2)+1,str3,10); putrec(str2,0,3,str3); lseek(file,f->datoffset+F_OPENCOUNT,SEEK_SET); if(write(file,str2,3)!=3) { close(file); errormsg(WHERE,ERR_WRITE,str1,3); return; } close(file); /**********************************/ /* Add transaction to BACKOUT.DAB */ /**********************************/ sprintf(str1,"%sbackout.dab",cfg.node_dir); if((file=nopen(str1,O_WRONLY|O_APPEND|O_CREAT))==-1) { errormsg(WHERE,ERR_OPEN,str1,O_WRONLY|O_APPEND|O_CREAT); return; } ch=BO_OPENFILE; write(file,&ch,1); /* backout type */ write(file,cfg.dir[f->dir]->code,8); /* directory code */ write(file,&f->datoffset,4); /* offset into .dat file */ write(file,&ch,BO_LEN-(1+8+4)); /* pad it */ close(file); }
extern "C" BOOL DLLCALL putmsgptrs(scfg_t* cfg, uint usernumber, subscan_t* subscan) { char str[256]; ushort idx; uint16_t scancfg; uint i,j; int file; ulong length; uint32_t l=0L; if(!usernumber) return(FALSE); sprintf(str,"%suser/ptrs/%4.4u.ixb", cfg->data_dir,usernumber); if((file=nopen(str,O_WRONLY|O_CREAT))==-1) { return(FALSE); } length=(ulong)filelength(file); for(i=0;i<cfg->total_subs;i++) { if(subscan[i].sav_ptr==subscan[i].ptr && subscan[i].sav_last==subscan[i].last && length>=((cfg->sub[i]->ptridx+1)*10UL) && subscan[i].sav_cfg==subscan[i].cfg) continue; while(filelength(file)<(long)(cfg->sub[i]->ptridx)*10) { lseek(file,0L,SEEK_END); idx=(ushort)(tell(file)/10); for(j=0;j<cfg->total_subs;j++) if(cfg->sub[j]->ptridx==idx) break; write(file,&l,sizeof(l)); write(file,&l,sizeof(l)); scancfg=0xff; if(j<cfg->total_subs) { if(!(cfg->sub[j]->misc&SUB_NSDEF)) scancfg&=~SUB_CFG_NSCAN; if(!(cfg->sub[j]->misc&SUB_SSDEF)) scancfg&=~SUB_CFG_SSCAN; } else /* default to scan OFF for unknown sub */ scancfg&=~(SUB_CFG_NSCAN|SUB_CFG_SSCAN); write(file,&scancfg,sizeof(scancfg)); } lseek(file,(long)((long)(cfg->sub[i]->ptridx)*10),SEEK_SET); write(file,&(subscan[i].ptr),sizeof(subscan[i].ptr)); write(file,&(subscan[i].last),sizeof(subscan[i].last)); write(file,&(subscan[i].cfg),sizeof(subscan[i].cfg)); } close(file); if(!flength(str)) /* Don't leave 0 byte files */ remove(str); return(TRUE); }
void clearptrs(int subnum) { char str[256]; ushort idx,scancfg; int file,i,gi; long l=0L; glob_t g; uifc.pop("Clearing Pointers..."); sprintf(str,"%suser/ptrs/*.ixb",cfg.data_dir); glob(str,0,NULL,&g); for(gi=0;gi<g.gl_pathc;gi++) { if(flength(g.gl_pathv[gi])>=((long)cfg.sub[subnum]->ptridx+1L)*10L) { if((file=nopen(g.gl_pathv[gi],O_WRONLY))==-1) { errormsg(WHERE,ERR_OPEN,g.gl_pathv[gi],O_WRONLY); bail(1); } while(filelength(file)<(long)(cfg.sub[subnum]->ptridx)*10) { lseek(file,0L,SEEK_END); idx=tell(file)/10; for(i=0;i<cfg.total_subs;i++) if(cfg.sub[i]->ptridx==idx) break; write(file,&l,sizeof(l)); write(file,&l,sizeof(l)); scancfg=0xff; if(i<cfg.total_subs) { if(!(cfg.sub[i]->misc&SUB_NSDEF)) scancfg&=~SUB_CFG_NSCAN; if(!(cfg.sub[i]->misc&SUB_SSDEF)) scancfg&=~SUB_CFG_SSCAN; } else /* Default to scan OFF for unknown sub */ scancfg&=~(SUB_CFG_NSCAN|SUB_CFG_SSCAN); write(file,&scancfg,sizeof(scancfg)); } lseek(file,((long)cfg.sub[subnum]->ptridx)*10L,SEEK_SET); write(file,&l,sizeof(l)); /* date set to null */ write(file,&l,sizeof(l)); /* date set to null */ scancfg=0xff; if(!(cfg.sub[subnum]->misc&SUB_NSDEF)) scancfg&=~SUB_CFG_NSCAN; if(!(cfg.sub[subnum]->misc&SUB_SSDEF)) scancfg&=~SUB_CFG_SSCAN; write(file,&scancfg,sizeof(scancfg)); close(file); } } globfree(&g); uifc.pop(0); }
void DLLCALL getextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext) { char str[MAX_PATH+1]; int file; memset(ext,0,F_EXBSIZE+1); SAFEPRINTF2(str,"%s%s.exb",cfg->dir[dirnum]->data_dir,cfg->dir[dirnum]->code); if((file=nopen(str,O_RDONLY))==-1) return; lseek(file,(datoffset/F_LEN)*F_EXBSIZE,SEEK_SET); read(file,ext,F_EXBSIZE); close(file); }
void getcarddat() { int file; if((file=nopen("card.dab",O_RDONLY))==-1) { bputs("getcarddat: Error opening card.dab\r\n"); return; } read(file,&dc,1); read(file,dealer,sizeof(dealer)); read(file,&total_decks,1); read(file,&cur_card,2); read(file,card,total_decks*52*sizeof(card_t)); close(file); }
void putcarddat() { int file; if((file=nopen("card.dab",O_WRONLY|O_CREAT))==-1) { bputs("putcarddat: Error opening card.dab\r\n"); return; } write(file,&dc,1); write(file,dealer,sizeof(dealer)); write(file,&total_decks,1); write(file,&cur_card,2); write(file,card,total_decks*52*sizeof(card_t)); close(file); }
void sbbs_t::backout() { char str[256],code[128],*buf; int i,file; long length,l; file_t f; sprintf(str,"%sbackout.dab",cfg.node_dir); if(flength(str)<1L) { remove(str); return; } if((file=nopen(str,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return; } length=(long)filelength(file); if((buf=(char *)malloc(length))==NULL) { close(file); errormsg(WHERE,ERR_ALLOC,str,length); return; } if(read(file,buf,length)!=length) { close(file); free(buf); errormsg(WHERE,ERR_READ,str,length); return; } close(file); for(l=0;l<length;l+=BO_LEN) { switch(buf[l]) { case BO_OPENFILE: /* file left open */ memcpy(code,buf+l+1,8); code[8]=0; for(i=0;i<cfg.total_dirs;i++) /* search by code */ if(!stricmp(cfg.dir[i]->code,code)) break; if(i<cfg.total_dirs) { /* found internal code */ f.dir=i; memcpy(&f.datoffset,buf+l+9,4); closefile(&f); } break; default: errormsg(WHERE,ERR_CHK,str,buf[l]); } } free(buf); remove(str); /* always remove the backout file */ }
void DLLCALL putextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext) { char str[MAX_PATH+1],nulbuf[F_EXBSIZE]; int file; strip_invalid_attr(ext); /* eliminate bogus ctrl-a codes */ memset(nulbuf,0,sizeof(nulbuf)); SAFEPRINTF2(str,"%s%s.exb",cfg->dir[dirnum]->data_dir,cfg->dir[dirnum]->code); if((file=nopen(str,O_WRONLY|O_CREAT))==-1) return; lseek(file,0L,SEEK_END); while(filelength(file)<(long)(datoffset/F_LEN)*F_EXBSIZE) write(file,nulbuf,sizeof(nulbuf)); lseek(file,(datoffset/F_LEN)*F_EXBSIZE,SEEK_SET); write(file,ext,F_EXBSIZE); close(file); }
void debugline(char *line) { char str[256]; int file; time_t now; struct dosdate_t date; struct dostime_t curtime; #if 1 now=time(NULL); unixtodos(now,&date,&curtime); if((file=nopen("debug.log",O_WRONLY|O_APPEND|O_CREAT))==-1) return; sprintf(str,"%d %02u:%02u:%02u %s\r\n" ,node_num,curtime.ti_hour,curtime.ti_min,curtime.ti_sec,line); write(file,str,strlen(str)); close(file); #endif }
int brute_username(void) { int i, c, ret = 0; char * rbuf; info("Bruteforcing cvs login... \n"); for (c = 0; CVSROOTS[c].name; c++) { if (!root && CVSROOTS[c].id == -1) continue; for ( i=0; USERNAMES[i].name; i++ ) { if (root) CVSROOTS[c].name = root; info("Trying cvsroot = %s, login = %s\t", CVSROOTS[c].name, USERNAMES[i].name); nopen(host, port); nprintf(CVS_VERIF, CVSROOTS[c].name, USERNAMES[i].name, scramble(DUMMY)); rbuf = flush_sock(); nclose(); if ( strstr( rbuf, CVS_NO_USER)) info( BAD_TRIP, rbuf ); else if (strstr( rbuf, CVS_AUTH_FAILED) || strstr(rbuf, CVS_AUTH_SUCCESS)) { info(GOOD_TRIP); USERNAMES[i].id = CVSROOTS[c].id; user = USERNAMES[i].name; if (pass) { free(rbuf); return (1); } ret++; } free(rbuf); } if (root) return (ret); } return (ret); }
void sbbs_t::create_sif_dat(char *siffile, char *datfile) { char *buf; int file; if((buf=(char *)malloc(SIF_MAXBUF))==NULL) { errormsg(WHERE,ERR_ALLOC,siffile,SIF_MAXBUF); return; } memset(buf,SIF_MAXBUF,0); /* initialize to null */ sif(siffile,buf,SIF_MAXBUF); if((file=nopen(datfile,O_WRONLY|O_TRUNC|O_CREAT))==-1) { free(buf); errormsg(WHERE,ERR_OPEN,datfile,O_WRONLY|O_TRUNC|O_CREAT); return; } write(file,buf,strlen(buf)); close(file); free(buf); }
int brute_password(void) { int i, c, ret=0; char * rbuf; info("Bruteforcing cvs password...\n"); for (c = 0; USERNAMES[c].name; c++) { if (!user && USERNAMES[c].id == -1) continue; for (i = 0; PASSWORDS[i].name; i++) { info("Trying login = %s, pass = %s\t", user?user:USERNAMES[c].name, PASSWORDS[i].name); nopen(host, port); nprintf(CVS_VERIF,root?root:CVSROOTS[USERNAMES[c].id].name, user?user:USERNAMES[c].name, scramble(PASSWORDS[i].name) ); rbuf = flush_sock(); nclose(); if (strstr(rbuf, CVS_AUTH_FAILED)) info(BAD_TRIP, rbuf); else if (strstr(rbuf, CVS_AUTH_SUCCESS)) { info(GOOD_TRIP); if (!root) root = CVSROOTS[ USERNAMES[c].id ].name; if (!user) user = USERNAMES[c].name; pass = PASSWORDS[i].name; free(rbuf); printf(SUCCESS_LOGON, user, pass, root); return (1); } else info(BAD_TRIP); free(rbuf); } if (user) return (0); } return (0); }
bool sbbs_t::syslog(const char* code, const char *entry) { char fname[MAX_PATH+1]; char str[128]; char tmp[64]; int file; struct tm tm; now=time(NULL); if(localtime_r(&now,&tm)==NULL) return(false); sprintf(fname,"%slogs/%2.2d%2.2d%2.2d.log",cfg.logs_dir,tm.tm_mon+1,tm.tm_mday ,TM_YEAR(tm.tm_year)); if((file=nopen(fname,O_WRONLY|O_APPEND|O_CREAT))==-1) { lprintf(LOG_ERR,"!ERRROR %d opening/creating %s",errno,fname); return(false); } sprintf(str,"%-2.2s %s %s\r\n\r\n",code, hhmmtostr(&cfg,&tm,tmp), entry); write(file,str,strlen(str)); close(file); return(true); }
void sbbs_t::logofflist() { char str[256]; int file; struct tm tm, tm_now; if(localtime_r(&now,&tm_now)==NULL) return; if(localtime_r(&logontime,&tm)==NULL) return; sprintf(str,"%slogs/%2.2d%2.2d%2.2d.lol",cfg.logs_dir,tm.tm_mon+1,tm.tm_mday ,TM_YEAR(tm.tm_year)); if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); return; } sprintf(str,"%-*.*s %-2d %-8.8s %2.2d:%2.2d %2.2d:%2.2d %3d%3ld%3ld%3ld%3ld" "%3ld%3ld\r\n",LEN_ALIAS,LEN_ALIAS,useron.alias,cfg.node_num,connection ,tm.tm_hour,tm.tm_min,tm_now.tm_hour,tm_now.tm_min ,(int)(now-logontime)/60,posts_read,logon_posts,logon_emails ,logon_fbacks,logon_uls,logon_dls); write(file,str,strlen(str)); close(file); }
int main(int argc, char **real_argv, char **envv) { CAP *cap; unsigned char **argv = (unsigned char **)real_argv; struct stat sbuf; unsigned char *s; unsigned char *t; long time_rc; unsigned char *run; #ifdef __MSDOS__ unsigned char *rundir; #endif SCRN *n; int opened = 0; int omid; int backopt; int c; init_bufs(); for (c = 1; argv[c] != NULL; ++c) { if (0 == zcmp((unsigned char*)argv[c], USTR "-nosys")) { read_sys_configs = 0; } else if (0 == zcmp((unsigned char*)argv[c], USTR "-nouser")) { read_user_configs = 0; } else { argv[--c] = argv[0]; argv += c; argc -= c; break; } } if (read_user_configs) { s = (unsigned char *)getenv("HOME"); if (s) { s = vsncpy(NULL, 0, sz(s)); s = vsncpy(sv(s), sc("/.joe-p37/only.rc")); if (!stat((char*)s, &sbuf)) read_sys_configs = 0; vsrm(s); } } joe_locale(); mainenv = (unsigned char **)envv; #ifdef __MSDOS__ _fmode = O_BINARY; zcpy(stdbuf, argv[0]); joesep(stdbuf); run = namprt(stdbuf); rundir = dirprt(stdbuf); for (c = 0; run[c]; ++c) if (run[c] == '.') { run = vstrunc(run, c); break; } #else run = namprt(argv[0]); #endif env_lines = 0; if ((s = (unsigned char *)getenv("LINES")) != NULL && sscanf((char *)s, "%d", &env_lines) != 1) env_lines = 0; env_columns = 0; if ((s = (unsigned char *)getenv("COLUMNS")) != NULL && sscanf((char *)s, "%d", &env_columns) != 1) env_columns = 0; if ((s = (unsigned char *)getenv("BAUD")) != NULL) sscanf((char *)s, "%u", (unsigned *)&Baud); if (getenv("DOPADDING")) dopadding = 1; if (getenv("NOXON")) noxon = 1; if ((s = (unsigned char *)getenv("JOETERM")) != NULL) joeterm = s; #ifndef __MSDOS__ if (!(cap = my_getcap(NULL, 9600, NULL, NULL))) { fprintf(stderr, (char *)joe_gettext(_("Couldn't load termcap/terminfo entry\n"))); return 1; } #endif #ifdef __MSDOS__ s = vsncpy(NULL, 0, sv(run)); s = vsncpy(sv(s), sc("rc")); c = procrc(cap, s); if (c == 0) goto donerc; if (c == 1) { unsigned char buf[8]; fprintf(stderr, (char *)joe_gettext(_("There were errors in '%s'. Use it anyway?")), s); fflush(stderr); if (NULL == fgets(buf, 8, stdin) || yn_checks(yes_key, buf)) goto donerc; } vsrm(s); s = vsncpy(NULL, 0, sv(rundir)); s = vsncpy(sv(s), sv(run)); s = vsncpy(sv(s), sc("rc")); c = procrc(cap, s); if (c != 0 && c != 1) { /* If built-in *fancyjoerc not present, process builtin *joerc, * which is always present. */ s = vstrunc(s, 0); s = vsncpy(sv(s), sc("*joerc")); c = procrc(cap, s); } if (c == 0) goto donerc; if (c == 1) { unsigned char buf[8]; fprintf(stderr, (char *)joe_gettext(_("There were errors in '%s'. Use it anyway?")), s); fflush(stderr); if (NULL == fgets(buf, 8, stdin) || yn_checks(yes_key, buf)) goto donerc; } #else /* Name of system joerc file. Try to find one with matching language... */ /* Try full language: like joerc.de_DE */ time_rc = 0; if (!read_sys_configs) { t = NULL; goto skip_joerc; } t = vsncpy(NULL, 0, sc(JOERC)); t = vsncpy(sv(t), sv(run)); t = vsncpy(sv(t), sc("rc.")); t = vsncpy(sv(t), sz(locale_msgs)); if (!stat((char *)t,&sbuf)) time_rc = sbuf.st_mtime; else { /* Try generic language: like joerc.de */ if (locale_msgs[0] && locale_msgs[1] && locale_msgs[2]=='_') { vsrm(t); t = vsncpy(NULL, 0, sc(JOERC)); t = vsncpy(sv(t), sv(run)); t = vsncpy(sv(t), sc("rc.")); t = vsncpy(sv(t), locale_msgs, 2); if (!stat((char *)t,&sbuf)) time_rc = sbuf.st_mtime; else goto nope; } else { nope: vsrm(t); /* Try Joe's bad english */ t = vsncpy(NULL, 0, sc(JOERC)); t = vsncpy(sv(t), sv(run)); t = vsncpy(sv(t), sc("rc")); if (!stat((char *)t,&sbuf)) time_rc = sbuf.st_mtime; else { /* If built-in *fancyjoerc not present, process builtin *joerc, * which is always present. */ t = vstrunc(s, 0); t = vsncpy(sv(s), sc("*joerc")); time_rc = stat((char *)t,&sbuf) ? 0 : sbuf.st_mtime; } } } skip_joerc: /* User's joerc file */ s = (unsigned char *)getenv("HOME"); if (s && !read_sys_configs) { if (read_user_configs) { /* TODO(pts): Don't read /dev/null */ s = vsncpy(NULL, 0, sz(s)); s = vsncpy(sv(s), sc("/.joe-p37/rc")); } else { s = vsncpy(NULL, 0, sc("/dev/null/missing")); } goto process_user_rc; } else if (!read_user_configs) { s = vsncpy(NULL, 0, sc("/dev/null/missing")); goto process_user_rc; } else if (s) { unsigned char buf[8]; s = vsncpy(NULL, 0, sz(s)); s = vsncpy(sv(s), sc("/.")); s = vsncpy(sv(s), sv(run)); s = vsncpy(sv(s), sc("rc")); if (!stat((char *)s,&sbuf)) { if (sbuf.st_mtime < time_rc) { fprintf(stderr,(char *)joe_gettext(_("Warning: %s is newer than your %s.\n")),t,s); fprintf(stderr,(char *)joe_gettext(_("You should update or delete %s\n")),s); fprintf(stderr,(char *)joe_gettext(_("Hit enter to continue with %s ")),t); fflush(stderr); (void)!fgets((char *)buf, 8, stdin); goto use_sys; } } process_user_rc: c = procrc(cap, s); if (c == 0) { vsrm(t); goto donerc; } if (c == 1) { fprintf(stderr,(char *)joe_gettext(_("There were errors in '%s'. Use it anyway (y,n)? ")), s); fflush(stderr); if (NULL == fgets((char *)buf, 8, stdin) || ynchecks(yes_key, buf)) { vsrm(t); goto donerc; } } } use_sys: vsrm(s); s = t; c = s ? procrc(cap, s) : -1; if (c == 0) goto donerc; if (c == 1) { unsigned char buf[8]; fprintf(stderr,(char *)joe_gettext(_("There were errors in '%s'. Use it anyway (y,n)? ")), s); fflush(stderr); if (NULL == fgets((char *)buf, 8, stdin) || ynchecks(yes_key, buf)) goto donerc; } /* Try built-in *fancyjoerc, e.g. "*joe-p37rc" */ vsrm(s); s = vsncpy(NULL, 0, sc("*")); s = vsncpy(sv(s), sv(run)); s = vsncpy(sv(s), sc("rc")); c = procrc(cap, s); if (c != 0 && c != 1) { /* If built-in *fancyjoerc not present, process builtin "*joerc", * which is always present. */ s = vstrunc(s, 0); s = vsncpy(sv(s), sc("*joerc")); c = procrc(cap, s); } if (c == 0) goto donerc; if (c == 1) { unsigned char buf[8]; fprintf(stderr,(char *)joe_gettext(_("There were errors in '%s'. Use it anyway (y,n)? ")), s); fflush(stderr); if (NULL == fgets((char *)buf, 8, stdin) || ynchecks(yes_key, buf)) goto donerc; } #endif fprintf(stderr,(char *)joe_gettext(_("Couldn't open '%s'\n")), s); vsrm(s); return 1; donerc: vsrm(s); if (validate_rc()) { fprintf(stderr,(char *)joe_gettext(_("rc file has no :main key binding section or no bindings. Bye.\n"))); return 1; } if (!isatty(fileno(stdin))) idleout = 0; for (c = 1; argv[c]; ++c) { if (argv[c][0] == '-') { if (argv[c][1]) switch (glopt(argv[c] + 1, argv[c + 1], NULL, 1)) { case 0: fprintf(stderr,(char *)joe_gettext(_("Unknown option '%s'\n")), argv[c]); break; case 1: break; case 2: ++c; break; } else idleout = 0; } } if (!dspasis) { /* Open all files as ASCII by default if `joe --asis' is specified. This is to avoid writing control characters to the UTF-8 terminal. */ fdefault.charmap = pdefault.charmap = find_charmap(USTR "ascii"); fdefault.map_name = pdefault.map_name = USTR "ascii"; } /* initialize mouse support */ if (xmouse && (s=(unsigned char *)getenv("TERM")) && strstr((char *)s,"xterm")) usexmouse=1; if (!(n = nopen(cap))) return 1; maint = screate(n); vmem = vtmp(); startup_log = bfind_scratch_incref(USTR "* Startup Log *"); startup_log->internal = 1; load_state(); /* It would be better if this ran uedit() to load files */ /* The business with backopt is to load the file first, then apply file * local options afterwords */ /* orphan is not compatible with exemac()- macros need a window to exist */ for (c = 1, backopt = 0; argv[c]; ++c) if (argv[c][0] == '+' && argv[c][1]>='0' && argv[c][1]<='9') { if (!backopt) backopt = c; } else if (argv[c][0] == '-' && argv[c][1]) { if (!backopt) backopt = c; if (glopt(argv[c] + 1, argv[c + 1], NULL, 0) == 2) ++c; } else { B *b = bfind_incref(argv[c]); BW *bw = NULL; int er = berror; /* This is too annoying */ /* set_current_dir(argv[c],1); */ setup_history(&filehist); append_history(filehist,sz(argv[c])); /* wmktw_takeref() inserts the window before maint->curwin */ if (!orphan || !opened) { bw = wmktw_takeref(maint, b); if (er) msgnwt(bw->parent, joe_gettext(msgs[-er])); } else { long line; b->orphan = 1; b->oldcur = pdup(b->bof, USTR "main"); pline(b->oldcur, get_file_pos(b->name)); line = b->oldcur->line - (maint->h - 1) / 2; if (line < 0) line = 0; b->oldtop = pdup(b->oldcur, USTR "main"); pline(b->oldtop, line); p_goto_bol(b->oldtop); } if (bw) { long lnum = 0; bw->o.readonly = bw->b->rdonly; if (backopt) { while (backopt != c) { if (argv[backopt][0] == '+') { sscanf((char *)(argv[backopt] + 1), "%ld", &lnum); ++backopt; } else { if (glopt(argv[backopt] + 1, argv[backopt + 1], &bw->o, 0) == 2) backopt += 2; else backopt += 1; lazy_opts(bw->b, &bw->o); } } } bw->b->o = bw->o; bw->b->rdonly = bw->o.readonly; /* Put cursor in window, so macros work properly */ maint->curwin = bw->parent; /* Execute macro */ if (er == -1 && bw->o.mnew) exmacro(bw->o.mnew,1); if (er == 0 && bw->o.mold) exmacro(bw->o.mold,1); /* Hmm... window might not exist any more... depends on what macro does... */ if (lnum > 0) pline(bw->cursor, lnum - 1); else pline(bw->cursor, get_file_pos(bw->b->name)); p_goto_bol(bw->cursor); /* Go back to first window so windows are in same order as command line */ if (opened) wnext(maint); } opened = 1; backopt = 0; } if (opened) { wshowall(maint); omid = mid; mid = 1; dofollows(); mid = omid; } else { BW *bw = wmktw_takeref(maint, bfind_incref(USTR "")); if (bw->o.mnew) exmacro(bw->o.mnew,1); } maint->curwin = maint->topwin; if (startup_log->eof->byte) { BW *bw = wmktw_takeref(maint, startup_log); startup_log = NULL; maint->curwin = bw->parent; wshowall(maint); uparserr(bw); } if (help) { help_on(maint); } if (!nonotice) { joe_snprintf_3(msgbuf,JOE_MSGBUFSIZE,joe_gettext(_("\\i** Joe's Own Editor v%s ** (%s) ** Copyright %s 2008 **\\i")),VERSION,locale_map->name,(locale_map->type ? "©" : "(C)")); msgnw(((BASE *)lastw(maint)->object)->parent, msgbuf); } if (!idleout) { if (!isatty(fileno(stdin)) && modify_logic(maint->curwin->object, ((BW *)maint->curwin->object)->b)) { /* Start shell going in first window */ unsigned char **a; unsigned char *cmd; a = vamk(10); cmd = vsncpy(NULL, 0, sc("/bin/sh")); a = vaadd(a, cmd); cmd = vsncpy(NULL, 0, sc("-c")); a = vaadd(a, cmd); cmd = vsncpy(NULL, 0, sc("/bin/cat")); a = vaadd(a, cmd); cstart (maint->curwin->object, USTR "/bin/sh", a, NULL, NULL, 0, 1); } } edloop(0); save_state(); /* Delete all buffer so left over locks get eliminated */ brmall(); vclose(vmem); nclose(n); if (exmsg) fprintf(stderr, "\n%s\n", exmsg); return 0; }
int main(int argc, char **real_argv, char **envv) { CAP *cap; unsigned char **argv = (unsigned char **)real_argv; struct stat sbuf; unsigned char *s; unsigned char *t; long time_rc; unsigned char *run; #ifdef __MSDOS__ unsigned char *rundir; #endif SCRN *n; int opened = 0; int omid; int backopt; int c; joe_locale(); mainenv = (unsigned char **)envv; vmem = vtmp(); startup_log = bfind_scratch(USTR "* Startup Log *"); startup_log->internal = 1; #ifdef __MSDOS__ _fmode = O_BINARY; zlcpy(stdbuf, sizeof(stdbuf), argv[0]); joesep(stdbuf); run = namprt(stdbuf); rundir = dirprt(stdbuf); for (c = 0; run[c]; ++c) if (run[c] == '.') { run = vstrunc(run, c); break; } #else run = namprt(argv[0]); #endif if ((s = (unsigned char *)getenv("LINES")) != NULL) sscanf((char *)s, "%d", &lines); if ((s = (unsigned char *)getenv("COLUMNS")) != NULL) sscanf((char *)s, "%d", &columns); if ((s = (unsigned char *)getenv("BAUD")) != NULL) sscanf((char *)s, "%u", (unsigned *)&Baud); if (getenv("DOPADDING")) dopadding = 1; if (getenv("NOXON")) noxon = 1; if ((s = (unsigned char *)getenv("JOETERM")) != NULL) joeterm = s; #ifndef __MSDOS__ if (!(cap = my_getcap(NULL, 9600, NULL, NULL))) { logerror_0((char *)joe_gettext(_("Couldn't load termcap/terminfo entry\n"))); goto exit_errors; } #endif #ifdef __MSDOS__ s = vsncpy(NULL, 0, sv(run)); s = vsncpy(sv(s), sc("rc")); c = procrc(cap, s); if (c == 0) goto donerc; if (c == 1) { logerror_1((char *)joe_gettext(_("There were errors in '%s'. Falling back on default.\n")), s); } vsrm(s); s = vsncpy(NULL, 0, sv(rundir)); s = vsncpy(sv(s), sv(run)); s = vsncpy(sv(s), sc("rc")); c = procrc(cap, s); if (c == 0) goto donerc; if (c == 1) { logerror_1((char *)joe_gettext(_("There were errors in '%s'. Falling back on default.\n")), s); } #else /* Name of system joerc file. Try to find one with matching language... */ /* Try full language: like joerc.de_DE */ t = vsncpy(NULL, 0, sc(JOERC)); t = vsncpy(sv(t), sv(run)); t = vsncpy(sv(t), sc("rc.")); t = vsncpy(sv(t), sz(locale_msgs)); if (!stat((char *)t,&sbuf)) time_rc = sbuf.st_mtime; else { /* Try generic language: like joerc.de */ if (locale_msgs[0] && locale_msgs[1] && locale_msgs[2]=='_') { vsrm(t); t = vsncpy(NULL, 0, sc(JOERC)); t = vsncpy(sv(t), sv(run)); t = vsncpy(sv(t), sc("rc.")); t = vsncpy(sv(t), locale_msgs, 2); if (!stat((char *)t,&sbuf)) time_rc = sbuf.st_mtime; else goto nope; } else { nope: vsrm(t); /* Try Joe's bad english */ t = vsncpy(NULL, 0, sc(JOERC)); t = vsncpy(sv(t), sv(run)); t = vsncpy(sv(t), sc("rc")); if (!stat((char *)t,&sbuf)) time_rc = sbuf.st_mtime; else time_rc = 0; } } /* User's joerc file */ s = (unsigned char *)getenv("HOME"); if (s) { s = vsncpy(NULL, 0, sz(s)); s = vsncpy(sv(s), sc("/.")); s = vsncpy(sv(s), sv(run)); s = vsncpy(sv(s), sc("rc")); if (!stat((char *)s,&sbuf)) { if (sbuf.st_mtime < time_rc) { logmessage_2((char *)joe_gettext(_("Warning: %s is newer than your %s.\n")),t,s); } } c = procrc(cap, s); if (c == 0) { vsrm(t); goto donerc; } if (c == 1) { logerror_1((char *)joe_gettext(_("There were errors in '%s'. Falling back on default.\n")), s); } } vsrm(s); s = t; c = procrc(cap, s); if (c == 0) goto donerc; if (c == 1) { logerror_1((char *)joe_gettext(_("There were errors in '%s'. Falling back on default.\n")), s); } /* Try built-in joerc */ s = vsncpy(NULL, 0, sc("*")); s = vsncpy(sv(s), sv(run)); s = vsncpy(sv(s), sc("rc")); c = procrc(cap, s); if (c != 0 && c != 1) { /* If *fancyjoerc not present, use *joerc which is always there */ s = vstrunc(s, 0); s = vsncpy(sv(s),sc("*joerc")); c = procrc(cap, s); } if (c == 0) goto donerc; if (c == 1) { logerror_1((char *)joe_gettext(_("There were errors in '%s'. Falling back on default.\n")), s); } #endif logerror_1((char *)joe_gettext(_("Couldn't open '%s'\n")), s); goto exit_errors; return 1; donerc: if (validate_rc()) { logerror_0((char *)joe_gettext(_("rc file has no :main key binding section or no bindings. Bye.\n"))); goto exit_errors; } { unsigned char buf[10]; int x; zlcpy(buf, sizeof(buf), USTR "\"`\" ` "); type_backtick = mparse(0, buf, &x, 0); } shell_kbd = mkkbd(kmap_getcontext(USTR "shell")); if (!isatty(fileno(stdin))) idleout = 0; for (c = 1; argv[c]; ++c) { if (argv[c][0] == '-') { if (argv[c][1]) switch (glopt(argv[c] + 1, argv[c + 1], NULL, 1)) { case 0: logerror_1((char *)joe_gettext(_("Unknown option '%s'\n")), argv[c]); break; case 1: break; case 2: ++c; break; } else idleout = 0; } } /* initialize mouse support */ if (xmouse && (s=(unsigned char *)getenv("TERM")) && strstr((char *)s,"xterm")) usexmouse=1; if (!(n = nopen(cap))) goto exit_errors; maint = screate(n); load_state(); /* It would be better if this ran uedit() to load files */ /* The business with backopt is to load the file first, then apply file * local options afterwords */ /* orphan is not compatible with exemac()- macros need a window to exist */ for (c = 1, backopt = 0; argv[c]; ++c) if (argv[c][0] == '+' && argv[c][1]>='0' && argv[c][1]<='9') { if (!backopt) backopt = c; } else if (argv[c][0] == '-' && argv[c][1]) { if (!backopt) backopt = c; if (glopt(argv[c] + 1, argv[c + 1], NULL, 0) == 2) ++c; } else { B *b = bfind(argv[c]); BW *bw = NULL; int er = berror; /* This is too annoying */ /* set_current_dir(argv[c],1); */ setup_history(&filehist); append_history(filehist,sz(argv[c])); /* wmktw inserts the window before maint->curwin */ if (!orphan || !opened) { bw = wmktw(maint, b); if (er) msgnwt(bw->parent, joe_gettext(msgs[-er])); } else { long line; b->orphan = 1; b->oldcur = pdup(b->bof, USTR "main"); pline(b->oldcur, get_file_pos(b->name)); p_goto_bol(b->oldcur); line = b->oldcur->line - (maint->h - 1) / 2; if (line < 0) line = 0; b->oldtop = pdup(b->oldcur, USTR "main"); pline(b->oldtop, line); p_goto_bol(b->oldtop); } if (bw) { long lnum = 0; bw->o.readonly = bw->b->rdonly; if (backopt) { while (backopt != c) { if (argv[backopt][0] == '+') { sscanf((char *)(argv[backopt] + 1), "%ld", &lnum); ++backopt; } else { if (glopt(argv[backopt] + 1, argv[backopt + 1], &bw->o, 0) == 2) backopt += 2; else backopt += 1; lazy_opts(bw->b, &bw->o); } } } bw->b->o = bw->o; bw->b->rdonly = bw->o.readonly; /* Put cursor in window, so macros work properly */ maint->curwin = bw->parent; /* Execute macro */ if (er == -1 && bw->o.mnew) exmacro(bw->o.mnew,1); if (er == 0 && bw->o.mold) exmacro(bw->o.mold,1); /* Hmm... window might not exist any more... depends on what macro does... */ if (lnum > 0) pline(bw->cursor, lnum - 1); else pline(bw->cursor, get_file_pos(bw->b->name)); p_goto_bol(bw->cursor); /* Go back to first window so windows are in same order as command line */ if (opened) wnext(maint); } opened = 1; backopt = 0; } if (opened) { wshowall(maint); omid = mid; mid = 1; dofollows(); mid = omid; } else { BW *bw = wmktw(maint, bfind(USTR "")); if (bw->o.mnew) exmacro(bw->o.mnew,1); } maint->curwin = maint->topwin; if (logerrors) { B *copied = bcpy(startup_log->bof, startup_log->eof); BW *bw = wmktw(maint, copied); copied->name = zdup(startup_log->name); copied->internal = 1; maint->curwin = bw->parent; wshowall(maint); } if (help) { help_on(maint); } if (!nonotice) { joe_snprintf_3(msgbuf,JOE_MSGBUFSIZE,joe_gettext(_("\\i** Joe's Own Editor v%s ** (%s) ** Copyright %s 2015 **\\i")),VERSION,locale_map->name,(locale_map->type ? "©" : "(C)")); msgnw(((BASE *)lastw(maint)->object)->parent, msgbuf); } if (!idleout) { if (!isatty(fileno(stdin)) && modify_logic(maint->curwin->object, ((BW *)maint->curwin->object)->b)) { /* Start shell going in first window */ unsigned char **a; unsigned char *cmd; a = vamk(10); cmd = vsncpy(NULL, 0, sc("/bin/sh")); a = vaadd(a, cmd); cmd = vsncpy(NULL, 0, sc("-c")); a = vaadd(a, cmd); cmd = vsncpy(NULL, 0, sc("/bin/cat")); a = vaadd(a, cmd); cstart (maint->curwin->object, USTR "/bin/sh", a, NULL, NULL, 0, 1, NULL, 0); } } edloop(0); save_state(); /* Delete all buffer so left over locks get eliminated */ brmall(); vclose(vmem); nclose(n); if (noexmsg) { if (notite) fprintf(stderr, "\n"); } else { if (exmsg) fprintf(stderr, "\n%s\n", exmsg); else if (notite) fprintf(stderr, "\n"); } return 0; exit_errors: /* Write out error log to console if we are exiting with errors. */ if (startup_log && startup_log->eof->byte) bsavefd(startup_log->bof, 2, startup_log->eof->byte); return 1; }
/* Important change as of Nov-16-2006, 'cmdline' may contain args */ long sbbs_t::exec_bin(const char *cmdline, csi_t *csi, const char* startup_dir) { char str[MAX_PATH+1]; char mod[MAX_PATH+1]; char modname[MAX_PATH+1]; char* p; int file; csi_t bin; SAFECOPY(mod,cmdline); p=mod; FIND_CHAR(p,' '); if(*p) { *p=0; /* terminate 'mod' */ p++; /* skip space */ SKIP_CHAR(p,' '); /* skip more spaces */ } if(*p) strcpy(main_csi.str, p); #ifdef JAVASCRIPT if((p=getfext(mod))!=NULL && stricmp(p,".js")==0) return(js_execfile(cmdline, startup_dir)); if(p==NULL && startup_dir!=NULL && *startup_dir) { SAFEPRINTF2(str,"%s%s.js", startup_dir, mod); if(fexistcase(str)) return(js_execfile(cmdline, startup_dir)); } if(cfg.mods_dir[0]) { SAFEPRINTF2(str,"%s%s.js",cfg.mods_dir,mod); if(fexistcase(str)) return(js_execfile(cmdline, startup_dir)); } #endif SAFECOPY(modname,mod); if(!strchr(modname,'.')) strcat(modname,".bin"); SAFEPRINTF2(str,"%s%s",cfg.mods_dir,modname); if(cfg.mods_dir[0]==0 || !fexistcase(str)) { #ifdef JAVASCRIPT SAFEPRINTF2(str,"%s%s.js",cfg.exec_dir,mod); if(fexistcase(str)) return(js_execfile(cmdline, startup_dir)); #endif SAFEPRINTF2(str,"%s%s",cfg.exec_dir,modname); fexistcase(str); } if((file=nopen(str,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return(-1); } memcpy(&bin,csi,sizeof(csi_t)); clearvars(&bin); bin.length=(uint32_t)filelength(file); if((bin.cs=(uchar *)malloc(bin.length))==NULL) { close(file); errormsg(WHERE,ERR_ALLOC,str,bin.length); return(-1); } if(lread(file,bin.cs,bin.length)!=bin.length) { close(file); errormsg(WHERE,ERR_READ,str,bin.length); free(bin.cs); return(-1); } close(file); bin.ip=bin.cs; bin.rets=0; bin.cmdrets=0; bin.misc=0; while(exec(&bin)==0) if(!(bin.misc&CS_OFFLINE_EXEC)) { checkline(); if(!online) break; } freevars(&bin); free(bin.cs); csi->logic=bin.logic; return(bin.retval); }
void sbbs_t::closefile(file_t* f) { char str1[256],str2[4],str3[4],ch,*buf; int file; long length,l,offset; /************************************/ /* Decrement open count in dat file */ /************************************/ sprintf(str1,"%s%s.dat",cfg.dir[f->dir]->data_dir,cfg.dir[f->dir]->code); if((file=nopen(str1,O_RDWR))==-1) { errormsg(WHERE,ERR_OPEN,str1,O_RDWR); return; } lseek(file,f->datoffset+F_OPENCOUNT,SEEK_SET); if(read(file,str2,3)!=3) { close(file); errormsg(WHERE,ERR_READ,str1,3); return; } str2[3]=0; ch=atoi(str2); if(ch) ch--; ultoa(ch,str3,10); putrec(str2,0,3,str3); lseek(file,f->datoffset+F_OPENCOUNT,SEEK_SET); if(write(file,str2,3)!=3) { close(file); errormsg(WHERE,ERR_WRITE,str1,3); return; } close(file); /*****************************************/ /* Removing transaction from BACKOUT.DAB */ /*****************************************/ sprintf(str1,"%sbackout.dab",cfg.node_dir); if(flength(str1)<1L) /* file is not there or empty */ return; if((file=nopen(str1,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,str1,O_RDONLY); return; } length=filelength(file); if((buf=(char *)malloc(length))==NULL) { close(file); errormsg(WHERE,ERR_ALLOC,str1,length); return; } if(read(file,buf,length)!=length) { close(file); free(buf); errormsg(WHERE,ERR_READ,str1,length); return; } close(file); if((file=nopen(str1,O_WRONLY|O_TRUNC))==-1) { errormsg(WHERE,ERR_OPEN,str1,O_WRONLY|O_TRUNC); return; } ch=0; /* 'ch' is a 'file already removed' flag */ for(l=0;l<length;l+=BO_LEN) { /* in case file is in backout.dab > 1 */ if(!ch && buf[l]==BO_OPENFILE) { memcpy(str1,buf+l+1,8); str1[8]=0; memcpy(&offset,buf+l+9,4); if(!stricmp(str1,cfg.dir[f->dir]->code) && offset==f->datoffset) { ch=1; continue; } } write(file,buf+l,BO_LEN); } free(buf); close(file); }
void play() { char str[256],str2[256],log[81],done,doub,dh,split_card,suggestion ,*YouWereDealt="\1n\1k\0015 You \1n\1m were dealt: %s\r\n" ,*UserWasDealt="\1n\1m\1h%s\1n\1m was dealt: %s\r\n" ,*YourHand="\1n\1k\0015 You \1n\1m (%2d) %s" ,*UserHand="\1n\1m\1h%-25s \1n\1m(%2d) %s" ,*DealerHand="\1n\1hDealer \1n\1m(%2d) " ,*Bust="\1n\1r\1hBust\1n\r\n" ,*Natural="\1g\1h\1iNatural " ,*Three7s="\1r\1h\1iThree 7's " ,*Blackjack="\1n\0011\1k Blackjack! \1n\r\n" ,*TwentyOne="\1n\0012\1k Twenty-one \1n\r\n"; int h,i,j,file; uint max; long val; time_t start,now; struct tm* tm; sprintf(str,"MESSAGE.%d",node_num); /* remove message if waiting */ if(fexist(str)) remove(str); getgamedat(0); if(node[node_num-1]) { getgamedat(1); node[node_num-1]=0; putgamedat(); getgamedat(0); } if(total_players && misc&INPLAY) { bputs("\r\n\1hWaiting for end of hand (^A to abort)...\1n"); start=now=time(NULL); getgamedat(0); while(total_players && misc&INPLAY) { if((i=inkey(0))!=0) { /* if key was hit */ if(i==1) { /* if ctrl-a */ bputs("\r\n"); return; } } /* return */ mswait(100); getgamedat(0); now=time(NULL); if(now-start>300) { /* only wait up to 5 minutes */ bputs("\r\ntimeout\r\n"); return; } } bputs("\r\n"); } getgamedat(1); node[node_num-1]=user_number; putgamedat(); if(!total_players) shuffle(); else listplayers(); sprintf(str,"\1n\1m\1h%s \1n\1m%s\r\n",user_name,joined()); putallnodemsg(str); while(1) { aborted=0; #if DEBUG debugline("top of loop"); #endif if(autoplay) lncntr=0; bprintf(ShoeStatus,cur_card,total_decks*52); if(cur_card>(total_decks*52)-(total_players*10)-10 && lastplayer()) shuffle(); getgamedat(1); misc&=~INPLAY; status[node_num-1]=BET; node[node_num-1]=user_number; putgamedat(); bprintf("\r\n\1n\1cYou have \1h%s\1n\1ck credits\r\n" ,ultoac(credits/1024L,str)); if(credits<min_bet/1024) { bprintf("\1n\1cMinimum bet: \1h%uk\r\n",min_bet); bputs("\1n\1r\1hCome back when you have more credits.\r\n"); break; } if(credits/1024L>(ulong)max_bet) max=max_bet; else max=credits/1024L; sprintf(str,"\r\nBet amount (in kilobytes) or ~Quit [%u]: " ,ibet<credits/1024L ? ibet : credits/1024L); chat(); mnemonics(str); if(autoplay && keyhit()) autoplay=0; if(autoplay) i=ibet; else i=getnum(max); if(i==-1) /* if user hit ^C or 'Q' */ break; bputs("\r\n"); if(i) /* if user entered a value */ bet[0]=i; else /* if user hit enter */ bet[0]=ibet<credits/1024L ? ibet : credits/1024L; if(bet[0]<min_bet) { bprintf("\1n\1cMinimum bet: \1h%uk\r\n",min_bet); bputs("\1n\1r\1hCome back when you're ready to bet more.\r\n"); break; } ibet=bet[0]; getgamedat(0); /* to get all new arrivals */ sprintf(str,"\1m\1h%s\1n\1m bet \1n\1h%u\1n\1mk\r\n",user_name,bet[0]); putallnodemsg(str); pc[0]=2; /* init player's 1st hand to 2 cards */ for(i=1;i<MAX_HANDS;i++) /* init player's other hands to 0 cards */ pc[i]=0; hands=1; /* init total player's hands to 1 */ getgamedat(1); /* first come first serve to be the */ for(i=0;i<total_nodes;i++) /* dealer in control of sync */ if(node[i] && status[i]==SYNC_D) break; if(i==total_nodes) { #if DEBUG debugline("syncdealer"); #endif syncdealer(); } /* all players meet here */ else { /* first player is current after here */ #if DEBUG debugline("syncplayer"); #endif syncplayer(); } /* game is closed (INPLAY) at this point */ #if DEBUG debugline("waitturn 1"); #endif waitturn(); getnodemsg(); /* Initial deal card #1 */ getcarddat(); player[0][0]=card[cur_card++]; putcarddat(); sprintf(str,YouWereDealt,cardstr(card[cur_card-1])); if(!symbols) strip_symbols(str); bputs(str); sprintf(str,UserWasDealt,user_name,cardstr(card[cur_card-1])); putallnodemsg(str); if(lastplayer()) { getcarddat(); dealer[0]=card[cur_card++]; dc=1; putcarddat(); } nextplayer(); #if DEBUG debugline("waitturn 2"); #endif waitturn(); getnodemsg(); getcarddat(); /* Initial deal card #2 */ player[0][1]=card[cur_card++]; putcarddat(); sprintf(str,YouWereDealt,cardstr(card[cur_card-1])); if(!symbols) strip_symbols(str); bputs(str); sprintf(str,UserWasDealt,user_name,cardstr(card[cur_card-1])); putallnodemsg(str); if(lastplayer()) { getcarddat(); dealer[1]=card[cur_card++]; dc=2; putcarddat(); } nextplayer(); #if DEBUG debugline("waitturn 3"); #endif waitturn(); getnodemsg(); getcarddat(); for(i=0;i<hands;i++) { if(autoplay) lncntr=0; done=doub=0; while(!done && pc[i]<MAX_CARDS && cur_card<total_decks*52) { h=hand(player[i],pc[i]); str[0]=0; for(j=0;j<pc[i];j++) { strcat(str,cardstr(player[i][j])); strcat(str," "); } j=bstrlen(str); while(j++<19) strcat(str," "); if(h>21) { strcat(str,Bust); sprintf(str2,YourHand,h,str); if(!symbols) strip_symbols(str2); bputs(str2); sprintf(str2,UserHand,user_name,h,str); putallnodemsg(str2); break; } if(h==21) { if(pc[i]==2) { /* blackjack */ if(player[i][0].suit==player[i][1].suit) strcat(str,Natural); strcat(str,Blackjack); } else { if(player[i][0].value==7 && player[i][1].value==7 && player[i][2].value==7) strcat(str,Three7s); strcat(str,TwentyOne); } sprintf(str2,YourHand,h,str); if(!symbols) strip_symbols(str2); bputs(str2); sprintf(str2,UserHand,user_name,h,str); putallnodemsg(str2); // fdelay(500); break; } strcat(str,"\r\n"); sprintf(str2,YourHand,h,str); if(!symbols) strip_symbols(str2); bputs(str2); sprintf(str2,UserHand,user_name,h,str); putallnodemsg(str2); if(doub) break; sprintf(str,"\1n\1hDealer\1n\1m card up: %s\r\n" ,cardstr(dealer[1])); if(!symbols) strip_symbols(str); bputs(str); if(tutor) { if(pc[i]==2) split_card=pair(player[i],pc[i]); else split_card=0; if(split_card==A || (split_card==9 && (dealer[1].value<7 || (dealer[1].value>7 && dealer[1].value<10))) || split_card==8 || (split_card==7 && dealer[1].value<9) || (split_card==6 && dealer[1].value<7) || (split_card==4 && dealer[1].value==5) || (split_card && split_card<4 && dealer[1].value<8)) suggestion='P'; else if(soft(player[i],pc[i])) { if(h>18) suggestion='S'; else if(pc[i]==2 && ((h==18 && dealer[1].value>3 && dealer[1].value<7) || (h==17 && dealer[1].value>2 && dealer[1].value<7) || (h>13 && dealer[1].value>3 && dealer[1].value<7) || (h==12 && dealer[1].value>4 && dealer[1].value<7))) suggestion='D'; else suggestion='H'; } else { /* hard */ if(h>16 || (h>13 && dealer[1].value<7) || (h==12 && dealer[1].value>3 && dealer[1].value<7)) suggestion='S'; else if(pc[i]==2 && (h==11 || (h==10 && dealer[1].value<10) || (h==9 && dealer[1].value<7))) suggestion='D'; else suggestion='H'; } } if(tutor==1) suggest(suggestion); strcpy(str,"\r\n~Hit"); strcpy(tmp,"H\r"); if(bet[i]+ibet<=credits/1024L && pc[i]==2) { strcat(str,", ~Double"); strcat(tmp,"D"); } if(bet[i]+ibet<=credits/1024L && pc[i]==2 && hands<MAX_HANDS && player[i][0].value==player[i][1].value) { strcat(str,", ~Split"); strcat(tmp,"S"); } strcat(str,", or [Stand]: "); chat(); mnemonics(str); if(autoplay && keyhit()) autoplay=0; if(autoplay) { lncntr=0; bputs("\r\n"); strcpy(str,stand()); bputs(str); putallnodemsg(str); done=1; } else switch(getkeys(tmp,0)) { case 'H': /* hit */ if(tutor==2 && suggestion!='H') wrong(suggestion); strcpy(str,hit()); bputs(str); putallnodemsg(str); getcarddat(); player[i][pc[i]++]=card[cur_card++]; putcarddat(); break; case 'D': /* double down */ if(tutor==2 && suggestion!='D') wrong(suggestion); strcpy(str,doubit()); bputs(str); putallnodemsg(str); getcarddat(); player[i][pc[i]++]=card[cur_card++]; putcarddat(); doub=1; bet[i]+=ibet; break; case 'S': /* split */ if(tutor==2 && suggestion!='P') wrong(suggestion); strcpy(str,split()); bputs(str); putallnodemsg(str); player[hands][0]=player[i][1]; getcarddat(); player[i][1]=card[cur_card++]; player[hands][1]=card[cur_card++]; putcarddat(); pc[hands]=2; bet[hands]=ibet; hands++; break; case CR: if(tutor==2 && suggestion!='S') wrong(suggestion); strcpy(str,stand()); bputs(str); putallnodemsg(str); done=1; break; } } } if(lastplayer()) { /* last player plays the dealer's hand */ getcarddat(); while(hand(dealer,dc)<17 && dc<MAX_CARDS && cur_card<total_decks*52) dealer[dc++]=card[cur_card++]; putcarddat(); } nextplayer(); #if DEBUG debugline("waitturn 4"); #endif waitturn(); getnodemsg(); if(firstplayer()==node_num) { strcpy(str,"\1n\0014\1h Final \1n\r\n"); bputs(str); putallnodemsg(str); } getcarddat(); dh=hand(dealer,dc); /* display dealer's hand */ sprintf(str,DealerHand,dh); for(i=0;i<dc;i++) { strcat(str,cardstr(dealer[i])); strcat(str," "); } i=bstrlen(str); while(i++<50) /* was 50 */ strcat(str," "); if(dh>21) { strcat(str,Bust); if(!symbols) strip_symbols(str); bputs(str); } else if(dh==21) { if(dc==2) { /* blackjack */ if(dealer[0].suit==dealer[1].suit) strcat(str,Natural); strcat(str,Blackjack); } else { /* twenty-one */ if(dc==3 && dealer[0].value==7 && dealer[1].value==7 && dealer[2].value==7) strcat(str,Three7s); strcat(str,TwentyOne); } if(!symbols) strip_symbols(str); bputs(str); } else { if(!symbols) strip_symbols(str); bprintf("%s\r\n",str); } for(i=0;i<hands;i++) { /* display player's hand(s) */ h=hand(player[i],pc[i]); str[0]=0; for(j=0;j<pc[i];j++) { strcat(str,cardstr(player[i][j])); strcat(str," "); } j=bstrlen(str); while(j++<19) strcat(str," "); if(logit) { now=time(NULL); tm=localtime(&now); sprintf(log,"%02d%02d%02d.log" /* log winnings */ ,tm->tm_mon+1,tm->tm_mday,tm->tm_year%100); if((file=nopen(log,O_RDONLY))!=-1) { read(file,tmp,filelength(file)); tmp[filelength(file)]=0; val=atol(tmp); close(file); } else val=0L; if((file=nopen(log,O_WRONLY|O_CREAT|O_TRUNC))==-1) { bprintf("error opening %s\r\n",log); return; } } if(h<22 && (h>dh || dh>21 /* player won */ || (h==21 && pc[i]==2 && dh==21 && dh>2))) { /* blackjack */ j=bet[i]; /* and dealer got 21 */ if(h==21 && /* natural blackjack or three 7's */ ((player[i][0].value==7 && player[i][1].value==7 && player[i][2].value==7) || (pc[i]==2 && player[i][0].suit==player[i][1].suit))) j*=2; else if(h==21 && pc[i]==2) /* regular blackjack */ j*=1.5; /* blackjack pays 1 1/2 to 1 */ sprintf(tmp,"\1n\1h\1m\1iWon!\1n\1h %u\1n\1mk",j); strcat(str,tmp); credits+=j*1024L; val-=j*1024L; moduserdat(); } else if(h<22 && h==dh) strcat(str,"\1n\1hPush"); else { strcat(str,"\1nLost"); credits-=bet[i]*1024L; val+=bet[i]*1024L; moduserdat(); } if(logit) { sprintf(tmp,"%ld",val); write(file,tmp,strlen(tmp)); close(file); } /* close winning log */ strcat(str,"\1n\r\n"); sprintf(str2,YourHand,h,str); if(!symbols) strip_symbols(str2); bputs(str2); sprintf(str2,UserHand,user_name,h,str); putallnodemsg(str2); } nextplayer(); if(!lastplayer()) { #if DEBUG debugline("lastplayer waitturn"); #endif waitturn(); nextplayer(); } #if DEBUG debugline("end of loop"); #endif getnodemsg(); } getgamedat(1); node[node_num-1]=0; putgamedat(); sprintf(str,"\1n\1m\1h%s \1n\1m%s\r\n",user_name,left()); putallnodemsg(str); }
int sbbs_t::text_sec() { char str[256],usemenu ,*file[MAX_TXTFILES],addpath[83],addstr[83],*buf,ch; char tmp[512]; long i,j,usrsec[MAX_TXTSECS],usrsecs,cursec; long l,length; FILE *stream; for(i=j=0;i<cfg.total_txtsecs;i++) { if(!chk_ar(cfg.txtsec[i]->ar,&useron,&client)) continue; usrsec[j++]=i; } usrsecs=j; if(!usrsecs) { bputs(text[NoTextSections]); return(1); } action=NODE_RTXT; while(online) { sprintf(str,"%smenu/text_sec.*",cfg.text_dir); if(fexist(str)) menu("text_sec"); else { bputs(text[TextSectionLstHdr]); for(i=0;i<usrsecs && !msgabort();i++) { sprintf(str,text[TextSectionLstFmt],i+1,cfg.txtsec[usrsec[i]]->name); if(i<9) outchar(' '); bputs(str); } } ASYNC; mnemonics(text[WhichTextSection]); if((cursec=getnum(usrsecs))<1) break; cursec--; while(online) { sprintf(str,"%smenu/text%lu.*",cfg.text_dir,cursec+1); if(fexist(str)) { sprintf(str,"text%lu",cursec+1); menu(str); usemenu=1; } else { bprintf(text[TextFilesLstHdr],cfg.txtsec[usrsec[cursec]]->name); usemenu=0; } sprintf(str,"%stext/%s.ixt",cfg.data_dir,cfg.txtsec[usrsec[cursec]]->code); j=0; if(fexist(str)) { if((stream=fnopen((int *)&i,str,O_RDONLY))==NULL) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return(0); } while(!ferror(stream) && !msgabort()) { /* file open too long */ if(!fgets(str,81,stream)) break; str[strlen(str)-2]=0; /* chop off CRLF */ if((file[j]=(char *)malloc(strlen(str)+1))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,strlen(str)+1); continue; } strcpy(file[j],str); fgets(str,81,stream); if(!usemenu) bprintf(text[TextFilesLstFmt],j+1,str); j++; } fclose(stream); } ASYNC; if(SYSOP) { strcpy(str,"QARE?"); mnemonics(text[WhichTextFileSysop]); } else { strcpy(str,"Q?"); mnemonics(text[WhichTextFile]); } i=getkeys(str,j); if(!(i&0x80000000L)) { /* no file number */ for(l=0;l<j;l++) free(file[l]); if((i=='E' || i=='R') && !j) continue; } if(i=='Q' || !i) break; if(i==-1) { /* ctrl-c */ for(i=0;i<j;i++) free(file[i]); return(0); } if(i=='?') /* ? means re-list */ continue; if(i=='A') { /* Add text file */ if(j) { bputs(text[AddTextFileBeforeWhich]); i=getnum(j+1); if(i<1) continue; i--; /* number of file entries to skip */ } else i=0; bprintf(text[AddTextFilePath] ,cfg.data_dir,cfg.txtsec[usrsec[cursec]]->code); if(!getstr(addpath,80,0)) continue; strcat(addpath,crlf); bputs(text[AddTextFileDesc]); if(!getstr(addstr,74,0)) continue; strcat(addstr,crlf); sprintf(str,"%stext/%s.ixt" ,cfg.data_dir,cfg.txtsec[usrsec[cursec]]->code); if(i==j) { /* just add to end */ if((i=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) { errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT); return(0); } write(i,addpath,strlen(addpath)); write(i,addstr,strlen(addstr)); close(i); continue; } j=i; /* inserting in middle of file */ if((stream=fnopen((int *)&i,str,O_RDWR))==NULL) { errormsg(WHERE,ERR_OPEN,str,O_RDWR); return(0); } length=(long)filelength(i); for(i=0;i<j;i++) { /* skip two lines for each entry */ fgets(tmp,81,stream); fgets(tmp,81,stream); } l=(long)ftell(stream); if((buf=(char *)malloc(length-l))==NULL) { fclose(stream); errormsg(WHERE,ERR_ALLOC,str,length-l); return(0); } fread(buf,1,length-l,stream); fseek(stream,l,SEEK_SET); /* go back to where we need to insert */ fputs(addpath,stream); fputs(addstr,stream); fwrite(buf,1,length-l,stream); fclose(stream); free(buf); continue; } if(i=='R' || i=='E') { /* Remove or Edit text file */ ch=(char)i; if(ch=='R') bputs(text[RemoveWhichTextFile]); else bputs(text[EditWhichTextFile]); i=getnum(j); if(i<1) continue; sprintf(str,"%stext/%s.ixt" ,cfg.data_dir,cfg.txtsec[usrsec[cursec]]->code); j=i-1; if((stream=fnopen(NULL,str,O_RDONLY))==NULL) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return(0); } for(i=0;i<j;i++) { /* skip two lines for each entry */ fgets(tmp,81,stream); fgets(tmp,81,stream); } fgets(addpath,81,stream); truncsp(addpath); fclose(stream); if(!strchr(addpath,'\\') && !strchr(addpath,'/')) sprintf(tmp,"%stext/%s/%s" ,cfg.data_dir,cfg.txtsec[usrsec[cursec]]->code,addpath); else strcpy(tmp,addpath); if(ch=='R') { /* Remove */ if(fexist(tmp)) { sprintf(str,text[DeleteTextFileQ],tmp); if(!noyes(str)) if(remove(tmp)) errormsg(WHERE,ERR_REMOVE,tmp,0); } sprintf(str,"%stext/%s.ixt" ,cfg.data_dir,cfg.txtsec[usrsec[cursec]]->code); removeline(str,addpath,2,0); } else { /* Edit */ strcpy(str,tmp); editfile(str); } continue; } i=(i&~0x80000000L)-1; if(!strchr(file[i],'\\') && !strchr(file[i],'/')) sprintf(str,"%stext/%s/%s" ,cfg.data_dir,cfg.txtsec[usrsec[cursec]]->code,file[i]); else strcpy(str,file[i]); fexistcase(str); attr(LIGHTGRAY); printfile(str,0); sprintf(str,"%s read text file: %s" ,useron.alias,file[i]); logline("T-",str); pause(); sys_status&=~SS_ABORT; for(i=0;i<j;i++) free(file[i]); } } return(0); }
int main(int argc, char **argv) { char str[81],compiler[32],*p; int i,file; FILE *stream; node_dir[0]=0; for(i=1;i<argc;i++) if(!stricmp(argv[i],"/L")) logit=1; else if(!stricmp(argv[i],"/T")) tutor=2; else if(!stricmp(argv[i],"/S")) tutor=1; else strcpy(node_dir,argv[i]); p=getenv("SBBSNODE"); if(!node_dir[0] && p) strcpy(node_dir,p); if(!node_dir[0]) { /* node directory not specified */ printf("usage: sbj <node directory> [/options]\r\n"); printf("\r\noptions: L = log wins/losses for each day\r\n"); getch(); return(1); } if(node_dir[strlen(node_dir)-1]!='\\' && node_dir[strlen(node_dir)-1]!='/') /* make sure node_dir ends in '\' */ strcat(node_dir,"/"); initdata(); /* read XTRN.DAT and more */ credits=user_cdt; total_nodes=sys_nodes; remove("debug.log"); if((file=nopen("sbj.cfg",O_RDONLY))==-1) { /* open config file */ bputs("Error opening sbj.cfg\r\n"); pause(); return(1); } if((stream=fdopen(file,"rb"))==NULL) { /* convert to stream */ bputs("Error converting sbj.cfg handle to stream\r\n"); pause(); return(1); } fgets(str,81,stream); /* number of decks in shoe */ total_decks=sys_decks=atoi(str); fgets(str,81,stream); /* min bet (in k) */ min_bet=atoi(str); fgets(str,81,stream); /* max bet (in k) */ max_bet=atoi(str); fgets(str,81,stream); /* default bet (in k) */ ibet=atoi(str); fclose(stream); if(!total_decks || total_decks>MAX_DECKS) { bputs("Invalid number of decks in sbj.cfg\r\n"); pause(); return(1); } if(!max_bet) { bputs("Invalid max bet in sbj.cfg\r\n"); pause(); return(1); } if(min_bet>max_bet) { bputs("Invalid min bet in sbj.cfg\r\n"); pause(); return(1); } if(ibet>max_bet || ibet<min_bet) { bputs("Invalid default bet in sbj.cfg\r\n"); pause(); return(1); } if(!fexist("card.dab")) { cur_card=0; dc=0; memset(dealer,0,sizeof(dealer)); memset(card,0,sizeof(card)); putcarddat(); } else { getcarddat(); if(total_decks!=sys_decks) { remove("card.dab"); total_decks=sys_decks; putcarddat(); } } if(!fexist("game.dab")) /* File's not there */ create_gamedab(); open_gamedab(); getgamedat(0); if(total_nodes!=sys_nodes) { /* total nodes changed */ close(gamedab); total_nodes=sys_nodes; create_gamedab(); open_gamedab(); } srand((unsigned)time(NULL)); #ifdef __16BIT__ while(_bios_keybrd(1)) /* clear input buffer */ _bios_keybrd(0); #endif putchar(5); /* ctrl-e */ mswait(500); if(keyhit()) { #ifdef __16BIT__ while(_bios_keybrd(1)) _bios_keybrd(0); #else getkey(0); #endif bputs("\r\n\1r\1h\1i*** ATTENTION ***\1n\1h\r\n"); bputs("\r\nSynchronet Blackjack uses Ctrl-E (ENQ) for the 'club' card " "symbol."); bputs("\r\nYour terminal responded to this control character with an " "answerback string."); bputs("\r\nYou will need to disable all Ctrl-E (ENQ) answerback " "strings (Including \r\nCompuserve Quick B transfers) if you wish to " "toggle card symbols on.\r\n\r\n"); symbols=0; pause(); } getgamedat(1); node[node_num-1]=0; putgamedat(); /* Override default mnemonic colors */ mnehigh=RED|HIGH; mnelow=CYAN|HIGH; /* Override default inactivity timeout values */ sec_warn=120; sec_timeout=180; COMPILER_DESC(compiler); #define SBJ_INDENT " " while(1) { cls(); sprintf(str,"\1n\1h\1cSynchronet \1rBlackjack! \1cv3.20 for %s\r\n" ,PLATFORM_DESC); center(str); sprintf(str,"\1w(XSDK v%s %s %s)\r\n\r\n" ,xsdk_ver,compiler,__DATE__); center(str); aborted=0; mnemonics(SBJ_INDENT"~Instructions\r\n"); mnemonics(SBJ_INDENT"~Join/Begin Game\r\n"); mnemonics(SBJ_INDENT"~List Players\r\n"); mnemonics(SBJ_INDENT"~Rules of the Game\r\n"); mnemonics(SBJ_INDENT"~Toggle Card Symbols\r\n"); sprintf(str,SBJ_INDENT"~Quit to %s\r\n",sys_name); mnemonics(str); nodesync(); bprintf("\1_\r\n"SBJ_INDENT"\1y\1hWhich: \1n"); switch(getkeys("IJBLRTQ|!",0)) { #if DEBUG case '!': if(!com_port) autoplay=1; break; case '|': debug(); break; #endif case 'I': cls(); printfile("sbj.msg"); break; case 'L': listplayers(); bprintf(ShoeStatus,cur_card,total_decks*52); break; case 'R': bprintf("\1n\1c\r\nMinimum bet: \1h%uk",min_bet); bprintf("\1n\1c\r\nMaximum bet: \1h%uk\r\n",max_bet); bprintf("\1w\1h\r\nCard decks in shoe: \1h%u\r\n",sys_decks); break; case 'T': symbols=!symbols; bprintf("\1_\1w\r\nCard symbols now: %s\r\n",symbols ? "ON":"OFF"); break; case 'Q': exit(0); case 'J': case 'B': sec_warn=60; /* Override default inactivity timeout values */ sec_timeout=90; play(); sec_warn=120; sec_timeout=180; break; } } }
void sbbs_t::resort(uint dirnum) { char str[25],ixbfname[128],datfname[128],exbfname[128],txbfname[128] ,ext[512],nulbuf[512]; char tmp[512]; uchar* ixbbuf, *datbuf; uchar* ixbptr[MAX_FILES]; int ixbfile,datfile,exbfile,txbfile,i,j; long ixblen,datlen,offset,newoffset,l; memset(nulbuf,0,512); bprintf(text[ResortLineFmt],cfg.lib[cfg.dir[dirnum]->lib]->sname,cfg.dir[dirnum]->sname); sprintf(ixbfname,"%s%s.ixb",cfg.dir[dirnum]->data_dir,cfg.dir[dirnum]->code); sprintf(datfname,"%s%s.dat",cfg.dir[dirnum]->data_dir,cfg.dir[dirnum]->code); sprintf(exbfname,"%s%s.exb",cfg.dir[dirnum]->data_dir,cfg.dir[dirnum]->code); sprintf(txbfname,"%s%s.txb",cfg.dir[dirnum]->data_dir,cfg.dir[dirnum]->code); if(flength(ixbfname)<1L || flength(datfname)<1L) { remove(exbfname); remove(txbfname); remove(ixbfname); remove(datfname); bputs(text[ResortEmptyDir]); return; } bputs(text[Sorting]); if((ixbfile=nopen(ixbfname,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,ixbfname,O_RDONLY); return; } if((datfile=nopen(datfname,O_RDONLY))==-1) { close(ixbfile); errormsg(WHERE,ERR_OPEN,datfname,O_RDONLY); return; } ixblen=(long)filelength(ixbfile); datlen=(long)filelength(datfile); if((ixbbuf=(uchar *)malloc(ixblen))==NULL) { close(ixbfile); close(datfile); errormsg(WHERE,ERR_ALLOC,ixbfname,ixblen); return; } if((datbuf=(uchar *)malloc(datlen))==NULL) { close(ixbfile); close(datfile); free((char *)ixbbuf); errormsg(WHERE,ERR_ALLOC,datfname,datlen); return; } if(lread(ixbfile,ixbbuf,ixblen)!=ixblen) { close(ixbfile); close(datfile); free((char *)ixbbuf); free((char *)datbuf); errormsg(WHERE,ERR_READ,ixbfname,ixblen); return; } if(lread(datfile,datbuf,datlen)!=datlen) { close(ixbfile); close(datfile); free((char *)ixbbuf); free((char *)datbuf); errormsg(WHERE,ERR_READ,datfname,datlen); return; } close(ixbfile); close(datfile); if((ixbfile=nopen(ixbfname,O_WRONLY|O_TRUNC))==-1) { free((char *)ixbbuf); free((char *)datbuf); errormsg(WHERE,ERR_OPEN,ixbfname,O_WRONLY|O_TRUNC); return; } if((datfile=nopen(datfname,O_WRONLY|O_TRUNC))==-1) { close(ixbfile); free((char *)ixbbuf); free((char *)datbuf); errormsg(WHERE,ERR_OPEN,datfname,O_WRONLY|O_TRUNC); return; } for(l=0,i=0;l<ixblen && i<MAX_FILES;l+=F_IXBSIZE,i++) ixbptr[i]=ixbbuf+l; switch(cfg.dir[dirnum]->sort) { case SORT_NAME_A: qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0]) ,(int(*)(const void*, const void*))fnamecmp_a); break; case SORT_NAME_D: qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0]) ,(int(*)(const void*, const void*))fnamecmp_d); break; case SORT_DATE_A: qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0]) ,(int(*)(const void*, const void*))fdatecmp_a); break; case SORT_DATE_D: qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0]) ,(int(*)(const void*, const void*))fdatecmp_d); break; } if((exbfile=nopen(exbfname,O_RDWR|O_CREAT))==-1) { close(ixbfile); close(datfile); free((char *)ixbbuf); free((char *)datbuf); errormsg(WHERE,ERR_OPEN,exbfname,O_RDWR|O_CREAT); return; } if((txbfile=nopen(txbfname,O_RDWR|O_CREAT))==-1) { close(exbfile); close(datfile); close(exbfile); free((char *)ixbbuf); free((char *)datbuf); errormsg(WHERE,ERR_OPEN,txbfname,O_RDWR|O_CREAT); return; } for(i=0;i<ixblen/F_IXBSIZE;i++) { offset=ixbptr[i][11]|((long)ixbptr[i][12]<<8)|((long)ixbptr[i][13]<<16); lwrite(datfile,&datbuf[offset],F_LEN); newoffset=(ulong)i*(ulong)F_LEN; j=datbuf[offset+F_MISC]; /* misc bits */ if(j!=ETX) j-=' '; if(j&FM_EXTDESC) { /* extended description */ lseek(exbfile,(offset/F_LEN)*512L,SEEK_SET); memset(ext,0,512); read(exbfile,ext,512); while(filelength(txbfile)<(newoffset/F_LEN)*512L) { // lseek(txbfile,0L,SEEK_END); write(txbfile,nulbuf,512); } lseek(txbfile,(newoffset/F_LEN)*512L,SEEK_SET); write(txbfile,ext,512); } str[0]=newoffset&0xff; /* Get offset within DAT file for IXB file */ str[1]=(newoffset>>8)&0xff; str[2]=(newoffset>>16)&0xff; lwrite(ixbfile,ixbptr[i],11); /* filename */ lwrite(ixbfile,str,3); /* offset */ lwrite(ixbfile,ixbptr[i]+14,8); } /* upload and download times */ close(exbfile); close(txbfile); close(ixbfile); close(datfile); remove(exbfname); rename(txbfname,exbfname); if(!flength(exbfname)) remove(exbfname); free((char *)ixbbuf); free((char *)datbuf); if(ixblen/F_IXBSIZE==datlen/F_LEN) bputs(text[Sorted]); else bprintf(text[Compressed] ,(uint)((datlen/F_LEN)-(ixblen/F_IXBSIZE)) ,ultoac(((datlen/F_LEN)-(ixblen/F_IXBSIZE))*F_LEN,tmp)); }
int main(int argc, char **argv) { char str[256],*p; int i,j,file; ulong length,max_users=0xffffffff; uint32_t l; sub_status_t *sub_status; scfg_t cfg; glob_t gl; size_t glp; fprintf(stderr,"\nSMBACTIV Version %s (%s) - Synchronet Message Base Activity " "Monitor\n", SMBACTIV_VER, PLATFORM_DESC); if(argc>1) max_users=atol(argv[1]); if(!max_users) { lprintf("\nusage: SMBACTIV [max_users]\n\n"); lprintf("max_users = limit output to subs read by this many users " "or less\n"); return(0); } p=getenv("SBBSCTRL"); if(p==NULL) { printf("\nSBBSCTRL environment variable not set.\n"); #ifdef __unix__ printf("\nExample: export SBBSCTRL=/sbbs/ctrl\n"); #else printf("\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n"); #endif return(1); } memset(&cfg,0,sizeof(cfg)); cfg.size=sizeof(cfg); SAFECOPY(cfg.ctrl_dir,p); if(!load_cfg(&cfg,NULL,TRUE,str)) { fprintf(stderr,"!ERROR loading configuration files: %s\n",str); return(1); } chdir(cfg.ctrl_dir); if((sub_status=(sub_status_t *)MALLOC (cfg.total_subs*sizeof(sub_status_t)))==NULL) { printf("ERROR Allocating memory for sub_status\r\n"); return(1); } lprintf("\nReading sub-board "); for(i=0;i<cfg.total_subs;i++) { lprintf("%5d of %-5d\b\b\b\b\b\b\b\b\b\b\b\b\b\b",i+1,cfg.total_subs); sprintf(smb.file,"%s%s",cfg.sub[i]->data_dir,cfg.sub[i]->code); if((j=smb_open(&smb))!=0) { lprintf("Error %d opening %s\r\n",j,smb.file); sub_status[i].read=0; sub_status[i].firstmsg=0L; continue; } sub_status[i].read=0; sub_status[i].firstmsg=first_msg(); smb_close(&smb); } sprintf(str,"%suser/ptrs/*.ixb",cfg.data_dir); if(glob(str, GLOB_MARK, NULL, &gl)) { lprintf("Unable to find any user pointer files.\n"); globfree(&gl); free(sub_status); return(1); } lprintf("\nComparing user pointers "); for(glp=0; glp<gl.gl_pathc; glp++) { lprintf("%-5d\b\b\b\b\b",glp); SAFECOPY(str,gl.gl_pathv[glp]); if((file=nopen(str,O_RDONLY|O_BINARY))==-1) { continue; } length=filelength(file); for(i=0;i<cfg.total_subs;i++) { if(sub_status[i].read>max_users) continue; if(length<(cfg.sub[i]->ptridx+1)*10UL) continue; else { lseek(file,((long)cfg.sub[i]->ptridx*10L)+4L,SEEK_SET); read(file,&l,4); } if(l>sub_status[i].firstmsg) sub_status[i].read++; } close(file); } globfree(&gl); printf("NumUsers Sub-board\n"); printf("-------- -------------------------------------------------" "-----------\n"); for(i=0;i<cfg.total_subs;i++) { if(sub_status[i].read>max_users) continue; printf("%8lu %-*s %-*s\n" ,sub_status[i].read ,LEN_GSNAME,cfg.grp[cfg.sub[i]->grp]->sname ,LEN_SLNAME,cfg.sub[i]->lname); } return(0); }
void sbbs_t::sof(char *fname, char *answers, long len) { char str[256],*buf,max,min,cr; int file; long length,l=0,m,a=0; sprintf(str,"%s%s.sif",cfg.text_dir,fname); if((file=nopen(str,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); answers[0]=0; return; } length=filelength(file); if((buf=(char *)malloc(length))==0) { close(file); errormsg(WHERE,ERR_ALLOC,str,length); answers[0]=0; return; } if(lread(file,buf,length)!=length) { close(file); errormsg(WHERE,ERR_READ,str,length); answers[0]=0; return; } close(file); while(l<length && online) { min=max=cr=0; while(l<length && buf[l++]!=STX); for(m=l;m<length;m++) if(buf[m]==ETX || !buf[m]) { buf[m]=0; break; } if(l>=length) break; if(online==ON_REMOTE) { rioctl(IOCM|ABORT); rioctl(IOCS|ABORT); } putmsg(buf+l,P_SAVEATR); m++; if(toupper(buf[m])!='C' && toupper(buf[m])!='S') continue; SYNC; if(online==ON_REMOTE) rioctl(IOSM|ABORT); if(a>=len) { bprintf("\r\nSOF: %s defined more data than buffer size " "(%lu bytes)\r\n",fname,len); break; } if((buf[m]&0xdf)=='C') { if((buf[m+1]&0xdf)=='U') /* Uppercase only */ m++; else if((buf[m+1]&0xdf)=='N') /* Numbers only */ m++; if((buf[m+1]&0xdf)=='L') { /* Draw line */ if(term_supports(COLOR)) attr(cfg.color[clr_inputline]); else attr(BLACK|BG_LIGHTGRAY); bputs(" \b"); m++; } if((buf[m+1]&0xdf)=='R') { /* Add CRLF */ cr=1; m++; } outchar(answers[a++]); attr(LIGHTGRAY); CRLF; if(cr) a+=2; } else if((buf[m]&0xdf)=='S') { /* String */ if((buf[m+1]&0xdf)=='U') m++; else if((buf[m+1]&0xdf)=='F') m++; else if((buf[m+1]&0xdf)=='N') /* Numbers only */ m++; if((buf[m+1]&0xdf)=='L') { if(term_supports(COLOR)) attr(cfg.color[clr_inputline]); else attr(BLACK|BG_LIGHTGRAY); m++; } if((buf[m+1]&0xdf)=='R') { cr=1; m++; } if(isdigit(buf[m+1])) { max=buf[++m]&0xf; if(isdigit(buf[m+1])) max=max*10+(buf[++m]&0xf); } if(buf[m+1]=='.' && isdigit(buf[m+2])) { m++; min=buf[++m]&0xf; if(isdigit(buf[m+1])) min=min*10+(buf[++m]&0xf); } if(buf[m+1]=='"') { max=0; m++; while(buf[++m]!='"' && max<80) max++; } if(!max) continue; getrec(answers,a,max,str); bputs(str); attr(LIGHTGRAY); CRLF; if(!cr) a+=max; else a+=max+2; } } free((char *)buf); }