home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Devil's Doorknob BBS Capture (1996-2003)
/
devilsdoorknobbbscapture1996-2003.iso
/
WWIV2.ZIP
/
XINIT.C
< prev
Wrap
C/C++ Source or Header
|
1993-10-18
|
14KB
|
508 lines
/*****************************************************************************
WWIV Version 4
Copyright (C) 1988-1993 by Wayne Bell
Distribution of the source code for WWIV, in any form, modified or unmodified,
without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
Distribution of compiled versions of WWIV is limited to copies compiled BY
THE AUTHOR. Distribution of any copies of WWIV not compiled by the author
is expressly prohibited.
*****************************************************************************/
#include "vars.h"
#pragma hdrstop
#include <dir.h>
#include <math.h>
void far interrupt inlii();
void far interrupt checkai();
void far interrupt plai();
void far interrupt outchri();
void far interrupt outstri();
void far interrupt nli();
void far interrupt pli();
void far interrupt emptyi();
void far interrupt inkeyi();
void far interrupt getkeyi();
void far interrupt inputi();
void far interrupt inputli();
void far interrupt yni();
void far interrupt nyi();
void far interrupt ansici();
void far interrupt oneki();
void far interrupt prti();
void far interrupt mpli();
void far *mallocx(unsigned long l, char *where)
{
void *x;
x=farmalloc(l);
if (!x) {
printf("Insufficient memory (%ld bytes) for %s.\n",l,where);
end_bbs(noklevel);
}
memset(x, 0, l);
return(x);
}
#define OFFOF(x) (FP_OFF(&(thisuser.x))-FP_OFF(&thisuser))
void init(void)
{
char s[161],*buf,ch,*ss;
int i,i1,i2,sm,cp,n,f;
int f1,f2,f3,f4,f5,f6,f7;
long l;
union REGS r;
struct date today;
votingrec v;
save_dos=find_interrupt();
if (!save_dos) {
printf("\nNo spare interrupt vector found to use.\n\n");
end_bbs(noklevel);
}
crttype=peekb(0x0040,0x0049);
if (crttype==7)
scrn=MK_FP(0xb000,0x0000);
else
scrn=MK_FP(0xb800,0x0000);
r.h.ah=15;
int86(0x10,&r,&r);
sm=r.h.al;
if (r.h.ah!=80) {
printf("\n\nYou must be in 80 column mode to run WWIV.\n\n");
end_bbs(noklevel);
}
if ((sm==4) || (sm==5) || (sm==6)) {
printf("\n\nYou must be in text mode to run WWIV.\n\n");
end_bbs(noklevel);
}
defscreenbottom=(int) peekb(0x0000,0x0484);
if (defscreenbottom<24)
defscreenbottom=24;
if (defscreenbottom>63)
defscreenbottom=24;
if ((defscreenbottom!=42) && (defscreenbottom!=49))
defscreenbottom=24;
screenbottom=defscreenbottom;
screenlen=160*(screenbottom+1);
if (!exist("restore.wwv")) {
for (i=0; i<screenbottom; i++)
printf("\n");
strcpy(s,wwiv_version);
strcat(s,", Copyright (c) 1988-1993 by Wayne Bell.\n\n");
printf(s);
}
strcpy(cdir,"X:\\");
cdir[0]='A'+getdisk();
getcurdir(0,&(cdir[3]));
#ifdef EMS_XMS
if (_OvrInitEms(0,0,16)!=0)
_OvrInitExt(0L,0);
#endif
userfile=-1;
configfile=-1;
statusfile=-1;
dlf=-1;
curlsub=-1;
curldir=-1;
setvect(save_dos, getvect(INT_REAL_DOS));
oldx=0;
oldy=0;
itimer();
r.h.ah=0x33;
r.h.al=0x01;
r.h.dl=0x00;
int86(INT_REAL_DOS,&r,&r);
use_workspace=0;
input_extern=0;
chat_file=0;
sysop_alert=0;
global_handle=0;
for (i=0; i<25; i++)
funcs[i]=NULL;
funcs[0]=(void far *)inlii;
funcs[1]=(void far *)checkai;
funcs[2]=(void far *)plai;
funcs[3]=(void far *)outchri;
funcs[4]=(void far *)outstri;
funcs[5]=(void far *)nli;
funcs[8]=(void far *)pli;
funcs[9]=(void far *)emptyi;
funcs[10]=(void far *)inkeyi;
funcs[11]=(void far *)getkeyi;
funcs[12]=(void far *)inputi;
funcs[13]=(void far *)inputli;
funcs[14]=(void far *)yni;
funcs[15]=(void far *)nyi;
funcs[16]=(void far *)ansici;
funcs[17]=(void far *)oneki;
funcs[18]=(void far *)prti;
funcs[19]=(void far *)mpli;
sprintf(ver_no2,"WWIV_FP=%04.4X:%04.4X",FP_SEG(funcs), FP_OFF(funcs));
strcpy(ver_no1,"BBS=");
strcat(ver_no1,wwiv_version);
getdate(&today);
if (today.da_year<1988) {
printf("You need to set the date & time before running the BBS.\n");
end_bbs(noklevel);
}
configfile=open("CONFIG.DAT",O_RDWR | O_BINARY);
if (configfile<0) {
printf("CONFIG.DAT NOT FOUND.\n");
end_bbs(noklevel);
}
read(configfile,(void *) (&syscfg), sizeof(configrec));
close(configfile);
cur_lang=-1;
if (set_language(0)) {
printf("You need the default language fully installed to run the BBS.\n");
end_bbs(noklevel);
}
/* make sure it is the new userrec structure */
sprintf(s,"%sUSER.QSC",syscfg.datadir);
if (!exist(s)) {
printf("You must go into INIT and convert your userlist before running the BBS.\n");
end_bbs(noklevel);
}
/* update user info data */
f1=sizeof(userrec);
f2=OFFOF(waiting);
f3=OFFOF(inact);
f4=OFFOF(sysstatus);
f5=OFFOF(forwardusr);
f6=OFFOF(forwardsys);
f7=OFFOF(net_num);
if ((f1!=syscfg.userreclen) ||
(f2!=syscfg.waitingoffset) ||
(f3!=syscfg.inactoffset) ||
(f4!=syscfg.sysstatusoffset) ||
(f5!=syscfg.fuoffset) ||
(f6!=syscfg.fsoffset) ||
(f7!=syscfg.fnoffset)) {
syscfg.userreclen=f1;
syscfg.waitingoffset=f2;
syscfg.inactoffset=f3;
syscfg.sysstatusoffset=f4;
syscfg.fuoffset=f5;
syscfg.fsoffset=f6;
syscfg.fnoffset=f7;
/* store the new config.dat file */
configfile=open("CONFIG.DAT",O_RDWR | O_BINARY);
write(configfile,(void *) (&syscfg), sizeof(configrec));
close(configfile);
}
if (!syscfg.primaryport)
ok_modem_stuff=0;
net_networks=NULL;
net_num=0;
sprintf(s,"%sNETWORKS.DAT", syscfg.datadir);
f=open(s,O_RDONLY|O_BINARY);
if (f>0) {
net_num_max=filelength(f)/sizeof(net_networks_rec);
if (net_num_max) {
net_networks=mallocx(net_num_max*sizeof(net_networks_rec),"networks.dat");
read(f, net_networks, net_num_max*sizeof(net_networks_rec));
}
close(f);
for (i=0; i<net_num_max; i++) {
ss=strchr(net_networks[i].name, ' ');
if (ss)
*ss=0;
}
}
if (!net_networks) {
net_networks=mallocx(sizeof(net_networks_rec), "networks.dat");
net_num_max=1;
strcpy(net_networks->name,"WWIVnet");
strcpy(net_networks->dir, syscfg.datadir);
net_networks->sysnum=syscfg.systemnumber;
}
set_net_num(0);
strcpy(s,syscfg.tempdir);
i=strlen(s);
if (s[0]==0)
i1=1;
else {
if ((s[i-1]=='\\') && (s[i-2]!=':'))
s[i-1]=0;
i1=chdir(s);
}
if (i1) {
printf("\nYour temporary directory isn't valid.\n");
printf("It is now set to: '%s'\n\n",syscfg.tempdir);
end_bbs(noklevel);
} else
cd_to(cdir);
strcpy(s,syscfg.batchdir);
i=strlen(s);
if (s[0]==0)
i1=1;
else {
if ((s[i-1]=='\\') && (s[i-2]!=':'))
s[i-1]=0;
i1=chdir(s);
}
if (i1) {
printf("\nYour batchdirectory isn't valid.\n");
printf("It is now set to: '%s'\n\n",syscfg.batchdir);
end_bbs(noklevel);
} else
cd_to(cdir);
sprintf(s,"%sSTATUS.DAT",syscfg.datadir);
statusfile=open(s,O_RDWR | O_BINARY);
if (statusfile<0) {
printf("%s NOT FOUND.\n",s);
end_bbs(noklevel);
}
read(statusfile,(void *)(&status), sizeof(statusrec));
close(statusfile);
status.wwiv_version=wwiv_num_version;
gat=(unsigned short *) mallocx(2048 * sizeof(short), "gat");
smallist=(smalrec *) mallocx((long)syscfg.maxusers * (long)sizeof(smalrec),
"names.lst - try decreasing max users in INIT");
gfilesec=(gfiledirrec *) mallocx((long) (32 * sizeof(gfiledirrec)), "gfiles");
sprintf(s,"%sGFILE.DAT",syscfg.datadir);
i=open(s,O_RDWR | O_BINARY);
if (i<0)
num_sec=0;
else
num_sec=read(i,(void *)gfilesec,32*sizeof(gfiledirrec))/sizeof(gfiledirrec);
close(i);
sprintf(s,"%sNAMES.LST",syscfg.datadir);
i=open(s,O_RDWR | O_BINARY);
if (i<0) {
printf("%s NOT FOUND.\n",s);
end_bbs(noklevel);
}
read(i,(void *) (smallist), (sizeof(smalrec) * status.users));
close(i);
max_subs=syscfg.max_subs;
max_dirs=syscfg.max_dirs;
subboards=(subboardrec *) mallocx(max_subs*sizeof(subboardrec), "subboards");
directories=(directoryrec *)mallocx(max_dirs*sizeof(directoryrec), "directories");
sprintf(s,"%sSUBS.DAT",syscfg.datadir);
i=open(s,O_RDWR | O_BINARY);
if (i<0) {
printf("%s NOT FOUND.\n",s);
end_bbs(noklevel);
}
num_subs=(read(i,subboards, (max_subs*sizeof(subboardrec))))/
sizeof(subboardrec);
close(i);
if (read_subs_xtr(max_subs, num_subs, subboards))
end_bbs(noklevel);
sprintf(s,"%sDIRS.DAT",syscfg.datadir);
i=open(s,O_RDWR | O_BINARY);
if (i<0) {
printf("%s NOT FOUND.\n",s);
end_bbs(noklevel);
}
num_dirs=(read(i,directories, (max_dirs*sizeof(directoryrec))))/
sizeof(directoryrec);
close(i);
chains=(chainfilerec *) mallocx(50 * sizeof(chainfilerec), "chains");
numextrn=0;
numchain=0;
numed=0;
sprintf(s,"%sCHAINS.DAT",syscfg.datadir);
i=open(s,O_RDWR | O_BINARY);
if (i>0) {
numchain=(read(i,(void *)chains, 50*sizeof(chainfilerec)))/sizeof(chainfilerec);
numchain=numchain;
close(i);
}
sprintf(s,"%sMODEM.DAT",syscfg.datadir);
i=open(s,O_RDWR | O_BINARY);
if (i>0) {
l=filelength(i);
modem_i = mallocx(l, "modem.dat");
read(i,modem_i, (unsigned) l);
close(i);
} else {
printf("\nRun INIT.EXE to convert modem data.\n\n");
end_bbs(noklevel);
}
sprintf(s,"%sNEXTERN.DAT",syscfg.datadir);
i=open(s,O_RDWR | O_BINARY);
if (i>0) {
l=filelength(i);
if (l>15*sizeof(newexternalrec))
l=15*sizeof(newexternalrec);
externs=mallocx(l+10, "external protocols");
numextrn=(read(i,(void *)externs, (unsigned) l))/sizeof(newexternalrec);
close(i);
} else
numextrn=0;
sprintf(s,"%sNINTERN.DAT",syscfg.datadir);
i=open(s,O_RDWR|O_BINARY);
if (i>0) {
over_intern=mallocx(3*sizeof(newexternalrec),"interal protocol overrides");
read(i,over_intern, 3*sizeof(newexternalrec));
close(i);
}
sprintf(s,"%sEDITORS.DAT",syscfg.datadir);
i=open(s,O_RDWR | O_BINARY);
if (i>0) {
l=filelength(i);
if (l>10*sizeof(editorrec))
l=10*sizeof(editorrec);
editors=mallocx(l+10, "external editors");
numed=(read(i,(void *)editors, (unsigned) l))/sizeof(editorrec);
numed=numed;
close(i);
}
batch=mallocx(MAX_BATCH * sizeof(batchrec), "batch list");
read_user(1,&thisuser);
if (thisuser.inact & inact_deleted)
fwaiting=0;
else
fwaiting=thisuser.waiting;
sl1(2,status.date1);
if (ok_modem_stuff) {
initport(syscfg.primaryport);
do_result(&(modem_i->defl));
}
if (syscfg.sysconfig & sysconfig_no_local)
topdata=0;
else
topdata=2;
ss=getenv("PROMPT");
strcpy(newprompt,"PROMPT=WWIV: ");
if (ss)
strcat(newprompt,ss);
else
strcat(newprompt,"$P$G");
sprintf(dszlog,"%s\\WWIVDSZ.LOG",cdir);
sprintf(s,"DSZLOG=%s",dszlog);
i=i1=0;
while (environ[i]!=NULL) {
if (strncmp(environ[i],"PROMPT=",7)==0)
xenviron[i1++]=newprompt;
else
if (strncmp(environ[i],"DSZLOG=",7)==0)
xenviron[i1++]=strdup(s);
else {
if ((strncmp(environ[i],"BBS=",4)) &&
(strncmp(environ[i],"WWIV_FP=",8)) &&
(strncmp(environ[i],"WWIV_NET=",8)))
xenviron[i1++]=environ[i];
}
++i;
}
if (!getenv("DSZLOG"))
xenviron[i1++]=strdup(s);
if (!ss)
xenviron[i1++]=newprompt;
xenviron[i1++]=ver_no1;
xenviron[i1++]=ver_no2;
xenviron[i1++]=wwiv_net_no;
xenviron[i1]=NULL;
for (i=0; i<20; i++)
questused[i]=0;
sprintf(s,"%sVOTING.DAT",syscfg.datadir);
f=open(s,O_RDWR | O_BINARY);
if (f>0) {
n=(int) (filelength(f) / sizeof(votingrec)) -1;
for (i=0; i<n; i++) {
lseek(f,(long) i * sizeof(votingrec),SEEK_SET);
read(f,(void *)&v,sizeof(votingrec));
if (v.numanswers)
questused[i]=1;
}
close(f);
}
if (syscfg.sysconfig & sysconfig_high_speed)
high_speed=1;
else
high_speed=0;
time_event=((double)syscfg.executetime)*60.0;
last_time=time_event-timer();
if (last_time<0.0)
last_time+=24.0*3600.0;
do_event=0;
if (status.callernum!=65535) {
status.callernum1=(long)status.callernum;
status.callernum=65535;
save_status();
}
msgs=(postrec *) mallocx((long)(255 * sizeof(postrec)), "posts");
usub=(usersubrec *)mallocx(max_subs*sizeof(usersubrec), "usub");
sub_dates=(long *) mallocx(max_subs*sizeof(long),"sub_dates");
udir=(usersubrec *)mallocx(max_dirs*sizeof(usersubrec), "udir");
dir_dates=(long *) mallocx(max_dirs*sizeof(long),"dir_dates");
qsc=(unsigned long *)mallocx(syscfg.qscn_len, "quickscan");
qsc_n=qsc+1;
qsc_q=qsc_n+(max_dirs+31)/32;
qsc_p=qsc_q+(max_subs+31)/32;
read_bbs_list_index();
frequent_init();
if (!restoring_shrink && !already_on) {
remove_from_temp("*.*", syscfg.tempdir, 1);
remove_from_temp("*.*", syscfg.batchdir, 1);
imodem(1);
cleanup_net();
}
lecho=ok_local();
daylight=0;
find_devices();
if (!restoring_shrink) {
/* sprintf(s,"%s brought up at %s on %s.",wwiv_version, times(), date());*/
sprintf(s,"");
sl1(0,"");
sl1(0,s);
sl1(0,"");
}
unlink("WWIV_NET.DAT");
detect_multitask();
}