|
|
1.1 root 1: /* scfgmdm.c */
2:
3: /* $Id: scfgmdm.c,v 1.5 2005/11/27 23:34:28 deuce Exp $ */
4:
5: /****************************************************************************
6: * @format.tab-size 4 (Plain Text/Source Code File Header) *
7: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
8: * *
9: * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html *
10: * *
11: * This program is free software; you can redistribute it and/or *
12: * modify it under the terms of the GNU General Public License *
13: * as published by the Free Software Foundation; either version 2 *
14: * of the License, or (at your option) any later version. *
15: * See the GNU General Public License for more details: gpl.txt or *
16: * http://www.fsf.org/copyleft/gpl.html *
17: * *
18: * Anonymous FTP access to the most recent released source is available at *
19: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
20: * *
21: * Anonymous CVS access to the development source and modification history *
22: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
24: * (just hit return, no password is necessary) *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
26: * *
27: * For Synchronet coding style and modification guidelines, see *
28: * http://www.synchro.net/source.html *
29: * *
30: * You are encouraged to submit any modifications (preferably in Unix diff *
31: * format) via e-mail to [email protected] *
32: * *
33: * Note: If this box doesn't appear square, then you need to fix your tabs. *
34: ****************************************************************************/
35:
36: #include "scfg.h"
37:
38: int exec_mdm(char *fname);
39:
40: void mdm_cfg(int mdmnum)
41: {
42:
43: free(cfg.mdm_result);
44: cfg.mdm_result=NULL;
45:
46: /*
47: strcpy(cfg.mdm_answ,"ATA");
48: strcpy(cfg.mdm_hang,"ATH");
49: strcpy(cfg.mdm_dial,"ATDT");
50: strcpy(cfg.mdm_offh,"ATM0H1");
51: strcpy(cfg.mdm_term,"ATE1V1");
52: strcpy(cfg.mdm_init,"AT&FS0=0S2=128E0V0X4&C1&D2");
53: */
54: cfg.mdm_answ[0]=0;
55: cfg.mdm_hang[0]=0;
56: cfg.mdm_dial[0]=0;
57: cfg.mdm_offh[0]=0;
58: cfg.mdm_term[0]=0;
59: cfg.mdm_init[0]=0;
60: cfg.mdm_spec[0]=0;
61: cfg.mdm_results=0;
62: cfg.mdm_misc=(MDM_RTS|MDM_CTS);
63:
64: exec_mdm(mdm_file[mdmnum]);
65:
66: }
67:
68: void cvttab(char *str)
69: {
70: int i;
71:
72: for(i=0;str[i];i++)
73: if(str[i]==TAB)
74: str[i]=' ';
75: }
76:
77: int export_mdm(char *fname)
78: {
79: char str[256];
80: int file,i;
81: time_t now;
82: FILE *stream;
83:
84: sprintf(str,"%s%s.MDM",cfg.ctrl_dir,fname);
85: if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1)
86: return(0);
87: if((stream=fdopen(file,"wb"))==NULL) {
88: close(file);
89: return(0); }
90:
91: now=time(NULL);
92: fprintf(stream,"# Exported from %s Node %u on %.24s\r\n\r\n"
93: ,cfg.sys_name,cfg.node_num,ctime(&now));
94: fprintf(stream,"COM_RATE\t%ld\r\n",cfg.com_rate);
95: fprintf(stream,"INIT_STR\t%s\r\n",cfg.mdm_init);
96: fprintf(stream,"DIAL_STR\t%s\r\n",cfg.mdm_dial);
97: fprintf(stream,"HANGUP_STR\t%s\r\n",cfg.mdm_hang);
98: fprintf(stream,"ANSWER_STR\t%s\r\n",cfg.mdm_answ);
99: fprintf(stream,"OFFHOOK_STR\t%s\r\n",cfg.mdm_offh);
100: fprintf(stream,"SPEC_INIT\t%s\r\n",cfg.mdm_spec);
101: fprintf(stream,"TERM_INIT\t%s\r\n",cfg.mdm_term);
102: fprintf(stream,"LOCKED_RATE\t%s\r\n",(cfg.mdm_misc&MDM_STAYHIGH) ? "YES":"NO");
103: fprintf(stream,"CALLER_ID\t%s\r\n",(cfg.mdm_misc&MDM_CALLERID) ? "YES":"NO");
104: fprintf(stream,"DROP_DTR\t%s\r\n",(cfg.mdm_misc&MDM_NODTR) ? "NO":"YES");
105: fprintf(stream,"FLOW_CONTROL\t%s\r\n"
106: ,(cfg.mdm_misc&(MDM_RTS|MDM_CTS)==(MDM_RTS|MDM_CTS)) ? "BOTH":
107: (cfg.mdm_misc&MDM_CTS) ? "TRANSMIT" : (cfg.mdm_misc&MDM_RTS) ? "RECEIVE" : "NONE");
108: for(i=0;i<cfg.mdm_results;i++)
109: fprintf(stream,"RESULT\t\t%u\t%u\t%u\t%s\r\n",cfg.mdm_result[i].code
110: ,cfg.mdm_result[i].cps,cfg.mdm_result[i].rate,cfg.mdm_result[i].str);
111:
112: fclose(stream);
113:
114: return(1);
115: }
116:
117: int exec_mdm(char *fname)
118: {
119: char str[256],msg[128],*p;
120: int file,i,j;
121: FILE *stream;
122:
123: sprintf(str,"%s%s.MDM",cfg.ctrl_dir,fname);
124:
125: if((file=open(str,O_RDONLY|O_BINARY|O_DENYALL))==-1)
126: return(0);
127: if((stream=fdopen(file,"rb"))==NULL) {
128: close(file);
129: return(0); }
130:
131: while(!feof(stream)) {
132: if(!fgets(str,255,stream))
133: break;
134: cvttab(str);
135: truncsp(str);
136: p=str;
137: while(*p && *p<=' ') /* look for beginning of command */
138: p++;
139: if(!*p)
140: continue;
141: if(*p=='#') /* remarks start with # */
142: continue;
143:
144: if(!strnicmp(p,"COM_RATE",8)) {
145: p+=8;
146: while(*p==' ') p++;
147: cfg.com_rate=atol(p);
148: continue; }
149:
150: if(!strnicmp(p,"INIT_STR",8)) {
151: p+=8;
152: while(*p==' ') p++;
153: sprintf(cfg.mdm_init,"%.63s",p);
154: continue; }
155:
156: if(!strnicmp(p,"DIAL_STR",8)) {
157: p+=8;
158: while(*p==' ') p++;
159: sprintf(cfg.mdm_dial,"%.63s",p);
160: continue; }
161:
162: if(!strnicmp(p,"HANGUP_STR",10)) {
163: p+=10;
164: while(*p==' ') p++;
165: sprintf(cfg.mdm_hang,"%.63s",p);
166: continue; }
167:
168: if(!strnicmp(p,"ANSWER_STR",10)) {
169: p+=10;
170: while(*p==' ') p++;
171: sprintf(cfg.mdm_answ,"%.63s",p);
172: continue; }
173:
174: if(!strnicmp(p,"OFFHOOK_STR",11)) {
175: p+=11;
176: while(*p==' ') p++;
177: sprintf(cfg.mdm_offh,"%.63s",p);
178: continue; }
179:
180: if(!strnicmp(p,"SPEC_INIT",9)) {
181: p+=9;
182: while(*p==' ') p++;
183: sprintf(cfg.mdm_spec,"%.63s",p);
184: continue; }
185:
186: if(!strnicmp(p,"TERM_INIT",9)) {
187: p+=9;
188: while(*p==' ') p++;
189: sprintf(cfg.mdm_term,"%.63s",p);
190: continue; }
191:
192: if(!strnicmp(p,"LOCKED_RATE",11)) {
193: p+=11;
194: while(*p==' ') p++;
195: if(!stricmp(p,"OFF") || !stricmp(p,"NO"))
196: cfg.mdm_misc&=~MDM_STAYHIGH;
197: else
198: cfg.mdm_misc|=MDM_STAYHIGH;
199: continue; }
200:
201: if(!strnicmp(p,"CALLER_ID",9)) {
202: p+=9;
203: while(*p==' ') p++;
204: if(!stricmp(p,"YES") || !stricmp(p,"ON"))
205: cfg.mdm_misc|=MDM_CALLERID;
206: else
207: cfg.mdm_misc&=~MDM_CALLERID;
208: continue; }
209:
210: if(!strnicmp(p,"VERBAL_RESULTS",14)) {
211: p+=14;
212: while(*p==' ') p++;
213: if(!stricmp(p,"YES") || !stricmp(p,"ON"))
214: cfg.mdm_misc|=MDM_VERBAL;
215: else
216: cfg.mdm_misc&=~MDM_VERBAL;
217: continue; }
218:
219: if(!strnicmp(p,"DROP_DTR",8)) {
220: p+=8;
221: while(*p==' ') p++;
222: if(!stricmp(p,"OFF") || !stricmp(p,"NO"))
223: cfg.mdm_misc|=MDM_NODTR;
224: else
225: cfg.mdm_misc&=~MDM_NODTR;
226: continue; }
227:
228: if(!strnicmp(p,"FLOW_CONTROL",12)) {
229: p+=12;
230: while(*p==' ') p++;
231: cfg.mdm_misc&=~(MDM_RTS|MDM_CTS);
232: strupr(p);
233: if(strstr(p,"RTS") || strstr(p,"RECEIVE") || strstr(p,"RECV")
234: || strstr(p,"BOTH"))
235: cfg.mdm_misc|=MDM_RTS;
236: if(strstr(p,"CTS") || strstr(p,"TRANSMIT") || strstr(p,"SEND")
237: || strstr(p,"BOTH"))
238: cfg.mdm_misc|=MDM_CTS;
239: continue; }
240:
241: if(!strnicmp(p,"RESULT ",7)) {
242: p+=7;
243: while(*p==' ') p++;
244: i=atoi(p);
245: for(j=0;j<cfg.mdm_results;j++)
246: if(cfg.mdm_result[j].code==i)
247: break;
248: if(j>=cfg.mdm_results) {
249: if((cfg.mdm_result=(mdm_result_t *)realloc(
250: cfg.mdm_result,sizeof(mdm_result_t)
251: *(cfg.mdm_results+1)))==NULL) {
252: errormsg(WHERE,ERR_ALLOC,p,cfg.mdm_results+1);
253: cfg.mdm_results=0;
254: bail(1);
255: continue; }
256: cfg.mdm_results++; }
257: cfg.mdm_result[j].code=i;
258: while(*p!=' ') p++;
259: while(*p==' ') p++;
260: cfg.mdm_result[j].cps=atoi(p);
261: while(*p!=' ') p++;
262: while(*p==' ') p++;
263: cfg.mdm_result[j].rate=atoi(p);
264: while(*p!=' ') p++;
265: while(*p==' ') p++;
266: sprintf(cfg.mdm_result[j].str,"%.*s",LEN_MODEM,p);
267: continue; }
268:
269: if(!strnicmp(p,"INCLUDE ",8)) {
270: p+=8;
271: while(*p==' ') p++;
272: exec_mdm(p);
273: continue; }
274:
275: sprintf(msg,"ERROR: '%.15s' in %.8s.MDM",p,fname);
276: umsg(msg);
277: }
278:
279: fclose(stream);
280: return(1);
281: }
282:
283:
284: void init_mdms()
285: {
286: char str[128],fname[128];
287: int file;
288: FILE *stream;
289:
290: mdm_types=0;
291: mdm_type=NULL;
292: mdm_file=NULL;
293: sprintf(str,"%sMDMS.IXT",cfg.ctrl_dir);
294: if((file=nopen(str,O_RDONLY))==-1) {
295: errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
296: return; }
297: if((stream=fdopen(file,"rb"))==NULL) {
298: close(file);
299: errormsg(WHERE,ERR_FDOPEN,str,O_RDONLY);
300: return; }
301:
302: while(!feof(stream)) {
303: if(!fgets(str,120,stream))
304: break;
305: truncsp(str);
306: if(!fgets(fname,120,stream))
307: break;
308: truncsp(fname);
309: if((mdm_type=realloc(mdm_type,sizeof(char *)*(mdm_types+1)))==NULL) {
310: errormsg(WHERE,ERR_ALLOC,"Modem Type",sizeof(char *)*(mdm_types+1));
311: break; }
312: if((mdm_file=realloc(mdm_file,sizeof(char *)*(mdm_types+1)))==NULL) {
313: errormsg(WHERE,ERR_ALLOC,"Modem File",sizeof(char *)*(mdm_types+1));
314: break; }
315: if((mdm_type[mdm_types]=malloc(strlen(str)+1))==NULL) {
316: errormsg(WHERE,ERR_ALLOC,"Modem Typename",sizeof(char *)*(mdm_types+1));
317: break; }
318: if((mdm_file[mdm_types]=malloc(9))==NULL) {
319: errormsg(WHERE,ERR_ALLOC,"Modem Filename",sizeof(char *)*(mdm_types+1));
320: break; }
321: strcpy(mdm_type[mdm_types],str);
322: sprintf(mdm_file[mdm_types],"%.8s",fname);
323: mdm_types++; }
324: fclose(stream);
325: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.