home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / c / crcbbs.arc / CRCPC1A.C < prev    next >
Text File  |  1985-10-22  |  18KB  |  616 lines

  1. #include    "crcpchdr.h"
  2.  
  3. static struct cmd_list *rvs_cmdl(me,daddy)
  4. struct cmd_list *me, *daddy;
  5. {
  6. struct cmd_list *babysitter;
  7.  
  8. babysitter = me->next;        /* Babysit my child for a moment ... */
  9. me->next = daddy;        /* Fool computer: my daddy is now my child */
  10. if (babysitter!=NULL) {        /* If I had a child for babysitter to hold, */
  11.     return(rvs_cmdl(babysitter,me));    /* Then reverse me & my child */
  12.     }
  13. else return me;            /* Else I am the last of the lineage ... */
  14. }
  15.  
  16. #define        DLM    " ,\r\n\t"
  17. struct cmd_list *read_cmds()    /* Read commands from CMDFILE */
  18. {
  19. FILE *fp;
  20. struct cmd_list *start_list, *new_elmt;
  21. char disk_buffer[128];
  22. char name[13];
  23. char minbc[4], clasc[4];
  24. char id[2];
  25. int minbr, class;
  26. char *ptr, *incptr(), *stpblk();
  27.  
  28. start_list = NULL;
  29. if ((fp=fopen(CMDFILE,"r"))!=NULL) {
  30.     while (fgets(disk_buffer,sizeof(disk_buffer),fp)!=NULL) {
  31.         if (!notnull(disk_buffer)) continue;
  32.         ptr = stpblk(disk_buffer);
  33.         if (*ptr=='/' && *(ptr+1)=='*') continue;
  34.         ptr = stptok(ptr,name,sizeof(name),DLM);
  35.         ptr = stptok(incptr(ptr),minbc,sizeof(minbc),DLM);
  36.         ptr = stptok(incptr(ptr),id,sizeof(id),DLM);
  37.         ptr = stptok(incptr(ptr),clasc,sizeof(clasc),DLM);
  38.         if (!*minbc || sscanf(minbc,"%d",&minbr)==0) minbr=strlen(name);
  39.         if (!*clasc || sscanf(clasc,"%d",&class)==0) class=0;
  40.         if ((new_elmt=(struct cmd_list *)getmem(sizeof(struct cmd_list)
  41.                 + strlen(name)))==NULL) 
  42.             return NULL;    /* NOTE: Memory may still be alloc'd */
  43.         new_elmt->next = start_list;
  44.         strcpy(new_elmt->name,uppercase(name));
  45.         new_elmt->abrl = minbr;
  46.         new_elmt->class = class;
  47.         new_elmt->cmd_id = id[0];
  48.         start_list = new_elmt;
  49.         }
  50.     fclose(fp);
  51.     }
  52. return(rvs_cmdl(start_list,NULL));   /* Convert LIFO back to FIFO order first */
  53. }
  54. #undef    DLM
  55.  
  56. #define        PI    3.1415926
  57. float randf()            /* Return float random num 0 < num < 1 */
  58. {
  59. int hh,mm,ss1,ms1,ss2,ms2;
  60. float retn;
  61. systime(&hh,&mm,&ss1,&ms1);
  62. for (hh=ss1*ms1;hh!=0;hh--);    /* Waste 'random' amount of time */
  63. systime(&hh,&mm,&ss2,&ms2);    /* Assume nice number of ms passed by now */
  64. retn = (PI*(float)ms1*(float)ss1)+(PI*(float)ms2*(float)ss2)
  65.     +((float)ms1+(float)ms2)/PI; /* Create 'wierd' number */
  66. retn = (float)(retn - (int)retn);        /* Truncate ? */
  67. return((float)retn);
  68. }
  69. #undef PI
  70.  
  71. int randint(topnum)
  72. int topnum;
  73. {
  74. return((int)((float)topnum*randf())+(float)1);
  75. }
  76.  
  77. do_fort(c,args,options)
  78. char c;
  79. char *args, *options;
  80. {
  81. int quiet, gap, maxtimes, i;
  82.  
  83. quiet = find_options(options,'q');
  84. if (!(maxtimes=stoi(args))) maxtimes = 1;
  85.  
  86. if (fort_une) {
  87.     for (i=0;i<maxtimes && !quit;i++) {
  88.         gap = randint(fort_gap);
  89.         fortune(gap);   /* Do fortune if requested */
  90.         }
  91.     }
  92. else if (!quiet) printf("Fortunes not active at this time\r\n");
  93. }
  94.  
  95. fortune(skips)
  96. int skips;
  97. {
  98. int i;
  99. if (fort_fp==NULL) return;    /* Nothing to do if fortune file not open */
  100. if (skips<0 || skips>1000) return;  /* Ignore crazy requests-stupid caller ! */
  101.  
  102. for (i=0;fort_fp!=NULL && i<skips;i++) {
  103.     do {                        /* Skip a fortune */
  104.         if (fgets(file_buff,STR_SIZE,fort_fp)==NULL) {
  105.             reset_fortf();
  106.             *file_buff = '\0';
  107.             }
  108.         } while(*ltrim(file_buff));
  109.     }
  110.  
  111. if (fort_fp==NULL) return;
  112.  
  113.             /* We have located the fortune we want: type it out */
  114. printf("\r\n");
  115. do {
  116.     if (fgets(file_buff,STR_SIZE,fort_fp)==NULL) {
  117.         reset_fortf();
  118.         *file_buff = '\0';
  119.         }
  120.     else mputs(file_buff);
  121.     } while(*ltrim(file_buff) && fort_fp!=NULL);
  122. }
  123.  
  124. any_last_news() 
  125. typeifexist(ipath,LASTNWS_MSG,FALSE);
  126. }
  127.  
  128. any_news(c,args,opts) 
  129. char c, *args, *opts;
  130. if (typeifexist(ipath,NEWS_MSG,TRUE)) printf("No news.\r\n"); 
  131. }
  132.  
  133. other_systems(c,args,opts)
  134. char c, *args, *opts;
  135. {
  136. if (typeifexist(ipath,BBS_LIST,TRUE)) printf("Sorry, no list active today\r\n");
  137. }
  138.  
  139. int typeifexist(path,filename,lng)
  140. char *path;
  141. char *filename;
  142. int lng;
  143. FILE *fp; 
  144. char buffer[DIRSIZE];
  145. if (*path) filename = prefix_dir(buffer,filename,path);
  146. if ((fp=fopen(filename,"r"))==NULL) return(TRUE);
  147. if (beginner && lng) ctlsctlk();
  148. fileterm(fp,"p");         /* Page mode active */
  149. fclose(fp);
  150. return(FALSE);
  151. }
  152.  
  153. goodbye(who)
  154. char *who;
  155. {
  156. sprintf(workstr,"%s SHUTDOWN: %s",SYSNAME,who);
  157. logevent(workstr);
  158. closelog();
  159. printf("Welcome to PC-DOS!\r\n");
  160. sysdir(cur_dir,cur_root);        /* Leave him where he was */
  161. if (!prton) printer(ON);
  162. brkset(ON);
  163. exit(0);
  164. }
  165.  
  166. reset_fortf()
  167. {
  168. char fortfile[DIRSIZE+LINESIZE];
  169. if (fort_fp!=NULL) fclose(fort_fp);
  170. prefix_dir(fortfile,FORTUNE_DAT,fpath);
  171. fort_fp = fopen(fortfile,"r");
  172. }
  173.  
  174. scan_events(c,args,opts)
  175. char c, *args, *opts;
  176. {
  177. FILE *evfp;
  178. int quiet;
  179. quiet = find_option(opts,'q');
  180. sysdir("",MAILBOX);
  181. closelog();
  182. if ((evfp=fopen(EVENT_LOG,"r"))==NULL) {
  183.     mputs("There is currently no event log.\r\n");
  184.     }
  185. else {
  186.     quit = FALSE;
  187.     if (!quiet && beginner) ctlsctlk();
  188.     cr();
  189.     while (!quit && (fgets(file_buff,termwidth,evfp)!=NULL)) 
  190.         mputs(file_buff);
  191.     fclose(evfp);
  192.     }
  193. openlog();
  194. }
  195.  
  196. read_userfile()
  197. {
  198. FILE *fp;
  199. char *bufptr;
  200.  
  201. init_vars();        /* Init/refresh/default system status vars */
  202.  
  203. userclass=
  204. totconnect=0;
  205. timeson=1;
  206.  
  207. dn_tab.before[0]=
  208. dn_tab.after[0]=
  209. userphone[0]=
  210. userreason[0]=
  211. syspw[0]=
  212. username[0]=    
  213. medit_opts[0]=        '\0';
  214.  
  215. termdef[0]=
  216. usersys[0]=
  217. fxfer[0]=
  218. userloc[0]=
  219. userspclty[0]=
  220. laston[0]=        '\0';    
  221.  
  222. nousrto=
  223. nousrfort=
  224. userread= 
  225. userwrite= 
  226. sysread= 
  227. syswrite=         FALSE;
  228.  
  229. not_terminal = TRUE;
  230. if (sysdir("",MAILBOX)) return(baddir(MAILBOX));
  231. strcpy(workstr,home_dir);
  232. strcat(workstr,USER_EXT);
  233. if ((fp=fopen(workstr,"r"))==NULL) return;      /* No user file:  Return  */
  234. while(fgets(file_buff,STR_SIZE,fp)!=NULL) {
  235.         del_crlf(file_buff);
  236.     bufptr = ltrim(file_buff);
  237.         if (bufptr[0]) process_userfile(file_buff);
  238.     }
  239. fclose(fp);
  240. init_tty(termdef);
  241. }
  242.  
  243. static process_userfile(buffer)
  244. char buffer[];
  245. {
  246. char token1[12];
  247. char token2[20];
  248. char token3[5];
  249. char token4[10];
  250. char *parseptr, *thirdptr, *fourptr, *fiveptr;
  251. int notfound;
  252. int mo,dy,yr;
  253.  
  254. parseptr = stpblk(stptok(stpblk(buffer),token1,12," \r"));
  255. thirdptr = stpblk(stptok(parseptr,token2,20," \r"));
  256. fourptr = stpblk(stptok(thirdptr,token3,5," \r"));
  257. fiveptr = stpblk(stptok(fourptr,token4,10," \r"));
  258. uppercase(token1), uppercase(token2);
  259. notfound = FALSE;
  260.  
  261. if (!strcmp(token1,"PWD:")) strcpy(syspw,token2);
  262. else if (!strcmp(token1,"ID:")) stccpy(user_id,token2,sizeof(user_id));
  263. else if (!strcmp(token1,"LASTON:")) strcpy(laston,token2);      
  264. else if (!strcmp(token1,"PHONE:")) strcpy(userphone,parseptr);
  265. else if (!strcmp(token1,"DUPLEX:")) duplex = stoi(token2);
  266. else if (!strcmp(token1,"SPECIALTY:")) strcpy(userspclty,parseptr);
  267. else if (!strcmp(token1,"MAXTIME:")) {
  268.     if (stoi(token2)) maxconnect = stoi(token2);
  269.     else if (sys_test | debug) printf("Bad MAXTIME arg in uf\r\n");
  270.     }
  271. else if (!strcmp(token1,"TERMDEF:")) strcpy(termdef,parseptr);
  272. else if (!strcmp(token1,"FXFER:")) strcpy(fxfer,parseptr);
  273. else if (!strcmp(token1,"REASON:")) strcpy(userreason,parseptr);
  274. else if (!strcmp(token1,"USERLOC:")) strcpy(userloc,parseptr);
  275. else if (!strcmp(token1,"TIMESON:")) timeson = stoi(token2)+1;
  276. else notfound = TRUE;
  277.  
  278. if (notfound==FALSE) ;
  279. else if (notfound=FALSE) ;
  280. else if (!strcmp(token1,"CLASS:")) userclass = stoi(token2);
  281. else if (!strcmp(token1,"BOARD:")) {
  282.         /* NOTE: We don't track last BBS sessions for PUBLIC accts */
  283.     extr_date(fiveptr,&mo,&dy,&yr);
  284.     if (!no_account) a_u_msg(token2,stoi(token3),stoi(token4),mo,dy,yr);
  285.     }
  286. else if (!strcmp(token1,"TOTCONNECT:")) totconnect=stol(token2);
  287. else if (!strcmp(token1,"SUSPENDED")) not_terminal = FALSE;
  288. else if (!strcmp(token1,"SYSREAD")) sysread = TRUE;
  289. else if (!strcmp(token1,"UCTRANS")) uctrans = TRUE;
  290. else if (!strcmp(token1,"SYSWRITE")) syswrite = TRUE;
  291. else if (!strcmp(token1,"USERREAD")) userread = TRUE;
  292. else if (!strcmp(token1,"USERWRITE")) userwrite = TRUE;
  293. else if (!strcmp(token1,"EXPERT")) beginner = FALSE;
  294. else notfound = TRUE;
  295.  
  296. if (notfound==FALSE) ;
  297. else if (!strcmp(token1,"NOVICE")) beginner = TRUE;
  298. else if (!strcmp(token1,"NOTIMEOUT")) nousrto = TRUE;
  299. else if (!strcmp(token1,"NOFORTUNE")) nousrfort = TRUE;
  300. else if (!strcmp(token1,"MEDIT:")) strcpy(medit_opts,parseptr);
  301. else if (!strcmp(token1,"USERSYS:")) strcpy(usersys,parseptr);
  302. else if (!strcmp(token1,"BEFORETEXT:")) bin_list(dn_tab.before,parseptr,sizeof(dn_tab.before));
  303. else if (!strcmp(token1,"AFTERTEXT:")) bin_list(dn_tab.after,parseptr,sizeof(dn_tab.after));
  304. else if (!strcmp(token1,"NAME:")) strcpy(username,parseptr);
  305. else if (sys_test) printf("Invalid item in USERINFO file: '%s'.\r\n",file_buff);
  306. }
  307.  
  308. write_userfile()
  309. {
  310. FILE *fp;
  311. struct lmsg *lmsg_ptr, *lmsg_next;
  312. char buf[32];
  313.  
  314. if (sysdir("",MAILBOX)) return(baddir(MAILBOX));
  315. strcpy(workstr,home_dir);
  316. strcat(workstr,USER_EXT);
  317. if ((fp=fopen(workstr,"w"))==NULL) {
  318.     printf("Can't update userfile !?\r\n");
  319.     return;      /* Oops!:  Return  */
  320.     }
  321. if (syspw[0]) writeln2(fp,"PWD: ",syspw);
  322. if (timeson) {
  323.         sprintf(workstr,"%d",timeson);
  324.         writeln2(fp,"TIMESON: ",workstr);
  325.         }
  326. if (beginner) writeln2(fp,"NOVICE"," ");
  327. else writeln2(fp,"EXPERT"," ");
  328. if (username[0]) writeln2(fp,"NAME: ",username);
  329. writeln2(fp,"LASTON: ",date());
  330. if (userloc[0]) writeln2(fp,"USERLOC: ",userloc);
  331. if (userreason[0]) writeln2(fp,"REASON: ",userreason);
  332. if (userphone[0]) writeln2(fp,"PHONE: ",userphone);
  333. if (maxconnect != defmaxconnect) writeln2(fp,"MAXTIME: ",itos(maxconnect));
  334. if (userspclty[0]) writeln2(fp,"SPECIALTY: ",userspclty);
  335. if (medit_opts[0]) writeln2(fp,"MEDIT: ",medit_opts);
  336. if (fxfer[0]) writeln2(fp,"FXFER: ",fxfer);
  337. if (termdef[0]) writeln2(fp,"TERMDEF: ",termdef);
  338. if (usersys[0]) writeln2(fp,"USERSYS: ",usersys);
  339. sprintf(workstr,"%ld",totconnect+cnct_seconds());
  340. writeln2(fp,"TOTCONNECT: ",workstr);
  341. sprintf(workstr,"%d",duplex);
  342. if (duplex!=defduplex) writeln2(fp,"DUPLEX: ",workstr);
  343. if (dn_tab.before[0]!='\0') {
  344.     dec_list(workstr,dn_tab.before,sizeof(workstr));
  345.     writeln2(fp,"BEFORETEXT: ",workstr);
  346.     }
  347. if (dn_tab.after[0]!='\0') {
  348.     dec_list(workstr,dn_tab.after,sizeof(workstr));
  349.     writeln2(fp,"AFTERTEXT: ",workstr);
  350.     }
  351. if (uctrans) writeln2(fp,"UCTRANS","");
  352. if (userclass>0) writeln2(fp,"CLASS: ",itos(userclass));
  353. if (sysread) writeln2(fp,"SYSREAD","");
  354. if (syswrite) writeln2(fp,"SYSWRITE","");
  355. if (userread) writeln2(fp,"USERREAD","");
  356. if (userwrite) writeln2(fp,"USERWRITE","");
  357. if (nousrto) writeln2(fp,"NOTIMEOUT","");
  358. if (nousrfort) writeln2(fp,"NOFORTUNE","");
  359. if (!not_terminal) writeln2(fp,"SUSPENDED AND WAITING CANCELLATION OR"," REVALIDATION");
  360. for (lmsg_ptr=lmsg_start;lmsg_ptr!=NULL;lmsg_ptr=lmsg_next) {
  361.         sprintf(buf,"%s %d %d %02d/%02d/%02d",lmsg_ptr->boardname,lmsg_ptr->lmb,
  362.         lmsg_ptr->lmr,lmsg_ptr->mo,lmsg_ptr->dy,lmsg_ptr->yr);
  363.         writeln2(fp,"BOARD: ",buf);
  364.         lmsg_next = lmsg_ptr->next_lmsg;
  365.         if (rlsmem(lmsg_ptr,sizeof(*lmsg_ptr))) printf("RLSMEM bd err!\r\n");
  366.         }
  367. lmsg_start = NULL;              /* No more LAST_MSG list */
  368. fclose(fp);
  369. }
  370.  
  371. /* 
  372.     init_tty: initialize global system tty-related variables from
  373.             'termdef' record formatted in tokens as follows:
  374.  
  375.     <termdescriptor> <Direct | Standard> <utlength> <utwidth> <clseq>
  376.     
  377. */
  378. static init_tty(termdef)
  379. char *termdef;
  380. {
  381. char buf[LINESIZE];
  382.  
  383. termdef = skptok(termdef);            /* Terminal descriptor */
  384. termdef = stpblk(stptok(termdef,buf,LINESIZE," "));    /* Get display mode token */
  385. if (*buf) tflag = (toupper(*buf)=='D');        /* True for DIRECT output. */
  386. termdef = stpblk(stptok(termdef,buf,LINESIZE," "));    /* Pick up UTLENGTH */
  387. if (stoi(buf)) utlength = stoi(buf);
  388. termdef = stpblk(stptok(termdef,buf,LINESIZE," "));    /* Pick up UTWIDTH */
  389. if (stoi(buf)) utwidth = stoi(buf);
  390. termdef = stpblk(stptok(termdef,buf,LINESIZE," "));    /* And CLS sequence */
  391. bin_list(utcls,buf,sizeof(utcls));        /* Assign CLS sequence */
  392. }
  393.  
  394.  
  395. who_is(c,args,opts)
  396. char c, *args, *opts;
  397. {
  398. int lidx, quiet;
  399.  
  400. quiet = find_option(opts,'q');
  401. sysdir("",user_root);
  402. if (beginner && !quiet) disp_msg(7);
  403. if (!*args) disp_reply("Enter '*' for all users, or userid: ",workstr,9);
  404. else stptok(args,workstr,9," ");
  405. if (workstr[0]=='\0') return(nothing_done());
  406. if (setup_dir(workstr,DIR_TYP)) {
  407.     printf("Couldn't find any users!?\r\n");
  408.     return;
  409.     }
  410. create_list();
  411. cr();
  412. if (!quiet && beginner) ctlsctlk();
  413. for (lidx=0;lidx<list_idx && !quit;lidx++) {
  414.     if (strcmp("..",list[lidx]->filedata.filename_ext) && 
  415.          strcmp(".",list[lidx]->filedata.filename_ext)) {
  416.         printf("Userid:        %s\r\nAccount since: %s\r\n",
  417.             list[lidx]->filedata.filename_ext,
  418.             filedate(list[lidx]->filedata.file_date));
  419.         pruser_stats(list[lidx]->filedata.filename_ext);
  420.         }
  421.     }
  422. drop_list();
  423. }
  424.  
  425. static pruser_stats(username)
  426. char username[];
  427. {
  428. FILE *fp;
  429. char userfile[17];
  430. char *bufptr;
  431.  
  432. if (!sysdir("",MAILBOX)) {
  433.     strcpy(userfile,username);
  434.     strcat(userfile,USER_EXT);
  435.     if ((fp=fopen(userfile,"r"))!=NULL) {
  436.         while(fgets(file_buff,STR_SIZE,fp)!=NULL && !quit) {
  437.                 del_crlf(file_buff);
  438.             bufptr = ltrim(file_buff);
  439.                 if (bufptr[0]) show_userfile(file_buff,username);
  440.             }
  441.         fclose(fp);
  442.         }
  443.     }    
  444.  
  445. if (sysdir(username,user_root)) return(baddir(username));
  446. strcpy(userfile,home_dir);
  447. strcat(userfile,MAIL_EXT);
  448. if ((fp=fopen(INFO_USR,"r"))!=NULL) {
  449.     cr();
  450.     while(fgets(file_buff,termwidth,fp)!=NULL && !quit) mputs(file_buff);
  451.     fclose(fp);    
  452.     }
  453. cr();
  454. }
  455.  
  456. static show_userfile(buff,who)
  457. char buff[];
  458. char who[];
  459. {
  460. char token1[15], *parseptr;
  461. int owner;
  462.  
  463.     /* We show almost all stuff to current user, or SYSREAD user */
  464. owner = !strcmp(home_dir,who) || sysread;
  465. del_crlf(parseptr=stpblk(stptok(stpblk(buff),token1,sizeof(token1)," \r\n")));
  466. uppercase(token1);
  467. if (!strcmp(token1,"NAME:")) printf("Name:          %s\r\n",parseptr);
  468. else if (!strcmp(token1,"LASTON:")) printf("Last logon:    %s\r\n",parseptr);
  469. else if (!strcmp(token1,"PHONE:")) {
  470.     if (owner||*parseptr!='*') {
  471.         printf("Telephone:     %s",parseptr);
  472.         if (*parseptr=='*') printf("  ('*'=private number)");
  473.         printf("\r\n");
  474.         }
  475.     }
  476. else if (!strcmp(token1,"USERLOC:"))  printf("Location:      %s\r\n",parseptr);
  477. else if (!strcmp(token1,"SPECIALTY:")) printf("Specialty:     %s\r\n",parseptr);
  478. else if (!strcmp(token1,"USERSYS:")) printf("System type:   %s\r\n",parseptr);
  479. else if (!strcmp(token1,"FXFER:"))   printf("File xfers:    %s\r\n",parseptr);
  480. else if (!strcmp(token1,"TIMESON:")) printf("Times on:      %s\r\n",parseptr);
  481. else if (!strcmp(token1,"MEDIT:")) {
  482.     if (owner) printf("Medit options: %s\r\n",parseptr);
  483.     }
  484. else if (!strcmp(token1,"TERMDEF:")) {
  485.     if (owner) printf("T-settings:    %s\r\n",parseptr);
  486.     }
  487. else if (!strcmp(token1,"MAXTIME:")) {
  488.     if (sysread) printf("Maximum stay:  %d minutes\r\n",stoi(parseptr));
  489.     }
  490. }
  491.  
  492. message()
  493. {
  494. int msgf;
  495.  
  496. if (!(msgf=open(SYSTEM_MSG,FREAD))) {
  497.     printf("Sysmail pending: %s\r\n",SYSTEM_MSG);
  498.     if (beginner) printf("Please ERASE file after reading.\r\n");
  499.     close(msgf);
  500.     }
  501. }
  502.  
  503. char *good_morning()
  504. {
  505. int hh,mm,ss,ms;
  506.  
  507. systime(&hh,&mm,&ss,&ms);
  508. if (hh<NOON) return("Good morning");
  509. else if (hh<DUSK) return("Good afternoon");
  510. else return("Good evening");
  511. }
  512.  
  513. systat(c,args,opts)
  514. char c, *args, *opts;
  515. {
  516. long getfree(), gettots();
  517.  
  518. printf("System name:   %s ver %s\r\n",SYSNAME,SYSVER);
  519. printf("Running under: %s ver %d.%d\r\n",DOSNAME,_dos[0],_dos[1]);
  520. printf("System time:   %s\r\n",timedate());
  521. printf("Disk space:    %ld/%ld = %3.0f%% free\r\n",
  522.     getfree(0), gettots(0),
  523.     100.0 * (float)getfree(0)/(float)gettots(0)+(float)0.05);
  524. }
  525.  
  526. /*
  527.  This version of MINIT uses the INT14H calls, assuming that an acceptable
  528.  method for initializing the BAUD rate is provided by such interrupt.
  529.  
  530.  As of 08/22/84, CRCPC assumed to run in conjunction with the latest
  531.  NEW14H/HOST communication/keyboard link, by CRC.
  532. */
  533.  
  534. minit(baud,parity,wordlen,stopbits,opts)
  535. char *baud, *parity, *wordlen, *stopbits;
  536. char *opts;
  537. {
  538. int hayes;
  539. char m16PARMS, set_baud(), set_parity(), set_length(), set_stop();
  540.  
  541. hayes = find_option(opts,'h');
  542.  
  543. m16PARMS = set_baud(baud) | 
  544.       set_parity(parity) | 
  545.       set_length(wordlen) |
  546.       set_stop(stopbits) ; 
  547.  
  548. int14h(port_used,INIT_COM,m16PARMS);    /* Setup modem */
  549.  
  550. /* I REALLY DON'T KNOW IF THIS mcode MAKES ANY SENSE ... */
  551. /* BUT THE 1200B STILL FUCKS UP WHEN BAUD RATES CHANGED ON IT */
  552. if (hayes && !rdsr()) {
  553.     wait_sec(1);
  554.     prmodm("+++");
  555.     wait_sec(1);
  556.     prmodm("ATO\r");    /* Tell Hayes about our baud rate change ?! */
  557.     }
  558. }
  559.  
  560. static char set_baud(mcode)
  561. char *mcode;
  562. {
  563. char olcr;
  564.  
  565. olcr = *mcode;
  566. if (olcr=='3') return(B6);        /* 300 baud */
  567. if (olcr=='6') return(B6|B5);        /* 600      */
  568. if (olcr=='1') return(B7);          /* 1200        */
  569. if (olcr=='2') return(B7|B5);        /* 2400        */
  570. if (olcr=='4') return(B7|B6);        /* 4800        */
  571. if (olcr=='9') return(B7|B6|B5);    /* 9600     */
  572. printf("%s?",mcode);
  573. return(0);
  574. }
  575.  
  576. static char set_parity(mcode)
  577. char *mcode;
  578. {
  579. char olcr;
  580.  
  581. olcr = *mcode;
  582. if (olcr=='E') return(B3|B4);
  583. if (olcr=='O') return(B3);
  584. if (olcr=='N') return(0);
  585. printf("%s?",mcode);
  586. return(0);
  587. }
  588.  
  589. static char set_length(mcode)
  590. char *mcode;
  591. {
  592. char olcr;
  593.  
  594. olcr = *mcode;
  595. if (olcr=='7') return(B1);
  596. if (olcr=='8') return(B0|B1);
  597. printf("%s?",mcode);
  598. return(0);
  599. }
  600.  
  601. static char set_stop(mcode)
  602. char *mcode;
  603. {
  604. char olcr;
  605.  
  606. olcr = *mcode;
  607. if (olcr=='2') return(B2);
  608. if (olcr=='1') return(0);
  609. printf("%s?",mcode);
  610. return(0);
  611. }
  612. 
  613.