home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programming
/
powerprogramming1994.iso
/
progtool
/
c
/
crcbbs.arc
/
CRCPC1A.C
< prev
next >
Wrap
Text File
|
1985-10-22
|
18KB
|
616 lines
#include "crcpchdr.h"
static struct cmd_list *rvs_cmdl(me,daddy)
struct cmd_list *me, *daddy;
{
struct cmd_list *babysitter;
babysitter = me->next; /* Babysit my child for a moment ... */
me->next = daddy; /* Fool computer: my daddy is now my child */
if (babysitter!=NULL) { /* If I had a child for babysitter to hold, */
return(rvs_cmdl(babysitter,me)); /* Then reverse me & my child */
}
else return me; /* Else I am the last of the lineage ... */
}
#define DLM " ,\r\n\t"
struct cmd_list *read_cmds() /* Read commands from CMDFILE */
{
FILE *fp;
struct cmd_list *start_list, *new_elmt;
char disk_buffer[128];
char name[13];
char minbc[4], clasc[4];
char id[2];
int minbr, class;
char *ptr, *incptr(), *stpblk();
start_list = NULL;
if ((fp=fopen(CMDFILE,"r"))!=NULL) {
while (fgets(disk_buffer,sizeof(disk_buffer),fp)!=NULL) {
if (!notnull(disk_buffer)) continue;
ptr = stpblk(disk_buffer);
if (*ptr=='/' && *(ptr+1)=='*') continue;
ptr = stptok(ptr,name,sizeof(name),DLM);
ptr = stptok(incptr(ptr),minbc,sizeof(minbc),DLM);
ptr = stptok(incptr(ptr),id,sizeof(id),DLM);
ptr = stptok(incptr(ptr),clasc,sizeof(clasc),DLM);
if (!*minbc || sscanf(minbc,"%d",&minbr)==0) minbr=strlen(name);
if (!*clasc || sscanf(clasc,"%d",&class)==0) class=0;
if ((new_elmt=(struct cmd_list *)getmem(sizeof(struct cmd_list)
+ strlen(name)))==NULL)
return NULL; /* NOTE: Memory may still be alloc'd */
new_elmt->next = start_list;
strcpy(new_elmt->name,uppercase(name));
new_elmt->abrl = minbr;
new_elmt->class = class;
new_elmt->cmd_id = id[0];
start_list = new_elmt;
}
fclose(fp);
}
return(rvs_cmdl(start_list,NULL)); /* Convert LIFO back to FIFO order first */
}
#undef DLM
#define PI 3.1415926
float randf() /* Return float random num 0 < num < 1 */
{
int hh,mm,ss1,ms1,ss2,ms2;
float retn;
systime(&hh,&mm,&ss1,&ms1);
for (hh=ss1*ms1;hh!=0;hh--); /* Waste 'random' amount of time */
systime(&hh,&mm,&ss2,&ms2); /* Assume nice number of ms passed by now */
retn = (PI*(float)ms1*(float)ss1)+(PI*(float)ms2*(float)ss2)
+((float)ms1+(float)ms2)/PI; /* Create 'wierd' number */
retn = (float)(retn - (int)retn); /* Truncate ? */
return((float)retn);
}
#undef PI
int randint(topnum)
int topnum;
{
return((int)((float)topnum*randf())+(float)1);
}
do_fort(c,args,options)
char c;
char *args, *options;
{
int quiet, gap, maxtimes, i;
quiet = find_options(options,'q');
if (!(maxtimes=stoi(args))) maxtimes = 1;
if (fort_une) {
for (i=0;i<maxtimes && !quit;i++) {
gap = randint(fort_gap);
fortune(gap); /* Do fortune if requested */
}
}
else if (!quiet) printf("Fortunes not active at this time\r\n");
}
fortune(skips)
int skips;
{
int i;
if (fort_fp==NULL) return; /* Nothing to do if fortune file not open */
if (skips<0 || skips>1000) return; /* Ignore crazy requests-stupid caller ! */
for (i=0;fort_fp!=NULL && i<skips;i++) {
do { /* Skip a fortune */
if (fgets(file_buff,STR_SIZE,fort_fp)==NULL) {
reset_fortf();
*file_buff = '\0';
}
} while(*ltrim(file_buff));
}
if (fort_fp==NULL) return;
/* We have located the fortune we want: type it out */
printf("\r\n");
do {
if (fgets(file_buff,STR_SIZE,fort_fp)==NULL) {
reset_fortf();
*file_buff = '\0';
}
else mputs(file_buff);
} while(*ltrim(file_buff) && fort_fp!=NULL);
}
any_last_news()
{
typeifexist(ipath,LASTNWS_MSG,FALSE);
}
any_news(c,args,opts)
char c, *args, *opts;
{
if (typeifexist(ipath,NEWS_MSG,TRUE)) printf("No news.\r\n");
}
other_systems(c,args,opts)
char c, *args, *opts;
{
if (typeifexist(ipath,BBS_LIST,TRUE)) printf("Sorry, no list active today\r\n");
}
int typeifexist(path,filename,lng)
char *path;
char *filename;
int lng;
{
FILE *fp;
char buffer[DIRSIZE];
if (*path) filename = prefix_dir(buffer,filename,path);
if ((fp=fopen(filename,"r"))==NULL) return(TRUE);
if (beginner && lng) ctlsctlk();
fileterm(fp,"p"); /* Page mode active */
fclose(fp);
return(FALSE);
}
goodbye(who)
char *who;
{
sprintf(workstr,"%s SHUTDOWN: %s",SYSNAME,who);
logevent(workstr);
closelog();
printf("Welcome to PC-DOS!\r\n");
sysdir(cur_dir,cur_root); /* Leave him where he was */
if (!prton) printer(ON);
brkset(ON);
exit(0);
}
reset_fortf()
{
char fortfile[DIRSIZE+LINESIZE];
if (fort_fp!=NULL) fclose(fort_fp);
prefix_dir(fortfile,FORTUNE_DAT,fpath);
fort_fp = fopen(fortfile,"r");
}
scan_events(c,args,opts)
char c, *args, *opts;
{
FILE *evfp;
int quiet;
quiet = find_option(opts,'q');
sysdir("",MAILBOX);
closelog();
if ((evfp=fopen(EVENT_LOG,"r"))==NULL) {
mputs("There is currently no event log.\r\n");
}
else {
quit = FALSE;
if (!quiet && beginner) ctlsctlk();
cr();
while (!quit && (fgets(file_buff,termwidth,evfp)!=NULL))
mputs(file_buff);
fclose(evfp);
}
openlog();
}
read_userfile()
{
FILE *fp;
char *bufptr;
init_vars(); /* Init/refresh/default system status vars */
userclass=
totconnect=0;
timeson=1;
dn_tab.before[0]=
dn_tab.after[0]=
userphone[0]=
userreason[0]=
syspw[0]=
username[0]=
medit_opts[0]= '\0';
termdef[0]=
usersys[0]=
fxfer[0]=
userloc[0]=
userspclty[0]=
laston[0]= '\0';
nousrto=
nousrfort=
userread=
userwrite=
sysread=
syswrite= FALSE;
not_terminal = TRUE;
if (sysdir("",MAILBOX)) return(baddir(MAILBOX));
strcpy(workstr,home_dir);
strcat(workstr,USER_EXT);
if ((fp=fopen(workstr,"r"))==NULL) return; /* No user file: Return */
while(fgets(file_buff,STR_SIZE,fp)!=NULL) {
del_crlf(file_buff);
bufptr = ltrim(file_buff);
if (bufptr[0]) process_userfile(file_buff);
}
fclose(fp);
init_tty(termdef);
}
static process_userfile(buffer)
char buffer[];
{
char token1[12];
char token2[20];
char token3[5];
char token4[10];
char *parseptr, *thirdptr, *fourptr, *fiveptr;
int notfound;
int mo,dy,yr;
parseptr = stpblk(stptok(stpblk(buffer),token1,12," \r"));
thirdptr = stpblk(stptok(parseptr,token2,20," \r"));
fourptr = stpblk(stptok(thirdptr,token3,5," \r"));
fiveptr = stpblk(stptok(fourptr,token4,10," \r"));
uppercase(token1), uppercase(token2);
notfound = FALSE;
if (!strcmp(token1,"PWD:")) strcpy(syspw,token2);
else if (!strcmp(token1,"ID:")) stccpy(user_id,token2,sizeof(user_id));
else if (!strcmp(token1,"LASTON:")) strcpy(laston,token2);
else if (!strcmp(token1,"PHONE:")) strcpy(userphone,parseptr);
else if (!strcmp(token1,"DUPLEX:")) duplex = stoi(token2);
else if (!strcmp(token1,"SPECIALTY:")) strcpy(userspclty,parseptr);
else if (!strcmp(token1,"MAXTIME:")) {
if (stoi(token2)) maxconnect = stoi(token2);
else if (sys_test | debug) printf("Bad MAXTIME arg in uf\r\n");
}
else if (!strcmp(token1,"TERMDEF:")) strcpy(termdef,parseptr);
else if (!strcmp(token1,"FXFER:")) strcpy(fxfer,parseptr);
else if (!strcmp(token1,"REASON:")) strcpy(userreason,parseptr);
else if (!strcmp(token1,"USERLOC:")) strcpy(userloc,parseptr);
else if (!strcmp(token1,"TIMESON:")) timeson = stoi(token2)+1;
else notfound = TRUE;
if (notfound==FALSE) ;
else if (notfound=FALSE) ;
else if (!strcmp(token1,"CLASS:")) userclass = stoi(token2);
else if (!strcmp(token1,"BOARD:")) {
/* NOTE: We don't track last BBS sessions for PUBLIC accts */
extr_date(fiveptr,&mo,&dy,&yr);
if (!no_account) a_u_msg(token2,stoi(token3),stoi(token4),mo,dy,yr);
}
else if (!strcmp(token1,"TOTCONNECT:")) totconnect=stol(token2);
else if (!strcmp(token1,"SUSPENDED")) not_terminal = FALSE;
else if (!strcmp(token1,"SYSREAD")) sysread = TRUE;
else if (!strcmp(token1,"UCTRANS")) uctrans = TRUE;
else if (!strcmp(token1,"SYSWRITE")) syswrite = TRUE;
else if (!strcmp(token1,"USERREAD")) userread = TRUE;
else if (!strcmp(token1,"USERWRITE")) userwrite = TRUE;
else if (!strcmp(token1,"EXPERT")) beginner = FALSE;
else notfound = TRUE;
if (notfound==FALSE) ;
else if (!strcmp(token1,"NOVICE")) beginner = TRUE;
else if (!strcmp(token1,"NOTIMEOUT")) nousrto = TRUE;
else if (!strcmp(token1,"NOFORTUNE")) nousrfort = TRUE;
else if (!strcmp(token1,"MEDIT:")) strcpy(medit_opts,parseptr);
else if (!strcmp(token1,"USERSYS:")) strcpy(usersys,parseptr);
else if (!strcmp(token1,"BEFORETEXT:")) bin_list(dn_tab.before,parseptr,sizeof(dn_tab.before));
else if (!strcmp(token1,"AFTERTEXT:")) bin_list(dn_tab.after,parseptr,sizeof(dn_tab.after));
else if (!strcmp(token1,"NAME:")) strcpy(username,parseptr);
else if (sys_test) printf("Invalid item in USERINFO file: '%s'.\r\n",file_buff);
}
write_userfile()
{
FILE *fp;
struct lmsg *lmsg_ptr, *lmsg_next;
char buf[32];
if (sysdir("",MAILBOX)) return(baddir(MAILBOX));
strcpy(workstr,home_dir);
strcat(workstr,USER_EXT);
if ((fp=fopen(workstr,"w"))==NULL) {
printf("Can't update userfile !?\r\n");
return; /* Oops!: Return */
}
if (syspw[0]) writeln2(fp,"PWD: ",syspw);
if (timeson) {
sprintf(workstr,"%d",timeson);
writeln2(fp,"TIMESON: ",workstr);
}
if (beginner) writeln2(fp,"NOVICE"," ");
else writeln2(fp,"EXPERT"," ");
if (username[0]) writeln2(fp,"NAME: ",username);
writeln2(fp,"LASTON: ",date());
if (userloc[0]) writeln2(fp,"USERLOC: ",userloc);
if (userreason[0]) writeln2(fp,"REASON: ",userreason);
if (userphone[0]) writeln2(fp,"PHONE: ",userphone);
if (maxconnect != defmaxconnect) writeln2(fp,"MAXTIME: ",itos(maxconnect));
if (userspclty[0]) writeln2(fp,"SPECIALTY: ",userspclty);
if (medit_opts[0]) writeln2(fp,"MEDIT: ",medit_opts);
if (fxfer[0]) writeln2(fp,"FXFER: ",fxfer);
if (termdef[0]) writeln2(fp,"TERMDEF: ",termdef);
if (usersys[0]) writeln2(fp,"USERSYS: ",usersys);
sprintf(workstr,"%ld",totconnect+cnct_seconds());
writeln2(fp,"TOTCONNECT: ",workstr);
sprintf(workstr,"%d",duplex);
if (duplex!=defduplex) writeln2(fp,"DUPLEX: ",workstr);
if (dn_tab.before[0]!='\0') {
dec_list(workstr,dn_tab.before,sizeof(workstr));
writeln2(fp,"BEFORETEXT: ",workstr);
}
if (dn_tab.after[0]!='\0') {
dec_list(workstr,dn_tab.after,sizeof(workstr));
writeln2(fp,"AFTERTEXT: ",workstr);
}
if (uctrans) writeln2(fp,"UCTRANS","");
if (userclass>0) writeln2(fp,"CLASS: ",itos(userclass));
if (sysread) writeln2(fp,"SYSREAD","");
if (syswrite) writeln2(fp,"SYSWRITE","");
if (userread) writeln2(fp,"USERREAD","");
if (userwrite) writeln2(fp,"USERWRITE","");
if (nousrto) writeln2(fp,"NOTIMEOUT","");
if (nousrfort) writeln2(fp,"NOFORTUNE","");
if (!not_terminal) writeln2(fp,"SUSPENDED AND WAITING CANCELLATION OR"," REVALIDATION");
for (lmsg_ptr=lmsg_start;lmsg_ptr!=NULL;lmsg_ptr=lmsg_next) {
sprintf(buf,"%s %d %d %02d/%02d/%02d",lmsg_ptr->boardname,lmsg_ptr->lmb,
lmsg_ptr->lmr,lmsg_ptr->mo,lmsg_ptr->dy,lmsg_ptr->yr);
writeln2(fp,"BOARD: ",buf);
lmsg_next = lmsg_ptr->next_lmsg;
if (rlsmem(lmsg_ptr,sizeof(*lmsg_ptr))) printf("RLSMEM bd err!\r\n");
}
lmsg_start = NULL; /* No more LAST_MSG list */
fclose(fp);
}
/*
init_tty: initialize global system tty-related variables from
'termdef' record formatted in tokens as follows:
<termdescriptor> <Direct | Standard> <utlength> <utwidth> <clseq>
*/
static init_tty(termdef)
char *termdef;
{
char buf[LINESIZE];
termdef = skptok(termdef); /* Terminal descriptor */
termdef = stpblk(stptok(termdef,buf,LINESIZE," ")); /* Get display mode token */
if (*buf) tflag = (toupper(*buf)=='D'); /* True for DIRECT output. */
termdef = stpblk(stptok(termdef,buf,LINESIZE," ")); /* Pick up UTLENGTH */
if (stoi(buf)) utlength = stoi(buf);
termdef = stpblk(stptok(termdef,buf,LINESIZE," ")); /* Pick up UTWIDTH */
if (stoi(buf)) utwidth = stoi(buf);
termdef = stpblk(stptok(termdef,buf,LINESIZE," ")); /* And CLS sequence */
bin_list(utcls,buf,sizeof(utcls)); /* Assign CLS sequence */
}
who_is(c,args,opts)
char c, *args, *opts;
{
int lidx, quiet;
quiet = find_option(opts,'q');
sysdir("",user_root);
if (beginner && !quiet) disp_msg(7);
if (!*args) disp_reply("Enter '*' for all users, or userid: ",workstr,9);
else stptok(args,workstr,9," ");
if (workstr[0]=='\0') return(nothing_done());
if (setup_dir(workstr,DIR_TYP)) {
printf("Couldn't find any users!?\r\n");
return;
}
create_list();
cr();
if (!quiet && beginner) ctlsctlk();
for (lidx=0;lidx<list_idx && !quit;lidx++) {
if (strcmp("..",list[lidx]->filedata.filename_ext) &&
strcmp(".",list[lidx]->filedata.filename_ext)) {
printf("Userid: %s\r\nAccount since: %s\r\n",
list[lidx]->filedata.filename_ext,
filedate(list[lidx]->filedata.file_date));
pruser_stats(list[lidx]->filedata.filename_ext);
}
}
drop_list();
}
static pruser_stats(username)
char username[];
{
FILE *fp;
char userfile[17];
char *bufptr;
if (!sysdir("",MAILBOX)) {
strcpy(userfile,username);
strcat(userfile,USER_EXT);
if ((fp=fopen(userfile,"r"))!=NULL) {
while(fgets(file_buff,STR_SIZE,fp)!=NULL && !quit) {
del_crlf(file_buff);
bufptr = ltrim(file_buff);
if (bufptr[0]) show_userfile(file_buff,username);
}
fclose(fp);
}
}
if (sysdir(username,user_root)) return(baddir(username));
strcpy(userfile,home_dir);
strcat(userfile,MAIL_EXT);
if ((fp=fopen(INFO_USR,"r"))!=NULL) {
cr();
while(fgets(file_buff,termwidth,fp)!=NULL && !quit) mputs(file_buff);
fclose(fp);
}
cr();
}
static show_userfile(buff,who)
char buff[];
char who[];
{
char token1[15], *parseptr;
int owner;
/* We show almost all stuff to current user, or SYSREAD user */
owner = !strcmp(home_dir,who) || sysread;
del_crlf(parseptr=stpblk(stptok(stpblk(buff),token1,sizeof(token1)," \r\n")));
uppercase(token1);
if (!strcmp(token1,"NAME:")) printf("Name: %s\r\n",parseptr);
else if (!strcmp(token1,"LASTON:")) printf("Last logon: %s\r\n",parseptr);
else if (!strcmp(token1,"PHONE:")) {
if (owner||*parseptr!='*') {
printf("Telephone: %s",parseptr);
if (*parseptr=='*') printf(" ('*'=private number)");
printf("\r\n");
}
}
else if (!strcmp(token1,"USERLOC:")) printf("Location: %s\r\n",parseptr);
else if (!strcmp(token1,"SPECIALTY:")) printf("Specialty: %s\r\n",parseptr);
else if (!strcmp(token1,"USERSYS:")) printf("System type: %s\r\n",parseptr);
else if (!strcmp(token1,"FXFER:")) printf("File xfers: %s\r\n",parseptr);
else if (!strcmp(token1,"TIMESON:")) printf("Times on: %s\r\n",parseptr);
else if (!strcmp(token1,"MEDIT:")) {
if (owner) printf("Medit options: %s\r\n",parseptr);
}
else if (!strcmp(token1,"TERMDEF:")) {
if (owner) printf("T-settings: %s\r\n",parseptr);
}
else if (!strcmp(token1,"MAXTIME:")) {
if (sysread) printf("Maximum stay: %d minutes\r\n",stoi(parseptr));
}
}
message()
{
int msgf;
if (!(msgf=open(SYSTEM_MSG,FREAD))) {
printf("Sysmail pending: %s\r\n",SYSTEM_MSG);
if (beginner) printf("Please ERASE file after reading.\r\n");
close(msgf);
}
}
char *good_morning()
{
int hh,mm,ss,ms;
systime(&hh,&mm,&ss,&ms);
if (hh<NOON) return("Good morning");
else if (hh<DUSK) return("Good afternoon");
else return("Good evening");
}
systat(c,args,opts)
char c, *args, *opts;
{
long getfree(), gettots();
printf("System name: %s ver %s\r\n",SYSNAME,SYSVER);
printf("Running under: %s ver %d.%d\r\n",DOSNAME,_dos[0],_dos[1]);
printf("System time: %s\r\n",timedate());
printf("Disk space: %ld/%ld = %3.0f%% free\r\n",
getfree(0), gettots(0),
100.0 * (float)getfree(0)/(float)gettots(0)+(float)0.05);
}
/*
This version of MINIT uses the INT14H calls, assuming that an acceptable
method for initializing the BAUD rate is provided by such interrupt.
As of 08/22/84, CRCPC assumed to run in conjunction with the latest
NEW14H/HOST communication/keyboard link, by CRC.
*/
minit(baud,parity,wordlen,stopbits,opts)
char *baud, *parity, *wordlen, *stopbits;
char *opts;
{
int hayes;
char m16PARMS, set_baud(), set_parity(), set_length(), set_stop();
hayes = find_option(opts,'h');
m16PARMS = set_baud(baud) |
set_parity(parity) |
set_length(wordlen) |
set_stop(stopbits) ;
int14h(port_used,INIT_COM,m16PARMS); /* Setup modem */
/* I REALLY DON'T KNOW IF THIS mcode MAKES ANY SENSE ... */
/* BUT THE 1200B STILL FUCKS UP WHEN BAUD RATES CHANGED ON IT */
if (hayes && !rdsr()) {
wait_sec(1);
prmodm("+++");
wait_sec(1);
prmodm("ATO\r"); /* Tell Hayes about our baud rate change ?! */
}
}
static char set_baud(mcode)
char *mcode;
{
char olcr;
olcr = *mcode;
if (olcr=='3') return(B6); /* 300 baud */
if (olcr=='6') return(B6|B5); /* 600 */
if (olcr=='1') return(B7); /* 1200 */
if (olcr=='2') return(B7|B5); /* 2400 */
if (olcr=='4') return(B7|B6); /* 4800 */
if (olcr=='9') return(B7|B6|B5); /* 9600 */
printf("%s?",mcode);
return(0);
}
static char set_parity(mcode)
char *mcode;
{
char olcr;
olcr = *mcode;
if (olcr=='E') return(B3|B4);
if (olcr=='O') return(B3);
if (olcr=='N') return(0);
printf("%s?",mcode);
return(0);
}
static char set_length(mcode)
char *mcode;
{
char olcr;
olcr = *mcode;
if (olcr=='7') return(B1);
if (olcr=='8') return(B0|B1);
printf("%s?",mcode);
return(0);
}
static char set_stop(mcode)
char *mcode;
{
char olcr;
olcr = *mcode;
if (olcr=='2') return(B2);
if (olcr=='1') return(0);
printf("%s?",mcode);
return(0);
}