home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.wwiv.com
/
ftp.wwiv.com.zip
/
ftp.wwiv.com
/
pub
/
UTILITY
/
ES102.ARJ
/
BE.C
next >
Wrap
Text File
|
1990-07-16
|
15KB
|
606 lines
/* note this is capable but NOT modded for 64 base mod */
/* this is an exact copy of boardedit() in SYSOPF.C so */
/* converting it to 64 base shouldn't be hard at all */
#include <stdio.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>
#include <dos.h>
#include <stdlib.h>
#include <sys\stat.h>
#include "vardec.h"
#define DO_PW_CHECK
/* delete or comment out above line if sysop password check is not desired */
int usernum, /* user number for the user */
age, /* age of the user */
screenchars, /* chars/line user has specified */
screenlines, /* lines/screen user has specified */
sl, /* sec lev for user (0-255) */
so, /* non-zero if user is sysop (sl=255) */
cs, /* non-zero if user is co-sysop */
okansi, /* non-zero if user can support ANSI */
incom, /* non-zero if user is calling remotely */
comport; /* com port user is on */
char name[81], /* name/alias of user */
realname[81], /* real name of user */
callsign[10], /* amateur radio callsign of user */
sex, /* sex of user, M or F */
laston[81], /* date user was last on */
gfiles[81], /* directory for text files, ends in \ */
data[81], /* directory for non-text files, ends in \ */
sysoplog[81], /* full path & filename for sysop log */
curspeed[81]; /* speed user is on at, "KB" if local */
double gold, /* gold user has */
timeallowed, /* number of seconds before user logged off */
version; /* version of WWIV running under */
configrec syscfg;
int num_subs, userfile;
subboardrec subboards[64];
void far interrupt (*inli)(char *, char *, int, int);
void far interrupt (*checka)(int *, int *);
void far interrupt (*pla)(char *, int *);
void far interrupt (*outchr)(char);
void far interrupt (*outstr)(char *);
void far interrupt (*nl)();
void far interrupt (*pl)(char *);
int far interrupt (*empty)();
char far interrupt (*inkey)();
unsigned char far interrupt (*getkey)();
void far interrupt (*input)(char *, int);
void far interrupt (*inputl)(char *, int);
int far interrupt (*yn)();
int far interrupt (*ny)();
void far interrupt (*ansic)(int);
char far interrupt (*onek)(char *);
void far interrupt (*prt)(int, char *);
void far interrupt (*mpl)(int);
void far **funcs;
int read_in_data(char *fn)
{
char buf[1024];
char *ptr[30],*ss,s[81];
int i,f,len,i1;
float fl;
f=open(fn,O_RDONLY | O_BINARY);
if (f<0) {
return(-1);
}
i1=1;
ptr[0]=buf;
len=read(f,(void *)buf,1024);
close(f);
for (i=0; i<len; i++)
if (buf[i]==13) {
buf[i]=0;
ptr[i1++]=&buf[i+2];
}
while (*ptr[6]==32)
++(ptr[6]);
while (*ptr[15]==32)
++(ptr[15]);
usernum=atoi(ptr[0]);
strcpy(name,ptr[1]);
strcpy(realname,ptr[2]);
strcpy(callsign,ptr[3]);
age=atoi(ptr[4]);
sex=*ptr[5];
sscanf(ptr[6],"%f",&fl);
gold=(double)fl;
strcpy(laston,ptr[7]);
screenchars=atoi(ptr[8]);
screenlines=atoi(ptr[9]);
sl=atoi(ptr[10]);
so=atoi(ptr[11]);
cs=atoi(ptr[12]);
okansi=atoi(ptr[13]);
incom=atoi(ptr[14]);
sscanf(ptr[15],"%f",&fl);
timeallowed=(double)fl;
strcpy(gfiles,ptr[16]);
strcpy(data,ptr[17]);
strcpy(sysoplog,gfiles);
strcat(sysoplog,ptr[18]);
strcpy(curspeed,ptr[19]);
comport=atoi(ptr[20]);
version=-1.0;
ss=getenv("BBS");
if (strncmp(ss,"WWIV",4)) {
printf("\nThis program MUST be run under WWIV v4.07 or later.\n");
exit(0);
}
strcpy(s,&(ss[6]));
i=(s[0]-'0')*100+(s[2]-'0')*10+(s[3]-'0');
version=((double)i)/100.0;
if (i<407) {
printf("\nThis program requires WWIV v4.07 or later.\n");
exit(0);
}
funcs=(void far *)getvect(0x6a);
inli=funcs[0];
checka=funcs[1];
pla=funcs[2];
outchr=funcs[3];
outstr=funcs[4];
nl=funcs[5];
pl=funcs[8];
empty=funcs[9];
inkey=funcs[10];
getkey=funcs[11];
input=funcs[12];
inputl=funcs[13];
yn=funcs[14];
ny=funcs[15];
ansic=funcs[16];
onek=funcs[17];
prt=funcs[18];
mpl=funcs[19];
return(0);
}
int checkpw()
{
#ifdef DO_PW_CHECK
char s[81];
nl();
prt(2,"SY: ");
input(s,20);
if (strcmp(s,(syscfg.systempw))==0)
#endif
return(1);
#ifdef DO_PW_CHECK
else
return(0);
#endif
}
void close_user()
{
if (userfile!=-1) {
close(userfile);
userfile=-1;
}
}
void read_user(unsigned int un, userrec *u)
{
long pos;
char s[80];
int i;
if (userfile==-1) {
sprintf(s, "%sUSER.LST", syscfg.datadir);
userfile=open(s,O_RDWR | O_BINARY);
if (userfile<0) {
u->inact=inact_deleted;
return;
}
}
pos=((long) sizeof(userrec)) * ((long) un);
if (filelength(userfile)<=pos) {
u->inact=inact_deleted;
return;
}
lseek(userfile,pos,SEEK_SET);
i=read(userfile, (void *)u, sizeof(userrec));
if (i==-1) {
sprintf(s, "%sUSER.LST", syscfg.datadir);
userfile=open(s,O_RDWR | O_BINARY);
if (userfile<0) {
u->inact=inact_deleted;
return;
}
pos=((long) sizeof(userrec)) * ((long) un);
if (filelength(userfile)<=pos) {
u->inact=inact_deleted;
return;
}
lseek(userfile,pos,SEEK_SET);
i=read(userfile, (void *)u, sizeof(userrec));
if (i==-1) {
pl("COULDN'T READ USER.");
}
close_user();
}
}
void write_user(unsigned int un, userrec *u)
{
long pos;
char s[80];
unsigned char oldsl;
int i;
if (userfile==-1) {
sprintf(s, "%sUSER.LST", syscfg.datadir);
userfile=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
}
pos=((long) sizeof(userrec)) * ((long) un);
lseek(userfile,pos,SEEK_SET);
i=write(userfile, (void *)u, sizeof(userrec));
if (i==-1) {
sprintf(s, "%sUSER.LST", syscfg.datadir);
userfile=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
pos=((long) sizeof(userrec)) * ((long) un);
lseek(userfile,pos,SEEK_SET);
i=write(userfile, (void *)u, sizeof(userrec));
if (i==-1) {
pl("COULDN'T WRITE USER.");
}
close_user();
}
}
void boarddata(int n, char *s)
{
char x,y,k,i;
subboardrec r;
r=subboards[n];
if (r.ar==0)
x=32;
else {
for (i=0; i<16; i++)
if ((1 << i) & r.ar)
x='A'+i;
}
switch(r.anony) {
case 0: y='N'; break;
case anony_enable_anony: y='Y'; break;
case anony_enable_dear_abby: y='D'; break;
case anony_force_anony: y='F'; break;
case anony_real_name: y='R'; break;
}
if (r.key==0)
k=32;
else
k=r.key;
sprintf(s,"%2d %1c %1c %-40s %-8s %-3d %-3d %-3d %-3d %1c",
n,k,x,r.name,r.filename,r.readsl,r.postsl,r.age,r.maxmsgs,y);
}
void showsubs()
{
int abort,i;
char s[180];
outchr(12);
abort=0;
pla("NN K AR Name FN RSL PSL AGE MSG ANON",
&abort);
pla("== - == ---------------------------------------- ======== --- === --- === ----",
&abort);
for (i=0; (i<num_subs) && (!abort); i++) {
boarddata(i,s);
pla(s,&abort);
}
}
void modify_sub(int n)
{
subboardrec r;
char s[81],s1[81],s2[81],ch,ch2;
int i,i1,done;
r=subboards[n];
done=0;
do {
outchr(12);
sprintf(s2, "A. Name : %s", r.name); pl(s2);
sprintf(s2, "B. Filename : %s", r.filename); pl(s2);
if (r.key==0)
strcpy(s,"None");
else {
s[0]=r.key;
s[1]=0;
}
sprintf(s2, "C. Key : %s", s); pl(s2);
itoa(r.readsl,s,10);
sprintf(s2, "D. Read SL : %s", s); pl(s2);
itoa(r.postsl,s,10);
sprintf(s2, "E. Post SL : %s", s); pl(s2);
switch(r.anony) {
case 0: strcpy(s,"No."); break;
case anony_enable_anony: strcpy(s,"Yes."); break;
case anony_enable_dear_abby: strcpy(s,"Dear Abby."); break;
case anony_force_anony: strcpy(s,"Forced."); break;
case anony_real_name: strcpy(s,"Real Name"); break;
}
sprintf(s2, "F. Anony : %s",s); pl(s2);
itoa(r.age,s,10);
sprintf(s2, "G. Min. Age : %s",s); pl(s2);
itoa(r.maxmsgs,s,10);
sprintf(s2, "H. Max Msgs : %s",s); pl(s2);
strcpy(s,"None.");
if (r.ar!=0) {
for (i=0; i<16; i++)
if ((1 << i) & r.ar)
s[0]='A'+i;
s[1]=0;
}
sprintf(s2, "I. AR : %s",s); pl(s2);
ltoa((unsigned long) r.type,s,10);
sprintf(s2, "J. Sub Type : %s",s); pl(s2);
itoa(r.storage_type,s,10);
sprintf(s2, "K. Storage typ: %s",s); pl(s2);
nl();
prt(2,"Which (A-K,Q) ? ");
ch=onek("QABCDEFGHIJK");
switch(ch) {
case 'Q':done=1; break;
case 'A':
nl();
prt(2,"New Name? ");
inputl(s,40);
if (s[0])
strcpy(r.name,s);
break;
case 'B':
nl();
prt(2,"New Filename? ");
input(s,8);
if ((s[0]!=0) && (strchr(s,'.')==0))
strcpy(r.filename,s);
break;
case 'C':
nl();
prt(2,"New Key (spc=none) ? ");
ch2=onek("@#$%^&()-_=+\\|][{};:'\",<>`~ ");
if (ch2==32)
r.key=0;
else
r.key=ch2;
break;
case 'D':
nl();
prt(2,"New Read SL? ");
input(s,3);
i=atoi(s);
if ((i>=0) && (i<256) && (s[0]))
r.readsl=i;
break;
case 'E':
nl();
prt(2,"New Post SL? ");
input(s,3);
i=atoi(s);
if ((i>=0) && (i<256) && (s[0]))
r.postsl=i;
break;
case 'F':
nl();
prt(2,"New Anony (Y,N,D,F,R) ? ");
ch2=onek("NYDFR");
switch(ch2) {
case 'N': r.anony=0; break;
case 'Y': r.anony=anony_enable_anony; break;
case 'D': r.anony=anony_enable_dear_abby; break;
case 'F': r.anony=anony_force_anony; break;
case 'R': r.anony=anony_real_name; break;
}
break;
case 'G':
nl();
prt(2,"New Min Age? ");
input(s,3);
i=atoi(s);
if ((i>=0) && (i<128) && (s[0]))
r.age=i;
break;
case 'H':
nl();
prt(2,"New Max Msgs? ");
input(s,3);
i=atoi(s);
if ((i>0) && (i<255) && (s[0]))
r.maxmsgs=i;
break;
case 'I':
nl();
prt(2,"New AR (<SPC>=None) ? ");
ch2=onek("ABCDEFGHIJKLMNOP ");
if (ch2==32)
r.ar=0;
else
r.ar=1 << (ch2-'A');
break;
case 'J':
nl();
prt(2,"New Sub Type? ");
input(s,5);
i=atoi(s);
if (s[0])
r.type=i;
break;
case 'K':
nl();
prt(2,"New Storage Type (0,1,2) ? ");
input(s,4);
i=atoi(s);
if ((s[0]) && (i>=0) && (i<=2))
r.storage_type=i;
break;
}
} while (!done);
subboards[n]=r;
}
void insert_sub(int n)
{
subboardrec r;
int i,i1,nu;
userrec u;
long l1,l2,l3;
for (i=num_subs-1; i>=n; i--)
subboards[i+1]=subboards[i];
strcpy(r.name,"** NEW SUB **");
strcpy(r.filename,"NONAME");
r.key=0;
r.readsl=60;
r.postsl=60;
r.anony=0;
r.age=0;
r.maxmsgs=100;
r.ar=0;
r.type=0;
r.storage_type=2;
subboards[n]=r;
++num_subs;
read_user(1,&u);
nu=(int) (filelength(userfile) / sizeof(userrec));
l1=0xffffffff >>(32-n);
l2=0xffffffff <<(n+1);
l3=1L << n;
for (i=1; i<nu; i++) {
read_user(i,&u);
if (u.sysopsub!=255)
if (u.sysopsub>=n)
++u.sysopsub;
for (i1=num_subs-1; i1>n; i1--)
u.qscnptr[i1]=u.qscnptr[i1-1];
u.qscnptr[n]=0L;
u.qscn=(u.qscn & l1) | ((u.qscn << 1) & l2) | l3;
write_user(i,&u);
}
modify_sub(n);
}
void delete_sub(int n)
{
char s[81];
int i,i1,nu;
userrec u;
long l1,l2;
prt(5, "Delete data files? ");
if (yn()) {
sprintf(s, "%s%s.SUB", syscfg.datadir, subboards[n].filename);
unlink(s);
sprintf(s, "%s%s.DAT", syscfg.msgsdir, subboards[n].filename);
unlink(s);
}
for (i=n; i<num_subs; i++)
subboards[i]=subboards[i+1];
--num_subs;
read_user(1,&u);
nu=(int) (filelength(userfile) / sizeof(userrec));
l1=0xffffffff >>(32-n);
l2=0xffffffff <<(n);
for (i=1; i<nu; i++) {
read_user(i,&u);
if (u.sysopsub==n)
u.sysopsub=255;
else
if ((u.sysopsub>n) && (u.sysopsub!=255))
--u.sysopsub;
for (i1=n; i1<num_subs; i1++)
u.qscnptr[i1]=u.qscnptr[i1+1];
u.qscnptr[31]=0L;
u.qscn=(u.qscn & l1) | ((u.qscn >> 1) & l2);
write_user(i,&u);
}
}
void boardedit()
{
int i,i1,i2,done,f;
char s[81],s1[81],s2[81],ch;
if (!checkpw())
return;
showsubs();
done=0;
do {
nl();
prt(2,"Subs: D:elete, I:nsert, M:odify, Q:uit, ? : ");
ch=onek("QDIM?");
switch(ch) {
case '?':
showsubs();
break;
case 'Q':
done=1;
break;
case 'M':
nl();
prt(2,"Sub number? ");
input(s,2);
i=atoi(s);
if ((s[0]!=0) && (i>=0) && (i<num_subs))
modify_sub(i);
break;
case 'I':
if (num_subs<32) {
nl();
prt(2,"Insert before which sub? ");
input(s,2);
i=atoi(s);
if ((s[0]!=0) && (i>=0) && (i<=num_subs))
insert_sub(i);
}
break;
case 'D':
nl();
prt(2,"Delete which sub? ");
input(s,2);
i=atoi(s);
if ((s[0]!=0) && (i>=0) && (i<num_subs)) {
nl();
sprintf(s1,"Delete %s? ",subboards[i].name);
prt(5,s1);
if (yn())
delete_sub(i);
}
break;
}
} while (!done);
sprintf(s, "%sSUBS.DAT", syscfg.datadir);
f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
write(f,(void *)&subboards[0], num_subs * sizeof(subboardrec));
close(f);
}
void main(int argc, char *argv[])
{
char s[81];
int i;
userfile = -1;
if (argc<2)
strcpy(s,"chain.txt");
else
strcpy(s,argv[1]);
if (read_in_data(s)==-1) {
printf("\nData file not found: %s\n\n", s);
abort();
}
strcpy(s,"CONFIG.DAT");
i=open(s,O_RDWR | O_BINARY);
if (i<0) {
printf("%s NOT FOUND.\n",s);
exit(1);
}
read(i,(void *) (&syscfg), sizeof(configrec));
close(i);
sprintf(s, "%sSUBS.DAT", syscfg.datadir);
i=open(s,O_RDWR | O_BINARY);
if (i<0) {
printf("%s NOT FOUND.\n",s);
exit(1);
}
num_subs=(read(i,(void *) (&subboards), (32*sizeof(subboardrec))))/
sizeof(subboardrec);
close(i);
boardedit();
}