|
|
1.1 root 1: #line 1 "CON_MID.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6:
7: extern char *wday[]; /* 3 char days of week */
8:
9: /****************************************************************************/
10: /* Waits for remote or local user to hit a key. Inactivity timer is checked */
11: /* and hangs up if inactive for 4 minutes. Returns key hit, or uppercase of */
12: /* key hit if mode&K_UPPER or key out of KEY BUFFER. Does not print key. */
13: /* Called from functions all over the place. */
14: /****************************************************************************/
15: char getkey(long mode)
16: {
17: char ch,coldkey,c=0,spin=random(5);
18:
19: if(!online)
20: return(0);
21: sys_status&=~SS_ABORT;
22: if((sys_status&SS_USERON || action==NODE_DFLT) && !(mode&K_GETSTR))
23: mode|=(useron.misc&SPIN);
24: lncntr=0;
25: timeout=time(NULL);
26: if(mode&K_SPIN)
27: outchar(' ');
28: do {
29: checkline(); /* check to make sure remote user is still online */
30: if(online==ON_REMOTE && console&CON_R_INPUT && rioctl(IOSTATE)&ABORT) {
31: rioctl(IOCS|ABORT);
32: sys_status|=SS_ABORT;
33: if(mode&K_SPIN) /* back space once if on spinning cursor */
34: bputs("\b \b");
35: return(0); }
36: if(sys_status&SS_SYSPAGE)
37: beep(random(800),100);
38: if(mode&K_SPIN)
39: switch(spin) {
40: case 0:
41: switch(c++) {
42: case 0:
43: outchar(BS);
44: outchar('�');
45: break;
46: case 10:
47: outchar(BS);
48: outchar('/');
49: break;
50: case 20:
51: outchar(BS);
52: outchar('�');
53: break;
54: case 30:
55: outchar(BS);
56: outchar('\\');
57: break;
58: case 40:
59: c=0;
60: break;
61: default:
62: if(!inDV && !(node_misc&NM_WINOS2))
63: mswait(DELAY_SPIN);
64: break; }
65: break;
66: case 1:
67: switch(c++) {
68: case 0:
69: outchar(BS);
70: outchar('�');
71: break;
72: case 10:
73: outchar(BS);
74: outchar('�');
75: break;
76: case 20:
77: outchar(BS);
78: outchar('�');
79: break;
80: case 30:
81: outchar(BS);
82: outchar('�');
83: break;
84: case 40:
85: outchar(BS);
86: outchar('�');
87: break;
88: case 50:
89: outchar(BS);
90: outchar('�');
91: break;
92: case 60:
93: c=0;
94: break;
95: default:
96: if(!inDV && !(node_misc&NM_WINOS2))
97: mswait(DELAY_SPIN);
98: break; }
99: break;
100: case 2:
101: switch(c++) {
102: case 0:
103: outchar(BS);
104: outchar('-');
105: break;
106: case 10:
107: outchar(BS);
108: outchar('=');
109: break;
110: case 20:
111: outchar(BS);
112: outchar('�');
113: break;
114: case 30:
115: outchar(BS);
116: outchar('=');
117: break;
118: case 40:
119: c=0;
120: break;
121: default:
122: if(!inDV && !(node_misc&NM_WINOS2))
123: mswait(DELAY_SPIN);
124: break; }
125: break;
126: case 3:
127: switch(c++) {
128: case 0:
129: outchar(BS);
130: outchar('�');
131: break;
132: case 10:
133: outchar(BS);
134: outchar('�');
135: break;
136: case 20:
137: outchar(BS);
138: outchar('�');
139: break;
140: case 30:
141: outchar(BS);
142: outchar('�');
143: break;
144: case 40:
145: c=0;
146: break;
147: default:
148: if(!inDV && !(node_misc&NM_WINOS2))
149: mswait(DELAY_SPIN);
150: break; }
151: break;
152: case 4:
153: switch(c++) {
154: case 0:
155: outchar(BS);
156: outchar('�');
157: break;
158: case 10:
159: outchar(BS);
160: outchar('�');
161: break;
162: case 20:
163: outchar(BS);
164: outchar('�');
165: break;
166: case 30:
167: outchar(BS);
168: outchar('�');
169: break;
170: case 40:
171: c=0;
172: break;
173: default:
174: if(!inDV && !(node_misc&NM_WINOS2))
175: mswait(DELAY_SPIN);
176: break; }
177: break; }
178: if(keybuftop!=keybufbot) {
179: ch=keybuf[keybufbot++];
180: if(keybufbot==KEY_BUFSIZE)
181: keybufbot=0; }
182: else
183: ch=inkey(mode);
184: if(sys_status&SS_ABORT)
185: return(0);
186: now=time(NULL);
187: if(ch) {
188: if(mode&K_NUMBER && isprint(ch) && !isdigit(ch))
189: continue;
190: if(mode&K_ALPHA && isprint(ch) && !isalpha(ch))
191: continue;
192: if(mode&K_NOEXASC && ch&0x80)
193: continue;
194: if(mode&K_SPIN)
195: bputs("\b \b");
196: if(mode&K_COLD && ch>SP && useron.misc&COLDKEYS) {
197: if(mode&K_UPPER)
198: outchar(toupper(ch));
199: else
200: outchar(ch);
201: while((coldkey=inkey(mode))==0 && online && !(sys_status&SS_ABORT))
202: checkline();
203: bputs("\b \b");
204: if(coldkey==BS)
205: continue;
206: if(coldkey>SP)
207: ungetkey(coldkey); }
208: if(mode&K_UPPER)
209: return(toupper(ch));
210: return(ch); }
211: if(sys_status&SS_USERON && !(sys_status&SS_LCHAT)) gettimeleft();
212: else if(online &&
213: ((node_dollars_per_call && now-answertime>SEC_BILLING)
214: || (now-answertime>SEC_LOGON && !(sys_status&SS_LCHAT)))) {
215: console&=~(CON_R_ECHOX|CON_L_ECHOX);
216: console|=(CON_R_ECHO|CON_L_ECHO);
217: bputs(text[TakenTooLongToLogon]);
218: hangup(); }
219: if(sys_status&SS_USERON && online && (timeleft/60)<(5-timeleft_warn)
220: && !SYSOP && !(sys_status&SS_LCHAT)) {
221: timeleft_warn=5-(timeleft/60);
222: SAVELINE;
223: attr(LIGHTGRAY);
224: bprintf(text[OnlyXminutesLeft]
225: ,((ushort)timeleft/60)+1,(timeleft/60) ? "s" : nulstr);
226: RESTORELINE; }
227:
228: if(online==ON_LOCAL && node_misc&NM_NO_INACT)
229: timeout=now;
230: if(now-timeout>=sec_warn) { /* warning */
231: if(sys_status&SS_USERON) {
232: SAVELINE;
233: bputs(text[AreYouThere]); }
234: else
235: bputs("\7\7");
236: while(!inkey(0) && online && now-timeout>=sec_warn) {
237: now=time(NULL);
238: if(now-timeout>=sec_hangup) {
239: if(online==ON_REMOTE) {
240: console|=CON_R_ECHO;
241: console&=~CON_R_ECHOX; }
242: bputs(text[CallBackWhenYoureThere]);
243: logline(nulstr,"Inactive");
244: hangup();
245: return(0); }
246: mswait(100); }
247: if(sys_status&SS_USERON) {
248: bputs("\r\1n\1>");
249: RESTORELINE; }
250: timeout=now; }
251:
252: } while(online);
253: return(0);
254: }
255:
256: /****************************************************************************/
257: /* This function lists users that are online. */
258: /* If listself is true, it will list the current node. */
259: /* Returns number of active nodes (not including current node). */
260: /****************************************************************************/
261: int whos_online(char listself)
262: {
263: int i,j;
264: node_t node;
265:
266: CRLF;
267: bputs(text[NodeLstHdr]);
268: for(j=0,i=1;i<=sys_nodes && i<=sys_lastnode;i++) {
269: getnodedat(i,&node,0);
270: if(i==node_num) {
271: if(listself)
272: printnodedat(i,node);
273: continue; }
274: if(node.status==NODE_INUSE || (SYSOP && node.status==NODE_QUIET)) {
275: printnodedat(i,node);
276: if(!lastnodemsg)
277: lastnodemsg=i;
278: j++; } }
279: if(!j)
280: bputs(text[NoOtherActiveNodes]);
281: return(j);
282: }
283:
284: /****************************************************************************/
285: /* Displays the information for node number 'number' contained in 'node' */
286: /****************************************************************************/
287: void printnodedat(uint number, node_t node)
288: {
289: uint i;
290: char hour,mer[3];
291:
292: attr(color[clr_nodenum]);
293: bprintf("%3d ",number);
294: attr(color[clr_nodestatus]);
295: switch(node.status) {
296: case NODE_WFC:
297: bputs("Waiting for call");
298: break;
299: case NODE_OFFLINE:
300: bputs("Offline");
301: break;
302: case NODE_NETTING:
303: bputs("Networking");
304: break;
305: case NODE_LOGON:
306: bputs("At logon prompt");
307: break;
308: case NODE_EVENT_WAITING:
309: bputs("Waiting for all nodes to become inactive");
310: break;
311: case NODE_EVENT_LIMBO:
312: bprintf("Waiting for node %d to finish external event",node.aux);
313: break;
314: case NODE_EVENT_RUNNING:
315: bputs("Running external event");
316: break;
317: case NODE_NEWUSER:
318: attr(color[clr_nodeuser]);
319: bputs("New user");
320: attr(color[clr_nodestatus]);
321: bputs(" applying for access ");
322: if(!node.connection)
323: bputs("Locally");
324: else
325: bprintf("at %ubps",node.connection);
326: break;
327: case NODE_QUIET:
328: if(!SYSOP) {
329: bputs("Waiting for call");
330: break; }
331: case NODE_INUSE:
332: if(node.misc&NODE_EXT) {
333: getnodeext(number,tmp);
334: bputs(tmp);
335: break; }
336: attr(color[clr_nodeuser]);
337: if(node.misc&NODE_ANON && !SYSOP)
338: bputs("UNKNOWN USER");
339: else
340: bputs(username(node.useron,tmp));
341: attr(color[clr_nodestatus]);
342: bputs(" ");
343: switch(node.action) {
344: case NODE_MAIN:
345: bputs("at main menu");
346: break;
347: case NODE_RMSG:
348: bputs("reading messages");
349: break;
350: case NODE_RMAL:
351: bputs("reading mail");
352: break;
353: case NODE_RSML:
354: bputs("reading sent mail");
355: break;
356: case NODE_RTXT:
357: bputs("reading text files");
358: break;
359: case NODE_PMSG:
360: bputs("posting message");
361: break;
362: case NODE_SMAL:
363: bputs("sending mail");
364: break;
365: case NODE_AMSG:
366: bputs("posting auto-message");
367: break;
368: case NODE_XTRN:
369: if(!node.aux)
370: bputs("at external program menu");
371: else {
372: bputs("running ");
373: i=node.aux-1;
374: if(SYSOP || chk_ar(xtrn[i]->ar,useron))
375: bputs(xtrn[node.aux-1]->name);
376: else
377: bputs("external program"); }
378: break;
379: case NODE_DFLT:
380: bputs("changing defaults");
381: break;
382: case NODE_XFER:
383: bputs("at transfer menu");
384: break;
385: case NODE_RFSD:
386: bprintf("retrieving from device #%d",node.aux);
387: break;
388: case NODE_DLNG:
389: bprintf("downloading");
390: break;
391: case NODE_ULNG:
392: bputs("uploading");
393: break;
394: case NODE_BXFR:
395: bputs("transferring bidirectional");
396: break;
397: case NODE_LFIL:
398: bputs("listing files");
399: break;
400: case NODE_LOGN:
401: bputs("logging on");
402: break;
403: case NODE_LCHT:
404: bprintf("in local chat with %s",sys_op);
405: break;
406: case NODE_MCHT:
407: if(node.aux) {
408: bprintf("in multinode chat channel %d",node.aux&0xff);
409: if(node.aux&0x1f00) { /* password */
410: outchar('*');
411: if(SYSOP)
412: bprintf(" %s",unpackchatpass(tmp,node)); } }
413: else
414: bputs("in multinode global chat channel");
415: break;
416: case NODE_PAGE:
417: bprintf("paging node %u for private chat",node.aux);
418: break;
419: case NODE_PCHT:
420: bprintf("in private chat with node %u",node.aux);
421: break;
422: case NODE_GCHT:
423: i=node.aux;
424: if(i>=total_gurus)
425: i=0;
426: bprintf("chatting with %s",guru[i]->name);
427: break;
428: case NODE_CHAT:
429: bputs("in chat section");
430: break;
431: case NODE_TQWK:
432: bputs("transferring QWK packet");
433: break;
434: case NODE_SYSP:
435: bputs("performing sysop activities");
436: break;
437: default:
438: bputs(itoa(node.action,tmp,10));
439: break; }
440: if(!node.connection)
441: bputs(" locally");
442: else
443: bprintf(" at %ubps",node.connection);
444: if(node.action==NODE_DLNG) {
445: if(sys_misc&SM_MILITARY) {
446: hour=node.aux/60;
447: mer[0]=0; }
448: else if((node.aux/60)>=12) {
449: if(node.aux/60==12)
450: hour=12;
451: else
452: hour=(node.aux/60)-12;
453: strcpy(mer,"pm"); }
454: else {
455: if((node.aux/60)==0) /* 12 midnite */
456: hour=12;
457: else hour=node.aux/60;
458: strcpy(mer,"am"); }
459: bprintf(" ETA %02d:%02d %s"
460: ,hour,node.aux%60,mer); }
461: break; }
462: i=NODE_LOCK;
463: if(node.status==NODE_INUSE || SYSOP)
464: i|=NODE_POFF|NODE_AOFF|NODE_MSGW|NODE_NMSG;
465: if(node.misc&i) {
466: bputs(" (");
467: if(node.misc&(i&NODE_AOFF))
468: outchar('A');
469: if(node.misc&NODE_LOCK)
470: outchar('L');
471: if(node.misc&(i&(NODE_MSGW|NODE_NMSG)))
472: outchar('M');
473: if(node.misc&(i&NODE_POFF))
474: outchar('P');
475: outchar(')'); }
476: if(SYSOP && ((node.misc
477: &(NODE_ANON|NODE_UDAT|NODE_INTR|NODE_RRUN|NODE_EVENT|NODE_DOWN))
478: || node.status==NODE_QUIET)) {
479: bputs(" [");
480: if(node.misc&NODE_ANON)
481: outchar('A');
482: if(node.misc&NODE_INTR)
483: outchar('I');
484: if(node.misc&NODE_RRUN)
485: outchar('R');
486: if(node.misc&NODE_UDAT)
487: outchar('U');
488: if(node.status==NODE_QUIET)
489: outchar('Q');
490: if(node.misc&NODE_EVENT)
491: outchar('E');
492: if(node.misc&NODE_DOWN)
493: outchar('D');
494: outchar(']'); }
495: if(node.errors && SYSOP) {
496: attr(color[clr_err]);
497: bprintf(" %d error%c",node.errors, node.errors>1 ? 's' : '\0' ); }
498: attr(LIGHTGRAY);
499: CRLF;
500: }
501:
502: /****************************************************************************/
503: /* Prints/updates the local status line (line #25) with the user/system */
504: /* information. Which info depends on value of statline. */
505: /* Called from several functions */
506: /****************************************************************************/
507: void statusline()
508: {
509: int row,col,atr;
510: char tmp1[128],tmp2[256],tmp3[256],age;
511:
512: #ifndef __OS2__
513: if(lclaes())
514: return;
515: #endif
516: col=lclwx();
517: row=lclwy();
518: STATUSLINE;
519: lclxy(1,node_scrnlen);
520: age=getage(useron.birth);
521: if(sys_status&(SS_CAP|SS_TMPSYSOP)) {
522: atr=lclatr((LIGHTGRAY<<4)|BLINK);
523: sys_status&SS_CAP ? lputc('C') : lputc(SP);
524: sys_status&SS_TMPSYSOP ? lputc('*') : lputc(SP);
525: lclatr(LIGHTGRAY<<4); }
526: else {
527: atr=lclatr(LIGHTGRAY<<4);
528: lputs(" "); }
529: switch(statline) {
530: case -1:
531: lputs("Terminal: Alt-X Exit Alt-D DOS Alt-H Hangup "
532: "Alt-L Logon Alt-U User Edit");
533: break;
534: case 0: /* Alias ML Password Modem Birthday Age Sex Phone */
535: lprintf("%-24.24s %02d %-8.8s %-8.8s %-8.8s %02d %c %s"
536: ,useron.alias,useron.level,sys_misc&SM_ECHO_PW ? useron.pass:"XXXX"
537: ,useron.modem,useron.birth,age,useron.sex,useron.phone);
538: break;
539: case 1: /* Alias ML RealName Alt-Z for Help */
540: lprintf("%-24.24s %02d %-25.25s "
541: ,useron.alias,useron.level,useron.name);
542: lputs("Alt-Z for Help");
543: break;
544: case 2: /* Alias ML RealName Age Sex Phone */
545: lprintf("%-24.24s %02d %-25.25s %02d %c %s"
546: ,useron.alias,useron.level,useron.name,age,useron.sex,useron.phone);
547: break;
548: case 3: /* Alias ML Location Phone */
549: lprintf("%-24.24s %02d %-30.30s %s"
550: ,useron.alias,useron.level,useron.location,useron.phone);
551: break;
552: case 4: /* Alias ML Note Phone */
553: lprintf("%-24.24s %02d %-30.30s %s"
554: ,useron.alias,useron.level,useron.note,useron.phone);
555: break;
556: case 5: /* Alias ML MF Age Sex Phone */
557: lprintf("%-24.24s %02d %-26.26s %02d %c %s"
558: ,useron.alias,useron.level,ltoaf(useron.flags1,tmp1)
559: ,age,useron.sex,useron.phone);
560: break;
561: case 6: /* Alias ML MF Expiration */
562: lprintf("%-24.24s %02d %-26.26s Exp: %s"
563: ,useron.alias,useron.level,ltoaf(useron.flags1,tmp1)
564: ,unixtodstr(useron.expire,tmp2));
565: break;
566: case 7: /* Alias ML Firston Laston Expire */
567: lprintf("%-24.24s %02d First: %s Last: %s Exp: %s"
568: ,useron.alias,useron.level,unixtodstr(useron.firston,tmp1)
569: ,unixtodstr(useron.laston,tmp2),unixtodstr(useron.expire,tmp3));
570: break;
571: case 8: /* Alias Credits Minutes Expire */
572: lprintf("%-24.24s Cdt: %-13.13s Min: %-10luExp: %s"
573: ,useron.alias,ultoac(useron.cdt,tmp1),useron.min
574: ,unixtodstr(useron.expire,tmp2));
575: break;
576: case 9: /* Exemptions Restrictions */
577: lprintf(" Exempt:%-26.26s Restrict:%s"
578: ,ltoaf(useron.exempt,tmp1),ltoaf(useron.rest,tmp2));
579: break;
580: case 10: /* Computer Modem Handle*/
581: lprintf("Comp: %-30.30s Modem: %-8.8s Handle: %s"
582: ,useron.comp,connection,useron.handle);
583: break;
584: case 11: /* StreetAddress Location Zip */
585: lprintf("%-30.30s %-30.30s %s"
586: ,useron.address,useron.location,useron.zipcode);
587: break;
588: case 12: /* UploadBytes Uploads DownloadBytes Downloads Leeches */
589: lprintf("Uloads: %-13.13s / %-5u Dloads: %-13.13s / %-5u Leech: %u"
590: ,ultoac(useron.ulb,tmp1),useron.uls
591: ,ultoac(useron.dlb,tmp2),useron.dls,useron.leech);
592: break;
593: case 13: /* Posts Emails Fbacks Waiting Logons Timeon */
594: lprintf("P: %-5u E: %-5u F: %-5u W: %-5u L: %-5u T: %-5u"
595: ,useron.posts,useron.emails,useron.fbacks,getmail(useron.number,0)
596: ,useron.logons,useron.timeon);
597: break;
598: case 14: /* NetMail forwarding address */
599: lprintf("NetMail: %s",useron.netmail);
600: break;
601: case 15: /* Comment */
602: lprintf("Comment: %s",useron.comment);
603: break;
604: }
605: lputc(CLREOL);
606: lclxy(75,lclwy());
607: getnodedat(node_num,&thisnode,0);
608: if(sys_status&SS_SYSALERT
609: || thisnode.misc&(NODE_RRUN|NODE_DOWN|NODE_LOCK|NODE_EVENT)) {
610: lclatr((LIGHTGRAY<<4)|BLINK);
611: sys_status&SS_SYSALERT ? lputc('A'):lputc(SP);
612: thisnode.misc&NODE_RRUN ? lputc('R'):lputc(SP);
613: thisnode.misc&NODE_DOWN ? lputc('D'):lputc(SP);
614: thisnode.misc&NODE_LOCK ? lputc('L'):lputc(SP);
615: thisnode.misc&NODE_EVENT ? lputc('E'):lputc(SP); }
616: TEXTWINDOW;
617: lclxy(col,row);
618: lclatr(atr);
619: }
620:
621: /****************************************************************************/
622: /* Prints PAUSE message and waits for a key stoke */
623: /****************************************************************************/
624: void pause()
625: {
626: uchar tempattrs=curatr; /* was lclatr(-1) */
627: int i,j;
628: long l=K_UPPER;
629:
630: RIOSYNC(0);
631: if(sys_status&SS_ABORT)
632: return;
633: lncntr=0;
634: if(online==ON_REMOTE)
635: rioctl(IOFI);
636: bputs(text[Pause]);
637: j=bstrlen(text[Pause]);
638: if(sys_status&SS_USERON && !(useron.misc&NO_EXASCII) && !(useron.misc&WIP))
639: l|=K_SPIN;
640: if(getkey(l)==text[YN][1])
641: sys_status|=SS_ABORT;
642: if(text[Pause][0]!='@')
643: for(i=0;i<j;i++)
644: bputs("\b \b");
645: getnodedat(node_num,&thisnode,0);
646: nodesync();
647: attr(tempattrs);
648: }
649:
650: void getlines()
651: {
652: if(useron.misc&ANSI && !useron.rows /* Auto-detect rows */
653: && online==ON_REMOTE) { /* Remote */
654: SYNC;
655: putcom("\x1b[s\x1b[99B\x1b[6n\x1b[u");
656: while(online && !rioctl(RXBC) && !lkbrd(1))
657: checkline();
658: inkey(0); }
659:
660: }
661:
662:
663: /****************************************************************************/
664: /* Prints a file remotely and locally, interpreting ^A sequences, checks */
665: /* for pauses, aborts and ANSI. 'str' is the path of the file to print */
666: /* Called from functions menu and text_sec */
667: /****************************************************************************/
668: void printfile(char *str, int mode)
669: {
670: char HUGE16 *buf;
671: int file,wip=0,rip=0;
672: long length,savcon=console;
673: FILE *stream;
674:
675: if(strstr(str,".WIP"))
676: wip=1;
677: if(strstr(str,".RIP"))
678: rip=1;
679:
680: if(mode&P_NOABORT || wip || rip) {
681: if(online==ON_REMOTE && console&CON_R_ECHO) {
682: rioctl(IOCM|ABORT);
683: rioctl(IOCS|ABORT); }
684: sys_status&=~SS_ABORT; }
685:
686: if(!tos && !wip && !rip)
687: CRLF;
688:
689: if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
690: bputs(text[FileNotFound]);
691: if(SYSOP) bputs(str);
692: CRLF;
693: return; }
694:
695: if(wip || rip || !(console&CON_L_ECHO)) {
696: if(online!=ON_REMOTE || !(console&CON_R_ECHO)) {
697: fclose(stream);
698: return; }
699: console&=~CON_L_ECHO;
700: lprintf("PRINTFILE (Remote Only): %s\r\n",str); }
701: if(mode&P_OPENCLOSE) {
702: length=filelength(file);
703: if((buf=MALLOC(length+1L))==NULL) {
704: close(file);
705: console=savcon;
706: errormsg(WHERE,ERR_ALLOC,str,length+1L);
707: return; }
708: buf[lread(file,buf,length)]=0;
709: fclose(stream);
710: putmsg(buf,mode);
711: FREE((char *)buf); }
712: else {
713: putmsg_fp(stream,filelength(file),mode);
714: fclose(stream); }
715: if((mode&P_NOABORT || wip || rip) && online==ON_REMOTE) {
716: SYNC;
717: rioctl(IOSM|ABORT); }
718: if(rip)
719: getlines();
720: console=savcon;
721: }
722:
723: void printtail(char *str, int lines, int mode)
724: {
725: char HUGE16 *buf,HUGE16 *p;
726: int file,cur=0;
727: ulong length,l;
728:
729: if(mode&P_NOABORT) {
730: if(online==ON_REMOTE) {
731: rioctl(IOCM|ABORT);
732: rioctl(IOCS|ABORT); }
733: sys_status&=~SS_ABORT; }
734: strupr(str);
735: if(!tos) {
736: CRLF; }
737: if((file=nopen(str,O_RDONLY))==-1) {
738: bputs(text[FileNotFound]);
739: if(SYSOP) bputs(str);
740: CRLF;
741: return; }
742: length=filelength(file);
743: if((buf=MALLOC(length+1L))==NULL) {
744: close(file);
745: errormsg(WHERE,ERR_ALLOC,str,length+1L);
746: return; }
747: l=lread(file,buf,length);
748: buf[l]=0;
749: close(file);
750: p=(buf+l)-1;
751: if(*p==LF) p--;
752: while(*p && p>buf) {
753: if(*p==LF)
754: cur++;
755: if(cur>=lines) {
756: p++;
757: break; }
758: p--; }
759: putmsg(p,mode);
760: if(mode&P_NOABORT && online==ON_REMOTE) {
761: SYNC;
762: rioctl(IOSM|ABORT); }
763: FREE((char *)buf);
764: }
765:
766: /****************************************************************************/
767: /* Prints the menu number 'menunum' from the text directory. Checks for ^A */
768: /* ,ANSI sequences, pauses and aborts. Usually accessed by user inputing '?'*/
769: /* Called from every function that has an available menu. */
770: /* The code definitions are as follows: */
771: /****************************************************************************/
772: void menu(char *code)
773: {
774: char str[256],path[256];
775: int c,i,l;
776:
777: sys_status&=~SS_ABORT;
778: if(menu_file[0])
779: strcpy(path,menu_file);
780: else {
781: sprintf(str,"%sMENU\\",text_dir);
782: if(menu_dir[0]) {
783: strcat(str,menu_dir);
784: strcat(str,"\\"); }
785: strcat(str,code);
786: strcat(str,".");
787: sprintf(path,"%s%s",str,useron.misc&WIP ? "WIP":"RIP");
788: if(!(useron.misc&(RIP|WIP)) || !fexist(path)) {
789: sprintf(path,"%sMON",str);
790: if((useron.misc&(COLOR|ANSI))!=ANSI || !fexist(path)) {
791: sprintf(path,"%sANS",str);
792: if(!(useron.misc&ANSI) || !fexist(path))
793: sprintf(path,"%sASC",str); } } }
794:
795: printfile(path,P_OPENCLOSE);
796: }
797:
798: /****************************************************************************/
799: /* Puts a character into the input buffer */
800: /****************************************************************************/
801: void ungetkey(char ch)
802: {
803:
804: keybuf[keybuftop++]=ch;
805: if(keybuftop==KEY_BUFSIZE)
806: keybuftop=0;
807: }
808:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.