home *** CD-ROM | disk | FTP | other *** search
- #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);
- }
-