|
|
1.1 root 1: #line 1 "MAIN_WFC.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6: #include "etext.h"
7: #include "cmdshell.h"
8: #include "qwk.h"
9:
10: extern char onquiet,nmi,llo,qwklogon;
11: extern char term_ret;
12: extern ulong connect_rate; /* already connected at xbps */
13: extern char *wday[],*mon[];
14: extern char *hungupstr;
15: extern char cidarg[];
16:
17: void reset_logon_vars(void)
18: {
19: int i;
20:
21: sys_status&=~(SS_USERON|SS_TMPSYSOP|SS_LCHAT|SS_ABORT
22: |SS_PAUSEON|SS_PAUSEOFF|SS_EVENT|SS_NEWUSER|SS_NEWDAY);
23: keybufbot=keybuftop=lbuflen=slcnt=altul=timeleft_warn=0;
24: logon_uls=logon_ulb=logon_dls=logon_dlb=0;
25: logon_posts=logon_emails=logon_fbacks=0;
26: batdn_total=batup_total=0;
27: usrgrps=usrlibs=0;
28: curgrp=curlib=0;
29: for(i=0;i<total_libs;i++)
30: curdir[i]=0;
31: for(i=0;i<total_grps;i++)
32: cursub[i]=0;
33: }
34:
35: void mail_maint(void)
36: {
37: int i;
38:
39: lprintf("\r\n\r\nPurging deleted/expired e-mail...");
40: sprintf(smb.file,"%sMAIL",data_dir);
41: smb.retry_time=smb_retry_time;
42: if((i=smb_open(&smb))!=0)
43: errormsg(WHERE,ERR_OPEN,smb.file,i);
44: else {
45: if((i=smb_locksmbhdr(&smb))!=0)
46: errormsg(WHERE,ERR_LOCK,smb.file,i);
47: else
48: delmail(0,MAIL_ALL);
49: smb_close(&smb); }
50: }
51:
52: /*************************************************************/
53: /* Returns 0 to reinitialize modem and start WFC cycle again */
54: /* Returns 1 to continue checking things peacefully */
55: /*************************************************************/
56: char wfc_events(time_t lastnodechk)
57: {
58: char str[256],str2[256],*buf;
59: int i,j,k,file,ret=1,chunk;
60: ulong l,m;
61: user_t user;
62: node_t node;
63: struct ffblk ff;
64: struct tm *gm;
65: struct date lastdate;
66:
67: for(i=0;i<total_qhubs;i++) {
68: gm=localtime(&now); /* Qnet call out based on time */
69: unixtodos(qhub[i]->last,&date,&curtime);
70: if(node_num==qhub[i]->node /* or frequency */
71: && (qhub[i]->last==-1L
72: || ((qhub[i]->freq
73: && (now-qhub[i]->last)/60>qhub[i]->freq)
74: || (qhub[i]->time
75: && (gm->tm_hour*60)+gm->tm_min>=qhub[i]->time
76: && (gm->tm_mday!=date.da_day || gm->tm_mon!=date.da_mon-1)))
77: && qhub[i]->days&(1<<gm->tm_wday))) {
78: offhook();
79: lputc(FF);
80: sprintf(str,"%sQNET\\%s.NOW"
81: ,data_dir,qhub[i]->id);
82: remove(str); /* Remove semaphore file */
83: sprintf(str,"%sQNET\\%s.PTR"
84: ,data_dir,qhub[i]->id);
85: file=nopen(str,O_RDONLY);
86: for(j=0;j<qhub[i]->subs;j++) {
87: sub[qhub[i]->sub[j]]->ptr=0;
88: lseek(file,sub[qhub[i]->sub[j]]->ptridx*4L,SEEK_SET);
89: read(file,&sub[qhub[i]->sub[j]]->ptr,4); }
90: if(file!=-1)
91: close(file);
92: if(pack_rep(i)) {
93: if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
94: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT);
95: else {
96: for(j=l=0;j<qhub[i]->subs;j++) {
97: while(filelength(file)<sub[qhub[i]->sub[j]]->ptridx*4L)
98: write(file,&l,4); /* initialize ptrs to null */
99: lseek(file,sub[qhub[i]->sub[j]]->ptridx*4L,SEEK_SET);
100: write(file,&sub[qhub[i]->sub[j]]->ptr,4); }
101: close(file); } }
102: delfiles(temp_dir,"*.*");
103:
104: qhub[i]->last=time(NULL);
105: sprintf(str,"%sQNET.DAB",ctrl_dir);
106: if((file=nopen(str,O_WRONLY))==-1) {
107: errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
108: bail(1); }
109: lseek(file,sizeof(time_t)*i,SEEK_SET);
110: write(file,&qhub[i]->last,sizeof(time_t));
111: close(file);
112:
113: if(qhub[i]->call[0]) {
114: getnodedat(node_num,&thisnode,1);
115: thisnode.status=NODE_NETTING;
116: putnodedat(node_num,thisnode);
117: lputc(FF);
118: external(cmdstr(qhub[i]->call,nulstr,nulstr,NULL),EX_SWAP);
119: ret=0; }
120: for(j=0;j<10;j++) {
121: sprintf(str,"%s%s.QW%c",data_dir,qhub[i]->id,j ? (j-1)+'0' : 'K');
122: if(fexist(str)) {
123: lclini(node_scrnlen-1);
124: delfiles(temp_dir,"*.*");
125: unpack_qwk(str,i); } }
126: lputc(FF); } }
127:
128: for(i=0;i<total_phubs;i++) {
129: gm=localtime(&now); /* PostLink call out based on time */
130: unixtodos(phub[i]->last,&date,&curtime);
131: if(node_num==phub[i]->node /* or frequency */
132: && ((phub[i]->freq
133: && (now-phub[i]->last)/60>phub[i]->freq)
134: || (phub[i]->time
135: && (gm->tm_hour*60)+gm->tm_min>=phub[i]->time
136: && (gm->tm_mday!=date.da_day || gm->tm_mon!=date.da_mon-1)))
137: && phub[i]->days&(1<<gm->tm_wday)) {
138: offhook();
139: lputc(FF);
140:
141: phub[i]->last=time(NULL);
142: sprintf(str,"%sPNET.DAB",ctrl_dir);
143: if((file=nopen(str,O_WRONLY))==-1) {
144: errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
145: bail(1); }
146: lseek(file,sizeof(time_t)*i,SEEK_SET);
147: write(file,&phub[i]->last,sizeof(time_t));
148: close(file);
149:
150: if(phub[i]->call[0]) {
151: getnodedat(node_num,&thisnode,1);
152: thisnode.status=NODE_NETTING;
153: putnodedat(node_num,thisnode);
154: lputc(FF);
155: external(cmdstr(phub[i]->call,nulstr,nulstr,NULL),EX_SWAP);
156: ret=0; } } }
157:
158: for(i=0;i<total_events;i++) {
159: if(!event[i]->node || event[i]->node>sys_nodes)
160: continue;
161: gm=localtime(&now);
162: unixtodos(event[i]->last,&date,&curtime);
163: if(event[i]->last==-1
164: || ((gm->tm_hour*60)+gm->tm_min>=event[i]->time
165: && (gm->tm_mday!=date.da_day || gm->tm_mon!=date.da_mon-1)
166: && event[i]->days&(1<<gm->tm_wday))) {
167:
168: if(event[i]->misc&EVENT_EXCL) { /* exclusive event */
169: offhook();
170: lputc(FF);
171: if(event[i]->node!=node_num) {
172: lprintf("Waiting for node %d to run timed event.\r\n\r\n"
173: ,event[i]->node);
174: lputs("Hit any key to abort wait...");
175: getnodedat(node_num,&thisnode,1);
176: thisnode.status=NODE_EVENT_LIMBO;
177: thisnode.aux=event[i]->node;
178: putnodedat(node_num,thisnode);
179: lastnodechk=0; /* really last event time check */
180: while(!lkbrd(0)) {
181: mswait(1);
182: now=time(NULL);
183: if(now-lastnodechk<10)
184: continue;
185: getnodedat(node_num,&thisnode,0);
186: if(thisnode.misc&NODE_DOWN)
187: return(0);
188: lastnodechk=now;
189: sprintf(str,"%sTIME.DAB",ctrl_dir);
190: if((file=nopen(str,O_RDONLY))==-1) {
191: errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
192: event[i]->last=now;
193: return(0); }
194: lseek(file,(long)i*4L,SEEK_SET);
195: read(file,&event[i]->last,sizeof(time_t));
196: close(file);
197: if(now-event[i]->last<(60*60)) /* event is done */
198: break; }
199: sprintf(str,"%s%s.NOW",data_dir,event[i]->code);
200: remove(str);
201: event[i]->last=now;
202: ret=0; }
203: else {
204: lputs("Waiting for all nodes to become inactive before "
205: "running timed event.\r\n\r\n");
206: lputs("Hit any key to abort wait and run event now...\r\n\r\n");
207: getnodedat(node_num,&thisnode,1);
208: thisnode.status=NODE_EVENT_WAITING;
209: putnodedat(node_num,thisnode);
210: lastnodechk=0;
211: while(!lkbrd(0)) {
212: mswait(1);
213: now=time(NULL);
214: if(now-lastnodechk<10)
215: continue;
216: lastnodechk=now;
217: getnodedat(node_num,&thisnode,0);
218: if(thisnode.misc&NODE_DOWN)
219: return(0);
220: for(j=1;j<=sys_nodes;j++) {
221: if(j==node_num)
222: continue;
223: getnodedat(j,&node,0);
224: if(node.status==NODE_EVENT_WAITING) /* two nodes */
225: break; /* waiting ?!?! */
226: if(node.status!=NODE_OFFLINE
227: && node.status!=NODE_EVENT_LIMBO)
228: break; }
229: if(j>sys_nodes) /* all nodes either offline or in limbo */
230: break;
231: lprintf("\rWaiting for node %d (status=%d)"
232: ,j,node.status);
233: lputc(CLREOL); } } }
234: if(event[i]->node!=node_num)
235: event[i]->last=now;
236: else {
237: sprintf(str,"%s%s.NOW",data_dir,event[i]->code);
238: remove(str);
239: offhook();
240: lputc(FF);
241: getnodedat(node_num,&thisnode,1);
242: thisnode.status=NODE_EVENT_RUNNING;
243: putnodedat(node_num,thisnode);
244: if(event[i]->dir[0]) {
245: if(event[i]->dir[1]==':') /* drive letter specified */
246: setdisk(toupper(event[i]->dir[0])-'A');
247: if(chdir(event[i]->dir))
248: errormsg(WHERE,ERR_CHDIR,event[i]->dir,0); }
249:
250: external(cmdstr(event[i]->cmd,nulstr,nulstr,NULL),0); /* EX_CC */
251: event[i]->last=time(NULL);
252: sprintf(str,"%sTIME.DAB",ctrl_dir);
253: if((file=nopen(str,O_WRONLY))==-1) {
254: errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
255: return(ret); }
256: lseek(file,(long)i*4L,SEEK_SET);
257: write(file,&event[i]->last,sizeof(time_t));
258: close(file);
259: ret=0; } } }
260:
261:
262: if(sys_status&SS_DAILY || thisnode.misc&NODE_EVENT) { /* daily events */
263:
264: offhook();
265: lputc(FF);
266:
267: if(sys_status&SS_DAILY) {
268:
269: getnodedat(node_num,&thisnode,1);
270: now=time(NULL);
271: j=lastuser();
272: thisnode.status=NODE_EVENT_RUNNING;
273: putnodedat(node_num,thisnode);
274:
275: lprintf("Running system daily maintenance...\r\n\r\n");
276: logentry("!:","Ran system daily maintenance");
277: for(i=1;i<=j;i++) {
278:
279: lprintf("\rChecking user %5u of %-5u",i,j);
280: user.number=i;
281: getuserdat(&user);
282:
283: /***********************************************/
284: /* Fix name (NAME.DAT and USER.DAT) mismatches */
285: /***********************************************/
286: if(user.misc&DELETED) {
287: if(strcmp(username(i,str2),"DELETED USER"))
288: putusername(i,nulstr);
289: continue; }
290:
291: if(strcmp(user.alias,username(i,str2)))
292: putusername(i,user.alias);
293:
294: if(!(user.misc&(DELETED|INACTIVE))
295: && user.expire && (ulong)user.expire<=(ulong)now) {
296: putsmsg(i,text[AccountHasExpired]);
297: sprintf(str,"%s #%u Expired",user.alias,user.number);
298: logentry("!%",str);
299: if(level_misc[user.level]&LEVEL_EXPTOVAL
300: && level_expireto[user.level]<10) {
301: user.flags1=val_flags1[level_expireto[user.level]];
302: user.flags2=val_flags2[level_expireto[user.level]];
303: user.flags3=val_flags3[level_expireto[user.level]];
304: user.flags4=val_flags4[level_expireto[user.level]];
305: user.exempt=val_exempt[level_expireto[user.level]];
306: user.rest=val_rest[level_expireto[user.level]];
307: if(val_expire[level_expireto[user.level]])
308: user.expire=now
309: +(val_expire[level_expireto[user.level]]*24*60*60);
310: else
311: user.expire=0;
312: user.level=val_level[level_expireto[user.level]]; }
313: else {
314: if(level_misc[user.level]&LEVEL_EXPTOLVL)
315: user.level=level_expireto[user.level];
316: else
317: user.level=expired_level;
318: user.flags1&=~expired_flags1; /* expired status */
319: user.flags2&=~expired_flags2; /* expired status */
320: user.flags3&=~expired_flags3; /* expired status */
321: user.flags4&=~expired_flags4; /* expired status */
322: user.exempt&=~expired_exempt;
323: user.rest|=expired_rest;
324: user.expire=0; }
325: putuserrec(i,U_LEVEL,2,itoa(user.level,str,10));
326: putuserrec(i,U_FLAGS1,8,ultoa(user.flags1,str,16));
327: putuserrec(i,U_FLAGS2,8,ultoa(user.flags2,str,16));
328: putuserrec(i,U_FLAGS3,8,ultoa(user.flags3,str,16));
329: putuserrec(i,U_FLAGS4,8,ultoa(user.flags4,str,16));
330: putuserrec(i,U_EXPIRE,8,ultoa(user.expire,str,16));
331: putuserrec(i,U_EXEMPT,8,ultoa(user.exempt,str,16));
332: putuserrec(i,U_REST,8,ultoa(user.rest,str,16));
333: if(expire_mod[0]) {
334: useron=user;
335: online=ON_LOCAL;
336: exec_bin(expire_mod,&main_csi);
337: online=0; }
338: }
339:
340: /***********************************************************/
341: /* Auto deletion based on expiration date or days inactive */
342: /***********************************************************/
343: if(!(user.exempt&FLAG('P')) /* Not a permanent account */
344: && !(user.misc&(DELETED|INACTIVE)) /* alive */
345: && (sys_autodel && (now-user.laston)/(long)(24L*60L*60L)
346: > sys_autodel)) { /* Inactive too long */
347: sprintf(str,"Auto-Deleted %s #%u",user.alias,user.number);
348: logentry("!*",str);
349: delallmail(i);
350: putusername(i,nulstr);
351: putuserrec(i,U_MISC,8,ultoa(user.misc|DELETED,str,16)); }
352:
353: if(!(user.misc&(DELETED|INACTIVE))
354: && preqwk_ar[0] && chk_ar(preqwk_ar,user)) { /* Pre-QWK */
355: for(k=1;k<=sys_nodes;k++) {
356: getnodedat(k,&node,0);
357: if((node.status==NODE_INUSE || node.status==NODE_QUIET
358: || node.status==NODE_LOGON) && node.useron==i)
359: break; }
360: if(k<=sys_nodes) /* Don't pre-pack with user online */
361: continue;
362: lclini(node_scrnlen-1);
363: lclatr(LIGHTGRAY);
364: lputc(FF);
365: console|=CON_L_ECHO;
366: lprintf("Pre-packing QWK for %s...\r\n"
367: ,user.alias);
368: useron=user;
369: online=ON_LOCAL;
370: statline=sys_def_stat;
371: statusline();
372: useron.qwk&=~QWK_FILES; /* turn off for pre-packing */
373: useron.misc|=(ANSI|COLOR);
374: delfiles(temp_dir,"*.*");
375: getmsgptrs();
376: getusrsubs();
377: batdn_total=0;
378: sprintf(str,"%sFILE\\%04u.QWK"
379: ,data_dir,useron.number);
380: if(pack_qwk(str,&l,1)) {
381: qwk_success(l,0,1);
382: putmsgptrs(); }
383: delfiles(temp_dir,"*.*");
384: lclatr(LIGHTGRAY);
385: lclini(node_scrnlen);
386: online=0;
387: lputc(FF); } }
388:
389: mail_maint();
390:
391: lprintf("\r\n\r\nRunning system daily event...\r\n");
392: logentry("!:","Ran system daily event");
393: sys_status&=~SS_DAILY;
394: if(sys_daily[0])
395: external(cmdstr(sys_daily,nulstr,nulstr,NULL),0); } /* EX_CC */
396:
397: if(thisnode.misc&NODE_EVENT) {
398: getnodedat(node_num,&thisnode,1);
399: thisnode.status=NODE_EVENT_RUNNING;
400: putnodedat(node_num,thisnode);
401: if(node_daily[0])
402: external(cmdstr(node_daily,nulstr,nulstr,NULL),0); /* EX_CC */
403: getnodedat(node_num,&thisnode,1);
404: thisnode.misc&=~NODE_EVENT;
405: putnodedat(node_num,thisnode); }
406: ret=0; }
407: return(ret);
408: }
409:
410: /****************************************************************************/
411: /* This function waits for either a caller or a local logon. It returns 0 */
412: /* if the user failed the logon procedure, a 1 if the user succeeded */
413: /* Called from function main */
414: /****************************************************************************/
415: char waitforcall()
416: {
417: static uint calls;
418: uchar str[256],str2[256],cname[LEN_CID+1],c,gotcaller=0,x,y,dcd,*p
419: ,ans=0,hbeat=0,menuon=0,blank=0
420: ,*ok=mdm_misc&MDM_VERBAL ? "OK":"0"
421:
422: /* IP logging vars added by enigma */
423: , ipstr[256], *ips;
424:
425: uint i,j,k,nodes,lastnodes=0;
426: long l,m;
427: int file,result_code=0;
428: time_t start,lastnodechk=0,laststatchk=0,laststatfdate=0;
429: node_t node;
430: struct tm *gm;
431: struct dfree d;
432: stats_t stats,node_stats;
433:
434: reset_logon_vars();
435: ipstr[0]=cid[0]=cname[0]=0;
436: online=console=0;
437: start=time(NULL);
438:
439: getnodedat(node_num,&thisnode,1);
440: thisnode.status=NODE_WFC;
441: thisnode.misc&=~(NODE_INTR|NODE_MSGW|NODE_NMSG|NODE_UDAT|NODE_POFF|NODE_AOFF);
442: putnodedat(node_num,thisnode);
443: catsyslog(0);
444: if(term_ret)
445: return(terminal());
446: /***
447: if(com_port)
448: rioctl(0x10f); /* for blanking debug line */
449: ***/
450:
451: if(qoc && calls) {
452: if(qoc==1)
453: offhook();
454: lclini(node_scrnlen);
455: lputc(FF);
456: bail(0); }
457: useron.misc=0;
458: rows=24;
459: lputc(FF);
460: if(node_misc&NM_RESETVID) {
461: textmode(C40);
462: textmode(C80);
463: _setcursortype(_NORMALCURSOR); }
464:
465: lclatr(curatr=LIGHTGRAY);
466: lclini(node_scrnlen);
467:
468:
469: lputc(FF);
470: if(com_port && !connect_rate) { /* Initialize the modem */
471: lprintf("\rSetting DTE rate: %lu baud",com_rate);
472: lputc(CLREOL);
473: #ifdef __OS2__
474: if((i=setbaud(com_rate))!=0) {
475: #else
476: if((i=setbaud((uint)(com_rate&0xffffL)))!=0) {
477: #endif
478: lprintf(" - Failed! (%d)\r\n",i);
479: bail(1); }
480: c=0;
481: if(!nmi && !(mdm_misc&MDM_DUMB)) /* if not dumb */
482: while(c<4) {
483: rioctl(IOFB);
484: rioctl(IOCM|PAUSE|ABORT);
485: rioctl(IOCS|PAUSE|ABORT);
486:
487: if(mdm_misc&MDM_CTS)
488: if(!(rioctl(IOSTATE)&CTS)) {
489: lputs("\rWaiting up to 30 seconds for CTS to raise ( )\b\b\b");
490: for(i=0;i<30 && !lkbrd(0);i++) { /* wait upto 15 seconds */
491: lprintf("%2d\b\b",i+1);
492: mswait(1000);
493: if(rioctl(IOSTATE)&CTS)
494: break; }
495: if(i==30) {
496: lputs("\r\n\r\nModem configured for hardware flow "
497: "control and CTS is stuck low.\r\n");
498: logline("@!","CTS stuck low. Can't initialize.");
499: bail(1); } }
500:
501: lputs("\rInitializing modem...");
502: lputc(CLREOL);
503:
504: dtr(5); /* in case we're still connected to somebody */
505: dtr(1);
506: mswait(750); /* DTR is sometimes slow */
507: rioctl(IOFB); /* crap comes in when dtr is raised ? */
508: if(rioctl(IOSTATE)&DCD && mdm_hang[0]) {
509: mdmcmd(mdm_hang);
510: if(strcmp(str,"0") && strcmp(str,"OK"))
511: getmdmstr(str,SEC_OK); }
512:
513: /******************************************/
514: /* Take phone off-hook while initializing */
515: /******************************************/
516: offhook();
517: getmdmstr(str,SEC_OK);
518: if(strcmp(str,"0") && strcmp(str,"OK"))
519: getmdmstr(str,SEC_OK);
520:
521: /*********************************************************/
522: /* Send User Configured (broken?) initialization strings */
523: /*********************************************************/
524: mdmcmd(mdm_init);
525: if(mdm_spec[0]) {
526: getmdmstr(str,SEC_OK);
527: if(strcmp(str,"0") && strcmp(str,"OK"))
528: getmdmstr(str,SEC_OK);
529: mdmcmd(mdm_spec); }
530: getmdmstr(str,SEC_OK);
531: if(strcmp(str,"0") && strcmp(str,"OK"))
532: getmdmstr(str,SEC_OK);
533:
534: /*****************************/
535: /* Send AT&C1 if DCD is high */
536: /*****************************/
537: if(rioctl(IOSTATE)&DCD) {
538: lputs("\r\nDCD is high. Sending AT&C1 to modem...");
539: mdmcmd("AT&C1");
540: getmdmstr(str,SEC_OK);
541: if(strcmp(str,ok))
542: getmdmstr(str,SEC_OK); }
543:
544: /**********************************************/
545: /* DCD still high? Pause and try dropping DTR */
546: /**********************************************/
547: if(rioctl(IOSTATE)&DCD) {
548: lputs("\r\nDCD is high. Pausing...");
549: dtr(0);
550: mswait(2000);
551: rioctl(MSR);
552: if(rioctl(IOSTATE)&DCD) {
553: lputs("\rDCD was high after modem init.\r\n");
554: logentry("@!","DCD was high after modem init");
555: if(mdm_misc&MDM_NODTR)
556: mdmcmd(mdm_hang);
557: else
558: dtr(15);
559: if(rioctl(IOSTATE)&DCD) {
560: lputs("Hanging up failed to lower DCD.\r\n");
561: logentry("@!","Hanging up failed to lower DCD");
562: if(++c==4)
563: break;
564: continue; } }
565: dtr(1); }
566:
567: /************************************************************/
568: /* Let's repair any damage the user configured init strings */
569: /* may have caused */
570: /************************************************************/
571: for(i=0;i<4;i++) {
572: rioctl(IOFB);
573: mdmcmd("AT");
574: if(!getmdmstr(str,SEC_OK) || !strcmp(str,ok))
575: break;
576: if(!strcmp(str,"AT")) { /* Echoing commands? */
577: getmdmstr(str,SEC_OK); /* Get OK */
578: lputs("\r\nCommand echoed. Sending ATE0 to modem...");
579: mdmcmd("ATE0"); }
580: else if(mdm_misc&MDM_VERBAL && !strcmp(str,"0")) { /* numeric? */
581: lputs("\r\nNumeric response. Sending ATV1 to modem...");
582: mdmcmd("ATV1"); }
583: else if(!(mdm_misc&MDM_VERBAL) && !strcmp(str,"OK")) {
584: lputs("\r\nVerbal response. Sending ATV0 to modem...");
585: mdmcmd("ATV0"); }
586: else {
587: lprintf("\r\nUnrecognized response '%s'. Sending AT to modem..."
588: ,str);
589: mdmcmd("AT"); }
590: if(getmdmstr(str,SEC_OK) && !strcmp(str,ok))
591: break; }
592:
593: /************************************************/
594: /* Put phone back on-hook and check result code */
595: /************************************************/
596: if(!mdm_hang[0])
597: mdmcmd("ATH");
598: else
599: mdmcmd(mdm_hang);
600: if(!getmdmstr(str,SEC_OK)) {
601: lputs("\r\nNo response.\r\n");
602: logentry("@!","No response"); }
603: else {
604: if(!strcmp(str,ok))
605: break;
606: lprintf("\r\nInvalid result code: '%s' "
607: "instead of '%s'.\r\n",str,ok);
608: sprintf(tmp,"Invalid result code: '%s' instead of '%s'.",str,ok);
609: logentry("@!",tmp); }
610: if(++c==4)
611: break;
612: rioini(0,0); /* remove com routines */
613: sys_status&=~SS_COMISR;
614: comini();
615: setrate(); }
616: if(c==4) {
617: lputs("\r\nModem failed initialization.\r\n");
618: errorlog("Modem failed initialization.");
619: offhook();
620: bail(1); }
621: lputc(FF); }
622:
623: else if(com_port && connect_rate) {
624: gotcaller=1;
625: console=CON_R_ECHO|CON_L_ECHO|CON_R_INPUT|CON_L_INPUT;
626: online=ON_REMOTE;
627: sprintf(connection,"%lu",connect_rate);
628: cur_rate=connect_rate;
629: cur_cps=connect_rate/10;
630: connect_rate=0;
631: if(cidarg[0]) { /* Caller-id passed as argument */
632: mdm_misc|=MDM_CALLERID;
633: p=strstr(cidarg,"NUMBER:");
634: if(p) p+=8;
635: else {
636: p=strstr(cidarg,"NMBR");
637: if(p) p+=7; }
638: if(p) { /* 3 message format */
639: sprintf(cid,"%.*s",LEN_CID,p);
640: for(i=strlen(cid);!isdigit(cid[i]) && i;i--)
641: ;
642: cid[i+1]=0; /* chop off non-numbers */
643: p=strstr(cidarg,"NAME:");
644: if(p) p+=6;
645: else {
646: p=strstr(cidarg,"NAME");
647: if(p) p+=7; }
648: if(p)
649: sprintf(cname,"%.*s",LEN_CID,p); }
650: else if(strlen(cidarg)>12) /* Single message format */
651: sprintf(cid,"%.*s",LEN_CID,cidarg+12);
652: else
653: sprintf(cid,"ERROR: '%s'",cidarg); } }
654:
655:
656: if(!online) {
657: /*******************************************************/
658: /* To make sure that BBS print routines work correctly */
659: /*******************************************************/
660: useron.number=1;
661: getuserdat(&useron);
662: if(!useron.number)
663: useron.misc=ANSI|COLOR; }
664:
665: useron.misc&=~UPAUSE; /* make sure pause is off */
666:
667: if(llo) {
668: quicklogonstuff();
669: sys_status&=~SS_USERON;
670: gotcaller=1; }
671:
672: if(!(useron.misc&EXPERT) && !gotcaller) { /* Novice sysop */
673: console=CON_L_ECHO;
674: online=ON_LOCAL;
675: lputc(FF);
676: tos=1;
677: lncntr=0;
678: menu("WFC");
679: menuon=1;
680: online=0; }
681:
682: while(!gotcaller) {
683: mswait(0); /* give up rest of time slice */
684:
685: console=CON_L_ECHO;
686: now=time(NULL);
687:
688: if(node_scrnblank && (now-start)/60>node_scrnblank
689: && !blank) { /* blank screen */
690: lputc(FF);
691: menuon=0;
692: blank=1; }
693: if(mdm_reinit && (now-start)/60>mdm_reinit) /* reinitialize modem */
694: return(0);
695: if(now-lastnodechk>node_sem_check) { /* check node.dab every x seconds */
696:
697: #if 1
698: if((i=heapcheck())!=_HEAPOK) {
699: lputc(FF);
700: offhook();
701: errormsg(WHERE,ERR_CHK,"heap",i);
702: bail(1); }
703: #endif
704:
705: for(i=0;i<total_qhubs;i++)
706: if(node_num==qhub[i]->node) {
707: sprintf(str,"%sQNET\\%s.NOW",data_dir,qhub[i]->id);
708: if(fexist(str))
709: qhub[i]->last=-1; }
710:
711: for(i=0;i<total_events;i++)
712: if(node_num==event[i]->node || event[i]->misc&EVENT_EXCL) {
713: sprintf(str,"%s%s.NOW",data_dir,event[i]->code);
714: if(fexist(str))
715: event[i]->last=-1; }
716:
717: lastnodechk=now;
718: getnodedat(node_num,&thisnode,0);
719: if(thisnode.misc&NODE_DOWN) {
720: lputc(FF);
721: offhook();
722: bail(0); }
723: if(thisnode.status!=NODE_WFC) {
724: getnodedat(node_num,&thisnode,1);
725: thisnode.status=NODE_WFC;
726: putnodedat(node_num,thisnode); }
727: if(thisnode.misc&NODE_RRUN) { /* Re-run the node */
728: offhook();
729: lputc(FF);
730: getnodedat(node_num,&thisnode,1);
731: thisnode.status=NODE_OFFLINE;
732: thisnode.misc=0;
733: putnodedat(node_num,thisnode);
734: close(nodefile);
735: close(node_ext);
736: sys_status&=~SS_NODEDAB;
737: if(sys_status&SS_LOGOPEN)
738: close(logfile);
739: if(sys_status&SS_COMISR)
740: rioini(0,0);
741: sys_status&=~(SS_COMISR|SS_INITIAL|SS_LOGOPEN);
742: p=strchr(orgcmd,' ');
743: if(p)
744: p++;
745: close(5);
746: if(execle(orgcmd,orgcmd,p,NULL,envp)) {
747: lprintf("\r\nCouldn't execute %s!\r\n",orgcmd);
748: bail(1); } } }
749:
750: if(!wfc_events(lastnodechk))
751: return(0);
752:
753: if(!menuon) {
754: /******************/
755: /* Roaming cursor */
756: /******************/
757: x=lclwx();
758: y=lclwy();
759: switch(random(5)) {
760: case 0:
761: if(x>1)
762: x--;
763: break;
764: case 1:
765: if(x<79)
766: x++;
767: break;
768: case 2:
769: if(y>1)
770: y--;
771: break;
772: case 4:
773: if(y<node_scrnlen-2)
774: y++;
775: break; } }
776: else { /* across the bottom */
777: y=25;
778: x=lclwx();
779: if(x%2) x+=2;
780: else x-=2;
781: if(x<1)
782: x=1;
783: else if(x>80)
784: x=80;
785: /*
786: lclxy(x,y);
787: gettext(x,y,x,y,&i);
788: lclatr(random(0xf)+1);
789: lputc(i);
790: lclatr(LIGHTGRAY);
791: */
792: /**
793: mswait(100);
794: puttext(x,y,x,y,&i);
795: **/ }
796:
797: #ifndef __FLAT__ // Heart beat always for 32-bit OSs
798: if(inDV) {
799: #endif
800: lclxy(80,1);
801: if(hbeat) {
802: lclatr(RED|HIGH);
803: lputc(3); }
804: else
805: lputc(0);
806: hbeat=!hbeat;
807: lclatr(LIGHTGRAY);
808: #ifndef __FLAT__
809: }
810: #endif
811:
812: lclxy(x,y);
813: mswait(100);
814:
815: /* Wait for call screen */
816: /* check every 10 seconds */
817:
818: if(node_misc&NM_WFCSCRN && now-laststatchk>node_stat_check
819: && !menuon && !blank) {
820: laststatchk=now;
821: sprintf(str,"%sDSTS.DAB",ctrl_dir);
822: if(fdate(str)!=laststatfdate) { /* system statistics */
823: lclxy(1,1);
824: lclatr(LIGHTGRAY);
825: lputs("Retrieving Statistics.");
826: lputc(CLREOL);
827: if(!laststatfdate) /* First time this WFC */
828: getstats(node_num,&node_stats);
829: lputc('.');
830: laststatfdate=fdate(str);
831: getstats(0,&stats);
832: lputc('.');
833: l=m=0;
834: if(node_misc&NM_WFCMSGS) {
835: for(i=0;i<total_subs;i++)
836: l+=getposts(i); /* l=total posts */
837: lputc('.');
838: for(i=0;i<total_dirs;i++)
839: m+=getfiles(i); /* m=total files */
840: lputc('.'); }
841: i=getmail(0,0); /* i=total email */
842: lputc('.');
843: j=getmail(1,0); /* j=total fback */
844: lclxy(1,1);
845: lclatr(GREEN);
846: lprintf("Node #: ");
847: lclatr(GREEN|HIGH);
848: gm=localtime(&now);
849: lprintf("%-3u ",node_num);
850: lclatr(GREEN);
851: lprintf("%-3.3s %-2u Space: ",mon[gm->tm_mon],gm->tm_mday);
852: if(temp_dir[1]==':')
853: k=temp_dir[0]-'A'+1;
854: else k=0;
855: getdfree(k,&d);
856: if((ulong)d.df_bsec*(ulong)d.df_sclus
857: *(ulong)d.df_avail<((ulong)min_dspace*1024L)*2L)
858: lclatr(RED|HIGH|BLINK);
859: else
860: lclatr(GREEN|HIGH);
861: sprintf(str,"%sk",ultoac(((ulong)d.df_bsec
862: *(ulong)d.df_sclus*(ulong)d.df_avail)/1024UL,tmp));
863: lprintf("%-12.12s",str);
864: if(lastuseron[0]) {
865: lclatr(GREEN);
866: lprintf("Laston: ");
867: lclatr(GREEN|HIGH);
868: lprintf(lastuseron);
869: lclatr(GREEN);
870: if(thisnode.connection)
871: lprintf(" %u",thisnode.connection);
872: else
873: lprintf(" Local"); }
874: lprintf("\r\n");
875: lclatr(GREEN);
876: lprintf("Logons: ");
877: lclatr(GREEN|HIGH);
878: sprintf(tmp,"%lu/%lu",node_stats.ltoday,stats.ltoday);
879: lprintf("%-12.12s",tmp);
880: lclatr(GREEN);
881: lprintf("Total: ");
882: lclatr(GREEN|HIGH);
883: lprintf("%-12.12s",ultoac(stats.logons,tmp));
884: lclatr(GREEN);
885: lprintf("Timeon: ");
886: lclatr(GREEN|HIGH);
887: sprintf(tmp,"%lu/%lu",node_stats.ttoday,stats.ttoday);
888: lprintf("%-12.12s",tmp);
889: lclatr(GREEN);
890: lprintf("Total: ");
891: lclatr(GREEN|HIGH);
892: lprintf("%-12.12s\r\n",ultoac(stats.timeon,tmp));
893: lclatr(GREEN);
894: lprintf("Emails: ");
895: lclatr(GREEN|HIGH);
896: sprintf(str,"%u/%u",(uint)stats.etoday,i);
897: lprintf("%-12.12s",str);
898: lclatr(GREEN);
899: lprintf("Posts: ");
900: lclatr(GREEN|HIGH);
901: sprintf(str,"%u",(uint)stats.ptoday);
902: if(node_misc&NM_WFCMSGS) {
903: strcat(str,"/");
904: strcat(str,ultoa(l,tmp,10)); }
905: lprintf("%-12.12s",str);
906: lclatr(GREEN);
907: lprintf("Fbacks: ");
908: lclatr(GREEN|HIGH);
909: sprintf(str,"%u/%u",(uint)stats.ftoday,j);
910: lprintf("%-12.12s",str);
911: lclatr(GREEN);
912: lprintf("Users: ");
913: lclatr(GREEN|HIGH);
914: sprintf(str,"%u/%u",stats.nusers,lastuser());
915: lprintf("%-12.12s\r\n",str);
916: lclatr(GREEN);
917: lprintf("Uloads: ");
918: lclatr(GREEN|HIGH);
919: ultoac(stats.ulb/1024UL,tmp);
920: strcat(tmp,"k");
921: lprintf("%-12.12s",tmp);
922: lclatr(GREEN);
923: lprintf("Files: ");
924: lclatr(GREEN|HIGH);
925: sprintf(str,"%u",(uint)stats.uls);
926: if(node_misc&NM_WFCMSGS) {
927: strcat(str,"/");
928: strcat(str,ultoa(m,tmp,10)); }
929: lprintf("%-12.12s",str);
930: lclatr(GREEN);
931: lprintf("Dloads: ");
932: lclatr(GREEN|HIGH);
933: ultoac(stats.dlb/1024UL,tmp);
934: strcat(tmp,"k");
935: lprintf("%-12.12s",tmp);
936: lclatr(GREEN);
937: lprintf("Files: ");
938: lclatr(GREEN|HIGH);
939: lprintf("%-12.12s\r\n",ultoac(stats.dls,tmp)); }
940: lclatr(curatr=LIGHTGRAY);
941: lclxy(1,6);
942: nodes=0;
943: for(i=1;i<=sys_nodes;i++) {
944: getnodedat(i,&node,0);
945: if((node.status!=NODE_WFC && node.status!=NODE_OFFLINE)
946: || node.errors) {
947: lputc(CLREOL);
948: printnodedat(i,node);
949: nodes++; } }
950: if(nodes<lastnodes) {
951: i=j=lclwy();
952: j+=(lastnodes-nodes)+1;
953: for(;i<=node_scrnlen && i<j;i++) {
954: lclxy(1,i);
955: lputc(CLREOL); } }
956: lastnodes=nodes;
957: lclatr(curatr=LIGHTGRAY); }
958:
959:
960: if(!(node_misc&NM_NO_LKBRD) && lkbrd(1)) {
961: start=time(NULL);
962: /* menuon=0; */
963: lputc(FF);
964: tos=1;
965: lncntr=0;
966: i=lkbrd(0);
967: if(!(i&0xff) && (i>=0x3b00 && i<=0x4400)
968: || i==0x8500 || i==0x8600) { /* F1-F12 */
969: if(i>=0x3b00 && i<=0x4400)
970: i=((i-0x3b00)>>8);
971: else if(i==0x8500)
972: i=10;
973: else
974: i=11;
975: offhook();
976: external(cmdstr(wfc_scmd[i],nulstr,nulstr,NULL),EX_SWAP);
977: return(0); }
978:
979: if(isdigit(i&0xff)) {
980: offhook();
981: external(cmdstr(wfc_cmd[i&0xf],nulstr,nulstr,NULL),0);
982: return(0); }
983:
984: switch(toupper(i)) {
985: case 'A': /* forced answer */
986: ans=1;
987: break;
988: case 'C': /* configure */
989: if(node_misc&NM_SYSPW) {
990: quicklogonstuff();
991: if(!chksyspass(1))
992: return(0); }
993: offhook();
994: if(sys_status&SS_LOGOPEN) {
995: close(logfile);
996: sys_status&=~SS_LOGOPEN; }
997: if(sys_status&SS_COMISR) {
998: rioini(0,0); /* replace COM i/o vectors */
999: sys_status&=~SS_COMISR; }
1000: close(nodefile);
1001: close(node_ext);
1002: sys_status&=~SS_NODEDAB;
1003: sprintf(str,"%sEXECSBBS.%s",exec_dir,
1004: #ifdef __OS2__
1005: "EXE"
1006: #else
1007: "COM"
1008: #endif
1009: );
1010: sprintf(tmp,"\"%s \"",cmdstr(scfg_cmd,nulstr,nulstr,NULL));
1011: if(execl(str,str,".",tmp,orgcmd,NULL,envp)) {
1012: errormsg(WHERE,ERR_EXEC,str,0);
1013: bail(1); }
1014: case 'D': /* Dos shell */
1015: offhook();
1016: external(comspec,0);
1017: return(0);
1018: case 'F': /* Force Network Call-out */
1019: quicklogonstuff();
1020: lclatr(YELLOW);
1021: lputs("QWK Hub ID: ");
1022: lclatr(WHITE);
1023: if(!getstr(str,8,K_UPPER))
1024: return(0);
1025: for(i=0;i<total_qhubs;i++)
1026: if(!stricmp(str,qhub[i]->id)) {
1027: if(qhub[i]->node==node_num)
1028: qhub[i]->last=-1;
1029: else {
1030: sprintf(tmp,"%sQNET\\%s.NOW",data_dir,str);
1031: if((file=nopen(tmp,O_CREAT|O_TRUNC|O_WRONLY))
1032: !=-1)
1033: close(file); }
1034: break; }
1035: return(0);
1036: case 'L': /* Log */
1037: if(node_misc&NM_SYSPW) {
1038: quicklogonstuff();
1039: if(!chksyspass(1))
1040: return(0); }
1041: offhook();
1042: now=time(NULL);
1043: unixtodos(now,&date,&curtime);
1044: sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG"
1045: ,data_dir,date.da_mon,date.da_day,date.da_year-1900);
1046: external(cmdstr(node_viewer,str,nulstr,NULL),0);
1047: return(0);
1048: case 'M': /* Read all mail */
1049: quicklogonstuff();
1050: if(node_misc&NM_SYSPW && !chksyspass(1))
1051: return(0);
1052: readmail(1,MAIL_ALL);
1053: online=console=0;
1054: return(0);
1055: case 'N': /* Node statistics */
1056: quicklogonstuff();
1057: if(node_misc&NM_SYSPW && !chksyspass(1))
1058: return(0);
1059: useron.misc|=UPAUSE;
1060: printstatslog(node_num);
1061: pause();
1062: return(0);
1063: case 'Q': /* Quit */
1064: offhook();
1065: bail(0);
1066: case 'R': /* Read feedback */
1067: quicklogonstuff();
1068: if(node_misc&NM_SYSPW && !chksyspass(1))
1069: return(0);
1070: readmail(1,MAIL_YOUR);
1071: return(0);
1072: case 'K': /* Sent mail */
1073: quicklogonstuff();
1074: if(node_misc&NM_SYSPW && !chksyspass(1))
1075: return(0);
1076: readmail(1,MAIL_SENT);
1077: return(0);
1078: case 'S': /* System Statistics */
1079: quicklogonstuff();
1080: if(node_misc&NM_SYSPW && !chksyspass(1))
1081: return(0);
1082: useron.misc|=UPAUSE;
1083: printstatslog(0);
1084: pause();
1085: return(0);
1086: case 'T': /* Terminal mode */
1087: if(!com_port) {
1088: lprintf("No COM port configured.");
1089: getch();
1090: lputc(FF);
1091: return(0); }
1092: if(node_misc&NM_SYSPW) {
1093: quicklogonstuff();
1094: if(!chksyspass(1))
1095: return(0); }
1096: return(terminal());
1097: case 'U': /* User edit */
1098: quicklogonstuff();
1099: useredit(0,1);
1100: return(0);
1101: case 'E':
1102: case 'W': /* Write e-mail */
1103: quicklogonstuff();
1104: if(node_misc&NM_SYSPW && !chksyspass(1))
1105: return(0);
1106: bputs(text[Email]);
1107: if(!getstr(str,50,0))
1108: return(0);
1109: if(!strchr(str,'@') && (i=finduser(str))!=0)
1110: email(i,nulstr,nulstr,WM_EMAIL);
1111: else
1112: netmail(str,nulstr,0);
1113: return(0);
1114: case 'X': /* Exit with phone on-hook */
1115: bail(0);
1116: case 'Y': /* Yesterday's log */
1117: if(node_misc&NM_SYSPW) {
1118: quicklogonstuff();
1119: if(!chksyspass(1))
1120: return(0); }
1121: offhook();
1122: now=time(NULL);
1123: now-=(ulong)60L*24L*60L;
1124: unixtodos(now,&date,&curtime);
1125: sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG"
1126: ,data_dir,date.da_mon,date.da_day,date.da_year-1900);
1127: external(cmdstr(node_viewer,str,nulstr,NULL),0);
1128: return(0);
1129: case 'Z':
1130: mail_maint();
1131: return(0);
1132: case '?': /* Menu */
1133: if(menuon) {
1134: menuon=0;
1135: lputc(FF);
1136: laststatchk=0;
1137: laststatfdate=0; }
1138: else {
1139: online=ON_LOCAL;
1140: menu("WFC");
1141: menuon=1;
1142: blank=0;
1143: online=0; }
1144: continue;
1145: case SP: /* Log on */
1146: lclatr(WHITE|HIGH); lputc('Y'); lclatr(GREEN);
1147: lputs(" Yes\r\n");
1148: lclatr(WHITE|HIGH); lputc('Z'); lclatr(GREEN);
1149: lputs(" Yes, Quiet\r\n");
1150: lclatr(WHITE|HIGH); lputc('F'); lclatr(GREEN);
1151: lputs(" Fast User #1\r\n");
1152: lclatr(WHITE|HIGH); lputc('Q'); lclatr(GREEN);
1153: lputs(" Fast User #1, Quiet\r\n");
1154: lclatr(BROWN|HIGH);
1155: lputs("\r\nLog on? [No]: ");
1156: lclatr(LIGHTGRAY);
1157: i=getch();
1158: switch(toupper(i)) {
1159: case 'Z':
1160: onquiet=1;
1161: case 'Y': /* Yes, logon */
1162: lputc(FF);
1163: quicklogonstuff();
1164: sys_status&=~SS_USERON;
1165: useron.misc=(UPAUSE|ANSI|COLOR);
1166: gotcaller=1;
1167: continue;
1168: case 'Q':
1169: onquiet=1;
1170: case 'F':
1171: lputc(FF);
1172: quicklogonstuff();
1173: if(sys_misc&SM_REQ_PW || node_misc&NM_SYSPW) {
1174: useron.misc=(UPAUSE|ANSI|COLOR);
1175: gotcaller=1;
1176: continue; }
1177: if(!useron.number) {
1178: lputc(7);
1179: lputs("A Sysop account hasn't been created");
1180: getch();
1181: return(0); }
1182: return(logon());
1183: default:
1184: return(0); }
1185: default:
1186: lputs("Hit '?' for a menu.");
1187: continue; } }
1188: if(com_port) {
1189: if(mdm_misc&MDM_VERBAL) {
1190: if(rioctl(RXBC)) {
1191: lputc(FF);
1192: getmdmstr(str,SEC_RING);
1193: if(!strcmp(str,"RING"))
1194: ans=1; } }
1195: else { /* numeric */
1196: if(incom()=='2')
1197: ans=1; }
1198: if(mdm_misc&MDM_DUMB && DCDHIGH)
1199: ans=1; }
1200: if(ans) {
1201: lputc(FF);
1202: if(mdm_misc&MDM_CALLERID) {
1203: lputs("Obtaining Caller-ID...");
1204: getmdmstr(str,SEC_CID);
1205: lprintf("\r\nCID: %s",str);
1206: if(!strncmpi(str,"TIME:",5)) { /* 3 message format */
1207: getmdmstr(str,SEC_CID);
1208: lprintf("\r\nCID: %s",str);
1209: p=strchr(str,':');
1210: if(p)
1211: strcpy(cid,p+2); /* Phone Number */
1212: getmdmstr(str,SEC_CID);
1213: lprintf("\r\nCID: %s",str);
1214: p=strchr(str,':');
1215: if(p)
1216: sprintf(cname,"%.*s",LEN_CID,p+2); } /* Caller Name */
1217: else if(!strncmpi(str,"DATE =",6)) { /* Supra format */
1218: getmdmstr(str,SEC_CID);
1219: lprintf("\r\nCID: %s",str); /* TIME = line */
1220: getmdmstr(str,SEC_CID);
1221: lprintf("\r\nCID: %s",str); /* NMBR = line */
1222: p=strchr(str,'=');
1223: if(p)
1224: sprintf(strstr(str,"NAME") ? cname:cid,"%.*s",LEN_CID,p+2);
1225: getmdmstr(str,SEC_CID); /* NAME = line */
1226: lprintf("\r\nCID: %s",str);
1227: p=strchr(str,'=');
1228: if(p)
1229: sprintf(strstr(str,"NAME") ? cname:cid,"%.*s",LEN_CID,p+2);
1230: }
1231: else if(strlen(str)>12) /* Single message format */
1232: sprintf(cid,"%.*s",LEN_CID,str+12);
1233: else
1234: sprintf(cid,"ERROR: '%s'",str);
1235: lputs(crlf); }
1236: cur_rate=cur_cps=0;
1237: connection[0]=0;
1238: result_code=0;
1239: if(!(mdm_misc&MDM_DUMB)) {
1240: if(mdm_rings>1) {
1241: lputs("Ring\r\n");
1242: for(i=1;i<mdm_rings;i++)
1243: if(!getmdmstr(str,10))
1244: break;
1245: else
1246: lputs("Ring\r\n");
1247: if(i<mdm_rings)
1248: return(0);
1249: lputs(crlf); }
1250: lputs("Answering...");
1251: mdmcmd(mdm_answ);
1252: rioctl(IOFI); // flush extra ring results
1253: while(!cur_rate || rioctl(RXBC)) { // no connect or more rsults
1254: if(!getmdmstr(str,SEC_ANSWER)) {
1255: if(cur_rate)
1256: break;
1257: lprintf("\r\nNO CARRIER\r\n");
1258: if(!(mdm_misc&MDM_NODTR)) {
1259: dtr(15);
1260: dtr(1);
1261: mswait(500); }
1262: mdmcmd(nulstr);
1263: hangup();
1264: return(0); }
1265: i=0;
1266: while(i<2
1267: && (!strcmp(str,"2")
1268: || !strcmp(str,"RING"))) { /* Ring? Get next result */
1269: lputs("Ring\r\n");
1270: if(i) {
1271: mdmcmd(mdm_answ); /* Give a second ATA */
1272: rioctl(IOFI); }
1273: if(!getmdmstr(str,SEC_ANSWER)) {
1274: if(!(mdm_misc&MDM_NODTR)) {
1275: dtr(15);
1276: dtr(1);
1277: mswait(500); }
1278: mdmcmd(nulstr);
1279: hangup(); /* Get next result code from modem */
1280: return(0); }
1281: i++; }
1282: if(!strcmp(str,"3") || !strcmp(str,"NO CARRIER")) {
1283: lprintf("\r\nNO CARRIER\r\n");
1284: hangup();
1285: return(0); }
1286:
1287: lprintf("\r\nResult Code: %s\r\n",str);
1288:
1289: /* IP (vmodem) logging additions by enigma */
1290: ips = strstr(str, "TEL FROM ");
1291: if(ips) {
1292: strcpy(ipstr, ips+9);
1293: }
1294:
1295: if(strstr(str,"FAX") || strstr(str,"+FCO")) {
1296: /* Just for the ZyXEL's */
1297: mswait(1500); /* 1 and a half second wait for ZyXEL */
1298: sys_misc&=~SM_ERRALARM;
1299: bail(100); }
1300:
1301: if(mdm_misc&MDM_VERBAL) {
1302: if(!cur_rate
1303: && (!strnicmp(str,"CONNECT ",8)
1304: || !strnicmp(str,"CARRIER ",8))) {
1305: cur_rate=atol(str+8);
1306: // build description
1307: for(i=8,j=0;str[i] && j<LEN_MODEM;i++) {
1308: if(j==2 && isdigit(str[i])
1309: && str[i+1]=='0' && str[i+2]=='0'
1310: && !isdigit(str[i+3]) && j+1<LEN_MODEM) {
1311: connection[j++]='.';
1312: connection[j++]=str[i];
1313: i+=2; }
1314: else
1315: connection[j++]=str[i]; }
1316: connection[j]=0; }
1317: if(!cur_rate && !strcmp(str,"CONNECT"))
1318: cur_rate=com_rate;
1319: if(cur_rate
1320: && (strstr(str,"ARQ") || strstr(str,"MNP")
1321: || strstr(str,"V42") || strstr(str,"LAPM")
1322: || strstr(str,"REL")))
1323: cur_cps=cur_rate/9; }
1324: else { /* numeric */
1325: j=atoi(str);
1326: for(i=0;i<mdm_results;i++)
1327: if(mdm_result[i].code==j) break;
1328: if(!cur_rate) {
1329: if(i==mdm_results) {
1330: lprintf("Unknown result code: '%s'\r\n",str);
1331: sprintf(tmp,"Unknown modem result code: '%s'",str);
1332: errorlog(tmp);
1333: if(mdm_misc&MDM_KNOWNRES || !mdm_results) {
1334: hangup();
1335: return(0); } /* Don't allow invalid codes */
1336: i--; } /* Use last configured result code */
1337: else
1338: result_code=mdm_result[i].code; }
1339: if(!strncmpi(mdm_result[i].str,"EXIT ",5))
1340: bail(atoi(mdm_result[i].str+5));
1341: if(!strcmpi(mdm_result[i].str,"FAX")) {
1342: lputs("FAX Connection\r\n");
1343: bail(100); }
1344: if(!strcmpi(mdm_result[i].str,"IGNORE") || cur_rate)
1345: lputs("Ignored\r\n");
1346: else {
1347: cur_rate=mdm_result[i].rate;
1348: cur_cps=mdm_result[i].cps;
1349: strcpy(connection,mdm_result[i].str); } } } }
1350: else /* dumb modem */
1351: cur_rate=com_rate;
1352:
1353: if(!connection[0])
1354: sprintf(connection,"%lu",cur_rate);
1355: lprintf("Logging Caller in at %s\r\n",connection);
1356: if(!cur_cps)
1357: cur_cps=cur_rate/10L;
1358:
1359: rioctl(IOCE|((RXLOST|FERR|PERR|OVRR)<<8)); /* clear error flags */
1360: console=CON_R_ECHO|CON_L_ECHO|CON_R_INPUT|CON_L_INPUT;
1361: online=ON_REMOTE;
1362: gotcaller=1;
1363: putcom(crlf);
1364: #if defined(__OS2__)
1365: putcom(decrypt(VersionNoticeOS2,0));
1366: #elif defined(__WIN32__)
1367: putcom(decrypt(VersionNoticeW32,0));
1368: #else
1369: putcom(decrypt(VersionNoticeDOS,0));
1370: #endif
1371: putcom(crlf);
1372: lprintf("Pausing %u Seconds...",mdm_ansdelay);
1373: if(node_misc&NM_ANSALARM) {
1374: now=time(NULL);
1375: while(time(NULL)-now<mdm_ansdelay)
1376: for(x=0;x<10;x++)
1377: for(y=0;y<10;y++)
1378: beep((x*100)+(y*5),10); }
1379: else
1380: secwait(mdm_ansdelay);
1381: nosound();
1382: rioctl(IOFI); } } /* flush input buffer */
1383:
1384: reset_logon_vars();
1385: calls++;
1386: useron.misc=0;
1387: answertime=logontime=starttime=time(NULL);
1388: if(online==ON_REMOTE) {
1389: setrate();
1390:
1391: now=time(NULL);
1392: gm=localtime(&now);
1393: sprintf(str,"%02d:%02d%c %s %s %02d %u Node %3u %5lubps (%s)"
1394: ,gm->tm_hour>12 ? gm->tm_hour-12 : gm->tm_hour==0 ? 12 : gm->tm_hour
1395: ,gm->tm_min,gm->tm_hour>=12 ? 'p' : 'a',wday[gm->tm_wday]
1396: ,mon[gm->tm_mon],gm->tm_mday,gm->tm_year+1900,node_num,cur_rate
1397: ,connection);
1398: if(result_code) {
1399: sprintf(tmp," [%d]",result_code);
1400: strcat(str,tmp); }
1401: logline("@",str);
1402:
1403: /* IP trashcan modification by enigma */
1404: if(trashcan(ipstr,"IP")) {
1405: sprintf(tmp, "IP Trashcan: %s, hanging up!\r\n", ipstr);
1406: logline("@!",tmp);
1407: hangup();
1408: return(0); }
1409:
1410: if(mdm_misc&MDM_CALLERID) {
1411: outcom(0xC);
1412: #if defined(__OS2__)
1413: putcom(decrypt(VersionNoticeOS2,0));
1414: #elif defined(__WIN32__)
1415: putcom(decrypt(VersionNoticeW32,0));
1416: #else
1417: putcom(decrypt(VersionNoticeDOS,0));
1418: #endif
1419: putcom(crlf);
1420: sprintf(str,"CID: %-*s %s",LEN_CID,cid,cname);
1421: logline("@*",str);
1422: if(trashcan(cid,"CID")) {
1423: hangup();
1424: return(0); } } }
1425: lclini(node_scrnlen-1);
1426: if(online==ON_REMOTE) {
1427: if(node_dollars_per_call) { /* Billing node stuff */
1428: now=time(NULL);
1429: bprintf(text[BillingNodeMsg],sys_name,node_dollars_per_call);
1430: while(online && now-answertime<30) {
1431: if(incom()!=NOINP) {
1432: if(!(mdm_misc&MDM_NODTR))
1433: dtr(15);
1434: else
1435: mdmcmd(mdm_hang); }
1436: checkline();
1437: now=time(NULL); }
1438: if(!online)
1439: return(0); }
1440: rioctl(IOFI);
1441: putcom("\x1b[99B\x1b[6n\x1b[!_\x1b[0t_\x1b[0m_\xC");
1442: lputc(FF);
1443: i=l=lncntr=autoterm=0;
1444: tos=1;
1445: #if defined(__OS2__)
1446: strcpy(str,decrypt(VersionNoticeOS2,0));
1447: #elif defined(__WIN32__)
1448: strcpy(str,decrypt(VersionNoticeW32,0));
1449: #else
1450: strcpy(str,decrypt(VersionNoticeDOS,0));
1451: #endif
1452: strcat(str,decrypt(CopyrightNotice,0));
1453: center(str);
1454: while(i++<30 && l<40) { /* wait up to 3 seconds for response */
1455: if((c=(incom()&0x7f))=='R') { /* break immediately if response */
1456: str[l++]=c;
1457: mswait(110);
1458: break; }
1459: if(c) {
1460: str[l++]=c;
1461: if(l==1 && c!=ESC)
1462: break; }
1463: else
1464: mswait(100); }
1465:
1466: if(rioctl(RXBC)) /* wait a bit for extra RIP reply chars */
1467: mswait(550);
1468:
1469: while((i=(incom()&0x7f))!=NOINP && l<40)
1470: str[l++]=i;
1471: str[l]=0;
1472:
1473: #if 0
1474: for(i=0;str[i];i++)
1475: lprintf("%02X ",str[i]);
1476: lputs(crlf);
1477: #endif
1478:
1479: if(l) {
1480: if(str[0]==ESC && str[1]=='[') {
1481: useron.misc|=(ANSI|COLOR);
1482: autoterm|=ANSI;
1483: rows=((str[2]&0xf)*10)+(str[3]&0xf);
1484: if(rows<10 || rows>99) rows=24; }
1485: truncsp(str);
1486: if(strstr(str,"RIPSCRIP")) {
1487: logline("@R",strstr(str,"RIPSCRIP"));
1488: useron.misc|=(RIP|COLOR|ANSI);
1489: autoterm|=(RIP|COLOR|ANSI); }
1490: else if(strstr(str,"DC-TERM")
1491: && toupper(*(strstr(str,"DC-TERM")+12))=='W') {
1492: logline("@W",strstr(str,"DC-TERM"));
1493: useron.misc|=(WIP|COLOR|ANSI);
1494: autoterm|=(WIP|COLOR|ANSI); } }
1495: rioctl(IOFI); /* flush left-over or late response chars */
1496: sprintf(str,"%sANSWER",text_dir);
1497: sprintf(tmp,"%s.%s",str,autoterm&WIP ? "WIP":"RIP");
1498: sprintf(str2,"%s.ANS",str);
1499: if(autoterm&(RIP|WIP) && fexist(tmp))
1500: strcat(str,autoterm&WIP ? ".WIP":".RIP");
1501: else if(autoterm&ANSI && fexist(str2))
1502: strcat(str,".ANS");
1503: else
1504: strcat(str,".ASC");
1505: rioctl(IOSM|PAUSE);
1506: sys_status|=SS_PAUSEON;
1507: tos=1;
1508: printfile(str,P_NOABORT);
1509: sys_status&=~SS_PAUSEON;
1510: CRLF; }
1511: else
1512: useron.misc=(UPAUSE|ANSI|COLOR);
1513:
1514: useron.number=0;
1515:
1516: exec_bin(login_mod,&main_csi);
1517:
1518: if(!useron.number)
1519: hangup();
1520: if(!online) {
1521: logout();
1522: return(0); }
1523:
1524: if(online==ON_REMOTE && mdm_misc&MDM_CALLERID) {
1525: strcpy(useron.note,cid);
1526: putuserrec(useron.number,U_NOTE,LEN_NOTE,useron.note); }
1527:
1528: /* log the IP by enigma */
1529:
1530: if(online==ON_REMOTE && ipstr[0]!='\0') {
1531: sprintf(useron.note, "Telnet: %s", ipstr);
1532: putuserrec(useron.number,U_NOTE,LEN_NOTE,useron.note);
1533: logline("@*", useron.note); }
1534:
1535: if(!(sys_status&SS_USERON)) {
1536: errormsg(WHERE,ERR_CHK,"User not logged on",0);
1537: hangup();
1538: logout();
1539: return(0); }
1540:
1541: return(1);
1542: }
1543:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.